2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
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)
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
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
24 #ifdef VERBOSE_REV_INFO
25 static char rcs_id[] = "$TOG: DtTermMain.c /main/19 1999/09/17 13:26:34 mgreess $";
26 #endif /* VERBOSE_REV_INFO */
30 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
31 * (c) Copyright 1993, 1994 International Business Machines Corp. *
32 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
33 * (c) Copyright 1993, 1994 Novell, Inc. *
39 #include "TermHeader.h"
41 #include "TermPrimDebug.h"
43 #include <sys/types.h>
51 #include <Xm/PushBG.h>
52 #include <Xm/LabelG.h>
53 #include <Xm/Protocols.h>
54 #include <Xm/Display.h>
56 * This for the sleazy hack to get the window manager frame width/height
58 #include <Xm/VendorSEP.h>
59 #define DEBUG_INCLUDES /*DKS*/
61 #include "TermPrimBufferP.h"
62 #include "TermPrimParserP.h"
63 #include "TermPrimPendingTextP.h"
64 #include "TermPrimSelectP.h"
65 #include "TermPrimP.h"
66 #include "TermPrimRenderP.h"
67 #include "TermPrimLineDrawP.h"
68 #include "TermPrimLineFontP.h"
69 #include "TermBufferP.h"
71 #include "TermParseTableP.h"
72 #include "TermFunction.h"
73 /* #include "TermFunctionKeyP.h" */
74 #include "TermViewP.h"
75 #endif /* DEBUG_INCLUDES */
78 #include "TermViewMenu.h"
79 #include "DtTermMain.h"
80 #include "DtTermSyntax.h"
81 #ifdef TERMINAL_SERVER
82 #include "DtTermServer.h"
83 #endif /* TERMINAL_SERVER */
84 #include "TermPrimWMProtocols.h"
85 #include "TermPrimMessageCatI.h"
87 #include "DtTermLogit.h"
88 #endif /* LOG_USAGE */
90 #include <Xv/Session.h>
91 #include <Xv/EnvControl.h>
92 #define DtSessionSavePath XvSessionSavePath
93 #define DtSessionRestorePath XvSessionRestorePath
94 #define DtWsmGetWorkspacesOccupied XvGetWorkspacePresence
95 #define DtWsmSetWorkspacesOccupied XvSetWorkspaceHints
99 #include <Dt/EnvControlP.h>
102 /* From Xm/BaseClassI.h */
103 extern XmWidgetExtData _XmGetWidgetExtData(
105 #if NeedWidePrototypes
106 unsigned int extType) ;
108 unsigned char extType) ;
109 #endif /* NeedWidePrototypes */
111 /* forward declarations... */
112 static void activateCallback(
114 XtPointer client_data,
118 static void ToggleMenuBar(
120 XtPointer client_data,
124 static void SaveSessionCB(
128 static Boolean RestoreSession(
132 static void SaveTerm(
133 DtTermViewWidget dtvw,
136 static void RestoreTerm(
138 DtTermViewWidget dtvw,
141 static void SetWorkSpaceHints(
145 static void TestProbeHandler(
147 XtPointer client_data,
150 static void RegisterTestProbe(
152 DtTermViewWidget tw);
154 static char defaultIgnoredKeysyms[] = "\
169 typedef struct _termattrs {
171 char *ignoredKeysyms;
174 #ifdef TERMINAL_SERVER
176 Boolean exitOnLastClose;
182 #ifdef SUN_TERMINAL_SERVER
190 #ifdef TERMINAL_SERVER
191 static TERMATTRS attrs = { NULL, defaultIgnoredKeysyms, NULL, False,
192 TRUE, False, False, NULL, False, 5, NULL, NULL, NULL};
193 #elif SUN_TERMINAL_SERVER
194 static TERMATTRS attrs = { NULL, defaultIgnoredKeysyms, NULL, False, False, NULL, NULL, NULL};
196 static TERMATTRS attrs = { NULL, defaultIgnoredKeysyms, NULL, False, NULL, NULL, NULL };
199 static Atom xa_MOTIF_WM_MESSAGES = None;
200 static Atom xa_DTTERM_TOGGLE_MENUBAR = None;
201 static Atom xa_DTTERM_TEST_PROBE_IDS = None;
202 static Atom xa_DTTERM_REMOTE_PROBE_REQUEST = None;
203 static Atom xa_WM_SAVE_YOURSELF;
204 static XtAppContext appContext;
205 static Widget topLevel;
206 static Widget topShell;
207 static char *title = NULL;
208 static DtTermViewWidget *instance_list = NULL;
209 static Boolean RestoringTerms = False;
210 static int savedArgc = 0;
211 static char **savedArgv = NULL;
213 #ifdef SUN_TERMINAL_SERVER
214 int InstanceCount = 0;
216 #ifndef TERMINAL_SERVER
217 static int InstanceCount = 0;
218 #endif /* TERMINAL_SERVER */
219 #endif /* SUN_TERMINAL_SERVER */
221 static const char _true[] = "true";
222 static const char _false[] = "false";
224 /* command line options...
226 static XrmOptionDescRec optionDescList[] = {
227 /* special (not end user) options...
229 {"-~", "*debugLevel", XrmoptionSepArg, (XtPointer) NULL},
230 {"-debugLevel", "*debugLevel", XrmoptionSepArg, (XtPointer) NULL},
231 {"-session", "*session", XrmoptionSepArg, (XtPointer) NULL},
233 #ifdef TERMINAL_SERVER
236 {"-noBlocking", "*blocking", XrmoptionNoArg, (XtPointer) _false},
237 {"-server", "*server", XrmoptionNoArg, (XtPointer) _true},
238 {"-serverId", "*serverId", XrmoptionSepArg, (XtPointer) NULL},
239 #endif /* TERMINAL_SERVER */
240 #ifdef SUN_TERMINAL_SERVER
241 {"-dtserver", "*server", XrmoptionNoArg, (XtPointer) _true},
242 {"-sdtserver", "*server", XrmoptionNoArg, (XtPointer) _true},
243 #endif /* SUN_TERMINAL_SERVER */
245 /* terminal emulation options...
247 {"-132", "*c132", XrmoptionNoArg, (XtPointer) _true},
248 {"+132", "*c132", XrmoptionNoArg, (XtPointer) _false},
249 {"-aw", "*autoWrap", XrmoptionNoArg, (XtPointer) _true},
250 {"+aw", "*autoWrap", XrmoptionNoArg, (XtPointer) _false},
251 {"-bs", "*backgroundIsSelect",
252 XrmoptionNoArg, (XtPointer) _true},
253 {"+bs", "*backgroundIsSelect",
254 XrmoptionNoArg, (XtPointer) _false},
255 {"-C", "*consoleMode", XrmoptionNoArg, (XtPointer) _true},
256 {"-cc", "*charClass", XrmoptionSepArg, (XtPointer) NULL},
257 {"-cu", "*curses", XrmoptionNoArg, (XtPointer) _true},
258 {"+cu", "*curses", XrmoptionNoArg, (XtPointer) _false},
259 {"-e", NULL, XrmoptionSkipLine,
261 {"-fb", "*userBoldFont", XrmoptionSepArg, (XtPointer) NULL},
262 {"-fn", "*userFont", XrmoptionSepArg, (XtPointer) NULL},
263 {"+iconic", ".iconic", XrmoptionNoArg, (XtPointer) _false},
264 {"-j", "*jumpScroll", XrmoptionNoArg, (XtPointer) _true},
265 {"+j", "*jumpScroll", XrmoptionNoArg, (XtPointer) _false},
266 {"-kshMode", "*kshMode", XrmoptionNoArg, (XtPointer) _true},
267 {"+kshMode", "*kshMode", XrmoptionNoArg, (XtPointer) _false},
268 {"-l", "*logging", XrmoptionNoArg, (XtPointer) _true},
269 {"+l", "*logging", XrmoptionNoArg, (XtPointer) _false},
270 {"-lf", "*logFile", XrmoptionSepArg, (XtPointer) NULL},
271 {"-ls", "*loginShell", XrmoptionNoArg, (XtPointer) _true},
272 {"+ls", "*loginShell", XrmoptionNoArg, (XtPointer) _false},
273 {"-map", "*mapOnOutput", XrmoptionNoArg, (XtPointer) _true},
274 {"+map", "*mapOnOutput", XrmoptionNoArg, (XtPointer) _false},
275 {"-mb", "*marginBell", XrmoptionNoArg, (XtPointer) _true},
276 {"+mb", "*marginBell", XrmoptionNoArg, (XtPointer) _false},
277 {"-ms", "*pointerColor", XrmoptionSepArg, (XtPointer) NULL},
278 {"-n", "*iconName", XrmoptionSepArg, (XtPointer) NULL},
279 {"-nb", "*nMarginBell", XrmoptionSepArg, (XtPointer) NULL},
280 {"-rw", "*reverseWrap", XrmoptionNoArg, (XtPointer) _true},
281 {"+rw", "*reverseWrap", XrmoptionNoArg, (XtPointer) _false},
282 {"-sb", "*scrollBar", XrmoptionNoArg, (XtPointer) _true},
283 {"+sb", "*scrollBar", XrmoptionNoArg, (XtPointer) _false},
284 {"-sf", "*sunFunctionKeys", XrmoptionNoArg, (XtPointer) _true},
285 {"+sf", "*sunFunctionKeys", XrmoptionNoArg, (XtPointer) _false},
286 {"-si", "*scrollTtyOutput", XrmoptionNoArg, (XtPointer) _true},
287 {"+si", "*scrollTtyOutput", XrmoptionNoArg, (XtPointer) _false},
288 {"-sk", "*scrollKey", XrmoptionNoArg, (XtPointer) _true},
289 {"+sk", "*scrollKey", XrmoptionNoArg, (XtPointer) _false},
290 {"-sl", "*saveLines", XrmoptionSepArg, (XtPointer) NULL},
291 {"-ti", "*termId", XrmoptionSepArg, (XtPointer) NULL},
292 {"-tm", "*ttyModes", XrmoptionSepArg, (XtPointer) NULL},
293 {"-tn", "*termName", XrmoptionSepArg, (XtPointer) NULL},
294 {"-standAlone", "*standAlone", XrmoptionNoArg, (XtPointer) _true},
295 {"-vb", "*visualBell", XrmoptionNoArg, (XtPointer) _true},
296 {"+vb", "*visualBell", XrmoptionNoArg, (XtPointer) _false},
297 /* legacy options that are ignored...
299 {"-ah", NULL, XrmoptionNoArg, (XtPointer) _true},
300 {"+ah", NULL, XrmoptionNoArg, (XtPointer) _false},
301 {"-b", NULL, XrmoptionSepArg, (XtPointer) NULL},
302 {"-cb", NULL, XrmoptionNoArg, (XtPointer) _true},
303 {"+cb", NULL, XrmoptionNoArg, (XtPointer) _false},
304 {"-cn", NULL, XrmoptionNoArg, (XtPointer) _true},
305 {"+cn", NULL, XrmoptionNoArg, (XtPointer) _false},
306 {"-cr", NULL, XrmoptionSepArg, (XtPointer) NULL},
307 {"-s", NULL, XrmoptionNoArg, (XtPointer) _true},
308 {"+s", NULL, XrmoptionNoArg, (XtPointer) _false},
309 {"-t", NULL, XrmoptionNoArg, (XtPointer) _true},
310 {"+t", NULL, XrmoptionNoArg, (XtPointer) _false},
311 {"-ut", NULL, XrmoptionNoArg, (XtPointer) _true},
312 {"+ut", NULL, XrmoptionNoArg, (XtPointer) _false},
313 {"-wf", NULL, XrmoptionNoArg, (XtPointer) _true},
314 {"+wf", NULL, XrmoptionNoArg, (XtPointer) _false},
317 /* application specific resources...
319 static XtResource applicationResources[] = {
320 {"debugLevel", "DebugLevel", XtRString, sizeof(char *),
321 XtOffsetOf(TERMATTRS, debugString), XtRImmediate, NULL},
322 {"ignoredKeysyms", "IgnoredKeysyms", XtRString, sizeof(char *),
323 XtOffsetOf(TERMATTRS, ignoredKeysyms), XtRImmediate, NULL},
324 {"loginShell", "LoginShell", XtRBoolean, sizeof(Boolean),
325 XtOffsetOf(TERMATTRS, loginShell), XtRString, "false"},
326 {"session", "Session", XtRString, sizeof(char *),
327 XtOffsetOf(TERMATTRS, session), XtRString, NULL},
328 #ifdef TERMINAL_SERVER
329 {"blocking", "Blocking", XtRBoolean, sizeof(Boolean),
330 XtOffsetOf(TERMATTRS, block), XtRString, "true"},
331 {"exitOnLastClose", "ExitOnLastClose", XtRBoolean, sizeof(Boolean),
332 XtOffsetOf(TERMATTRS, exitOnLastClose), XtRString, "false"},
333 {"server", "Server", XtRBoolean, sizeof(Boolean),
334 XtOffsetOf(TERMATTRS, server), XtRString, "false"},
335 {"serverId", "ServerId", XtRString, sizeof(char *),
336 XtOffsetOf(TERMATTRS, serverId), XtRImmediate, NULL},
337 {"standAlone", "StandAlone", XtRBoolean, sizeof(Boolean),
338 XtOffsetOf(TERMATTRS, standAlone), XtRString, "false"},
339 {"pingInterval", "PingInterval", XtRInt, sizeof(int),
340 XtOffsetOf(TERMATTRS, PingInterval), XtRString, "5"},
341 #endif /* TERMINAL_SERVER */
342 #ifdef SUN_TERMINAL_SERVER
343 {"server", "Server", XtRBoolean, sizeof(Boolean),
344 XtOffsetOf(TERMATTRS, server), XtRString, "false"},
345 #endif /* SUN_TERMINAL_SERVER */
346 {XtNtitle, XtCTitle, XtRString, sizeof(char *),
347 XtOffsetOf(TERMATTRS, title), XtRString, (caddr_t) NULL},
348 {XtNiconName, XtCIconName, XtRString, sizeof(char *),
349 XtOffsetOf(TERMATTRS, icon_name), XtRString, (caddr_t) NULL},
350 {"name", "Name", XtRString, sizeof(char *),
351 XtOffsetOf(TERMATTRS, dtterm_name), XtRString, (caddr_t) NULL},
354 extern String fallbackResources[];
360 int i, major_op, first_event, first_err;
362 void (*IAptr)()=(void (*)())NULL;
363 DtTermPrimitiveWidget tw;
365 if ((IAptr = (void (*)())dlsym(RTLD_NEXT, "XSolarisIASetProcessInfo"))!=NULL) {
366 pids = (int *)malloc(sizeof(int) * (InstanceCount + 1));
368 for (i = 0; i < InstanceCount; i++) {
369 tw = (DtTermPrimitiveWidget)instance_list[i]->termview.term;
370 pids[i + 1] = tw->term.subprocessPid;
372 if (XQueryExtension(XtDisplay(w), "SolarisIA",
373 &major_op, &first_event, &first_err))
374 (*IAptr)(XtDisplay(w),pids,
375 0x1,InstanceCount + 1);
383 DestroyTree(XtPointer client_data, XtIntervalId *id)
385 (void) XtDestroyWidget((Widget) client_data);
387 #endif /* DELAY_DESTROY */
391 DestroyDtTerm(Widget w, XtPointer client_data, XtPointer call_data)
393 /* destroy the whole interface... */
394 (void) XtDestroyWidget((Widget) client_data);
399 ExitTimeout(XtPointer client_data, XtIntervalId *id)
409 DecrementInstanceCountAndExit(Widget w, XtPointer client_data,
412 DtTermViewWidget *new_instance_list;
417 * First, update the instance list cache by "deleting" the current instance
421 if (InstanceCount > 0)
423 new_instance_list = (DtTermViewWidget *)XtMalloc(sizeof(DtTermViewWidget) * InstanceCount);
424 for (j = 0,i = 0; i < (InstanceCount+1); i++)
425 if (instance_list[i] != (DtTermViewWidget )w)
427 new_instance_list[j] = instance_list[i];
430 XtFree((char *)instance_list);
431 instance_list = new_instance_list;
434 XtFree((char *)instance_list);
436 /* check off this instance... */
437 #ifdef TERMINAL_SERVER
438 if (attrs.standAlone || !attrs.serverId) {
439 #endif /* TERMINAL_SERVER */
443 if (InstanceCount <= 0) {
444 /* use a timeout so that the toolkit can finish killing off
447 (void) XtAppAddTimeOut(XtWidgetToApplicationContext(w), 0,
448 ExitTimeout, (XtPointer) 0);
450 #ifdef TERMINAL_SERVER
452 ServerInstanceTerminated((Widget) client_data);
454 #endif /* TERMINAL_SERVER */
457 /* Here is where one would add the call into sunDtTermServer.c
458 * implement a "lurking" dtterm server. */
463 /***************************************************************************
465 * RegisterTestProbe - shoves a property on the root window that says *
466 * we're ready to be tested, and sets up the event handler for the client *
469 ***************************************************************************/
470 static void RegisterTestProbe(
475 Window win = XtWindow(topLevel);
477 if (xa_DTTERM_TEST_PROBE_IDS == None)
479 xa_DTTERM_TEST_PROBE_IDS = XInternAtom(XtDisplay(topLevel),
480 "_DTTERM_TEST_PROBE_IDS", False);
482 if (xa_DTTERM_REMOTE_PROBE_REQUEST == None)
484 xa_DTTERM_REMOTE_PROBE_REQUEST = XInternAtom(XtDisplay(topLevel),
485 "_DTTERM_REMOTE_PROBE_REQUEST", False);
488 XChangeProperty(XtDisplay(topLevel), RootWindowOfScreen(XtScreen(topLevel)),
489 xa_DTTERM_TEST_PROBE_IDS, xa_DTTERM_TEST_PROBE_IDS,
490 32, PropModeReplace, (unsigned char *)&win, 1);
491 XtAddEventHandler(topLevel, NoEventMask , True, (XtEventHandler )TestProbeHandler,
498 #define FOUR_BYTE_PTR 3
499 #define GET_USER_KEY_LOCK 4
500 #define GET_AUTO_LINE_FEED 5
501 #define GET_CURSOR_VISIBLE 6
502 #define GET_SCROLLBAR_WINDOW 7
503 /***************************************************************************
505 * TestProbeHandler - handle the client message for test probes *
507 ***************************************************************************/
508 static void TestProbeHandler(
510 XtPointer client_data,
514 XClientMessageEvent *cm = (XClientMessageEvent *)event;
515 DtTermViewWidget tw = (DtTermViewWidget )client_data;
517 Atom prop_name, actual_type;
518 int prop_type; /* THIS WILL BREAK ON A 16-BIT INT SYSTEM */
521 unsigned long nitems, bytes_left;
534 unsigned char *reply;
538 if (cm->send_event == False) return;
539 if (cm->message_type != xa_DTTERM_REMOTE_PROBE_REQUEST) return;
541 reply = (unsigned char*) malloc(sizeof(unsigned char) * 1024);
545 * If it's a xa_DTTERM_REMOTE_PROBE_REQUEST, then the data is three 32-bit
546 * quantities: 0 is the window ID, 1 is the property atom to get off the
547 * window, and 2 is the number of bytes required to getvalues the requested
554 prop_name = cm->data.l[1];
555 prop_type = cm->data.l[2];
559 if (XGetWindowProperty(XtDisplay(w), win, prop_name, offset, length,
560 False, AnyPropertyType, &actual_type,&actual_format,
561 &nitems, &bytes_left, &data) == Success)
565 case GET_CURSOR_VISIBLE:
566 sprintf((char *)reply,"%d", (int )_DtTermPrimGetCursorVisible(tw->termview.term));
569 case GET_USER_KEY_LOCK:
570 sprintf((char *)reply,"%d", (int )_DtTermGetUserKeyLock(tw->termview.term));
573 case GET_AUTO_LINE_FEED:
574 sprintf((char *)reply,"%d", (int )_DtTermGetAutoLineFeed(tw->termview.term));
577 case GET_SCROLLBAR_WINDOW:
578 sprintf((char *)reply, "0x%lx", tw->termview.scrollBar.widget ?
579 XtWindow(tw->termview.scrollBar.widget) : 0);
583 XtSetArg(al[0], (XtPointer ) data,&onebyte);
584 if (!strcmp((char *)data, XmNmenuBar) ||
585 !strcmp((char *)data, DtNscrollBar))
586 XtGetValues((Widget)tw, al, 1);
588 XtGetValues(tw->termview.term, al, 1);
589 sprintf((char *)reply,"%d", onebyte.uc);
593 XtSetArg(al[0], (XtPointer ) data,&twobyte);
594 XtGetValues(tw->termview.term, al, 1);
595 sprintf((char *)reply,"%d", twobyte.s);
600 XtSetArg(al[0], (XtPointer ) data,&fourbyte);
601 XtGetValues(tw->termview.term, al, 1);
602 if (prop_type == FOUR_BYTE_PTR)
604 sprintf((char *)reply,"%s", fourbyte.cp);
606 sprintf((char *)reply,"%s", "<NULL>");
609 sprintf((char *)reply,"%d", fourbyte.i);
612 sprintf((char *)reply,"%s","ERROR");
615 XChangeProperty(XtDisplay(w), win, prop_name, prop_name, 8,
616 PropModeReplace, reply, strlen((char *)reply));
617 XSync(XtDisplay(w),False);
627 Widget termViewWidget
635 /* intern the necessary atoms... */
636 if (xa_MOTIF_WM_MESSAGES == None) {
637 /* get the atom value... */
638 xa_MOTIF_WM_MESSAGES = XInternAtom(XtDisplay(topLevel),
639 "_MOTIF_WM_MESSAGES", False);
641 if (xa_DTTERM_TOGGLE_MENUBAR == None) {
642 /* get the atom value... */
643 xa_DTTERM_TOGGLE_MENUBAR = XInternAtom(XtDisplay(topLevel),
644 "_DTTERM_TOGGLE_MENUBAR", False);
647 /* add a menubar toggle to the mwm pulldown... */
649 menu = GETMESSAGE(NL_SETN_Main,1,"\
651 Toggle\\ Menu\\ Bar f.send_msg %d\
653 (void) sprintf(buffer, menu, xa_DTTERM_TOGGLE_MENUBAR);
654 (void) XtSetArg(al[ac], XmNmwmMenu, buffer); ac++;
655 (void) XtSetValues(topLevel, al, ac);
657 /* add a protocoll handler for MOTIF_WM_MESSAGES... */
658 if (xa_MOTIF_WM_MESSAGES != None) {
659 (void) XmAddProtocols(topLevel, xa_MOTIF_WM_MESSAGES,
660 &xa_DTTERM_TOGGLE_MENUBAR, 1);
661 (void) XmAddProtocolCallback(topLevel, xa_MOTIF_WM_MESSAGES,
662 xa_DTTERM_TOGGLE_MENUBAR,
663 ToggleMenuBar, (XtPointer) termViewWidget);
668 CloneCallback(Widget wid, XtPointer client_data, XtPointer call_data)
670 register DtTermViewWidget w = (DtTermViewWidget) wid;
671 DtTermViewCallbackStruct *termCB = (DtTermViewCallbackStruct *) call_data;
673 Widget parent = XtParent((Widget) w);
678 /* duplicate the dtterm widget's parent widget...
680 if (XtIsShell(parent)) {
683 Boolean allowShellResize;
684 #ifdef COPY_WHEN_CLONING
688 #endif /* COPY_WHEN_CLONING */
689 char *topShellIconName;
692 if (XtIsApplicationShell(parent)) {
693 (void) XtSetArg(arglist[i], XmNargc, &argc); i++;
694 (void) XtSetArg(arglist[i], XmNargv, &argv); i++;
696 #ifdef COPY_WHEN_CLONING
697 (void) XtSetArg(arglist[i], XmNgeometry, &geometry); i++;
698 (void) XtSetArg(arglist[i], XmNwidth, &width); i++;
699 (void) XtSetArg(arglist[i], XmNheight, &height); i++;
700 #endif /* COPY_WHEN_CLONING */
701 (void) XtSetArg(arglist[i], XmNallowShellResize, &allowShellResize);
703 (void) XtGetValues(parent, arglist, i);
706 if (XtIsApplicationShell(parent)) {
707 (void) XtSetArg(arglist[i], XmNargc, argc); i++;
708 (void) XtSetArg(arglist[i], XmNargv, argv); i++;
710 #ifdef COPY_WHEN_CLONING
711 (void) XtSetArg(arglist[i], XmNgeometry, geometry); i++;
712 (void) XtSetArg(arglist[i], XmNwidth, width); i++;
713 (void) XtSetArg(arglist[i], XmNheight, height); i++;
714 #endif /* COPY_WHEN_CLONING */
715 (void) XtSetArg(arglist[i], XmNallowShellResize, allowShellResize); i++;
716 /* Set the title (and icon name) for the clone (new) dtterm window
717 the same as the initial title (and icon name) of the top level
720 (void) XtSetArg(arglist[i], XmNtitle, attrs.title); i++;
722 topShellIconName = attrs.icon_name;
723 else if (attrs.dtterm_name)
724 topShellIconName = attrs.dtterm_name;
725 else topShellIconName = attrs.title;
726 (void) XtSetArg(arglist[i], XmNiconName, topShellIconName); i++;
728 shellWidget = XtAppCreateShell((char *) 0, "Dtterm",
729 XtClass(parent), XtDisplay((Widget) w), arglist, i);
732 (void) XtSetArg(arglist[i], XmNallowShellResize, True); i++;
733 shellWidget = XtAppCreateShell((char *) 0, "Dtterm",
734 applicationShellWidgetClass, XtDisplay((Widget) w), arglist, i);
737 #ifdef COPY_WHEN_CLONING
738 termWidget = DtCreateTermView(shellWidget, "dtTermView", termCB->arglist,
740 #else /* COPY_WHEN_CLONING */
741 termWidget = DtCreateTermView(shellWidget, "dtTermView", termCB->arglist,
743 #endif /* COPY_WHEN_CLONING */
745 /* add a menubar toggle to the mwm pulldown... */
746 (void) AddMenubarToggle(shellWidget, termWidget);
748 (void) InstanceCount++;
749 (void) XtManageChild(termWidget);
751 /* destroy the widget on child termination... */
752 (void) XtAddCallback(termWidget, DtNsubprocessTerminationCallback,
753 DestroyDtTerm, (XtPointer) shellWidget);
754 (void) XtAddCallback(termWidget, XmNdestroyCallback,
755 DecrementInstanceCountAndExit, (XtPointer) topLevel);
756 (void) _DtTermPrimAddDeleteWindowCallback(shellWidget, DestroyDtTerm,
757 (XtPointer) shellWidget);
758 (void) XtAddCallback(termWidget, DtNnewCallback,
759 CloneCallback, (XtPointer) 0);
760 instance_list = (DtTermViewWidget *)XtRealloc((char *)instance_list,
761 (sizeof(DtTermViewWidget) * InstanceCount));
762 instance_list[InstanceCount - 1] = (DtTermViewWidget )termWidget;
764 (void) XtRealizeWidget(shellWidget);
772 XtPointer client_data,
776 XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
778 if (cb->event->xclient.message_type == xa_MOTIF_WM_MESSAGES) {
779 /* can't use case here, since we are not switching on a pre-defined
782 if (cb->event->xclient.data.l[0] == xa_DTTERM_TOGGLE_MENUBAR) {
783 (void) _DtTermViewMenuToggleMenuBar((Widget) client_data);
787 #ifdef SUN_TERMINAL_SERVER
791 #endif /* SUN_TERMINAL_SERVER */
794 Widget topLevelWidget,
798 Boolean enableCloneCallback
801 Widget termViewWidget;
803 /* bump our session count... */
805 (void) LogBumpSessionCount(1);
806 #endif /* LOG_USAGE */
808 termViewWidget = DtCreateTermView(topLevelWidget, name, arglist, argcnt);
810 /* add a menubar toggle to the mwm pulldown... */
811 (void) AddMenubarToggle(topLevelWidget, termViewWidget);
813 #ifdef TERMINAL_SERVER
814 if (attrs.standAlone || !attrs.serverId) {
815 #endif /* TERMINAL_SERVER */
816 (void) InstanceCount++;
817 #ifdef TERMINAL_SERVER
819 #endif /* TERMINAL_SERVER */
820 (void) XtManageChild(termViewWidget);
821 /* destroy the widget on termination... */
822 (void) XtAddCallback(termViewWidget, DtNsubprocessTerminationCallback,
823 DestroyDtTerm, (XtPointer) topLevelWidget);
824 (void) XtAddCallback(termViewWidget, XmNdestroyCallback,
825 DecrementInstanceCountAndExit, (XtPointer) topLevelWidget);
826 (void) _DtTermPrimAddDeleteWindowCallback(topLevelWidget, DestroyDtTerm,
827 (XtPointer) topLevelWidget);
828 instance_list = (DtTermViewWidget * ) XtRealloc((char *)instance_list, (sizeof(DtTermViewWidget) * InstanceCount));
829 instance_list[InstanceCount - 1] = (DtTermViewWidget )termViewWidget;
830 if (enableCloneCallback)
831 (void) XtAddCallback(termViewWidget, DtNnewCallback,
832 CloneCallback, (XtPointer) 0);
834 #ifdef SUN_TERMINAL_SERVER
856 DebugF('s', 10, fprintf(stderr, ">>SignalHandler() starting\n"));
857 _DtTermPrimPtyCleanup();
858 _DtTermPrimUtmpCleanup();
859 _DtTermPrimLogFileCleanup();
860 DebugF('s', 10, fprintf(stderr, ">>SignalHandler() finished\n"));
864 static int signalList[] = {
896 char *prop = (char *) 0;
899 unsigned long numItems;
900 unsigned long bytesAfter;
902 (void) XGetWindowProperty(display,
903 RootWindow(display, 0),
904 XmInternAtom(display, property, FALSE),
913 (unsigned char **) &prop);
915 if ((actualType != XA_STRING) ||
916 (actualFormat != 8) ||
928 #ifndef XmNdefaultVirtualBindings
929 #define XmNdefaultVirtualBindings "defaultVirtualBindings"
930 #endif /* XmNdefaultVirtualBindings */
940 char *origDisplayBindings,*freeOrigBindings=NULL;
941 char *newDisplayBindings;
946 char **ignoredKeysymList;
947 int numIgnoredKeysyms;
949 /* malloc a copy of the ignoredKeysym string... */
950 if (attrs.ignoredKeysyms && *attrs.ignoredKeysyms) {
951 c1 = XtMalloc(strlen(attrs.ignoredKeysyms) + 1);
952 (void) strcpy(c1, attrs.ignoredKeysyms);
953 attrs.ignoredKeysyms = c1;
956 /* count the number of keysyms in the list... */
957 for (c1 = attrs.ignoredKeysyms, numIgnoredKeysyms = 0; c1 && *c1; ) {
959 c1 = strchr(c1, '\n');
965 /* malloc space for the array... */
966 ignoredKeysymList = (char **) XtMalloc((numIgnoredKeysyms + 1) *
969 /* build the list... */
970 for (c1 = attrs.ignoredKeysyms, i1 = 0; i1 < numIgnoredKeysyms; i1++) {
971 ignoredKeysymList[i1] = c1;
972 c1 = strchr(c1, '\n');
978 /* null terminate the list... */
979 ignoredKeysymList[i1] = (char *) 0;
982 w = XmGetXmDisplay(display);
985 (void) XtSetArg(al[ac], XmNdefaultVirtualBindings, &origDisplayBindings);
987 (void) XtGetValues(w, al, ac);
989 if (!origDisplayBindings) {
990 GetBindingsProperty(display, "_MOTIF_BINDINGS", &origDisplayBindings);
991 freeOrigBindings = origDisplayBindings ;
994 if (!origDisplayBindings) {
995 GetBindingsProperty(display, "_MOTIF_DEFAULT_BINDINGS",
996 &origDisplayBindings);
997 freeOrigBindings = origDisplayBindings ;
1000 if (!origDisplayBindings) {
1001 if (ignoredKeysymList) XtFree((char *)ignoredKeysymList);
1005 DebugF('b', 10, fprintf(stderr,
1006 "FixOSFBindings(): bindings: %s\n", origDisplayBindings));
1007 newDisplayBindings = XtMalloc(strlen(origDisplayBindings) + 1);
1008 c1 = origDisplayBindings;
1009 c2 = newDisplayBindings;
1011 /* remember the current position in the new string... */
1014 /* copy over everything up to the '\n' or null... */
1015 while (*c1 && (*c1 != '\n')) {
1019 /* null terminate the string... */
1022 /* run through the exclusion list and look for a match... */
1023 for (i1 = 0; i1 < numIgnoredKeysyms; i1++) {
1024 DebugF('b', 10, fprintf(stderr, "!strcmp(\"%s\", \"%s\") = %d\n",
1025 c2 - strlen(ignoredKeysymList[i1]),
1026 ignoredKeysymList[i1],
1027 !strcmp(c2 - strlen(ignoredKeysymList[i1]),
1028 ignoredKeysymList[i1])));
1029 if ((strlen(ignoredKeysymList[i1]) <= (size_t)(c2 - cHold)) &&
1030 !strcmp(c2 - strlen(ignoredKeysymList[i1]),
1031 ignoredKeysymList[i1])) {
1032 /* we hit a match... */
1033 DebugF('b', 10, fprintf(stderr, "match!\n"));
1038 /* if we hit a match, back up the string... */
1039 if (i1 < numIgnoredKeysyms) {
1040 DebugF('b', 10, fprintf(stderr, "dropping %s\n", cHold));
1042 /* skip over whitespace in the source... */
1043 while (isspace(*c1)) {
1047 /* copy over whitespace in the source... */
1048 DebugF('b', 10, fprintf(stderr, "keeping %s\n", cHold));
1049 while (isspace(*c1)) {
1056 /* null terminate the string... */
1059 /* and set this new bindings string... */
1061 (void) XtSetArg(al[ac], XmNdefaultVirtualBindings, newDisplayBindings);
1063 (void) XtSetValues(w, al, ac);
1065 /* changed from XtFree to free as it was allocated with malloc to avoid FMM */
1066 if (freeOrigBindings) free(origDisplayBindings);
1068 XtFree((char *)ignoredKeysymList);
1070 /* and finally, reparse the string... */
1071 _XmVirtKeysInitialize(w);
1075 removeWmCommandCallback
1078 XtPointer clientData,
1083 static Atom xa_WM_STATE = None;
1084 Boolean firstTime = True;
1087 xa_WM_STATE = XInternAtom(XtDisplay(w), "WM_STATE", True);
1091 if (((XPropertyEvent *) event)->atom == xa_WM_STATE) {
1092 /* blow away the atom... */
1093 (void) XDeleteProperty(XtDisplay(w), XtWindow(w),
1096 /* we have done our job and don't need to be called again... */
1097 (void) XtRemoveEventHandler(w, (EventMask) XtAllEvents,
1098 True, removeWmCommandCallback, clientData);
1109 cp = strrchr(name, '/');
1110 return(cp ? cp + 1 : name);
1114 main(int argc, char **argv)
1121 char **commandToExecute = (char **) 0;
1122 int ptyMasterFd = -1;
1123 struct sigaction sa;
1124 #ifdef SUN_TERMINAL_SERVER
1125 Boolean iAmTheServer = False;
1126 #endif /* SUN_TERMINAL_SERVER */
1128 (void) atexit(AtExitProc);
1130 if (c = getenv("dttermDebugFlags")) {
1131 (void) setDebugFlags(c);
1133 if (isDebugSet('T')) {
1137 (void) timeStamp("starting");
1140 if (c = getenv("dttermDelayFlags"))
1144 int delay = atoi(c);
1145 pid_t pid = getpid();
1146 printf("dtterm (%d) sleeping for %d seconds\n", pid, delay);
1151 /* before we do anything, let's set up signal handlers to clean up
1154 (void) sigemptyset(&sa.sa_mask);
1157 sa.sa_handler = SignalHandler;
1158 /* trap all signals that we want to clean up after... */
1159 for (i = 0; i < (sizeof(signalList) / sizeof(signalList[0])); i++) {
1160 (void) sigaction(signalList[i], &sa, (struct sigaction *) 0);
1163 /* ignore SIGHUP... */
1164 sa.sa_handler = SIG_IGN;
1165 (void) sigaction(SIGHUP, &sa, (struct sigaction *) 0);
1168 ** set up the environment variables for this client...
1171 #if (OSMINORVERSION > 01)
1172 VuEnvControl(VUE_ENV_SET);
1173 #endif /* (OSMINORVERSION > 01) */
1175 _DtEnvControl(DT_ENV_SET);
1178 /* set up the I18N world... */
1179 (void) XtSetLanguageProc(NULL, NULL, NULL);
1181 if (isDebugSet('T')) {
1185 (void) timeStamp("XtSetLangProc() finished");
1188 /* before we initialize Xt, let's save argv and argc... */
1190 savedArgv = (char **) XtMalloc((argc + 1) * sizeof(char *));
1191 for (i = 0; i < argc; i++) {
1192 savedArgv[i] = XtMalloc(strlen(argv[i]) + 1);
1193 (void) strcpy(savedArgv[i], argv[i]);
1194 #ifdef SUN_TERMINAL_SERVER
1195 if ((!strcmp(argv[i], "-sdtserver")) || (!strcmp(argv[i], "-dtserver")))
1196 iAmTheServer = TRUE;
1197 #endif /* SUN_TERMINAL_SERVER */
1199 savedArgv[i] = (char *) 0;
1206 /* before we do anything with the toolkit, let's usurp the constraint
1207 * initialize proc for the XmManager widget class. This will allow us
1208 * to prevent it from performing that awful
1209 * DoMagicBBCompatibilityStuff() on us that steals (among other things)
1210 * our return key. Note that currently, this is all that the
1211 * XmManager widget does for widgets, but if it did more than we
1212 * would loose out on that.
1214 /* initialize Xt and the X world... */
1215 (void) DtTermInitialize();
1218 (void) XtSetArg(arglist[i], XmNallowShellResize, True); i++;
1220 topLevel = XtAppInitialize(&appContext,
1223 XtNumber(optionDescList),
1230 #ifdef SUN_TERMINAL_SERVER
1232 (void) ServerStartSession(topLevel, savedArgc, savedArgv,
1236 #endif /* SUN_TERMINAL_SERVER */
1238 /* get application specific resources... */
1240 /* Need to specify base address of the resources. In our case, attrs */
1241 (void) XtGetApplicationResources(topLevel, (XtPointer)&attrs,
1242 applicationResources,
1243 XtNumber(applicationResources),
1246 /* set all the debug flags... */
1247 (void) setDebugFlags(attrs.debugString);
1249 (void) FixOSFBindings(XtDisplay(topLevel));
1251 /* Add the Save_yourself callback... */
1252 xa_WM_SAVE_YOURSELF = XInternAtom(XtDisplay(topLevel),
1253 "WM_SAVE_YOURSELF", False);
1254 XmAddWMProtocolCallback(topLevel, xa_WM_SAVE_YOURSELF,
1255 (XtCallbackProc)SaveSessionCB, (XtPointer)NULL);
1258 (void) XtSetArg(arglist[i], XmNmappedWhenManaged, False); i++;
1259 (void) XtSetArg(arglist[i], XmNallowShellResize, True); i++;
1260 topShell = XtAppCreateShell((char *) 0, "Dtterm",
1261 applicationShellWidgetClass, XtDisplay(topLevel), arglist, i);
1263 if (attrs.session != NULL)
1264 RestoringTerms = TRUE;
1266 if (isDebugSet('T')) {
1270 (void) timeStamp("XtAppInitialize() finished");
1273 for (i = 1; i < argc; i++) {
1274 if (argv[i][0] != '-') {
1275 (void) Syntax(argv[0], argv[i]);
1279 switch(argv[i][1]) {
1283 /* skip past the '-S'... */
1285 if (c2 = strchr(c, '.')) {
1286 /* skip past the '.'... */
1289 /* skip past the first 2 characters since they are the
1290 * name of the pty...
1294 /* use scanf instead of atoi since it won't change the value
1295 * of ptyMasterFd if the string does not contain a valid
1298 (void) sscanf(c2, "%d", &ptyMasterFd);
1302 /* command to exec...
1306 commandToExecute = &argv[i];
1314 (void) Help(argv[0]);
1319 (void) Syntax(argv[0], argv[i]);
1325 #ifdef TERMINAL_SERVER
1326 if (attrs.standAlone || !attrs.serverId) {
1327 #endif /* TERMINAL_SERVER */
1328 /* log our startup... */
1330 (void) LogStart(0, argc, argv);
1331 #endif /* LOG_USAGE */
1334 if (commandToExecute) {
1335 (void) XtSetArg(arglist[i], DtNsubprocessArgv, commandToExecute);
1339 if (!RestoringTerms || !RestoreSession(topShell, arglist, i)) {
1341 RestoringTerms = False;
1343 if (ptyMasterFd >= 0) {
1344 /* set the workspace for the initial dtterm instance... */
1345 (void) XtSetArg(arglist[i], DtNtermDevice, ptyMasterFd); i++;
1346 (void) XtSetArg(arglist[i], DtNtermDeviceAllocate, False); i++;
1347 (void) XtSetArg(arglist[i], DtNsubprocessExec, False); i++;
1348 (void) CreateInstance(topShell, "dtTermView", arglist, i, False);
1351 (void) CreateInstance(topShell, "dtTermView", arglist, i, True);
1355 /* realize the interface... */
1357 (void) XtSetArg(arglist[i], XmNmappedWhenManaged, False); i++;
1358 (void) XtSetValues(topLevel, arglist, i);
1359 (void) XtRealizeWidget(topLevel);
1361 #ifdef SUN_TERMINAL_SERVER
1363 FinishToolTalkInit(topLevel);
1364 #endif /* SUN_TERMINAL_SERVER */
1366 /* Set title to the command to execute (if any)
1368 if (commandToExecute && !attrs.title) {
1369 attrs.title = base_name (commandToExecute[0]);
1372 /* Else set title to default ("Terminal")
1375 title = XtMalloc(strlen(GETMESSAGE(NL_SETN_Main, 3, "Terminal")) + 1);
1376 (void) strcpy(title, GETMESSAGE(NL_SETN_Main, 3, "Terminal"));
1377 attrs.title = title;
1380 /* realize the interface... */
1382 (void) XtSetArg(arglist[i], XmNtitle, attrs.title); i++;
1383 if ((!attrs.icon_name) && (!attrs.dtterm_name)) {
1384 (void) XtSetArg(arglist[i], XmNiconName, attrs.title); i++;
1386 (void) XtSetArg(arglist[i], XmNmappedWhenManaged, False); i++;
1387 (void) XtSetArg(arglist[i], XmNgeometry, NULL); i++;
1388 (void) XtSetValues(topShell, arglist, i);
1389 (void) XtRealizeWidget(topShell);
1391 if (RestoringTerms != True) {
1392 /* use the wm command to pass the -xrm resource to the wm... */
1393 (void) XSetCommand(XtDisplay(topShell), XtWindow(topShell),
1394 savedArgv, savedArgc);
1395 /* add a callback to remove it after it has been seen... */
1396 (void) XtAddEventHandler(topShell, (EventMask) PropertyChangeMask,
1397 False, removeWmCommandCallback, (XtPointer) 0);
1400 (void) XtSetArg(arglist[0], XmNmappedWhenManaged, True);
1401 (void) XtSetValues(topShell, arglist, 1);
1402 XtMapWidget(topShell);
1403 RegisterTestProbe(topShell,instance_list[0]);
1405 if (ptyMasterFd >= 0) {
1406 /* write out the window id... */
1407 char buffer[BUFSIZ];
1409 (void) sprintf(buffer, "%lx\n", XtWindow(topLevel));
1410 (void) write(ptyMasterFd, buffer, strlen(buffer));
1413 sunSetupIA(topLevel);
1416 #ifdef TERMINAL_SERVER
1418 if (ptyMasterFd >= 0) {
1419 (void) fprintf(stderr,
1420 GETMESSAGE(NL_SETN_Main,2, "%s: the -S option cannot be used with the -server or -serverid options\n"),
1426 (void) XtSetArg(arglist[i], XmNmappedWhenManaged, False); i++;
1427 (void) XtSetValues(topLevel, arglist, i);
1428 (void) XtRealizeWidget(topLevel);
1430 (void) ServerStartSession(topLevel, savedArgc, savedArgv,
1431 attrs.server, attrs.serverId, attrs.exitOnLastClose,
1432 attrs.block, attrs.loginShell,
1435 #endif /* TERMINAL_SERVER */
1437 /* and hand off to Xt... */
1438 (void) XtAppMainLoop(appContext);
1441 /************************************************************************
1445 ************************************************************************/
1450 Widget w, /* widget id */
1451 caddr_t client_data, /* data from application */
1452 caddr_t call_data ) /* data from widget class */
1454 char *longpath, *fileName;
1457 char *xa_CommandStr[1024];
1463 DtSessionSavePath(w, &longpath, &fileName);
1465 /* Create the session file */
1466 if ((fd = creat (longpath, S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP)) == -1)
1471 sprintf(bufr, "*dtterm.numClonedTerms: %d\n", InstanceCount);
1472 write (fd, bufr, strlen(bufr));
1474 for(i = 0; i < InstanceCount; i++)
1475 SaveTerm(instance_list[i], i, fd);
1478 "*dtterm.sessionFileVersionId: dttermSessionFileVersion.1.0.0\n");
1479 write (fd, bufr, strlen(bufr));
1484 xa_CommandStr[i] = savedArgv[0]; i++;
1485 xa_CommandStr[i] = "-session"; i++;
1486 xa_CommandStr[i] = fileName; i++;
1489 * Now restore the command line minus the old session parameter
1492 for (j = 1; j < savedArgc; j++)
1494 if (strcmp(savedArgv[j], "-session") == 0)
1501 xa_CommandStr[i] = savedArgv[j];
1506 XSetCommand(XtDisplay(topLevel),
1507 XtWindow(topLevel), xa_CommandStr, i);
1510 XtFree ((char *)fileName);
1515 DtTermViewWidget dtvw,
1519 char *bufr = malloc(1024);
1521 Dimension width, height;
1523 unsigned long numInfo;
1524 unsigned char charCursorStyle;
1530 Boolean reverseVideo;
1534 Boolean reverseWrap;
1537 Boolean autoLineFeed;
1543 static char *defaultCwd = (char *) 0;
1546 char buffer[BUFSIZ];
1547 DtTermWidget dtw = (DtTermWidget )dtvw->termview.term;
1548 static Boolean firstTime = True;
1549 static Atom xa_WM_STATE = None;
1550 struct _wmStateStruct {
1556 unsigned long nItems;
1557 unsigned long bytesAfter;
1559 XmVendorShellExtObject vendorExt;
1560 XmWidgetExtData extData;
1562 x = XtX(XtParent(dtvw));
1563 y = XtY(XtParent(dtvw));
1566 * Modify x & y to take into account window mgr frames
1567 * This is pretty bogus, but I don't know a better way to do it.
1569 extData = _XmGetWidgetExtData(XtParent(dtvw), XmSHELL_EXTENSION);
1570 vendorExt = (XmVendorShellExtObject)extData->widget;
1571 x -= vendorExt->vendor.xOffset;
1572 y -= vendorExt->vendor.yOffset;
1573 width = XtWidth(XtParent(dtvw));
1574 height = XtHeight(XtParent(dtvw));
1576 sprintf(bufr, "*dtterm_%d.x: %d\n", cloneNum, x);
1577 sprintf(bufr, "%s*dtterm_%d.y: %d\n", bufr, cloneNum, y);
1578 sprintf(bufr, "%s*dtterm_%d.width: %d\n", bufr, cloneNum, width);
1579 sprintf(bufr, "%s*dtterm_%d.height: %d\n", bufr, cloneNum, height);
1581 /* Write out iconic state...
1584 xa_WM_STATE = XInternAtom(XtDisplay(dtvw), "WM_STATE", True);
1587 if (xa_WM_STATE && (Success == XGetWindowProperty(
1589 XtWindow(XtParent(dtvw)),
1592 (sizeof(struct _wmStateStruct) + 3) / 4,
1599 (unsigned char **) &prop))) {
1600 if (prop->state == IconicState) {
1601 sprintf(bufr, "%s*dtterm_%d.iconify: %s\n", bufr, cloneNum,
1604 sprintf(bufr, "%s*dtterm_%d.iconify: %s\n", bufr, cloneNum,
1609 if(DtWsmGetWorkspacesOccupied(XtDisplay(dtvw),
1610 XtWindow(XtParent(dtvw)), &pWsPresence,
1611 &numInfo) == Success)
1614 sprintf(bufr, "%s*dtterm_%d.workspaceList: ", bufr, cloneNum);
1615 for(i = 0; i < numInfo; i++)
1617 char *name = XGetAtomName(XtDisplay(dtvw),
1619 sprintf(bufr, "%s %s", bufr, name);
1622 sprintf(bufr, "%s\n", bufr);
1623 XtFree((char *)pWsPresence);
1626 write (fd, bufr, strlen(bufr));
1628 sprintf(bufr, "*dtterm_%d.userFontListIndex: %d\n", cloneNum,
1629 _DtTermViewGetUserFontListIndex((Widget )dtvw));
1630 write (fd, bufr, strlen(bufr));
1632 /* get the current widget values... */
1634 (void) XtSetArg(al[ac], DtNmenuBar, &menuBar); ac++;
1635 (void) XtSetArg(al[ac], DtNscrollBar, &scrollBar); ac++;
1636 (void) XtGetValues((Widget)dtvw, al, ac);
1638 (void) XtSetArg(al[ac], DtNrows, &rows); ac++;
1639 (void) XtSetArg(al[ac], DtNcolumns, &columns); ac++;
1640 (void) XtSetArg(al[ac], DtNblinkRate, &blinkRate); ac++;
1641 (void) XtSetArg(al[ac], DtNcharCursorStyle, &charCursorStyle); ac++;
1642 (void) XtSetArg(al[ac], DtNblinkRate, &blinkRate); ac++;
1643 (void) XtSetArg(al[ac], DtNjumpScroll, &jumpScroll); ac++;
1644 (void) XtSetArg(al[ac], DtNmarginBell, &marginBell); ac++;
1645 (void) XtSetArg(al[ac], DtNnMarginBell, &nMarginBell); ac++;
1646 (void) XtSetArg(al[ac], DtNvisualBell, &visualBell); ac++;
1647 (void) XtSetArg(al[ac], DtNreverseVideo, &reverseVideo); ac++;
1648 (void) XtSetArg(al[ac], DtNappCursorDefault, &cursorMode); ac++;
1649 (void) XtSetArg(al[ac], DtNappKeypadDefault, &keypadMode); ac++;
1650 (void) XtSetArg(al[ac], DtNautoWrap, &autoWrap); ac++;
1651 (void) XtSetArg(al[ac], DtNreverseWrap, &reverseWrap); ac++;
1652 (void) XtSetArg(al[ac], DtNc132, &c132); ac++;
1653 (void) XtGetValues((Widget)dtw, al, ac);
1654 lockState = _DtTermGetUserKeyLock((Widget) dtw);
1655 autoLineFeed = _DtTermGetAutoLineFeed((Widget) dtw);
1657 /* get the current working directory if it was saved... */
1658 cwd = _DtTermGetCurrentWorkingDirectory((Widget) dtw);
1659 if (!cwd || !*cwd) {
1660 /* no saved cwd, use the one we were started from... */
1662 /* first time through, use getcwd() to get it... */
1663 if (getcwd(buffer, sizeof(buffer))) {
1664 defaultCwd = XtMalloc(strlen(buffer) + 1);
1665 (void) strcpy(defaultCwd, buffer);
1671 (void) sprintf(bufr, "*dtterm_%d*rows: %d\n", cloneNum, rows);
1672 (void) write(fd, bufr, strlen(bufr));
1673 (void) sprintf(bufr, "*dtterm_%d*columns: %d\n", cloneNum, columns);
1674 (void) write(fd, bufr, strlen(bufr));
1676 if(menuBar == False)
1678 sprintf(bufr, "*dtterm_%d*menuBar: False\n", cloneNum);
1679 write (fd, bufr, strlen(bufr));
1681 if(scrollBar == False)
1683 sprintf(bufr, "*dtterm_%d*scrollBar: False\n", cloneNum);
1684 write (fd, bufr, strlen(bufr));
1686 if (_DtTermPrimGetCursorVisible((Widget )dtw))
1688 if (charCursorStyle == DtTERM_CHAR_CURSOR_BAR)
1689 sprintf(bufr, "*dtterm_%d*charCursorStyle: CHARCURSOR_BAR\n", cloneNum);
1691 sprintf(bufr, "*dtterm_%d*charCursorStyle: CHARCURSOR_BOX\n", cloneNum);
1694 sprintf(bufr, "*dtterm_%d*charCursorStyle: CHARCURSOR_INVISIBLE\n", cloneNum);
1695 write (fd, bufr, strlen(bufr));
1698 sprintf(bufr, "*dtterm_%d*blinkRate: %d\n", cloneNum,blinkRate);
1699 write (fd, bufr, strlen(bufr));
1701 if(jumpScroll == False)
1703 sprintf(bufr, "*dtterm_%d*jumpScroll: False\n", cloneNum);
1704 write (fd, bufr, strlen(bufr));
1706 if(marginBell == True)
1708 sprintf(bufr, "*dtterm_%d*marginBell: True\n", cloneNum);
1709 write (fd, bufr, strlen(bufr));
1710 sprintf(bufr, "*dtterm_%d*nMarginBell: %d\n", cloneNum,nMarginBell);
1711 write (fd, bufr, strlen(bufr));
1713 if(visualBell == True)
1715 sprintf(bufr, "*dtterm_%d*visualBell: True\n", cloneNum);
1716 write (fd, bufr, strlen(bufr));
1718 if(reverseVideo == True)
1720 sprintf(bufr, "*dtterm_%d*reverseVideo: True\n", cloneNum);
1721 write (fd, bufr, strlen(bufr));
1723 if(cursorMode == True)
1725 sprintf(bufr, "*dtterm_%d*appCursorDefault: True\n", cloneNum);
1726 write (fd, bufr, strlen(bufr));
1728 if(keypadMode == True)
1730 sprintf(bufr, "*dtterm_%d*appKeypadDefault: True\n", cloneNum);
1731 write (fd, bufr, strlen(bufr));
1733 if(autoWrap == False)
1735 sprintf(bufr, "*dtterm_%d*autoWrap: False\n", cloneNum);
1736 write (fd, bufr, strlen(bufr));
1738 if(reverseWrap == True)
1740 sprintf(bufr, "*dtterm_%d*reverseWrap: True\n", cloneNum);
1741 write (fd, bufr, strlen(bufr));
1745 sprintf(bufr, "*dtterm_%d*c132: True\n", cloneNum);
1746 write (fd, bufr, strlen(bufr));
1748 if(lockState == False)
1749 sprintf(bufr, "*dtterm_%d*userKeyLock: False\n", cloneNum);
1751 sprintf(bufr, "*dtterm_%d*userKeyLock: True\n", cloneNum);
1752 write (fd, bufr, strlen(bufr));
1753 if(autoLineFeed == False)
1754 sprintf(bufr, "*dtterm_%d*autoLineFeed: False\n", cloneNum);
1756 sprintf(bufr, "*dtterm_%d*autoLineFeed: True\n", cloneNum);
1757 write (fd, bufr, strlen(bufr));
1760 (void) sprintf(bufr, "*dtterm_%d*currentWorkingDirectory: %s\n",
1762 (void) write(fd, bufr, strlen(bufr));
1767 /***********************************************************************
1769 * RestoreSession - returns True for success, False for failure...
1771 ***********************************************************************/
1778 char *fileName = attrs.session;
1782 XrmName xrm_name[5];
1783 XrmRepresentation rep_type;
1786 int numToRestore, i, j;
1790 if(DtSessionRestorePath(topLevel, &path, fileName) == False)
1793 /* Open the file as a resource database */
1794 if ((db = XrmGetFileDatabase (path)) == NULL)
1796 /* if we got a bogus filename, bail out... */
1800 xrm_name[0] = XrmStringToQuark ("dtterm");
1801 xrm_name[1] = XrmStringToQuark ("numClonedTerms");
1803 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
1805 /* if we got nothing back, bail out... */
1806 if (!value.addr || !*((char *) value.addr)) {
1810 numToRestore = atoi((char *)value.addr);
1811 /* if we don't have at least one to restore, bail out... */
1812 if (numToRestore < 1) {
1816 ShellWidget = topDog;
1818 for (j = 0; j < numToRestore; j++)
1820 /* use the passed arglist as a starting point... */
1821 for (ac = 0; ac < passedAc; ac++) {
1822 al[ac].value = passedAl[ac].value;
1823 al[ac].name = passedAl[ac].name;
1826 (void) CreateInstance(ShellWidget, "dtTermView", al, ac, True);
1827 RestoreTerm(ShellWidget, instance_list[j], j, db);
1828 (void) XtSetArg(al[0], XmNmappedWhenManaged, True);
1829 (void) XtSetValues(ShellWidget, al, 1);
1830 /* mapping the shell widget here is redundant, and it turns out
1831 * was responsible for CMVC7216: broken restoring of
1832 * iconified instances in multiple workspaces...
1836 (void) XtSetArg(al[ac], XmNallowShellResize, True); ac++;
1837 (void) XtSetArg(al[ac], XmNmappedWhenManaged, True); ac++;
1838 ShellWidget = XtAppCreateShell((char *) 0, "Dtterm",
1839 applicationShellWidgetClass, XtDisplay(topDog), al, ac);
1841 /* success, return True... */
1848 DtTermViewWidget dtvw,
1853 XrmName xrm_name[5];
1854 XrmRepresentation rep_type;
1856 DtTermWidget dtw = (DtTermWidget )dtvw->termview.term;
1858 Dimension width, height;
1860 unsigned char charCursorStyle;
1866 Boolean reverseVideo;
1870 Boolean reverseWrap;
1873 Boolean autoLineFeed;
1882 sprintf(buf, "dtterm_%d", termNum);
1883 xrm_name[0] = XrmStringToQuark(buf);
1886 /* Pass 1, before widget realization...
1889 /* get x position */
1890 xrm_name[1] = XrmStringToQuark ("x");
1891 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
1892 x = atoi((char *)value.addr);
1894 /* get y position */
1895 xrm_name [1] = XrmStringToQuark ("y");
1896 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
1897 y = atoi((char *)value.addr);
1900 xrm_name [1] = XrmStringToQuark ("width");
1901 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
1902 width = atoi((char *)value.addr);
1905 xrm_name [1] = XrmStringToQuark ("height");
1906 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
1907 height = atoi((char *)value.addr);
1911 * First the shell resources...
1915 (void) XtSetArg(al[ac], XmNx, x); ac++;
1916 (void) XtSetArg(al[ac], XmNy, y); ac++;
1917 (void) XtSetArg(al[ac], XmNwidth, width); ac++;
1918 (void) XtSetArg(al[ac], XmNheight, height); ac++;
1920 /* get iconify... */
1921 xrm_name[1] = XrmStringToQuark("iconify");
1922 if(XrmQGetResource(db, xrm_name, xrm_name, &rep_type, &value)) {
1923 if (!strcmp((char *)value.addr, "True")) {
1924 (void) XtSetArg(al[ac], XmNinitialState, IconicState); ac++;
1926 (void) XtSetArg(al[ac], XmNinitialState, NormalState); ac++;
1929 (void) XtSetArg(al[ac], XmNinitialState, NormalState);
1932 (void) XtSetValues(XtParent((Widget)dtvw), al, ac);
1936 * Now the TermView resources...
1940 xrm_name[1] = XrmStringToQuark ("rows");
1941 if(XrmQGetResource(db, xrm_name, xrm_name, &rep_type, &value)) {
1942 rows = atoi((char *)value.addr);
1943 (void) XtSetArg(al[ac], DtNrows, rows); ac++;
1946 xrm_name[1] = XrmStringToQuark ("columns");
1947 if(XrmQGetResource(db, xrm_name, xrm_name, &rep_type, &value)) {
1948 columns = atoi((char *)value.addr);
1949 (void) XtSetArg(al[ac], DtNcolumns, columns); ac++;
1952 xrm_name[1] = XrmStringToQuark ("menuBar");
1953 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
1954 {(void) XtSetArg(al[ac], XmNmenuBar, False); ac++;}
1955 xrm_name[1] = XrmStringToQuark ("scrollBar");
1956 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
1957 {(void) XtSetArg(al[ac], DtNscrollBar, False); ac++;}
1959 xrm_name[1] = XrmStringToQuark ("userFontListIndex");
1960 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True) {
1961 _DtTermViewSetUserFontListIndex((Widget )dtvw, atol(value.addr));
1964 (void) XtSetValues((Widget)dtvw, al, ac);
1968 * And finally the termprim stuff...
1973 (void) XtSetArg(al[ac], DtNrows, rows); ac++;
1977 (void) XtSetArg(al[ac], DtNcolumns, columns); ac++;
1980 xrm_name[1] = XrmStringToQuark ("charCursorStyle");
1981 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
1982 if (!strcmp(value.addr, "CHARCURSOR_INVISIBLE"))
1983 _DtTermPrimSetCursorVisible((Widget )dtw, False);
1986 if (!strcmp(value.addr, "CHARCURSOR_BAR"))
1987 (void) XtSetArg(al[ac], DtNcharCursorStyle, DtTERM_CHAR_CURSOR_BAR);
1989 (void) XtSetArg(al[ac], DtNcharCursorStyle, DtTERM_CHAR_CURSOR_BOX);
1993 xrm_name [1] = XrmStringToQuark ("blinkRate");
1994 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
1995 blinkRate = atoi((char *)value.addr);
1996 (void) XtSetArg(al[ac], DtNblinkRate, blinkRate); ac++;
1998 xrm_name[1] = XrmStringToQuark ("jumpScroll");
1999 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2000 {(void) XtSetArg(al[ac], DtNjumpScroll, False); ac++;}
2002 xrm_name[1] = XrmStringToQuark ("marginBell");
2003 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2005 (void) XtSetArg(al[ac], DtNmarginBell, True); ac++;
2006 xrm_name [1] = XrmStringToQuark ("nMarginBell");
2007 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
2008 nMarginBell = atoi((char *)value.addr);
2009 (void) XtSetArg(al[ac], DtNnMarginBell, nMarginBell);ac++;
2012 xrm_name[1] = XrmStringToQuark ("visualBell");
2013 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2014 {(void) XtSetArg(al[ac], DtNvisualBell, True); ac++;}
2016 xrm_name[1] = XrmStringToQuark ("reverseVideo");
2017 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2018 {(void) XtSetArg(al[ac], DtNreverseVideo, True); ac++;}
2020 xrm_name[1] = XrmStringToQuark ("appCursorDefault");
2021 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2022 {(void) XtSetArg(al[ac], DtNappCursorDefault, True); ac++;}
2024 xrm_name[1] = XrmStringToQuark ("appKeypadDefault");
2025 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2026 {(void) XtSetArg(al[ac], DtNappKeypadDefault, True); ac++;}
2028 xrm_name[1] = XrmStringToQuark ("autoWrap");
2029 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2030 {(void) XtSetArg(al[ac], DtNautoWrap, False); ac++;}
2032 xrm_name[1] = XrmStringToQuark ("reverseWrap");
2033 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2034 {(void) XtSetArg(al[ac], DtNreverseWrap, True); ac++;}
2036 xrm_name[1] = XrmStringToQuark ("c132");
2037 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2038 {(void) XtSetArg(al[ac], DtNc132, True); ac++;}
2040 xrm_name[1] = XrmStringToQuark ("reverseVideo");
2041 if(XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value) == True)
2042 {(void) XtSetArg(al[ac], DtNreverseVideo, True); ac++;}
2044 xrm_name[1] = XrmStringToQuark ("userKeyLock");
2045 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
2046 if (!strcmp(value.addr, "True"))
2047 _DtTermSetUserKeyLock((Widget) dtw, True);
2049 _DtTermSetUserKeyLock((Widget) dtw, False);
2051 xrm_name[1] = XrmStringToQuark ("autoLineFeed");
2052 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
2053 if (!strcmp(value.addr, "True"))
2054 _DtTermSetAutoLineFeed((Widget) dtw, True);
2056 _DtTermSetAutoLineFeed((Widget) dtw, False);
2058 (void) XtSetValues((Widget)dtw, al, ac);
2060 xrm_name[1] = XrmStringToQuark ("currentWorkingDirectory");
2061 XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value);
2062 if (value.addr && *value.addr) {
2063 _DtTermSetCurrentWorkingDirectory((Widget) dtw, value.addr);
2066 /* realize the interface...
2068 (void) XtRealizeWidget(shellWidget);
2072 /* Pass 2, after widget realization...
2075 /* get workspace list */
2076 xrm_name[1] = XrmStringToQuark("workspaceList");
2077 XrmQGetResource(db, xrm_name, xrm_name, &rep_type, &value);
2078 SetWorkSpaceHints( XtParent((Widget)dtvw),(char *) value.addr);
2089 Atom * workspace_atoms = NULL;
2090 int num_workspaces=0;
2095 ptr = strchr (workspaces, ' ');
2100 /* if we haven't hit a match, try interning the atom... */
2101 if (thisWsAtom == None) {
2102 thisWsAtom = XmInternAtom (XtDisplay(shell), workspaces, True);
2105 if (thisWsAtom != None) {
2106 workspace_atoms = (Atom *) XtRealloc ((char *)workspace_atoms,
2107 sizeof (Atom) * (num_workspaces + 1));
2108 workspace_atoms[num_workspaces] = thisWsAtom;
2114 workspaces = ptr + 1;
2116 } while (ptr != NULL);
2118 if (num_workspaces > 0) {
2119 DtWsmSetWorkspacesOccupied(XtDisplay(shell), XtWindow (shell),
2120 workspace_atoms, num_workspaces);
2123 XtFree ((char *) workspace_atoms);
2124 workspace_atoms = NULL;