a9644bb0f5373bbb6a4f4c0842bd7403cc748c62
[oweals/cde.git] / cde / lib / tt / lib / tttk / ttdtprocid.C
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 //%%  (c) Copyright 1993, 1994 Hewlett-Packard Company                  
24 //%%  (c) Copyright 1993, 1994 International Business Machines Corp.    
25 //%%  (c) Copyright 1993, 1994 Sun Microsystems, Inc.                   
26 //%%  (c) Copyright 1993, 1994 Novell, Inc.                             
27 //%%  $XConsortium: ttdtprocid.C /main/3 1995/10/23 10:32:27 rswiston $                                                         
28 /*
29  * @(#)ttdtprocid.C     1.3 93/09/07
30  *
31  * Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
32  */
33
34 #include <limits.h>
35 #include <X11/Intrinsic.h>
36 #include "util/tt_Xlib.h"
37 #include "api/c/api_api.h"
38 #include "tttk/ttdtprocid.h"
39 #include "tttk/tttkmessage.h"
40 #include "tttk/tttkpattern.h"
41 #include "tttk/tttkutils.h"
42 #include "tttk/tttk2free.h"
43 #include "tttk/ttdesktop.h"
44
45 _TtDtProcid::_TtDtProcid(
46         const char     *toolName,
47         const char     *vendor,
48         const char     *version
49 )
50 {
51         // XXX Initialize procid's default contexts from environ(5).
52         _toolname = _tt_strdup( toolName );
53         _vendor = _tt_strdup( vendor );
54         _version = _tt_strdup( version );
55 }
56
57 _TtDtProcid::~_TtDtProcid()
58 {
59         tt_free( _toolname );
60         tt_free( _vendor );
61         tt_free( _version );
62 }
63
64 //
65 // Create patterns for either session_join or message_accept
66 //
67 Tt_pattern *_TtDtProcid::
68 pats_create(
69         Tt_message      contract,
70         Ttdt_contract_cb cb,
71         Widget          shell,
72         void           *clientData
73 ) const
74 {
75         int numPats = 11;
76         if (contract == 0) {
77                 numPats = 13;
78         }
79         Tt_pattern *pats = (Tt_pattern *)malloc(numPats * sizeof(Tt_pattern));
80         if (pats == 0) {
81                 return (Tt_pattern *)tt_error_pointer( TT_ERR_NOMEM );
82         }
83         int i = -1;
84         char *sess = tt_default_session();
85         if (shell != 0) {
86                 pats[++i] = ttdt_Get_Geometry_pat( TT_HANDLE, contract,
87                                 _ttdt_do_GSet_Geometry, shell, 1 );
88                 pats[++i] = ttdt_Set_Geometry_pat( TT_HANDLE, contract,
89                                 _ttdt_do_GSet_Geometry, shell, 1 );
90                 pats[++i] = ttdt_Get_Iconified_pat( TT_HANDLE, contract,
91                                 _ttdt_do_wm_state, shell, 0 );
92                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_MAPPED ) );
93                 tt_pattern_session_add( pats[i], sess );
94                 tt_pattern_register( pats[i] );
95                 pats[++i] = ttdt_Set_Iconified_pat( TT_HANDLE, contract,
96                                 _ttdt_do_wm_state, shell, 0 );
97                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_MAPPED ) );
98                 tt_pattern_session_add( pats[i], sess );
99                 tt_pattern_register( pats[i] );
100                 pats[++i] = ttdt_Get_XInfo_pat( TT_HANDLE, contract,
101                                 _ttdt_do_Get_XInfo, shell, 1 );
102                 pats[++i] = ttdt_Set_XInfo_pat( TT_HANDLE, contract,
103                                 _ttdt_do_Set_XInfo, shell, 1 );
104                 pats[++i] = _ttdt_pat(TTDT_RAISE, _ttdt_contract_cb, TT_HANDLE,
105                                 contract, _ttdt_do_RaiseLower, shell, 0 );
106                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_LOWER ) );
107                 tt_pattern_session_add( pats[i], sess );
108                 tt_pattern_register( pats[i] );
109         } else {
110                 pats[++i] = ttdt_Get_Geometry_pat( TT_HANDLE, contract,
111                                 (Ttdt_Geometry_out_cb)cb, clientData, 1 );
112                 pats[++i] = ttdt_Set_Geometry_pat( TT_HANDLE, contract,
113                                 (Ttdt_Geometry_out_cb)cb, clientData, 1 );
114                 pats[++i] = ttdt_Get_Iconified_pat( TT_HANDLE, contract,
115                                 (Ttdt_Iconified_out_cb)cb, clientData, 0 );
116                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_MAPPED ) );
117                 tt_pattern_session_add( pats[i], sess );
118                 tt_pattern_register( pats[i] );
119                 pats[++i] = ttdt_Set_Iconified_pat( TT_HANDLE, contract,
120                                 (Ttdt_Iconified_out_cb)cb, clientData, 0 );
121                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_MAPPED ) );
122                 tt_pattern_session_add( pats[i], sess );
123                 tt_pattern_register( pats[i] );
124                 pats[++i] = ttdt_Get_XInfo_pat( TT_HANDLE, contract,
125                                 (Ttdt_XInfo_out_cb)cb, clientData, 1 );
126                 pats[++i] = ttdt_Set_XInfo_pat( TT_HANDLE, contract,
127                                 (Ttdt_XInfo_in_cb)cb, clientData, 1 );
128                 pats[++i] = _ttdt_pat(TTDT_RAISE, _ttdt_contract_cb, TT_HANDLE,
129                                 contract, cb, clientData, 0 );
130                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_LOWER ) );
131                 tt_pattern_session_add( pats[i], sess );
132                 tt_pattern_register( pats[i] );
133         }
134         void *_clientData = clientData;
135         if (cb == 0) {
136                 // No callback, so set up our own client data
137                 if (contract == 0) {
138                         // tttk will send WM_DELETE_WINDOW to shell...
139                         _clientData = shell;
140                 } else {
141                         // ...but that quits entire app, so do not do it
142                         // for ttdt_message_accept().  Seeing no shell,
143                         // _ttdt_contract_cb() will fail the Quit.
144                         _clientData = 0;
145                 }
146         }
147         pats[++i] = _ttdt_pat(  TTDT_QUIT, _ttdt_contract_cb, TT_HANDLE,
148                                 contract, cb, _clientData, 1 );
149         pats[++i] = _ttdt_pat(  TTDT_PAUSE, _ttdt_contract_cb, TT_HANDLE,
150                                 contract, cb, (cb ? clientData : shell), 0 );
151         tt_pattern_op_add( pats[i], _ttDtOp( TTDT_RESUME ));
152         tt_pattern_session_add( pats[i], sess );
153         tt_pattern_register( pats[i] );
154         pats[++i] = _ttdt_pat(  TTDT_GET_STATUS, _ttdt_contract_cb, TT_HANDLE,
155                                 contract, cb, clientData, 1 );
156         if (contract == 0) {
157                 pats[++i]= _ttdt_pat( TTDT_DO_COMMAND, _ttdt_contract_cb,
158                                       TT_HANDLE, contract, cb, clientData, 1 );
159                 pats[++i]= _ttdt_pat( TTDT_SET_LOCALE, _ttdt_posix_cb,
160                                       TT_HANDLE, contract, 0, 0, 0 );
161                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_LOCALE ));
162                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_ENVIRONMENT ));
163                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_ENVIRONMENT ));
164                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SET_SITUATION ));
165                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_SITUATION ));
166                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_SIGNAL ));
167                 tt_pattern_op_add( pats[i], _ttDtOp( TTDT_GET_SYSINFO ));
168                 tt_pattern_session_add( pats[i], sess );
169                 tt_pattern_register( pats[i] );
170         }
171         pats[++i] = 0;
172         Tt_pattern *pat = pats;
173         while (*pat != 0) {
174                 Tt_status status = tt_ptr_error( *pat );
175                 if (status != TT_OK) {
176                         _tttk_patterns_destroy( pats );
177                         return (Tt_pattern *)tt_error_pointer( status );
178                 }
179                 pat++;
180         }
181         tt_free( sess );
182         return pats;
183 }