From ed9ff70f023edaf015d8ba7698f335ee9ce4537f Mon Sep 17 00:00:00 2001 From: patacongo Date: Mon, 1 Dec 2008 13:22:34 +0000 Subject: [PATCH] Add argument to window callbacks git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@1366 7fd9a85b-ad96-42d3-883c-3090e2eb8679 --- nuttx/examples/nx/nx_main.c | 104 +++++++++++++++------- nuttx/graphics/nxbe/nxbe.h | 5 ++ nuttx/graphics/nxmu/nx_eventhandler.c | 8 +- nuttx/graphics/nxsu/nx_kbdchin.c | 2 +- nuttx/graphics/nxsu/nx_kbdin.c | 2 +- nuttx/graphics/nxsu/nx_mousein.c | 2 +- nuttx/graphics/nxsu/nx_open.c | 6 +- nuttx/graphics/nxsu/nxsu_redrawreq.c | 2 +- nuttx/graphics/nxsu/nxsu_reportposition.c | 2 +- nuttx/include/nuttx/nx.h | 19 ++-- 10 files changed, 104 insertions(+), 48 deletions(-) diff --git a/nuttx/examples/nx/nx_main.c b/nuttx/examples/nx/nx_main.c index a98795d42..f1a136f82 100644 --- a/nuttx/examples/nx/nx_main.c +++ b/nuttx/examples/nx/nx_main.c @@ -84,20 +84,22 @@ enum exitcode_e ****************************************************************************/ static void nxeg_redraw1(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, - boolean more); + boolean morem, FAR void *arg); static void nxeg_redraw2(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, - boolean more); + boolean more, FAR void *arg); static void nxeg_position1(NXWINDOW hwnd, FAR const struct nxgl_rect_s *size, FAR const struct nxgl_point_s *pos, - FAR const struct nxgl_rect_s *bounds); + FAR const struct nxgl_rect_s *bounds, + FAR void *arg); static void nxeg_position2(NXWINDOW hwnd, FAR const struct nxgl_rect_s *size, FAR const struct nxgl_point_s *pos, - FAR const struct nxgl_rect_s *bounds); + FAR const struct nxgl_rect_s *bounds, + FAR void *arg); #ifdef CONFIG_NX_MOUSE static void nxeg_mousein1(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, - ubyte buttons); + ubyte buttons, FAR void *arg); static void nxeg_mousein2(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, - ubyte buttons); + ubyte buttons, FAR void *arg); #endif #ifdef CONFIG_NX_KBD static void nxeg_kbdin(NXWINDOW hwnd, ubyte nch, const ubyte *ch); @@ -163,10 +165,10 @@ static nxgl_mxpixel_t g_color2[CONFIG_NX_NPLANES]; ****************************************************************************/ static void nxeg_redraw1(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, - boolean more) + boolean more, FAR void *arg) { - message("nxeg_redraw1: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n", - hwnd, + message("nxeg_redraw%d: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s arg=%p\n", + (int)arg, hwnd, rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y, more ? "TRUE" : "FALSE"); nx_fill(hwnd, rect, g_color1); @@ -177,12 +179,13 @@ static void nxeg_redraw1(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, ****************************************************************************/ static void nxeg_redraw2(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, - boolean more) + boolean more, FAR void *arg) { - message("nxeg_redraw2: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n", - hwnd, + message("nxeg_redraw%d: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s arg=%p\n", + (int)arg, hwnd, rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y, - more ? "TRUE" : "FALSE"); + more ? "TRUE" : "FALSE", + arg); nx_fill(hwnd, rect, g_color2); } @@ -192,12 +195,13 @@ static void nxeg_redraw2(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, static void nxeg_position1(NXWINDOW hwnd, FAR const struct nxgl_rect_s *size, FAR const struct nxgl_point_s *pos, - FAR const struct nxgl_rect_s *bounds) + FAR const struct nxgl_rect_s *bounds, + FAR void *arg) { /* Report the position */ - message("nxeg_position1: hwnd=%p size={(%d,%d),(%d,%d)} pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", - hwnd, + message("nxeg_position%d: hwnd=%p size={(%d,%d),(%d,%d)} pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", + arg, hwnd, size->pt1.x, size->pt1.y, size->pt2.x, size->pt2.y, pos->x, pos->y, bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y); @@ -223,12 +227,13 @@ static void nxeg_position1(NXWINDOW hwnd, FAR const struct nxgl_rect_s *size, static void nxeg_position2(NXWINDOW hwnd, FAR const struct nxgl_rect_s *size, FAR const struct nxgl_point_s *pos, - FAR const struct nxgl_rect_s *bounds) + FAR const struct nxgl_rect_s *bounds, + FAR void *arg) { /* Report the position */ - message("nxeg_position2: hwnd=%p size={(%d,%d),(%d,%d)} pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", - hwnd, + message("nxeg_position%d: hwnd=%p size={(%d,%d),(%d,%d)} pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", + arg, hwnd, size->pt1.x, size->pt1.y, size->pt2.x, size->pt2.y, pos->x, pos->y, bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y); @@ -240,10 +245,10 @@ static void nxeg_position2(NXWINDOW hwnd, FAR const struct nxgl_rect_s *size, #ifdef CONFIG_NX_MOUSE static void nxeg_mousein1(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, - ubyte buttons) + ubyte buttons, FAR void *arg) { - message("nxeg_mousein1: hwnd=%p pos=(%d,%d) button=%02x\n", - hwnd, pos->x, pos->y, buttons); + message("nxeg_mousein%d: hwnd=%p pos=(%d,%d) button=%02x\n", + arg, hwnd, pos->x, pos->y, buttons); } #endif @@ -253,7 +258,7 @@ static void nxeg_mousein1(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, #ifdef CONFIG_NX_MOUSE static void nxeg_mousein2(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, - ubyte buttons) + ubyte buttons, FAR void *arg) { message("nxeg_mousein2: hwnd=%p pos=(%d,%d) button=%02x\n", hwnd, pos->x, pos->y, buttons); @@ -546,7 +551,7 @@ int user_start(int argc, char *argv[]) /* Create window #1 */ message("user_start: Create window #1\n"); - hwnd1 = nx_openwindow(g_hnx, &g_nxcb1); + hwnd1 = nx_openwindow(g_hnx, &g_nxcb1, (FAR void *)2); message("user_start: hwnd1=%p\n", hwnd1); if (!hwnd1) @@ -580,8 +585,18 @@ int user_start(int argc, char *argv[]) goto errout_with_hwnd1; } - pt.x = g_xres / 4; - pt.y = g_yres / 4; + /* Sleep a bit -- both so that we can see the result of the above operations + * but also, in the multi-user case, so that the server can get a chance to + * actually do them! + */ + + message("user_start: Sleeping\n\n"); + sleep(1); + + /* Set the position of window #1 */ + + pt.x = g_xres / 8; + pt.y = g_yres / 8; message("user_start: Set hwnd1 postion to (%d,%d)\n", pt.x, pt.y); ret = nx_setposition(hwnd1, &pt); @@ -592,18 +607,15 @@ int user_start(int argc, char *argv[]) goto errout_with_hwnd1; } - /* Sleep a bit -- both so that we can see the result of the above operations - * but also, in the multi-user case, so that the server can get a chance to - * actually do them! - */ + /* Sleep a bit */ message("user_start: Sleeping\n\n"); sleep(2); /* Create window #2 */ - message("user_start: Create window #1\n"); - hwnd2 = nx_openwindow(g_hnx, &g_nxcb2); + message("user_start: Create window #2\n"); + hwnd2 = nx_openwindow(g_hnx, &g_nxcb2, (FAR void *)2); message("user_start: hwnd2=%p\n", hwnd2); if (!hwnd2) @@ -613,6 +625,11 @@ int user_start(int argc, char *argv[]) goto errout_with_hwnd1; } + /* Sleep a bit */ + + message("user_start: Sleeping\n\n"); + sleep(1); + /* Set the size of the window 2 == size of window 1*/ message("user_start: Set hwnd2 size to (%d,%d)\n", rect.pt2.x, rect.pt2.y); @@ -624,6 +641,13 @@ int user_start(int argc, char *argv[]) goto errout_with_hwnd2; } + /* Sleep a bit */ + + message("user_start: Sleeping\n\n"); + sleep(1); + + /* Set the position of window #2 */ + pt.x = g_xres - rect.pt2.x - pt.x; pt.y = g_yres - rect.pt2.y - pt.y; @@ -654,6 +678,22 @@ int user_start(int argc, char *argv[]) /* Sleep a bit */ + message("user_start: Sleeping\n\n"); + sleep(1); + + /* Lower window 1 */ + + message("user_start: Raise window #2\n"); + ret = nx_raise(hwnd2); + if (ret < 0) + { + message("user_start: nx_raise failed: %d\n", errno); + g_exitcode = NXEXIT_NXSETPOSITION; + goto errout_with_hwnd2; + } + + /* Sleep a bit */ + message("user_start: Sleeping\n\n"); sleep(2); diff --git a/nuttx/graphics/nxbe/nxbe.h b/nuttx/graphics/nxbe/nxbe.h index 5f5e14b76..b07da6793 100644 --- a/nuttx/graphics/nxbe/nxbe.h +++ b/nuttx/graphics/nxbe/nxbe.h @@ -142,9 +142,14 @@ struct nxbe_window_s FAR struct nxbe_window_s *above; /* The window "above" this window */ FAR struct nxbe_window_s *below; /* The window "below this one */ + /* Window geometry */ struct nxgl_rect_s bounds; /* The bounding rectangle of window */ struct nxgl_point_s origin; /* The position of the top-left corner of the window */ + + /* Client state information this is provide in window callbacks */ + + FAR void *arg; }; /* Back-end state ***********************************************************/ diff --git a/nuttx/graphics/nxmu/nx_eventhandler.c b/nuttx/graphics/nxmu/nx_eventhandler.c index a9ef438f0..830ff6f00 100644 --- a/nuttx/graphics/nxmu/nx_eventhandler.c +++ b/nuttx/graphics/nxmu/nx_eventhandler.c @@ -193,7 +193,7 @@ int nx_eventhandler(NXHANDLE handle) DEBUGASSERT(wnd); if (wnd->cb->redraw) { - wnd->cb->redraw((NXWINDOW)wnd, &redraw->rect, redraw->more); + wnd->cb->redraw((NXWINDOW)wnd, &redraw->rect, redraw->more, wnd->arg); } } break; @@ -205,7 +205,7 @@ int nx_eventhandler(NXHANDLE handle) DEBUGASSERT(wnd); if (wnd->cb->position) { - wnd->cb->position((NXWINDOW)wnd, &postn->size, &postn->pos, &postn->bounds); + wnd->cb->position((NXWINDOW)wnd, &postn->size, &postn->pos, &postn->bounds, wnd->arg); } } break; @@ -218,7 +218,7 @@ int nx_eventhandler(NXHANDLE handle) DEBUGASSERT(wnd); if (wnd->cb->mousein) { - wnd->cb->mousein((NXWINDOW)wnd, &mouse->pos, mouse->buttons); + wnd->cb->mousein((NXWINDOW)wnd, &mouse->pos, mouse->buttons, wnd->arg); } } break; @@ -232,7 +232,7 @@ int nx_eventhandler(NXHANDLE handle) DEBUGASSERT(wnd); if (wnd->cb->kbdin) { - wnd->cb->kbdin((NXWINDOW)wnd, kbd->nch, kbd->ch); + wnd->cb->kbdin((NXWINDOW)wnd, kbd->nch, kbd->ch, wnd->arg); } } break; diff --git a/nuttx/graphics/nxsu/nx_kbdchin.c b/nuttx/graphics/nxsu/nx_kbdchin.c index 37a357b42..27e588e8d 100644 --- a/nuttx/graphics/nxsu/nx_kbdchin.c +++ b/nuttx/graphics/nxsu/nx_kbdchin.c @@ -93,7 +93,7 @@ int nx_kbdchin(NXHANDLE handle, ubyte ch) if (wnd->cb->kbdin) { - wnd->kbdin(wnd, 1, &ch); + wnd->cb->kbdin(wnd, 1, &ch, wnd->arg); } } diff --git a/nuttx/graphics/nxsu/nx_kbdin.c b/nuttx/graphics/nxsu/nx_kbdin.c index c6f65eabb..3fe6a26c0 100644 --- a/nuttx/graphics/nxsu/nx_kbdin.c +++ b/nuttx/graphics/nxsu/nx_kbdin.c @@ -92,7 +92,7 @@ int int nx_kbdin(NXHANDLE handle, ubyte nch const char *ch) if (wnd->cb->kbdin) { - wnd->cb->kbdin(wnd, kbd->nch, kbd->ch); + wnd->cb->kbdin(wnd, kbd->nch, kbd->ch, wnd->arg); } } diff --git a/nuttx/graphics/nxsu/nx_mousein.c b/nuttx/graphics/nxsu/nx_mousein.c index 256d59da1..2ae753b94 100644 --- a/nuttx/graphics/nxsu/nx_mousein.c +++ b/nuttx/graphics/nxsu/nx_mousein.c @@ -107,7 +107,7 @@ void nxsu_mousereport(struct nxbe_window_s *wnd) if (win->cb->mousein) { - win->cb->mousein((NXWINDOW)wnd, &g_mpos, g_mbutton); + win->cb->mousein((NXWINDOW)wnd, &g_mpos, g_mbutton, wnd->arg); } } diff --git a/nuttx/graphics/nxsu/nx_open.c b/nuttx/graphics/nxsu/nx_open.c index 481a75e42..15efd3dbe 100644 --- a/nuttx/graphics/nxsu/nx_open.c +++ b/nuttx/graphics/nxsu/nx_open.c @@ -61,7 +61,8 @@ ****************************************************************************/ static void nxsu_bkgdredraw(NXWINDOW hwnd, - FAR const struct nxgl_rect_s *rect, boolean more); + FAR const struct nxgl_rect_s *rect, + boolean more, FAR void *arg); /**************************************************************************** * Private Data @@ -92,7 +93,8 @@ const struct nx_callback_s g_bkgdcb = ****************************************************************************/ static void nxsu_bkgdredraw(NXWINDOW hwnd, - FAR const struct nxgl_rect_s *rect, boolean more) + FAR const struct nxgl_rect_s *rect, + boolean more, FAR void *arg) { FAR struct nxbe_window_s *wnd = (FAR struct nxbe_window_s *)hwnd; FAR struct nxbe_state_s *be = wnd->be; diff --git a/nuttx/graphics/nxsu/nxsu_redrawreq.c b/nuttx/graphics/nxsu/nxsu_redrawreq.c index b7623f426..9952709c8 100644 --- a/nuttx/graphics/nxsu/nxsu_redrawreq.c +++ b/nuttx/graphics/nxsu/nxsu_redrawreq.c @@ -97,7 +97,7 @@ void nxfe_redrawreq(FAR struct nxbe_window_s *wnd, FAR const struct nxgl_rect_s /* And request the redraw */ - wnd->cb->redraw((NXWINDOW)wnd, &relrect, FALSE); + wnd->cb->redraw((NXWINDOW)wnd, &relrect, FALSE, wnd->arg); } } diff --git a/nuttx/graphics/nxsu/nxsu_reportposition.c b/nuttx/graphics/nxsu/nxsu_reportposition.c index 7c7bad751..9ad8197e6 100644 --- a/nuttx/graphics/nxsu/nxsu_reportposition.c +++ b/nuttx/graphics/nxsu/nxsu_reportposition.c @@ -102,6 +102,6 @@ void nxfe_reportposition(FAR struct nxbe_window_s *wnd) /* And provide this to the client */ - wnd->cb->position(wnd, &rect, &wnd->origin, &be->bkgd.bounds); + wnd->cb->position(wnd, &rect, &wnd->origin, &be->bkgd.bounds, wnd->arg); } } diff --git a/nuttx/include/nuttx/nx.h b/nuttx/include/nuttx/nx.h index 9f7b52dd8..12d13491d 100644 --- a/nuttx/include/nuttx/nx.h +++ b/nuttx/include/nuttx/nx.h @@ -101,13 +101,15 @@ struct nx_callback_s * rect - The rectangle that needs to be re-drawn (in window relative * coordinates * more - TRUE: More re-draw requests will follow + * arg - User provided argument (see nx_openwindow, nx_constructwindow) * * Returned Value: * None * **************************************************************************/ - void (*redraw)(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, boolean more); + void (*redraw)(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, + boolean more, FAR void *arg); /************************************************************************** * Name: position @@ -123,6 +125,7 @@ struct nx_callback_s * the overalll display * bounds - The bounding rectangle that the describes the entire * display + * arg - User provided argument (see nx_openwindow, nx_constructwindow) * * Returned Value: * None @@ -131,7 +134,8 @@ struct nx_callback_s void (*position)(NXWINDOW hwnd, FAR const struct nxgl_rect_s *size, FAR const struct nxgl_point_s *pos, - FAR const struct nxgl_rect_s *bounds); + FAR const struct nxgl_rect_s *bounds, + FAR void *arg); /************************************************************************** * Name: mousein @@ -143,6 +147,7 @@ struct nx_callback_s * hwnd - Window handle * pos - The (x,y) position of the mouse * buttons - See NX_MOUSE_* definitions + * arg - User provided argument (see nx_openwindow, nx_constructwindow) * * Returned Value: * None @@ -150,7 +155,8 @@ struct nx_callback_s **************************************************************************/ #ifdef CONFIG_NX_MOUSE - void (*mousein)(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, ubyte buttons); + void (*mousein)(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, + ubyte buttons, FAR void *arg); #endif /************************************************************************** @@ -163,6 +169,7 @@ struct nx_callback_s * hwnd - Window handle * nch - The number of characters that are available in ch[] * ch - The array of characters + * arg - User provided argument (see nx_openwindow, nx_constructwindow) * * Returned Value: * None @@ -170,7 +177,7 @@ struct nx_callback_s **************************************************************************/ #ifdef CONFIG_NX_KBD - void (*kbdin)(NXWINDOW hwnd, ubyte nch, const ubyte *ch); + void (*kbdin)(NXWINDOW hwnd, ubyte nch, const ubyte *ch, FAR void *arg); #endif }; @@ -390,6 +397,7 @@ EXTERN int nx_eventnotify(NXHANDLE handle, int signo); * Input Parameters: * handle - The handle returned by nx_connect * cb - Callbacks used to process window events + * arg - User provided value that will be returned with NX callbacks. * * Return: * Success: A non-NULL handle used with subsequent NX accesses @@ -398,7 +406,8 @@ EXTERN int nx_eventnotify(NXHANDLE handle, int signo); ****************************************************************************/ EXTERN NXWINDOW nx_openwindow(NXHANDLE handle, - FAR const struct nx_callback_s *cb); + FAR const struct nx_callback_s *cb, + FAR void *arg); /**************************************************************************** * Name: nx_closewindow