diff --git a/graphics/nxmu/nx_eventhandler.c b/graphics/nxmu/nx_eventhandler.c index 136ff9b5ff..a9ef438f09 100644 --- a/graphics/nxmu/nx_eventhandler.c +++ b/graphics/nxmu/nx_eventhandler.c @@ -187,45 +187,53 @@ int nx_eventhandler(NXHANDLE handle) return ERROR; case NX_CLIMSG_REDRAW: - if (conn->cb->redraw) - { - FAR struct nxclimsg_redraw_s *redraw = (FAR struct nxclimsg_redraw_s *)buffer; - wnd = redraw->wnd; - DEBUGASSERT(wnd); - wnd->cb->redraw((NXWINDOW)wnd, &redraw->rect, redraw->more); - } + { + FAR struct nxclimsg_redraw_s *redraw = (FAR struct nxclimsg_redraw_s *)buffer; + wnd = redraw->wnd; + DEBUGASSERT(wnd); + if (wnd->cb->redraw) + { + wnd->cb->redraw((NXWINDOW)wnd, &redraw->rect, redraw->more); + } + } break; case NX_CLIMSG_NEWPOSITION: - if (conn->cb->position) - { - FAR struct nxclimsg_newposition_s *postn = (FAR struct nxclimsg_newposition_s *)buffer; - wnd = postn->wnd; - DEBUGASSERT(wnd); - wnd->cb->position((NXWINDOW)wnd, &postn->size, &postn->pos, &postn->bounds); - } + { + FAR struct nxclimsg_newposition_s *postn = (FAR struct nxclimsg_newposition_s *)buffer; + wnd = postn->wnd; + DEBUGASSERT(wnd); + if (wnd->cb->position) + { + wnd->cb->position((NXWINDOW)wnd, &postn->size, &postn->pos, &postn->bounds); + } + } break; #ifdef CONFIG_NX_KBD case NX_CLIMSG_MOUSEIN: - if (conn->cb->mousein) - { - FAR struct nxclimsg_mousein_s *mouse = (FAR struct nxclimsg_mousein_s *)buffer; - wnd = mouse->wnd; - DEBUGASSERT(wnd); - wnd->cb->mousein((NXWINDOW)wnd, &mouse->pos, mouse->buttons); + { + FAR struct nxclimsg_mousein_s *mouse = (FAR struct nxclimsg_mousein_s *)buffer; + wnd = mouse->wnd; + DEBUGASSERT(wnd); + if (wnd->cb->mousein) + { + wnd->cb->mousein((NXWINDOW)wnd, &mouse->pos, mouse->buttons); + } } break; #endif #ifdef CONFIG_NX_KBD case NX_CLIMSG_KBDIN: - if (conn->cb->kbdin) - { - FAR struct nxclimsg_kbdin_s *kbd = (FAR struct nxclimsg_kbdin_s *)buffer; - wnd = kbd->wnd; - DEBUGASSERT(wnd); - wnd->cb->kbdin((NXWINDOW)wnd, kbd->nch, kbd->ch); + { + FAR struct nxclimsg_kbdin_s *kbd = (FAR struct nxclimsg_kbdin_s *)buffer; + wnd = kbd->wnd; + DEBUGASSERT(wnd); + if (wnd->cb->kbdin) + { + wnd->cb->kbdin((NXWINDOW)wnd, kbd->nch, kbd->ch); + } } break; #endif diff --git a/graphics/nxmu/nx_eventnotify.c b/graphics/nxmu/nx_eventnotify.c index 9432f3361e..e722c0dcea 100644 --- a/graphics/nxmu/nx_eventnotify.c +++ b/graphics/nxmu/nx_eventnotify.c @@ -84,6 +84,9 @@ * client can then call nv_eventhandler() only when incoming events are * available. * + * Only one such event is issued. Upon receipt of the signal, if the client + * wishes further notifications, it must call nx_eventnotify again. + * * Input Parameters: * handle - the handle returned by nx_connect * diff --git a/graphics/nxmu/nx_openwindow.c b/graphics/nxmu/nx_openwindow.c index 03fa9786b4..8a834d4ba5 100644 --- a/graphics/nxmu/nx_openwindow.c +++ b/graphics/nxmu/nx_openwindow.c @@ -111,12 +111,17 @@ NXWINDOW nx_openwindow(NXHANDLE handle, FAR const struct nx_callback_s *cb) return NULL; } + /* Setup only the connection structure. We'll need this to communicate with + * the server. The server will set everything else up. + */ + + wnd->conn = conn; + wnd->cb = cb; + /* Request initialization the new window from the server */ outmsg.msgid = NX_SVRMSG_OPENWINDOW; - outmsg.conn = conn; outmsg.wnd = wnd; - outmsg.cb = cb; ret = mq_send(conn->cwrmq, &outmsg, sizeof(struct nxsvrmsg_openwindow_s), NX_SVRMSG_PRIO); if (ret < 0) diff --git a/graphics/nxmu/nxfe.h b/graphics/nxmu/nxfe.h index 88ea878302..50cf50b099 100644 --- a/graphics/nxmu/nxfe.h +++ b/graphics/nxmu/nxfe.h @@ -110,7 +110,6 @@ struct nxfe_conn_s mqd_t crdmq; /* MQ to read from the server (may be non-blocking) */ mqd_t cwrmq; /* MQ to write to the server (blocking) */ - FAR const struct nx_callback_s *cb; /* Message handling callbacks */ /* These are only usable on the server side of the connection */ @@ -179,16 +178,27 @@ enum nxmsg_e /* Server-to-Client Message Structures **************************************/ -/* The generic message structure. All messages begin with this form. Also, messages - * that have no data other than the msgid event use this structure. This includes: - * NX_CLIMSG_CONNECTED and NX_CLIMSG_DISCONNECTED. - */ +/* The generic message structure. All messages begin with this form. */ struct nxclimsg_s { uint32 msgid; /* Any of nxclimsg_e */ }; +/* The server is now connected */ + +struct nxclimsg_connected_s +{ + uint32 msgid; /* NX_CLIMSG_REDRAW_CONNECTED */ +}; + +/* The server is now disconnected */ + +struct nxclimsg_disconnected_s +{ + uint32 msgid; /* NX_CLIMSG_REDRAW_DISCONNECTED */ +}; + /* This message is received when a requested window has been opened. If wnd is NULL * then errorcode is the errno value that provides the explanation of the error. */ @@ -254,9 +264,7 @@ struct nxsvrmsg_s /* Generic server message */ struct nxsvrmsg_openwindow_s { uint32 msgid; /* NX_SVRMSG_OPENWINDOW */ - FAR struct nxfe_conn_s *conn; /* The specific connection sending the message */ FAR struct nxbe_window_s *wnd; /* The pre-allocated window structure */ - FAR const struct nx_callback_s *cb; /* Event handling callbacks */ }; /* This message informs the server that client wishes to close a window */ @@ -442,8 +450,7 @@ EXTERN void nxmu_semtake(sem_t *sem); * Create a new window. * * Input Parameters: - * conn - The client containing connection information [IN] - * svr - The server state structure [IN] + * be - The back-end status structure * wnd - The pre-allocated window structure to be ininitilized [IN/OUT] * * Return: @@ -451,10 +458,8 @@ EXTERN void nxmu_semtake(sem_t *sem); * ****************************************************************************/ -EXTERN void nxmu_openwindow(FAR struct nxfe_conn_s *conn, - FAR struct nxbe_state_s *be, - FAR struct nxbe_window_s *wnd, - FAR const struct nx_callback_s *cb); +EXTERN void nxmu_openwindow(FAR struct nxbe_state_s *be, + FAR struct nxbe_window_s *wnd); /**************************************************************************** * Name: nxmu_requestbkgd @@ -565,7 +570,7 @@ EXTERN nxmu_mousein(FAR struct nxfe_state_s *fe, ****************************************************************************/ #ifdef CONFIG_NX_KBD -EXTERN void nxmu_kbdin(FAR struct nxs_server_s *svr, ubyte nch, ubyte *ch); +EXTERN void nxmu_kbdin(FAR struct nxfe_state_s *fe, ubyte nch, ubyte *ch); #endif #undef EXTERN diff --git a/graphics/nxmu/nxmu_openwindow.c b/graphics/nxmu/nxmu_openwindow.c index 13a69d4665..a458bc6762 100644 --- a/graphics/nxmu/nxmu_openwindow.c +++ b/graphics/nxmu/nxmu_openwindow.c @@ -74,29 +74,23 @@ * Create a new window. * * Input Parameters: - * conn - The client containing connection information [IN] - * be - The server state structure [IN] + * be - The back-end status structure * wnd - The pre-allocated window structure to be ininitilized [IN/OUT] - * cb - Callbacks used to process window events * * Return: * None * ****************************************************************************/ -void nxmu_openwindow(FAR struct nxfe_conn_s *conn, - FAR struct nxbe_state_s *be, - FAR struct nxbe_window_s *wnd, - FAR const struct nx_callback_s *cb) +void nxmu_openwindow(FAR struct nxbe_state_s *be, FAR struct nxbe_window_s *wnd) { /* The window structure was allocated in nx_openwindow and all fields have - * been set to zero (except sem... see below). We need only initialize the - * the non zero fields and insert the new window. + * been set to zero cb and conn which were initialized on the client side. + * On the server side, we need only initialize a few more the non zero fields + * and insert the new window at the top of the display. */ wnd->be = be; - wnd->conn = conn; - wnd->cb = cb; /* Now, insert the new window at the top on the display. topwind is * never NULL (it may point only at the background window, however) diff --git a/graphics/nxmu/nxmu_server.c b/graphics/nxmu/nxmu_server.c index d9e7eb5a69..1cefed621e 100644 --- a/graphics/nxmu/nxmu_server.c +++ b/graphics/nxmu/nxmu_server.c @@ -80,14 +80,14 @@ static inline void nxmu_disconnect(FAR struct nxfe_conn_s *conn) { - struct nxclimsg_s outmsg; - int ret; + struct nxclimsg_disconnected_s outmsg; + int ret; /* Send the handshake message back to the client */ outmsg.msgid = NX_CLIMSG_DISCONNECTED; - ret = mq_send(conn->swrmq, &outmsg, sizeof(struct nxclimsg_s), NX_CLIMSG_PRIO); + ret = mq_send(conn->swrmq, &outmsg, sizeof(struct nxclimsg_disconnected_s), NX_CLIMSG_PRIO); if (ret < 0) { gdbg("mq_send failed: %d\n", errno); @@ -104,9 +104,9 @@ static inline void nxmu_disconnect(FAR struct nxfe_conn_s *conn) static inline void nxmu_connect(FAR struct nxfe_conn_s *conn) { - char mqname[NX_CLIENT_MXNAMELEN]; - struct nxclimsg_s outmsg; - int ret; + char mqname[NX_CLIENT_MXNAMELEN]; + struct nxclimsg_connected_s outmsg; + int ret; /* Create the client MQ name */ @@ -114,7 +114,6 @@ static inline void nxmu_connect(FAR struct nxfe_conn_s *conn) /* Open the client MQ -- this should have already been created by the client */ - outmsg.msgid = NX_CLIMSG_CONNECTED; conn->swrmq = mq_open(mqname, O_WRONLY); if (conn->swrmq == (mqd_t)-1) { @@ -124,7 +123,9 @@ static inline void nxmu_connect(FAR struct nxfe_conn_s *conn) /* Send the handshake message back to the client */ - ret = mq_send(conn->swrmq, &outmsg, sizeof(struct nxclimsg_s), NX_CLIMSG_PRIO); + outmsg.msgid = NX_CLIMSG_CONNECTED; + + ret = mq_send(conn->swrmq, &outmsg, sizeof(struct nxclimsg_connected_s), NX_CLIMSG_PRIO); if (ret < 0) { gdbg("mq_send failed: %d\n", errno); @@ -376,7 +377,7 @@ int nx_runinstance(FAR const char *mqname, FAR struct fb_vtable_s *fb) case NX_SVRMSG_OPENWINDOW: /* Create a new window */ { FAR struct nxsvrmsg_openwindow_s *openmsg = (FAR struct nxsvrmsg_openwindow_s *)buffer; - nxmu_openwindow(openmsg->conn, &fe.be, openmsg->wnd, openmsg->cb); + nxmu_openwindow(&fe.be, openmsg->wnd); } break; diff --git a/graphics/nxsu/nx_releasebkgd.c b/graphics/nxsu/nx_releasebkgd.c index 7035898a14..d73cd1e501 100644 --- a/graphics/nxsu/nx_releasebkgd.c +++ b/graphics/nxsu/nx_releasebkgd.c @@ -85,7 +85,7 @@ * ****************************************************************************/ -void nx_releasebkgd(NXWINDOW hwnd) +int nx_releasebkgd(NXWINDOW hwnd) { FAR struct nxfe_state_s *fe = (FAR struct nxfe_state_s *)hwnd; FAR struct nxbe_state_s *be = &fe->be; diff --git a/include/nuttx/nx.h b/include/nuttx/nx.h index e54d0f06b3..9f7b52dd82 100644 --- a/include/nuttx/nx.h +++ b/include/nuttx/nx.h @@ -227,10 +227,15 @@ EXTERN int nx_runinstance(FAR const char *mqname, FAR struct fb_vtable_s *fb); * connection is normally needed per thread as each connection can host * multiple windows. * - * NOTE that multiple instances of the NX server may run at the same time, - * each with different message queue names. nx_connect() is simply - * a macro that can be used when only one server instance is required. In - * that case, a default server name is used. + * NOTES: + * - This function returns before the connection is fully instantiated. + * it is necessary to wait for the connection event before using the + * returned handle. + * - Multiple instances of the NX server may run at the same time, + * each with different message queue names. + * - nx_connect() is simply a macro that can be used when only one + * server instance is required. In that case, a default server name + * is used. * * Multiple user mode only! * @@ -357,6 +362,9 @@ EXTERN int nx_eventhandler(NXHANDLE handle); * client can then call nv_eventhandler() only when incoming events are * available. * + * Only one such event is issued. Upon receipt of the signal, if the client + * wishes further notifications, it must call nx_eventnotify again. + * * Input Parameters: * handle - the handle returned by nx_connect *