Example #1
0
//
// Add commission id and register in session, if appropriate
//
Tt_pattern
_ttDesktopPatternFinish(
	Tt_pattern	pat,
	Tt_message	commission,
	int		register_it
)
{
	_TttkItem2Free fuse = pat;
	Tt_status status;
	if (commission != 0) {
		char *id = _tttk_message_id( commission );
		status = tt_pattern_arg_add( pat, TT_IN, Tttk_message_id, id );
		tt_free( id );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		tt_pattern_user_set( pat, _TttkContractKey, commission );
	}
	if (register_it) {
		status = tt_pattern_register( pat );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
	}
	fuse = (caddr_t)0;
	return pat;
}
Example #2
0
//
// Create and optionally send a {GS}et_Iconified request or edict
//
static Tt_message
_ttdt_GSet_Iconified(
	Tttk_op			op,
	const char	       *handler,
	Tt_message		commission,
	Tt_class		theClass,
	Ttdt_Iconified_in_cb	callback,
	void		       *clientdata,
	int			iconified,
	int			send
)
{
	Tt_message msg = _ttDesktopMessageCreate( commission, theClass,
				handler, op, _ttdt_Iconified_in_cb,
				(void *)callback, clientdata );
	Tt_status status = tt_ptr_error( msg );
	if (status != TT_OK) {
		return msg;
	}
	_TttkItem2Free fuse = msg;
	if (op == TTDT_GET_ICONIFIED) {
		status = tt_message_arg_add( msg, TT_OUT, Tttk_boolean, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	} else {
		status = tt_message_iarg_add( msg, TT_IN, Tttk_boolean,
					      iconified );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}
	fuse = (caddr_t)0;
	return _ttDesktopMessageFinish( msg, commission, send );
}
Example #3
0
//
// Add commission id and send, if appropriate
//
Tt_message
_ttDesktopMessageFinish(
	Tt_message		msg,
	Tt_message		commission,
	int			send
)
{
	_TttkItem2Free fuse = msg;
	Tt_status status;
	if (commission != 0) {
		char *id = _tttk_message_id( commission );
		status = tt_message_arg_add( msg, TT_IN, Tttk_message_id, id );
		tt_free( id );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}
	if (send) {
		status = tt_message_send( msg );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}
	fuse = (caddr_t)0;
	return msg;
}
Example #4
0
//
// If clientCB is 0, uses _ttDtApplyLocale, q.v. re clientData.
//
Tt_message
ttdt_Get_Locale(
	const char         *handler,
	Tt_message	    commission,
	Ttdt_Get_Locale_msg_cb  clientCB,
	void		   *clientData,
	const char        **categories,
	int                 send
)
{
	const char *_handler = handler;
	if ((handler == 0) && (commission != 0)) {
		_handler = tt_message_sender( commission );
	}
	if (clientCB == 0) {
		clientCB = _ttDtApplyLocale;
	}
	Tt_message msg = _ttDtPMessageCreate( commission, TT_REQUEST,
				TT_SESSION, handler,
				TTDT_GET_LOCALE, _ttDtGetLocaleCB, (void *)clientCB,
				clientData );
	Tt_status status = tt_ptr_error( msg );
	if (status != TT_OK) {
		return msg;
	}
	//
	// Guarantees that msg will be destroyed when this function returns
	//
	_TttkItem2Free fuse = msg;
	const char **_cats = categories;
	if (_cats == 0) {
		_cats = _Tt_categories;
	}
	while (*_cats != 0) {
		status = tt_message_arg_add( msg, TT_IN, Tttk_string, *_cats );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_arg_add( msg, TT_OUT, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		_cats++;
	}
	if (send) {
		status = tt_message_send( msg );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}
	fuse = (caddr_t)0;
	return msg;
}
Example #5
0
static Tt_message
_ttDtStarted(
	Tttk_op		op,
	Tt_message	context,
	const char     *toolName,
	const char     *vendor,
	const char     *version,
	int		sendAndDestroy
)
{
	Tt_message msg = tttk_message_create( context, TT_NOTICE, TT_SESSION, 0,
					      _ttDtOp( op ), 0 );
	Tt_status status = tt_ptr_error( msg );
	if (status != TT_OK) {
		return msg;
	}
	tt_message_arg_add( msg, TT_IN, Tttk_string, toolName );
	tt_message_arg_add( msg, TT_IN, Tttk_string, vendor );
	tt_message_arg_add( msg, TT_IN, Tttk_string, version );
	if (! sendAndDestroy) {
		return msg;
	}
	status = tt_message_send( msg );
	if (status != TT_OK) {
		tttk_message_destroy( msg );
		return (Tt_message)tt_error_pointer( status );
	}
	tttk_message_destroy( msg );
	return 0;
}
Example #6
0
//
// Parse {GS}et_XInfo request, pass it to user callback,
// and optionally fill in and send the reply.
//
static Tt_message
_ttdt_XInfo_out_cb(
	Tt_message	msg,
	Tt_pattern	pat,
	void	       *clientCB,
	void	       *clientData
)
{
	_TttkItem2Free fuse = msg;
	char *display = _tttk_message_arg_val( msg, 0, 0 );
	char *_visual = _tttk_message_arg_val( msg, 1, 0 );
	int visual = _ttDtVisual( _visual );
	tt_free( _visual );
	int depth = _tttk_message_arg_ival( msg, 2, 1 );
	Ttdt_XInfo_out_cb _cb = (Ttdt_XInfo_out_cb)clientCB;
	msg = (*_cb)( msg, clientData, _tttk_pattern_contract( pat ),
		      &display, &visual, &depth );
	Tt_status status = tt_ptr_error( msg );
	if ((status != TT_OK) || (msg == 0)) {
		// user already replied or failed, and destroyed
		fuse = (caddr_t)0;
		return msg;
	}
	tt_message_arg_val_set( msg, 0, display );
	tt_message_arg_val_set( msg, 1, _ttDtVisualString( visual ));
	tt_message_arg_ival_set( msg, 2, depth );
	status = _tttk_message_reply( msg );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}
	return 0;
}
Example #7
0
//
// Parse {GS}et_Iconified request, pass it to user callback,
// and optionally fill in and send the reply.
//
static Tt_message
_ttdt_Iconified_out_cb(
	Tt_message	msg,
	Tt_pattern	pat,
	void	       *clientCB,
	void	       *clientData
)
{
	_TttkItem2Free fuse = msg;
	int iconified = _tttk_message_arg_ival( msg, 0, 0 );
	Ttdt_Iconified_out_cb _cb = (Ttdt_Iconified_out_cb)clientCB;
	msg = (*_cb)( msg, clientData, _tttk_pattern_contract( pat ),
		      &iconified );
	Tt_status status = tt_ptr_error( msg );
	if ((status != TT_OK) || (msg == 0)) {
		// user already replied or failed, and destroyed
		fuse = (caddr_t)0;
		return msg;
	}
	tt_message_arg_ival_set( msg, 0, iconified );
	status = _tttk_message_reply( msg );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}
	return 0;
}
Example #8
0
//
// Parse Get_Locale reply and pass it to user callback.
// Also used to parse Set_Locale request and pass it to _ttDtApplyLocale().
//
Tt_message
_ttDtGetLocaleCB(
	Tt_message	msg,
	Tt_pattern	,
	void	       *clientCB,
	void	       *clientData
)
{
	_TttkItem2Free fuse = msg;
	int numArgs = tt_message_args_count( msg );
	Tt_status status = tt_int_error( numArgs );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}
	_TttkList2Free fuses( numArgs + 2 );
	int n = numArgs / 2;
	char **categories = (char **)tt_malloc( (n + 1) * sizeof(char *) );
	char **locales    = (char **)tt_malloc( (n + 1) * sizeof(char *) );
	categories[ n ]   = 0;
	locales[    n ]   = 0;
	//
	// We only need these guys until after we call clientCB
	//
	fuses += (caddr_t)categories;
	fuses += (caddr_t)locales;
	for (int i = 0; i < n; i++) {
		categories[i] = tt_message_arg_val( msg, 2 * i );
		status = tt_ptr_error( categories[i] );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		fuses += categories[i];
		locales[i] = tt_message_arg_val( msg, 2 * i + 1 );
		status = tt_ptr_error( locales[i] );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		fuses += locales[i];
	}
	fuse = (caddr_t)0; // aborts message destruction
	Ttdt_Get_Locale_msg_cb _cb = (Ttdt_Get_Locale_msg_cb)clientCB;
	return (*_cb)( msg, clientData,
		       (const char **)categories,
		       (const char **)locales );
}
Example #9
0
//
// If clientCB is 0, uses _ttDtApplySituation, q.v. re clientData.
//
Tt_message
ttdt_Get_Situation(
	const char     *handler,
	Tt_message	commission,
	Ttdt_Get_Situation_msg_cb	clientCB,
	void	       *clientData,
	int		send
)
{
	const char *_handler = handler;
	if ((handler == 0) && (commission != 0)) {
		_handler = tt_message_sender( commission );
	}
	if (clientCB == 0) {
		clientCB = _ttDtApplySituation;
	}
	Tt_message msg = _ttDtPMessageCreate( commission, TT_REQUEST,
				TT_SESSION, _handler,
				TTDT_GET_SITUATION, _ttDtGetSituationCB,
				(void *)clientCB, clientData );
	Tt_status status = tt_ptr_error( msg );
	if (status != TT_OK) {
		return msg;
	}
	//
	// Guarantees that msg will be destroyed when this function returns
	//
	_TttkItem2Free fuse = msg;
	status = tt_message_arg_add( msg, TT_OUT, Tttk_string, 0 );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}
	if (send) {
		status = tt_message_send( msg );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}
	fuse = (caddr_t)0;
	return msg;
}
Example #10
0
//
// Create and optionally send a {GS}et_XInfo request or edict
//
static Tt_message
_ttdt_GSet_XInfo(
	Tttk_op			op,
	const char	       *handler,
	Tt_message		commission,
	Tt_class		theClass,
	Ttdt_XInfo_in_cb	callback,
	void		       *clientdata,
	const char	       *display,
	int			visual,
	int			depth,
	int			send
)
{
	Tt_message msg = _ttDesktopMessageCreate( commission, theClass,
				handler, op, _ttdt_XInfo_in_cb,
				(void *)callback, clientdata );
	Tt_status status = tt_ptr_error( msg );
	if (status != TT_OK) {
		return msg;
	}
	_TttkItem2Free fuse = msg;
	if (op == TTDT_GET_XINFO) {
		status = tt_message_arg_add( msg, TT_OUT, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_arg_add( msg, TT_OUT, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_arg_add( msg, TT_OUT, Tttk_integer, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	} else {
		status = tt_message_arg_add( msg, TT_IN, Tttk_string, display);
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_arg_add( msg, TT_IN, Tttk_string,
					     _ttDtVisualString( visual ));
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_iarg_add( msg, TT_INOUT, Tttk_integer,
					      depth );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}
	fuse = (caddr_t)0;
	return _ttDesktopMessageFinish( msg, commission, send );
}
Example #11
0
//
// Parse {GS}et_Geometry request, pass it to user callback,
// and optionally fill in and send the reply.
//
static Tt_message
_ttdt_Geometry_out_cb(
	Tt_message	msg,
	Tt_pattern	pat,
	void	       *clientCB,
	void	       *clientData
)
{
	_TttkItem2Free fuse = msg;
	int width   = _tttk_message_arg_ival( msg, 0, -1 );
	int height  = _tttk_message_arg_ival( msg, 1, -1 );
	int xOffset = _tttk_message_arg_ival( msg, 2, INT_MAX );
	int yOffset = _tttk_message_arg_ival( msg, 3, INT_MAX );
	Ttdt_Geometry_out_cb _cb = (Ttdt_Geometry_out_cb)clientCB;
	Tt_message contract = _tttk_pattern_contract( pat );
	msg = (*_cb)( msg, clientData, contract, &width, &height, &xOffset,
		      &yOffset );
	Tt_status status = tt_ptr_error( msg );
	if ((status != TT_OK) || (msg == 0)) {
		// user already replied or failed, and destroyed
		fuse = (caddr_t)0;
		return msg;
	}
	if (width != -1) {
		tt_message_arg_ival_set( msg, 0, width );
	}
	if (height != -1) {
		tt_message_arg_ival_set( msg, 1, height );
	}
	if (xOffset != INT_MAX) {
		tt_message_arg_ival_set( msg, 2, xOffset );
	}
	if (yOffset != INT_MAX) {
		tt_message_arg_ival_set( msg, 3, yOffset );
	}
	status = _tttk_message_reply( msg );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}
	return 0;
}
Example #12
0
//
// Parse Get_Situation reply and pass it to user callback
//
static Tt_message
_ttDtGetSituationCB(
	Tt_message	msg,
	Tt_pattern	,
	void	       *clientCB,
	void	       *clientData
)
{
	if (! _tttk_message_in_final_state( msg )) {
		// Not in final state; our address space is probably handler
		return msg;
	}
	_TttkItem2Free fuse = msg;
	char *cwd = tt_message_arg_val( msg, 0 );
	Tt_status status = tt_ptr_error( cwd );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}
	Ttdt_Get_Situation_msg_cb _cb = (Ttdt_Get_Situation_msg_cb)clientCB;
	msg = (*_cb)( msg, clientData, cwd );
	fuse = (caddr_t)0; // prevent message destruction
	return msg;
}
Example #13
0
//
// Create patterns for either session_join or message_accept
//
Tt_pattern *_TtDtProcid::
pats_create(
	Tt_message	contract,
	Ttdt_contract_cb cb,
	Widget		shell,
	void	       *clientData
) const
{
	int numPats = 11;
	if (contract == 0) {
		numPats = 13;
	}
	Tt_pattern *pats = (Tt_pattern *)malloc(numPats * sizeof(Tt_pattern));
	if (pats == 0) {
		return (Tt_pattern *)tt_error_pointer( TT_ERR_NOMEM );
	}
	int i = -1;
	char *sess = tt_default_session();
	if (shell != 0) {
		pats[++i] = ttdt_Get_Geometry_pat( TT_HANDLE, contract,
				_ttdt_do_GSet_Geometry, shell, 1 );
		pats[++i] = ttdt_Set_Geometry_pat( TT_HANDLE, contract,
				_ttdt_do_GSet_Geometry, shell, 1 );
		pats[++i] = ttdt_Get_Iconified_pat( TT_HANDLE, contract,
				_ttdt_do_wm_state, shell, 0 );
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_MAPPED ) );
		tt_pattern_session_add( pats[i], sess );
		tt_pattern_register( pats[i] );
		pats[++i] = ttdt_Set_Iconified_pat( TT_HANDLE, contract,
				_ttdt_do_wm_state, shell, 0 );
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_MAPPED ) );
		tt_pattern_session_add( pats[i], sess );
		tt_pattern_register( pats[i] );
		pats[++i] = ttdt_Get_XInfo_pat(	TT_HANDLE, contract,
				_ttdt_do_Get_XInfo, shell, 1 );
		pats[++i] = ttdt_Set_XInfo_pat(	TT_HANDLE, contract,
				_ttdt_do_Set_XInfo, shell, 1 );
		pats[++i] = _ttdt_pat(TTDT_RAISE, _ttdt_contract_cb, TT_HANDLE,
				contract, (void *)_ttdt_do_RaiseLower, shell, 0 );
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_LOWER ) );
		tt_pattern_session_add( pats[i], sess );
		tt_pattern_register( pats[i] );
	} else {
		pats[++i] = ttdt_Get_Geometry_pat( TT_HANDLE, contract,
				(Ttdt_Geometry_out_cb)cb, clientData, 1 );
		pats[++i] = ttdt_Set_Geometry_pat( TT_HANDLE, contract,
				(Ttdt_Geometry_out_cb)cb, clientData, 1 );
		pats[++i] = ttdt_Get_Iconified_pat( TT_HANDLE, contract,
				(Ttdt_Iconified_out_cb)cb, clientData, 0 );
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_MAPPED ) );
		tt_pattern_session_add( pats[i], sess );
		tt_pattern_register( pats[i] );
		pats[++i] = ttdt_Set_Iconified_pat( TT_HANDLE, contract,
				(Ttdt_Iconified_out_cb)cb, clientData, 0 );
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_MAPPED ) );
		tt_pattern_session_add( pats[i], sess );
		tt_pattern_register( pats[i] );
		pats[++i] = ttdt_Get_XInfo_pat(	TT_HANDLE, contract,
				(Ttdt_XInfo_out_cb)cb, clientData, 1 );
		pats[++i] = ttdt_Set_XInfo_pat(	TT_HANDLE, contract,
				(Ttdt_XInfo_in_cb)cb, clientData, 1 );
		pats[++i] = _ttdt_pat(TTDT_RAISE, _ttdt_contract_cb, TT_HANDLE,
				contract, (void *)cb, clientData, 0 );
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_LOWER ) );
		tt_pattern_session_add( pats[i], sess );
		tt_pattern_register( pats[i] );
	}
	void *_clientData = clientData;
	if (cb == 0) {
		// No callback, so set up our own client data
		if (contract == 0) {
			// tttk will send WM_DELETE_WINDOW to shell...
			_clientData = shell;
		} else {
			// ...but that quits entire app, so do not do it
			// for ttdt_message_accept().  Seeing no shell,
			// _ttdt_contract_cb() will fail the Quit.
			_clientData = 0;
		}
	}
	pats[++i] = _ttdt_pat(	TTDT_QUIT, _ttdt_contract_cb, TT_HANDLE,
				contract, (void *)cb, _clientData, 1 );
	pats[++i] = _ttdt_pat(	TTDT_PAUSE, _ttdt_contract_cb, TT_HANDLE,
				contract, (void *)cb, (cb ? clientData : shell), 0 );
	tt_pattern_op_add( pats[i], _ttDtOp( TTDT_RESUME ));
	tt_pattern_session_add( pats[i], sess );
	tt_pattern_register( pats[i] );
	pats[++i] = _ttdt_pat(	TTDT_GET_STATUS, _ttdt_contract_cb, TT_HANDLE,
				contract, (void *)cb, clientData, 1 );
	if (contract == 0) {
		pats[++i]= _ttdt_pat( TTDT_DO_COMMAND, _ttdt_contract_cb,
				      TT_HANDLE, contract, (void *)cb, clientData, 1 );
		pats[++i]= _ttdt_pat( TTDT_SET_LOCALE, _ttdt_posix_cb,
				      TT_HANDLE, contract, 0, 0, 0 );
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_LOCALE ));
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_ENVIRONMENT ));
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_ENVIRONMENT ));
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_SITUATION ));
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_SITUATION ));
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SIGNAL ));
		tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_SYSINFO ));
		tt_pattern_session_add( pats[i], sess );
		tt_pattern_register( pats[i] );
	}
	pats[++i] = 0;
	Tt_pattern *pat = pats;
	while (*pat != 0) {
		Tt_status status = tt_ptr_error( *pat );
		if (status != TT_OK) {
			_tttk_patterns_destroy( pats );
			return (Tt_pattern *)tt_error_pointer( status );
		}
		pat++;
	}
	tt_free( sess );
	return pats;
}
Example #14
0
Tt_message
dtexec_tttk_message_create(
	Tt_message		context,
	Tt_class		theClass,
	Tt_scope		theScope,
	const char	       *handler,
	const char	       *op,
	Tt_message_callback	callback
)
{
	Tt_message msg;
	Tt_address address;
	Tt_status status;


	msg = tt_message_create();
	status = tt_ptr_error( msg );
	if (status != TT_OK) {
		return msg;
	}

	status = tt_message_class_set( msg, theClass );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}

	status = tt_message_scope_set( msg, theScope );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}

	address = TT_PROCEDURE;
	if (handler != 0) {
		status = tt_message_handler_set( msg, handler );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		address = TT_HANDLER;
	}

	status = tt_message_address_set( msg, address );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}

	if (op != 0) {
		status = tt_message_op_set( msg, op );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}

	if (callback != 0) {
		status = tt_message_callback_add( msg, callback );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}

	return msg;
}
Example #15
0
//
// Create and optionally send a {GS}et_Geometry request or edict
//
static Tt_message
_ttdt_GSet_Geometry(
	Tttk_op			op,
	const char	       *handler,
	Tt_message		commission,
	Tt_class		theClass,
	Ttdt_Geometry_in_cb	callback,
	void		       *clientdata,
	int			w,
	int			h,
	int			x,
	int			y,
	int			send
)
{
	Tt_message msg = _ttDesktopMessageCreate( commission, theClass,
				handler, op, _ttdt_Geometry_in_cb,
				(void *)callback, clientdata );
	Tt_status status = tt_ptr_error( msg );
	if (status != TT_OK) {
		return msg;
	}
	_TttkItem2Free fuse = msg;
	if (op == TTDT_GET_GEOMETRY) {
		status = tt_message_arg_add( msg, TT_OUT, Tttk_width, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_arg_add( msg, TT_OUT, Tttk_height, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_arg_add( msg, TT_OUT, Tttk_xoffset, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_arg_add( msg, TT_OUT, Tttk_yoffset, 0 );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	} else {
		status = tt_message_iarg_add( msg, TT_INOUT, Tttk_width, w );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_iarg_add( msg, TT_INOUT, Tttk_height, h );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_iarg_add( msg, TT_INOUT, Tttk_xoffset, x );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
		status = tt_message_iarg_add( msg, TT_INOUT, Tttk_yoffset, y );
		if (status != TT_OK) {
			return (Tt_message)tt_error_pointer( status );
		}
	}
	fuse = (caddr_t)0;
	return _ttDesktopMessageFinish( msg, commission, send );
}
Example #16
0
//
// Create a pattern for a desktop message
//
Tt_pattern
_ttdt_pat(
	Tttk_op			op,
	_TtDtMessageCB		internalCB,
	Tt_category		category,
	Tt_message		commission,
	void		       *clientCB,
	void		       *clientdata,
	int			register_it
)
{
	Tt_pattern pat = _ttDtPatternCreate( category, TT_SESSION,
					     register_it, 0, op,
					     internalCB, clientCB,
					     clientdata, 0 );
	Tt_status status = tt_ptr_error( pat );
	if (status != TT_OK) {
		return pat;
	}
	_TttkItem2Free fuse = pat;
	Tt_mode mode = TT_OUT;
	switch (op) {
	    case TTDT_SET_XINFO:
		mode = TT_IN;
	    case TTDT_GET_XINFO:
		status = tt_pattern_arg_add( pat, mode, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_integer, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		break;
	    case TTDT_SET_GEOMETRY:
		mode = TT_INOUT;
	    case TTDT_GET_GEOMETRY:
		status = tt_pattern_arg_add( pat, mode, Tttk_width, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_height, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_xoffset, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_yoffset, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		break;
	    case TTDT_SET_ICONIFIED:
		mode = TT_IN;
	    case TTDT_GET_ICONIFIED:
		status = tt_pattern_arg_add( pat, mode, Tttk_boolean, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		break;
	    case TTDT_QUIT:
		status = tt_pattern_arg_add( pat, TT_IN, Tttk_boolean, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, TT_IN, Tttk_boolean, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		break;
	    case TTDT_STATUS:
		mode = TT_IN;
	    case TTDT_GET_STATUS:
		status = tt_pattern_arg_add( pat, mode, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, mode, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		break;
	    case TTDT_DO_COMMAND:
		status = tt_pattern_arg_add( pat, TT_IN, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		status = tt_pattern_arg_add( pat, TT_OUT, Tttk_string, 0 );
		if (status != TT_OK) {
			return (Tt_pattern)tt_error_pointer( status );
		}
		break;
	    case TTDT_PAUSE:
	    case TTDT_RESUME:
		// No args
		break;
	}
	fuse = (caddr_t)0;
	return _ttDesktopPatternFinish( pat, commission, register_it );
}
Example #17
0
//
// Handle a POSIX-related Desktop request
//
Tt_message
_ttdt_posix_cb(
	Tt_message	msg,
	Tt_pattern	pat,
	void	       *,
	void	       *
)
{	char *opString = tt_message_op( msg );
	Tttk_op op = tttk_string_op( opString );
	tt_free( opString );
	int numArgs = tt_message_args_count( msg );
	Tt_status status = tt_int_error( numArgs );
	if (status != TT_OK) {
		return (Tt_message)tt_error_pointer( status );
	}
	switch (op) {
		char	       *categoryName, *variable, *value;
		int		category, i;
		struct utsname	names;
#if defined(OPT_SYSINFO)		
		char		buf[ SYS_NMLN ];
#endif
	    case TTDT_SET_LOCALE:
		return _ttDtGetLocaleCB( msg, pat, (void *)_ttDtApplyLocale, 0 );
	    case TTDT_GET_LOCALE:
		for (i = 0; i < numArgs/2; i++) {
			categoryName = _tttk_message_arg_val( msg, 2 * i, 0 );
			if (categoryName == 0) {
				continue;
			}
			category = _ttDtCategory( categoryName );
			if (category > 0) {
				tt_message_arg_val_set( msg, 2 * i + 1,
						setlocale( category, 0 ));
			}
			tt_free( categoryName );
		}
		tt_message_reply( msg );
		tttk_message_destroy( msg );
		return 0;
	    case TTDT_SET_ENVIRONMENT:
	    case TTDT_GET_ENVIRONMENT:
		for (i = 0; i < numArgs/2; i++) {
			variable = _tttk_message_arg_val( msg, 2 * i, 0 );
			if (variable == 0) {
				continue;
			}
			if (op == TTDT_GET_ENVIRONMENT) {
				tt_message_arg_val_set( msg, 2 * i + 1,
						getenv( variable ));
			} else if (_tttk_message_arg_is_set( msg, 2*i+1 )) {
				value = _tttk_message_arg_val( msg, 2*i+1, 0 );
				_tt_putenv( variable, value );
				tt_free( value );
			} else {
				_tt_putenv( variable, 0 );
			}
			tt_free( variable );
		}
		tt_message_reply( msg );
		tttk_message_destroy( msg );
		return 0;
	    case TTDT_SET_SITUATION:
		value = _tttk_message_arg_val( msg, 0, 0 );
		if (value == 0) {
			value = tt_message_file( msg );
			if (tt_ptr_error( value ) != TT_OK) {
				value = 0;
			}
		}
		if (value == 0) {
			tttk_message_fail( msg, TT_DESKTOP_EPROTO, 0, 1 );
			return 0;
		}
		if (chdir( value ) != 0) {
			tt_free( value );
			tttk_message_fail( msg, _tt_errno_status( errno ),
					   0, 1 );
			return 0;
		}
		tt_free( value );
		tt_message_reply( msg );
		tttk_message_destroy( msg );
		return 0;
	    case TTDT_GET_SITUATION:
		value = getcwd( 0, MAXPATHLEN );
		if (value == 0) {
			tttk_message_fail( msg, _tt_errno_status( errno ),
					   0, 1 );
			return 0;
		}
		status = tt_message_arg_val_set( msg, 0, value );
		free( value );
		if (status != TT_OK) {
			tttk_message_fail( msg, status, 0, 1 );
			return 0;
		}
		tt_message_reply( msg );
		tttk_message_destroy( msg );
		return 0;
	    case TTDT_SIGNAL:
		i = _tttk_message_arg_ival( msg, 0, 0 );
		if (i <= 0) {
			tttk_message_fail( msg, TT_DESKTOP_EINVAL, 0, 1 );
			return 0;
		}
		// Reply before actually signalling, in case we die
		tt_message_reply( msg );
		tttk_message_destroy( msg );
		kill( getpid(), i );
		return 0;
	    case TTDT_GET_SYSINFO:
		if (uname( &names ) < 0) {
			tttk_message_fail( msg, _tt_errno_status( errno ),
					   0, 1 );
			return 0;
		}
		// The first 5 values are from uname and seem pretty standard
		tt_message_arg_val_set( msg, 0, names.sysname );
		tt_message_arg_val_set( msg, 1, names.nodename );
		tt_message_arg_val_set( msg, 2, names.release );
		tt_message_arg_val_set( msg, 3, names.version );
		tt_message_arg_val_set( msg, 4, names.machine );
		// The last 3 are from sysinfo which seems to be SVR4 only.
		// For platforms without the sysinfo call, we just leave
		// the values unset for now, except for the serial
		// number which is available from utsname onHPUX.
#if defined(OPT_SYSINFO)		
		if (sysinfo( SI_ARCHITECTURE, buf, SYS_NMLN ) >= 0) {
			tt_message_arg_val_set( msg, 5, buf );
		}
		if (sysinfo( SI_HW_PROVIDER, buf, SYS_NMLN ) >= 0) {
			tt_message_arg_val_set( msg, 6, buf );
		}
		if (sysinfo( SI_HW_SERIAL, buf, SYS_NMLN ) >= 0) {
			tt_message_arg_val_set( msg, 7, buf );
		}
#elif defined(__hpux) || defined(hpux)
		tt_message_arg_val_set( msg, 7, names.idnumber);
#endif
		tt_message_reply( msg );
		tttk_message_destroy( msg );
		return 0;
	}
	return msg;
}