123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- /*
- * 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
- */
- /* $XConsortium: session.c /main/3 1995/10/27 10:40:33 rswiston $ */
- /*
- * (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.
- */
- /*
- * session.c
- *
- * Example code for Dt Session Manager conventions and API
- */
- #include <stdio.h>
- #include <Xm/RowColumn.h>
- #include <Xm/ToggleB.h>
- #include <Xm/Protocols.h>
- #include <Dt/Session.h>
- /*
- * Define '-session' command line option
- */
- typedef struct _ApplicationArgs {
- String session;
- } ApplicationArgs;
- static XtResource applicationResources[] = {
- {
- "session",
- "Session",
- XmRString,
- sizeof(String),
- XtOffsetOf(ApplicationArgs,session),
- XmRImmediate,
- NULL
- },
- };
- static XrmOptionDescRec commandLineOpts[] = {
- { "-session", "session", XrmoptionSepArg, NULL },
- };
- static ApplicationArgs applicationArgs;
- /*
- * Simple application state to be preserved across sessions
- */
- static int lightState = False;
- /*
- * miscellaneous global data
- */
- static XtAppContext appContext;
- static Widget toplevel;
- static int savedArgc;
- static char **savedArgv;
- static void PreserveCommandLine(int, char **);
- static void SetWmCommand(char *);
- static void SaveSessionCb(Widget, XtPointer, XtPointer);
- static void RestoreSession(Widget, char*);
- static void SaveApplicationState(char *);
- static void RestoreApplicationState(char *);
- main(int argc, char **argv)
- {
- Widget mainWindow, toggle;
- XmString labelString;
- Arg args[1];
-
- /* Save the command line before Xt parses out the standard options */
- PreserveCommandLine(argc, argv);
- /* Create the application UI */
- toplevel = XtAppInitialize(&appContext, "Session",
- commandLineOpts, XtNumber(commandLineOpts),
- &argc, argv,
- NULL,
- NULL, 0);
- XtGetApplicationResources(toplevel, &applicationArgs,
- applicationResources,
- XtNumber(applicationResources),
- NULL, 0);
- mainWindow = XmCreateWorkArea(toplevel, "mainWindow", NULL, 0);
- XtManageChild(mainWindow);
- labelString = XmStringCreateLocalized("Lights");
- XtSetArg(args[0], XmNlabelString, labelString);
- toggle = XmCreateToggleButton(mainWindow, "lightsToggle", args, 1);
- XtManageChild(toggle);
- XmStringFree(labelString);
- /* Add callback to detect session manager messages */
- XmAddWMProtocolCallback(toplevel,
- XInternAtom(XtDisplay(toplevel), "WM_SAVE_YOURSELF", False),
- SaveSessionCb, (XtPointer)toplevel);
- /* Restore state if application was restarted by session manager */
- if (applicationArgs.session != NULL) {
- RestoreSession(toplevel, applicationArgs.session);
- }
- XtRealizeWidget(toplevel);
- XtAppMainLoop(appContext);
- }
- /*
- * Save session state
- */
- static void SaveSessionCb(Widget w, XtPointer cd, XtPointer cb)
- {
- Widget toplevel = (Widget)cd;
- char *savePath = NULL;
- char *saveFile = NULL;
- DtSessionSavePath(toplevel, &savePath, &saveFile);
- if (savePath != NULL) {
- SaveApplicationState(savePath);
- SetWmCommand(saveFile);
- XtFree(savePath);
- XtFree(saveFile);
- }
- }
- static void SaveApplicationState(char *path)
- {
- Widget toggle = XtNameToWidget(toplevel, "*lightsToggle");
- FILE *fp;
- lightState = XmToggleButtonGetState(toggle);
- if ((fp = fopen(path, "w")) != NULL) {
- fprintf(fp, "%d", lightState);
- fclose(fp);
- }
- }
- static void PreserveCommandLine(int argc, char **argv)
- {
- int i;
- savedArgv = (char **)XtMalloc(argc*sizeof(char *));
- savedArgc = argc;
- for (i=0; i < argc; i++) savedArgv[i] = XtNewString(argv[i]);
- }
- static void SetWmCommand(char *sessionId)
- {
- char **wm_command;
- int i, j;
- wm_command = (char **) XtMalloc((savedArgc+2) * sizeof(char*));
- wm_command[0] = XtNewString(savedArgv[0]);
- wm_command[1] = XtNewString("-session");
- wm_command[2] = XtNewString(sessionId);
- for (i = 1, j = 3; i < savedArgc; i++) {
- if (strcmp(savedArgv[i], "-session") == 0) { i++; continue; }
- wm_command[j] = XtNewString(savedArgv[i]);
- j++;
- }
- XSetCommand(XtDisplay(toplevel), XtWindow(toplevel), wm_command, j);
- for (i=0; i < j; i++) XtFree(wm_command[i]);
- XtFree((char*)wm_command);
- }
- /*
- * Restore previously saved state
- */
- static void RestoreSession(Widget w, char *restoreFile)
- {
- char *restorePath = NULL;
- DtSessionRestorePath(w, &restorePath, restoreFile);
- if (restorePath != NULL) {
- RestoreApplicationState(restorePath);
- XtFree(restorePath);
- }
- }
- static void RestoreApplicationState(char *path)
- {
- Widget toggle = XtNameToWidget(toplevel, "*lightsToggle");
- FILE *fp;
- if ((fp = fopen(path, "r")) != NULL) {
- fscanf(fp, "%d", &lightState);
- fclose(fp);
- }
- XmToggleButtonSetState(toggle, lightState, False);
- }
|