cdesktopenv/cde/programs/dtprintinfo/libUI/MotifUI/Application.C

389 lines
10 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 libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $TOG: Application.C /main/9 1998/07/24 16:14:41 mgreess $ */
/* *
* (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 "Application.h"
#include <sys/stat.h>
#include <Xm/Protocols.h>
#ifndef NO_CDE
extern "C" {
#include <Dt/Dt.h>
#include <Dt/EnvControlP.h>
#include <Dt/DbUtil.h>
#include <Dt/Action.h>
#include <Dt/Session.h>
}
#endif
#include <stdlib.h> // for putenv function
const char *SESSION_FLAG = "-session";
const char *SESSION_NAME = "session";
const char *SESSION_CLASSNAME = "Session";
const char *DEFAULT_FONT = "fixed";
typedef struct
{
XmFontList user_font;
XmFontList system_font;
char *session_file;
Dimension shadow_thickness;
} ApplicationArgs, *ApplicationArgsPtr;
static XtResource resources[] =
{
{"userFont", "XmCFontList", XmRFontList, sizeof(XmFontList),
XtOffsetOf (ApplicationArgs, user_font), XmRString,
#ifdef aix
(XtPointer) DEFAULT_FONT
#else
(XtPointer) "fixed"
#endif
},
{"systemFont", "XmCFontList", XmRFontList, sizeof(XmFontList),
XtOffsetOf (ApplicationArgs, system_font), XmRString,
#ifdef aix
(XtPointer) DEFAULT_FONT
},
{(char *)SESSION_NAME, (char *)SESSION_CLASSNAME, XtRString, sizeof(char *),
#else
(XtPointer) "fixed"
},
{"session", "Session", XtRString, sizeof(char *),
#endif
XtOffsetOf (ApplicationArgs, session_file), XmRString, (XtPointer) NULL,
},
{XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension,
sizeof (Dimension), XtOffsetOf (ApplicationArgs, shadow_thickness),
XmRImmediate, (XtPointer) 1
}
};
static XrmOptionDescRec options[] =
{
#ifdef aix
{(char *)SESSION_FLAG, (char *)SESSION_NAME, XrmoptionSepArg, NULL}
#else
{"-session", "session", XrmoptionSepArg, NULL}
#endif
};
extern "C" {
extern Boolean XmeRenderTableGetDefaultFont(XmFontList, XFontStruct **);
}
Application::Application(char *name,
char *appClassName,
int *_argc,
char **_argv)
: MotifUI(NULL, name, appClassName, appClassName)
{
#ifndef NO_CDE
_DtEnvControl(DT_ENV_SET);
#endif
XtSetLanguageProc(NULL, NULL, NULL);
_w = XtVaAppInitialize(&appContext, appClassName, options, XtNumber(options),
_argc, _argv, NULL, XmNallowShellResize, true,
XmNtitle, name, XmNiconName, name, NULL);
topLevel = _w;
display = XtDisplay(_w);
root = RootWindowOfScreen(XtScreen(_w));
white = WhitePixelOfScreen(XtScreen(_w));
black = BlackPixelOfScreen(XtScreen(_w));
depth = DefaultDepthOfScreen(XtScreen(_w));
int numMouseButtons = XGetPointerMapping(display, (unsigned char *)NULL, 0);
bMenuButton = (numMouseButtons < 3) ? Button2 : Button3;
ApplicationArgs application_args;
XtGetApplicationResources(_w, &application_args, resources,
XtNumber(resources), NULL, 0);
userFont = application_args.user_font;
userFont = application_args.system_font;
session_info = NULL;
attributes = NULL;
values = NULL;
n_attrs = 0;
session_path = NULL;
fp = NULL;
if (session_file = application_args.session_file)
{
if (*session_file == '/')
session_path = strdup(session_file);
else
DtSessionRestorePath(topLevel, &session_path, session_file);
}
shadowThickness = application_args.shadow_thickness;
{
XmFontContext context;
if (XmFontListInitFontContext(&context, userFont))
{
XmFontListEntry entry = XmFontListNextEntry(context);
if (entry)
{
XmFontType _type_return;
fs = (XFontStruct *)XmFontListEntryGetFont(entry, &_type_return);
if (_type_return != XmFONT_IS_FONT) {
XmeRenderTableGetDefaultFont(userFont, &fs);
}
if (fs) {
font = fs->fid;
}
}
XmFontListFreeFontContext(context);
}
}
argc = *_argc;
argv = _argv;
InstallDestroyCB();
// If the user specified -display on the command line, we need
// to set the environment variable DISPLAY to this value so that
// any aixterms or X applications launched from this program
// go to the same display
new_display = new char [strlen("DISPLAY=") +
strlen(DisplayString(display)) + 1];
sprintf(new_display, "DISPLAY=%s", DisplayString(display));
putenv(new_display);
// Make the environment variable ENV set to nothing. This is so that
// we don't run the user's ENV every time we open a child process.
putenv("ENV=");
#ifndef NO_CDE
if (!DtAppInitialize(appContext, display, topLevel, argv[0], appClassName))
{
// Fatal Error: could not connect to the messaging system.
// DtAppInitialize() has already logged an appropriate error msg
exit(-1);
}
// Load the filetype/action dbs; DtInvokeAction() requires this
DtDbLoad();
#endif
Atom xa_WM_SAVE_YOURSELF = XInternAtom(display, "WM_SAVE_YOURSELF", False);
XmAddWMProtocols(topLevel, &xa_WM_SAVE_YOURSELF, 1);
XmAddWMProtocolCallback(topLevel, xa_WM_SAVE_YOURSELF, SaveSessionCB,
(XtPointer)this);
XmAddWMProtocolCallback(topLevel,
XmInternAtom(display, "WM_DELETE_WINDOW", False),
CloseCB, (XtPointer)this);
}
Application::~Application()
{
if (userFont)
XmFontListFree(userFont);
delete session_info;
delete attributes;
delete values;
delete new_display;
}
boolean Application::SetName(char *name)
{
if (!_w)
return false;
XtVaSetValues(_w, XmNtitle, name, XmNiconName, name, NULL);
return true;
}
boolean Application::SetVisiblity(boolean flag)
{
if (!_w)
return false;
if (flag)
{
XtRealizeWidget(_w);
XtVaSetValues(_w, XmNallowShellResize, False, NULL);
}
return true;
}
void Application::Run()
{
XtAppMainLoop(appContext);
}
void Application::SaveSessionCB(Widget, XtPointer client_data, XtPointer)
{
Application *obj = (Application *)client_data;
obj->SaveMe(true);
}
void Application::CloseCB(Widget, XtPointer client_data, XtPointer)
{
Application *obj = (Application *)client_data;
obj->SaveMe();
}
void Application::SaveMe(boolean save_as_session)
{
char *path = NULL, *name = NULL;
if (save_as_session)
DtSessionSavePath(topLevel, &path, &name);
else
{
name = SessionFile();
char *path1 = SessionPath();
path = new char[strlen(path1) + strlen(name) + 2];
sprintf(path, "%s/%s", path1, name);
name = NULL;
}
if (path && (fp = fopen(path, "w")))
{
SaveYourSelf();
fflush(fp);
fclose(fp);
fp = NULL;
}
if (save_as_session)
{
char **new_argv = NULL;
char **_argv;
int _argc;
XtVaGetValues(topLevel, XmNargc, &_argc, XmNargv, &_argv, NULL);
int i;
if (path && name)
{
if (_argc > 2 && !STRCMP(SESSION_FLAG, _argv[1]))
{
new_argv = new char *[_argc + 1];
for (i = 0; i < _argc; i++)
new_argv[i] = _argv[i];
new_argv[2] = name;
new_argv[i] = NULL;
}
else
{
int j;
new_argv = new char *[_argc + 3];
new_argv[0] = _argv[0];
new_argv[1] = (char *)SESSION_FLAG;
new_argv[2] = name;
for (i = 1, j = 3; i < _argc; i++, j++)
new_argv[j] = _argv[i];
new_argv[j] = NULL;
_argc += 2;
}
}
else
{
new_argv = new char *[_argc + 1];
for (i = 0; i < _argc; i++)
new_argv[i] = _argv[i];
new_argv[i] = NULL;
}
XSetCommand(display, XtWindow(topLevel), new_argv, _argc);
delete [] new_argv;
}
if (path)
XtFree(path);
if (name)
XtFree(name);
}
void Application::Save(char *attribute, char *value)
{
if (fp)
fprintf(fp, "%s\n%s\n", attribute, value);
}
char *Application::Restore(char *attribute)
{
char *value = NULL;
if (!session_info)
{
if (!session_path)
{
char *name = SessionFile();
char *path = SessionPath();
session_path = new char[strlen(path) + strlen(name) + 2];
sprintf(session_path, "%s/%s", path, name);
session_file = strdup(session_path);
}
struct stat statbuff;
if (stat(session_path, &statbuff) != -1)
{
FILE *fp1;
if (fp1 = fopen(session_path, "r"))
{
session_info = new char[statbuff.st_size + 1];
fread(session_info, (unsigned int)statbuff.st_size, 1, fp1);
fclose(fp1);
session_info[statbuff.st_size] = '\0';
char *s, *s1 = session_info;
s = s1;
while (s && (s = strchr(s1, '\n')))
{
n_attrs++;
s1 = s + 1;
}
n_attrs /= 2;
attributes = new char*[n_attrs];
values = new char*[n_attrs];
s = strtok(session_info, "\n");
int i = 0;
while (s && *s)
{
attributes[i] = s;
values[i] = strtok(NULL, "\n");
s = strtok(NULL, "\n");
i++;
}
}
}
if (!session_info)
session_info = strdup("");
}
int i;
for (i = 0; i < n_attrs; i++)
if (!STRCMP(attributes[i], attribute))
{
value = values[i];
break;
}
return value;
}