Tt_status dtexec_tttk_message_abandon( Tt_message msg ) { int fail; Tt_status status; if (dtexec_tttk_message_am_handling( msg )) { fail = 0; if (tt_message_address( msg ) == TT_HANDLER) { fail = 1; } else if (tt_message_status( msg ) == TT_WRN_START_MESSAGE) { fail = 1; } if (fail) { if (tt_message_class( msg ) == TT_REQUEST) { tt_message_status_set(msg, TT_DESKTOP_ENOTSUP); status = tt_message_fail( msg ); dtexec_tttk_message_destroy( msg ); } else { status = dtexec_tttk_message_destroy( msg ); } } else { tt_message_status_set( msg, TT_DESKTOP_ENOTSUP ); status = tt_message_reject( msg ); dtexec_tttk_message_destroy( msg ); } } else { status = dtexec_tttk_message_destroy( msg ); } return status; }
// // Parse a request and pass it to the user's contract callback. // Tt_message _ttdt_contract_cb( Tt_message msg, Tt_pattern pat, void *clientCB, void *clientData ) { Ttdt_contract_cb _cb = (Ttdt_contract_cb)clientCB; char *opString = tt_message_op( msg ); Tttk_op op = tttk_string_op( opString ); tt_free( opString ); Boolean sensitive = True; int silent, force; static Atom wmProtocols = 0; static Atom wmDeleteWindow = 0; switch (op) { Widget widget; Display *dpy; Window win; XClientMessageEvent ev; case TTDT_GET_STATUS: // Fill in the answers we know tt_message_arg_val_set( msg, 1, _ttdtme->vendor() ); tt_message_arg_val_set( msg, 2, _ttdtme->toolname() ); tt_message_arg_val_set( msg, 3, _ttdtme->version() ); break; case TTDT_QUIT: case TTDT_PAUSE: case TTDT_RESUME: if (_cb != 0) { break; } widget = _ttdt_realized_widget( clientData ); if (widget == 0) { tttk_message_fail( msg, TT_DESKTOP_ENOTSUP, 0, 0 ); return 0; } dpy = (Display *)CALLXT(XtDisplay)( widget ); win = CALLXT(XtWindow)( widget ); if (widget == 0) { tttk_message_fail( msg, TT_DESKTOP_ENOTSUP, 0, 0 ); return 0; } switch (op) { case TTDT_QUIT: silent = _tttk_message_arg_ival( msg, 0, 0 ); force = _tttk_message_arg_ival( msg, 0, 0 ); if (silent || force) { // // tttk cannot guarantee that the application // will neither block on user input nor // cancel the WM_DELETE_WINDOW // tttk_message_fail( msg, TT_DESKTOP_ENOTSUP, 0, 0 ); return 0; } ev.type = ClientMessage; ev.window = win; if (wmProtocols == 0) { wmProtocols = CALLX11(XInternAtom)( dpy, "WM_PROTOCOLS", False ); wmDeleteWindow = CALLX11(XInternAtom)( dpy, "WM_DELETE_WINDOW", False ); } ev.message_type = wmProtocols; ev.format = 32; ev.data.l[0] = wmDeleteWindow; ev.data.l[1] = 0; //XtLastTimestampProcessed? CALLX11(XSendEvent)( dpy, win, False, 0L, (XEvent*)&ev ); tt_message_reply( msg ); tt_message_destroy( msg ); return 0; case TTDT_PAUSE: sensitive = False; case TTDT_RESUME: if (CALLXT(XtIsSensitive)( widget ) == sensitive) { tt_message_status_set(msg,TT_DESKTOP_EALREADY); } else { CALLXT(XtSetSensitive)( widget, sensitive ); } tt_message_reply( msg ); tt_message_destroy( msg ); return 0; } break; } if (_cb == 0) { return msg; } return (*_cb)( msg, clientData, _tttk_pattern_contract( pat ) ); }