cdesktopenv/cde/examples/dtsession/session.c

237 lines
5.6 KiB
C

/*
* 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 librararies 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);
}