Example #1
0
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;
}
Example #2
0
//
// 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 ) );
}