123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /************************************<+>*************************************
- ****************************************************************************
- **
- ** File: WmWsCallB.c
- **
- ** RCS: $XConsortium: WmWsCallB.c /main/6 1996/11/06 18:42:04 drk $
- **
- ** Project: DT Workspace Manager
- **
- ** Description: Workspace change callback functions
- **
- ** (c) Copyright 1993, 1994 Hewlett-Packard Company
- ** (c) Copyright 1993, 1994 International Business Machines Corp.
- ** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
- ** (c) Copyright 1993, 1994 Novell, Inc.
- **
- ****************************************************************************
- ************************************<+>*************************************/
- #include <stdlib.h>
- #include <Tt/tttk.h>
- #include <Dt/Service.h>
- #include <Dt/Wsm.h>
- #include <Dt/WsmM.h>
- #include <Dt/SvcTT.h>
- #include "WsmP.h"
- #include "DtSvcLock.h"
- /*************************************<->*************************************
- *
- * DtWsmWsModifiedProc _DtWsmWsChangeHandler (widget, aWS,
- * reason, client_data);
- *
- *
- * Description:
- * -----------
- * Internal function called when workspace changes.
- *
- *
- * Inputs:
- * ------
- * widget - widget (for window where service is registered)
- * aWS - Atom for workspace identification
- * reason - type of workspace modification
- * client_data - pointer to data
- *
- * Outputs:
- * --------
- * Return - none
- *
- * Comments:
- * ---------
- *
- *************************************<->***********************************/
- static void
- _DtWsmWsChangeHandler (
- Widget widget,
- Atom aWS,
- DtWsmWsReason reason,
- XtPointer client_data)
- {
- struct _DtWsmCBContext *pCbCtx;
- pCbCtx = (struct _DtWsmCBContext *) client_data;
- /*
- * We only deal with the workspace changes
- */
- if (reason == DtWSM_REASON_CURRENT)
- {
- /*
- * Call registered callback function.
- */
- (*(pCbCtx->ws_cb)) (pCbCtx->widget, aWS,
- pCbCtx->client_data);
- }
-
- } /* END OF FUNCTION _DtWsmWsChangeHandler */
- /*************************************<->*************************************
- *
- * DtWsmCBContext * DtWsmAddCurrentWorkspaceCallback (widget,
- * ws_change,
- * client_data)
- *
- *
- * Description:
- * -----------
- * Register a function to be called when the workspace changes.
- *
- *
- * Inputs:
- * ------
- * widget - widget for this client
- * ws_change - function to call when workspace changes
- * client_data - additional data to pass back to client when called.
- *
- * Outputs:
- * --------
- * Return - ptr to callback context data (opaque)
- *
- * Comments:
- * ---------
- * The callback context data ptr should be saved if you intend to
- * removed this callback at some point in the future.
- *
- *************************************<->***********************************/
- DtWsmCBContext
- DtWsmAddCurrentWorkspaceCallback (
- Widget widget,
- DtWsmWsChangeProc ws_change,
- XtPointer client_data)
- {
- struct _DtWsmCBContext *pCbCtx;
- _DtSvcWidgetToAppContext(widget);
- _DtSvcAppLock(app);
- /*
- * Allocate data to remember stuff about this callback
- */
- pCbCtx = (struct _DtWsmCBContext * )
- XtMalloc (sizeof(struct _DtWsmCBContext));
- /*
- * Save what we want to remember
- */
- pCbCtx->widget = widget;
- pCbCtx->ws_cb = ws_change;
- pCbCtx->client_data = client_data;
- /*
- * Register interest in the workspace change message
- */
- pCbCtx->nested_context = (XtPointer)
- DtWsmAddWorkspaceModifiedCallback (widget,
- (DtWsmWsModifiedProc)_DtWsmWsChangeHandler,
- (XtPointer) pCbCtx);
- _DtSvcAppUnlock(app);
- return (pCbCtx);
- } /* END OF FUNCTION DtWsmAddCurrentWorkspaceCallback */
- /*
- ----------------------------------------------------------------------
- */
- /*************************************<->*************************************
- *
- * Tt_callback_action _WsModifiedCB (Tt_message m, tt_pattern p)
- *
- *
- * Description:
- * -----------
- * Internal function called when a workspace is modified.
- *
- *
- * Inputs:
- * ------
- * m - ToolTalk message
- * p - ToolTalk pattern
- *
- * Outputs:
- * --------
- * Return - ToolTalk callback status
- *
- * Comments:
- * ---------
- *
- *************************************<->***********************************/
- static Tt_callback_action
- _WsModifiedCB (Tt_message m, Tt_pattern p)
- {
- struct _DtWsmCBContext *pCbCtx;
- Atom aWs;
- DtWsmWsReason reason;
- Widget widget;
- DtWsmWsModifiedProc ws_modify;
- XtPointer client_data;
- /*
- * user data 0: Widget widget;
- * user data 1: DtWsmWsModifiedProc ws_modify;
- * user data 2: XtPointer client_data;
- */
- widget = (Widget)tt_pattern_user(p, 0);
- ws_modify = (DtWsmWsModifiedProc)tt_pattern_user(p, 1);
- client_data = (XtPointer)tt_pattern_user(p, 2);
- /*
- * 0th arg: screen number, string, not used
- */
- /*
- * Convert the atom to binary.
- */
- aWs = (Atom)strtoul(tt_message_arg_val(m, 1), (char **)NULL, 0);
- /*
- * Convert "reason" of workspace modification
- */
- reason = (DtWsmWsReason)strtoul(tt_message_arg_val(m, 2), (char **)NULL, 0);
- /*
- * Call registered callback function.
- */
- (*ws_modify)(widget, aWs, reason, client_data);
-
- return TT_CALLBACK_PROCESSED;
- } /* END OF FUNCTION _DtWsmWsModifyHandler */
- /*************************************<->*************************************
- *
- * DtWsmCBContext * DtWsmAddWorkspaceModifiedCallback (widget,
- * ws_modify,
- * client_data)
- *
- *
- * Description:
- * -----------
- * Register a function to be called when the workspace is modified.
- *
- *
- * Inputs:
- * ------
- * widget - widget for this client
- * ws_modify - function to call when workspace is modified
- * client_data - additional data to pass back to client when called.
- *
- * Outputs:
- * --------
- * Return - ptr to callback context data (opaque)
- *
- * Comments:
- * ---------
- * The callback context data ptr should be saved if you intend to
- * removed this callback at some point in the future.
- *
- *************************************<->***********************************/
- DtWsmCBContext
- DtWsmAddWorkspaceModifiedCallback (
- Widget widget,
- DtWsmWsModifiedProc ws_modify,
- XtPointer client_data)
- {
- struct _DtWsmCBContext *pCbCtx;
- int screen;
- String sName;
- char sNum[32];
- Tt_status status;
- Tt_pattern pattern;
- char * sessId;
- _DtSvcWidgetToAppContext(widget);
- _DtSvcAppLock(app);
- /*
- * This function register a ToolTalk pattern for every
- * callback added.
- */
- _DtSvcInitToolTalk(widget);
- pattern = tt_pattern_create();
- status = tt_ptr_error(pattern);
- if (status != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- if (tt_pattern_scope_add(pattern, TT_SESSION) != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- if (tt_pattern_category_set(pattern, TT_OBSERVE) != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- if (tt_pattern_class_add(pattern, TT_NOTICE) != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- if (tt_pattern_state_add(pattern, TT_SENT) != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- sessId = tt_default_session();
- if (tt_pattern_session_add(pattern, sessId) != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- tt_free( sessId );
- screen = XScreenNumberOfScreen(XtScreen(widget));
- sprintf(sNum, "%d", screen);
- sName = _DtWsmSelectionNameForScreen (screen);
- /*
- * Only receive DtWorkspace_Modified notice from the screen
- * we registered with.
- */
- status = tt_pattern_arg_add(pattern, TT_IN, Tttk_string, sNum);
- if (status != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- if (tt_pattern_op_add(pattern, "DtWorkspace_Modified") != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- /*
- * Store information needed by the callback in the user data
- * fields of the pattern.
- */
- status = tt_pattern_user_set(pattern, 0, (void *)widget);
- if (status != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- status = tt_pattern_user_set(pattern, 1, (void *)ws_modify);
- if (status != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- status = tt_pattern_user_set(pattern, 2, (void *)client_data);
- if (status != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- /*
- * _WsModifiedCB is the ToolTalk callback which will call
- * the user callback.
- */
- if (tt_pattern_callback_add(pattern, _WsModifiedCB) != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- if (tt_pattern_register(pattern) != TT_OK) {
- _DtSvcAppUnlock(app);
- return NULL;
- }
- /*
- * Allocate data to remember stuff about this callback
- */
- pCbCtx = (struct _DtWsmCBContext * )
- XtMalloc (sizeof(struct _DtWsmCBContext));
- /*
- * Save what we want to remember
- */
- pCbCtx->pattern = pattern;
- pCbCtx->widget = widget;
- pCbCtx->ws_cb = ws_modify;
- pCbCtx->client_data = client_data;
- pCbCtx->nested_context = NULL;
- XtFree (sName);
- _DtSvcAppUnlock(app);
- return (pCbCtx);
- } /* END OF FUNCTION DtWsmAddWorkspaceModifiedCallback */
- /*************************************<->*************************************
- *
- * DtWsmRemoveWorkspaceCallback (pCbCtx)
- *
- * Description:
- * -----------
- * Unregister a workspace callback.
- *
- *
- * Inputs:
- * ------
- * pCbCtx - ptr to context returned when callback added
- *
- * Outputs:
- * --------
- * Return - none
- *
- * Comments:
- * ---------
- *
- *************************************<->***********************************/
- void
- DtWsmRemoveWorkspaceCallback (DtWsmCBContext pCbCtx)
- {
- /*
- * Is this somewhat valid?
- */
- if (pCbCtx && (pCbCtx->widget != NULL)) {
- _DtSvcWidgetToAppContext(pCbCtx->widget);
- _DtSvcAppLock(app);
- if (pCbCtx->nested_context) {
- /*
- * This was a convenience callback for just the workspace
- * change info.
- */
- DtWsmRemoveWorkspaceCallback (
- (DtWsmCBContext) pCbCtx->nested_context);
- }
- else {
- /*
- * Unregister interest in this message
- */
- tt_pattern_destroy(pCbCtx->pattern);
- }
- /*
- * Free previously allocated data
- */
- XtFree((char *) pCbCtx);
- _DtSvcAppUnlock(app);
- }
- } /* END OF FUNCTION DtWsmRemoveWorkspaceCallback */
- /*************************************<->*************************************
- *
- * _DtWsmSelectionNameForScreen (scr)
- *
- * Description:
- * -----------
- * Returns a string containing the selection name used for
- * communication with the workspace manager on this screen
- *
- *
- * Inputs:
- * ------
- * scr - number of screen
- *
- * Outputs:
- * --------
- * Return - ptr to string with selection name (free with XtFree)
- *
- * Comments:
- * ---------
- * Assumes the screen number is < 1000.
- *
- *************************************<->***********************************/
- String
- _DtWsmSelectionNameForScreen (
- int scr)
- {
- String sName;
- sName = (String) XtMalloc (strlen(DtWSM_TOOL_CLASS) + 4 + 1);
- sprintf ((char *)sName, "%s_%d", DtWSM_TOOL_CLASS, (scr % 1000));
- return (sName);
- } /* END OF FUNCTION _DtWsmSelectionNameForScreen */
- Tt_callback_action
- _DtWsmConsumeReply(
- Tt_message msg,
- Tt_pattern pat )
- {
- switch (tt_message_state( msg )) {
- case TT_HANDLED:
- case TT_FAILED:
- tttk_message_destroy( msg );
- return TT_CALLBACK_PROCESSED;
- default:
- return TT_CALLBACK_CONTINUE;
- }
- }
|