797 lines
26 KiB
C
797 lines
26 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
|
|
*/
|
|
/* $XConsortium: MainWin.c /main/8 1996/03/25 00:52:54 pascale $ */
|
|
/************************************<+>*************************************
|
|
****************************************************************************
|
|
**
|
|
** File: MainWin.c
|
|
**
|
|
** Project: DT 3.0
|
|
**
|
|
** Description: Controls the main Dtstyle dialog
|
|
**
|
|
**
|
|
****************************************************************************
|
|
************************************<+>*************************************/
|
|
/*
|
|
* (c) Copyright 1996 Digital Equipment Corporation.
|
|
* (c) Copyright 1990, 1996 Hewlett-Packard Company.
|
|
* (c) Copyright 1996 International Business Machines Corp.
|
|
* (c) Copyright 1996 Sun Microsystems, Inc.
|
|
* (c) Copyright 1996 Novell, Inc.
|
|
* (c) Copyright 1996 FUJITSU LIMITED.
|
|
* (c) Copyright 1996 Hitachi.
|
|
*/
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* include files */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
#include <X11/Xlib.h>
|
|
#include <Xm/MwmUtil.h>
|
|
#include <signal.h>
|
|
#include <errno.h>
|
|
|
|
#include <Xm/Xm.h>
|
|
#include <Xm/XmP.h>
|
|
#include <Xm/CascadeB.h>
|
|
#include <Xm/ColorObjP.h>
|
|
#include <Xm/MainW.h>
|
|
#include <Xm/Frame.h>
|
|
#include <Xm/PushB.h>
|
|
#include <Xm/RowColumn.h>
|
|
#include <Xm/SeparatoG.h>
|
|
|
|
/*
|
|
#include <Dt/Box.h>
|
|
*/
|
|
#include <Dt/Control.h>
|
|
#include <Dt/DialogBox.h>
|
|
#include <Dt/Icon.h>
|
|
#include <Dt/IconFile.h>
|
|
|
|
#include <Dt/HourGlass.h>
|
|
#include <Dt/UserMsg.h>
|
|
|
|
#include "Main.h"
|
|
#include "ColorMain.h"
|
|
#include "Backdrop.h"
|
|
#include "Keyboard.h"
|
|
#include "Mouse.h"
|
|
#include "Audio.h"
|
|
#include "Screen.h"
|
|
#include "Dtwm.h"
|
|
#include "Startup.h"
|
|
#include "I18nMain.h"
|
|
|
|
#include "Help.h"
|
|
#include "SaveRestore.h"
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* include extern functions */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
#include "MainWin.h"
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* Local #defines */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* Internal Functions */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
static void _DtMapCB(
|
|
Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data) ;
|
|
static void build_mainWindow( Widget shell) ;
|
|
static void activateCB(
|
|
Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data) ;
|
|
static void ProcessComponentList(
|
|
Widget parent,
|
|
Widget mainRC) ;
|
|
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* Internal variables */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
static int colorUse = XmCO_BLACK_WHITE;
|
|
static saveRestore save = {FALSE, 0, };
|
|
|
|
|
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
/* init_mainWindow */
|
|
/* */
|
|
/* build if needed, otherwise just manage the mainWindow. */
|
|
/* Assumes shell has been created */
|
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
void
|
|
init_mainWindow( Widget shell )
|
|
{
|
|
if (style.mainWindow == NULL) {
|
|
build_mainWindow(shell);
|
|
if (save.restoreFlag)
|
|
XtAddCallback (shell, XtNpopupCallback, _DtMapCB, NULL);
|
|
XtManageChild(style.mainWindow);
|
|
XtPopup(shell, XtGrabNone);
|
|
}
|
|
else /* fix Shouldn't ever happen */
|
|
XtManageChild(style.mainWindow);
|
|
}
|
|
|
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
/* _DtMapCB */
|
|
/* first time only, set correct sizing in case font */
|
|
/* size has changed (if so, saved size is wrong) */
|
|
/* remove callback after first time */
|
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
static void
|
|
_DtMapCB(
|
|
Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data )
|
|
{
|
|
XSizeHints hints;
|
|
|
|
if (save.restoreFlag)
|
|
{
|
|
hints.min_width = XtWidth(w);
|
|
hints.min_height = XtHeight(w);
|
|
hints.max_width = XtWidth(w);
|
|
hints.max_height = XtHeight(w);
|
|
hints.flags = PMinSize | PMaxSize;
|
|
XSetWMNormalHints (style.display, XtWindow(w), &hints);
|
|
}
|
|
|
|
XtRemoveCallback(style.shell, XtNpopupCallback, _DtMapCB, NULL);
|
|
}
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++++++++*/
|
|
/* build_mainWindow */
|
|
/* */
|
|
/* build the main window, but don't manage it. */
|
|
/*+++++++++++++++++++++++++++++++++++++++++++++*/
|
|
static void
|
|
build_mainWindow(
|
|
Widget shell )
|
|
{
|
|
int count, n, n2;
|
|
Arg args[MAX_ARGS];
|
|
Widget WidgList[10];
|
|
Widget frame;
|
|
Widget mainMenu;
|
|
Widget mainRC;
|
|
Widget filePulldown;
|
|
Widget helpPulldown;
|
|
Widget exitBtn;
|
|
char *mnemonic;
|
|
char *tmpStr;
|
|
Pixmap pixmap;
|
|
XmString labelString;
|
|
Pixmap ditherPix;
|
|
XmPixelSet pixelSet[XmCO_NUM_COLORS];
|
|
Pixel bg;
|
|
short a,i,p,s;
|
|
|
|
|
|
/* saveRestore
|
|
* Note that save.poscnt has been initialized elsewhere.
|
|
* save.posArgs may contain information from restoreAudio().*/
|
|
|
|
XtSetArg(save.posArgs[save.poscnt], XmNnoResize, True); save.poscnt++;
|
|
XtSetArg(save.posArgs[save.poscnt], XmNresizePolicy, XmRESIZE_NONE); save.poscnt++;
|
|
style.mainWindow= XmCreateMainWindow(shell,"mainWindow", save.posArgs, save.poscnt);
|
|
XtAddCallback(style.mainWindow, XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_MAIN_WINDOW);
|
|
|
|
n = 0;
|
|
tmpStr = (char *)XtMalloc(strlen(GETMESSAGE(4, 1, "Style Manager"))+1);
|
|
sprintf(tmpStr, "%s", GETMESSAGE(4, 1, "Style Manager"));
|
|
XtSetArg(args[n], XmNtitle, tmpStr); n++;
|
|
XtSetArg(args[n], XmNiconName,
|
|
(char *)GETMESSAGE(4, 37, "Style")); n++;
|
|
XtSetValues(XtParent(style.mainWindow), args, n);
|
|
XtFree(tmpStr);
|
|
|
|
n = 0;
|
|
mainMenu= XmCreateMenuBar(style.mainWindow,"mainMenu", args, n);
|
|
XtAddCallback(mainMenu, XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_MENUBAR);
|
|
XtManageChild(mainMenu);
|
|
|
|
/* create the pulldown widgets */
|
|
n = 0;
|
|
filePulldown= XmCreatePulldownMenu(mainMenu,"fileMenu", args, n );
|
|
XtAddCallback(filePulldown, XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_FILE_MENU);
|
|
|
|
n = 0;
|
|
helpPulldown= XmCreatePulldownMenu(mainMenu, "helpMenu" , args, n );
|
|
XtAddCallback(helpPulldown, XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_HELP_MENU);
|
|
|
|
/* create the cascade butons */
|
|
count = 0;
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 2, "F"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 3, "File"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
XtSetArg(args[n], XmNsubMenuId, filePulldown); n++;
|
|
XtSetArg (args[n], XmNmarginWidth, LB_MARGIN_WIDTH); n++;
|
|
WidgList[count++]=
|
|
XmCreateCascadeButton(mainMenu, "fileCascadeButton", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_FILE_MENU);
|
|
XmStringFree(labelString);
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 4, "H"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 5, "Help"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
XtSetArg(args[n], XmNsubMenuId, helpPulldown); n++;
|
|
XtSetArg (args[n], XmNmarginWidth, 6); n++;
|
|
WidgList[count++]=
|
|
XmCreateCascadeButton(mainMenu, "helpCascadeButton", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_HELP_MENU);
|
|
XmStringFree(labelString);
|
|
|
|
n = 0;
|
|
XtSetArg(args[n], XmNmenuHelpWidget, WidgList[count-1]); n++;
|
|
XtSetValues (mainMenu, args, n);
|
|
|
|
XtManageChildren (WidgList, count);
|
|
|
|
/* create the File menu pane's buttons */
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 53, "x"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 7, "Exit"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
exitBtn= XmCreatePushButton(filePulldown, "exit", args, n );
|
|
XtAddCallback(exitBtn, XmNactivateCallback, activateCB_exitBtn, NULL);
|
|
XtAddCallback(exitBtn, XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_EXIT);
|
|
XtManageChild(exitBtn);
|
|
XmStringFree(labelString);
|
|
|
|
/* create the Help menu pane's buttons */
|
|
count =0;
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 54, "v"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 55, "Overview"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
WidgList[count++]=
|
|
XmCreatePushButton(helpPulldown, "overview", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_INTRODUCTION);
|
|
XmStringFree(labelString);
|
|
|
|
n = 0;
|
|
WidgList[count++]=
|
|
XmCreateSeparatorGadget(helpPulldown,"separator",args,n);
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 43, "T"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 56, "Tasks"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
WidgList[count++]= XmCreatePushButton(helpPulldown, "tasks", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TASKS);
|
|
XmStringFree(labelString);
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 45, "R"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 57, "Reference"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
WidgList[count++]= XmCreatePushButton(helpPulldown, "reference", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_REFERENCE);
|
|
XmStringFree(labelString);
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 47, "O"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 48, "On Item"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
WidgList[count++]= XmCreatePushButton(helpPulldown, "onItem", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpModeCB, (XtPointer)NULL);
|
|
XmStringFree(labelString);
|
|
|
|
n = 0;
|
|
WidgList[count++] =
|
|
XmCreateSeparatorGadget(helpPulldown,"separator",args,n);
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 49, "U"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 58, "Using Help"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
WidgList[count++]=
|
|
XmCreatePushButton(helpPulldown, "usingHelp", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_USING);
|
|
XmStringFree(labelString);
|
|
|
|
n = 0;
|
|
WidgList[count++] =
|
|
XmCreateSeparatorGadget(helpPulldown,"separator",args,n);
|
|
|
|
n = 0;
|
|
mnemonic = ((char *)GETMESSAGE(4, 59, "A"));
|
|
XtSetArg(args[n], XmNmnemonic, mnemonic[0]); n++;
|
|
labelString = CMPSTR((char *)GETMESSAGE(4, 60, "About Style Manager"));
|
|
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
|
WidgList[count++]= XmCreatePushButton(helpPulldown, "stylemanager", args, n );
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer)HELP_VERSION);
|
|
XmStringFree(labelString);
|
|
|
|
XtManageChildren(WidgList, count);
|
|
|
|
/* create frame and row column for icon gadgets */
|
|
n = 0;
|
|
XtSetArg(args[n], XmNresizePolicy, XmRESIZE_NONE); n++;
|
|
XtSetArg(args[n], XmNshadowType, XmSHADOW_OUT); n++;
|
|
XtSetArg(args[n], XmNshadowThickness, 1); n++;
|
|
frame = XmCreateFrame(style.mainWindow, "frame", args, n);
|
|
XtManageChild(frame);
|
|
|
|
/* Save pixels for later use */
|
|
/* primary top/bottom shadow -> fg/bg for pixmaps in primary areas */
|
|
/* secondary top/bottom shadow -> fg/bg for pixmaps in secondary areas */
|
|
/* secondary select color -> backgrounds of editable text areas */
|
|
/* secondary foreground -> fill color on toggle indicators */
|
|
|
|
/* Get the primary colors to be used later */
|
|
n = 0;
|
|
XtSetArg(args[n], XmNbackground, &bg); n++;
|
|
XtGetValues(style.mainWindow, args, n);
|
|
|
|
XmGetColors (style.screen, style.colormap, bg,
|
|
NULL,
|
|
&style.primTSCol,
|
|
&style.primBSCol,
|
|
NULL);
|
|
|
|
/* Get the secondary colors to be used later */
|
|
n = 0;
|
|
XtSetArg(args[n], XmNbackground, &style.secBgCol); n++;
|
|
XtGetValues(exitBtn, args, n);
|
|
|
|
XmGetColors (style.screen, style.colormap, style.secBgCol,
|
|
&style.tgSelectColor,
|
|
&style.secTSCol,
|
|
&style.secBSCol,
|
|
&style.secSelectColor);
|
|
|
|
if ((style.secTSCol == style.secBSCol) || /* B_W or shadowPixmaps==True */
|
|
(!style.useMultiColorIcons)) /* multiColorIcons turned off */
|
|
{
|
|
/* force TS = White, BS = Black */
|
|
style.secTSCol = style.primTSCol = WhitePixelOfScreen(style.screen);
|
|
style.secBSCol = style.primBSCol = BlackPixelOfScreen(style.screen);
|
|
}
|
|
|
|
XmeGetPixelData(style.screenNum, &colorUse, pixelSet, &a, &i, &p, &s);
|
|
|
|
n = 0;
|
|
if (colorUse == XmCO_BLACK_WHITE)
|
|
{
|
|
ditherPix = XmGetPixmap (style.screen, "50_foreground",
|
|
style.primBSCol,style.primTSCol);
|
|
XtSetArg(args[n], XmNbackgroundPixmap, ditherPix); n++;
|
|
}
|
|
XtSetArg(args[n], XmNallowOverlap, False); n++;
|
|
XtSetArg(args[n], XmNadjustLast, False); n++;
|
|
XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); n++;
|
|
XtSetArg(args[n], XmNspacing, style.horizontalSpacing); n++;
|
|
mainRC = XmCreateRowColumn(frame, "mainRC", args, n);
|
|
XtManageChild(mainRC);
|
|
|
|
n = 0;
|
|
XtSetArg(args[n], XmNmenuBar, mainMenu); n++;
|
|
XtSetArg(args[n], XmNcommandWindow, NULL); n++;
|
|
XtSetArg(args[n], XmNworkWindow, frame); n++;
|
|
XtSetValues (style.mainWindow, args, n);
|
|
|
|
ProcessComponentList (shell, mainRC);
|
|
|
|
}
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++
|
|
* ProcessComponentList();
|
|
*
|
|
*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
static void
|
|
ProcessComponentList(
|
|
Widget parent,
|
|
Widget mainRC )
|
|
{
|
|
int count=0;
|
|
int j=0;
|
|
int n, n2;
|
|
Arg args[MAX_ARGS];
|
|
Widget componentWidget;
|
|
int s;
|
|
char *string;
|
|
char *resString, *resString2;
|
|
XmString cmp_string;
|
|
int helpTag;
|
|
char *dtIcon;
|
|
int len;
|
|
|
|
style.workProcs = False;
|
|
if (style.xrdb.componentList == NULL) return;
|
|
|
|
n = 0;
|
|
XtSetArg(args[n], XmNalignment, XmALIGNMENT_CENTER); n++;
|
|
XtSetArg(args[n], XmNpixmapPosition, XmPIXMAP_TOP); n++;
|
|
XtSetArg(args[n], XmNshadowType, XmSHADOW_OUT); n++;
|
|
n2 = 3; /* number of preset args for creating Icons */
|
|
|
|
resString = strdup (style.xrdb.componentList);
|
|
resString2 = resString;
|
|
len = strlen(resString);
|
|
string = strtok(resString, " ");
|
|
s = 0;
|
|
while (string != NULL)
|
|
{
|
|
/* check for valid name, duplicate name *** */
|
|
|
|
/* create Icon in Dtstyle main window */
|
|
|
|
n = n2;
|
|
XtSetArg(args[n], XmNfillMode, XmFILL_SELF); n++;
|
|
if (colorUse == XmCO_BLACK_WHITE)
|
|
{
|
|
XtSetArg(args[n], XmNuseEmbossedText, False); n++;
|
|
}
|
|
XtSetArg(args[n], XmNpixmapForeground, style.primBSCol); n++;
|
|
XtSetArg(args[n], XmNpixmapBackground, style.primTSCol); n++;
|
|
if (strcmp(string, COLOR) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 27, "Color"));
|
|
helpTag = HELP_COLOR_BUTTON;
|
|
dtIcon = _DtGetIconFileName(style.screen, COLOR_ICON, NULL, NULL, 0);
|
|
style.workProcs = True;
|
|
}
|
|
else if (strcmp(string, FONT) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 28, "Font"));
|
|
dtIcon = _DtGetIconFileName(style.screen, FONT_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_FONT_BUTTON;
|
|
}
|
|
|
|
else if (strcmp(string, BACKDROP) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 29, "Backdrop"));
|
|
dtIcon = _DtGetIconFileName(style.screen, BACKDROP_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_BACKDROP_BUTTON;
|
|
}
|
|
|
|
else if (strcmp(string, KEYBOARD) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 30, "Keyboard"));
|
|
dtIcon = _DtGetIconFileName(style.screen, KEYBOARD_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_KEYBOARD_BUTTON;
|
|
}
|
|
|
|
else if (strcmp(string, MOUSE) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 31, "Mouse"));
|
|
dtIcon = _DtGetIconFileName(style.screen, MOUSE_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_MOUSE_BUTTON;
|
|
}
|
|
|
|
else if (strcmp(string, BEEP) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 32, "Beep"));
|
|
dtIcon = _DtGetIconFileName(style.screen, BEEP_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_AUDIO_BUTTON;
|
|
}
|
|
|
|
else if (strcmp(string, SCREEN) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 33, "Screen"));
|
|
dtIcon = _DtGetIconFileName(style.screen, SCREEN_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_SCREEN_BUTTON;
|
|
}
|
|
|
|
else if (strcmp(string, DTWM) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 38, "Window"));
|
|
dtIcon = _DtGetIconFileName(style.screen, DTWM_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_DTWM_BUTTON;
|
|
}
|
|
|
|
else if (strcmp(string, STARTUP) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 35, "Startup"));
|
|
dtIcon = _DtGetIconFileName(style.screen, STARTUP_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_STARTUP_BUTTON;
|
|
}
|
|
else if (strcmp(string, I18N) == 0)
|
|
{
|
|
cmp_string = CMPSTR(GETMESSAGE(4, 34, "Intl'"));
|
|
dtIcon = _DtGetIconFileName(style.screen, I18N_ICON, NULL, NULL, 0);
|
|
helpTag = HELP_I18N_BUTTON;
|
|
}
|
|
else
|
|
{
|
|
s += strlen(string) +1;
|
|
if (resString+s >= resString2 + len)
|
|
string = NULL;
|
|
else
|
|
string = strtok(resString+s, " ");
|
|
continue;
|
|
}
|
|
XtSetArg(args[n], XmNimageName, dtIcon); n++;
|
|
XtSetArg(args[n], XmNstring, cmp_string); n++;
|
|
componentWidget = _DtCreateControl(mainRC, string, args, n);
|
|
XtManageChild (componentWidget);
|
|
XtAddCallback(componentWidget, XmNcallback, activateCB, string);
|
|
XtAddCallback(componentWidget, XmNhelpCallback,
|
|
(XtCallbackProc)HelpRequestCB, (XtPointer) (intptr_t) helpTag);
|
|
XmStringFree(cmp_string);
|
|
XtFree(dtIcon);
|
|
|
|
s += strlen(string) +1;
|
|
if (resString+s >= resString2 + len)
|
|
string = NULL;
|
|
else
|
|
string = strtok(resString+s, " ");
|
|
|
|
} /* while */
|
|
|
|
}
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* cancel all the dialogs (for exit) */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
void
|
|
callCancels( void )
|
|
{
|
|
DtDialogBoxCallbackStruct CancelBut;
|
|
char dialogStates[60];
|
|
static Boolean calledAlready = False;
|
|
|
|
if (!calledAlready) {
|
|
dialogStates[0] = '\0';
|
|
|
|
if(style.colorDialog != NULL && XtIsManaged(style.colorDialog)) {
|
|
CancelBut.button_position = CANCEL_BUTTON;
|
|
XtCallCallbacks(style.colorDialog, XmNcallback, &CancelBut);
|
|
}
|
|
|
|
if(style.fontDialog != NULL && XtIsManaged(style.fontDialog)) {
|
|
CancelBut.button_position = CANCEL_BUTTON;
|
|
XtCallCallbacks(style.fontDialog, XmNcallback, &CancelBut);
|
|
}
|
|
|
|
if(style.audioDialog != NULL && XtIsManaged(style.audioDialog)) {
|
|
CancelBut.button_position = CANCEL_BUTTON;
|
|
XtCallCallbacks(style.audioDialog, XmNcallback, &CancelBut);
|
|
}
|
|
|
|
if(style.kbdDialog != NULL && XtIsManaged(style.kbdDialog)) {
|
|
CancelBut.button_position = CANCEL_BUTTON;
|
|
XtCallCallbacks(style.kbdDialog, XmNcallback, &CancelBut);
|
|
}
|
|
|
|
if(style.mouseDialog != NULL && XtIsManaged(style.mouseDialog)) {
|
|
CancelBut.button_position = CANCEL_BUTTON;
|
|
XtCallCallbacks(style.mouseDialog, XmNcallback, &CancelBut);
|
|
}
|
|
|
|
if(style.screenDialog != NULL && XtIsManaged(style.screenDialog)) {
|
|
CancelBut.button_position = CANCEL_BUTTON;
|
|
XtCallCallbacks(style.screenDialog, XmNcallback, &CancelBut);
|
|
}
|
|
|
|
if(style.startupDialog != NULL && XtIsManaged(style.startupDialog)) {
|
|
CancelBut.button_position = CANCEL_BUTTON;
|
|
XtCallCallbacks(style.startupDialog, XmNcallback, &CancelBut);
|
|
}
|
|
|
|
if (dialogStates[0])
|
|
_DtAddToResource(style.display, dialogStates);
|
|
|
|
calledAlready = True;
|
|
}
|
|
}
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* Menu CallBacks */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
void
|
|
activateCB_exitBtn(
|
|
Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data )
|
|
{
|
|
/*callCancels() remembers whether its been called so it won't get called*/
|
|
/*twice on logout.*/
|
|
callCancels();
|
|
|
|
XSync(style.display, 0);
|
|
exit(0);
|
|
}
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* PushButton CallBacks */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
/* activateCB */
|
|
/*+++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
static void
|
|
activateCB(
|
|
Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data )
|
|
{
|
|
|
|
DtControlCallbackStruct *cbs =
|
|
(DtControlCallbackStruct *) call_data;
|
|
char *cd;
|
|
cd = (char *) client_data;
|
|
|
|
/* if any other event besides an activate
|
|
event invokes this callback, don't invoke
|
|
any dialogs. Just ignore the event.
|
|
*/
|
|
if (cbs->reason != XmCR_ACTIVATE) return;
|
|
|
|
if (strcmp(cd, COLOR) == 0)
|
|
Customize(style.shell);
|
|
|
|
else if (strcmp(cd, FONT) == 0)
|
|
popup_fontBB(style.shell);
|
|
|
|
else if (strcmp(cd, BACKDROP) == 0)
|
|
BackdropDialog (style.shell);
|
|
|
|
else if (strcmp(cd, KEYBOARD) == 0)
|
|
popup_keyboardBB(style.shell);
|
|
|
|
else if (strcmp(cd, MOUSE) == 0)
|
|
popup_mouseBB(style.shell);
|
|
|
|
else if (strcmp(cd, BEEP) == 0)
|
|
popup_audioBB(style.shell);
|
|
|
|
else if (strcmp(cd, SCREEN) == 0)
|
|
popup_screenBB(style.shell);
|
|
|
|
else if (strcmp(cd, DTWM) == 0)
|
|
popup_dtwmBB(style.shell);
|
|
|
|
else if (strcmp(cd, STARTUP) == 0)
|
|
popup_startupBB(style.shell);
|
|
|
|
else if (strcmp(cd, I18N) == 0)
|
|
popup_i18nBB(style.shell);
|
|
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* restoreMain()
|
|
*
|
|
* restore any state information saved with saveMain.
|
|
* This is called from restoreSession with the application
|
|
* shell and the special xrm database retrieved for restore.
|
|
************************************************************************/
|
|
void
|
|
restoreMain(
|
|
Widget shell,
|
|
XrmDatabase db )
|
|
{
|
|
XrmName xrm_name[5];
|
|
XrmRepresentation rep_type;
|
|
XrmValue value;
|
|
|
|
xrm_name [0] = XrmStringToQuark ("mainWindow");
|
|
xrm_name [1] = XrmStringToQuark ("ismapped");
|
|
xrm_name [2] = 0;
|
|
|
|
if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value)) {
|
|
/* Are we supposed to be mapped? */
|
|
if (strcmp(value.addr, "True") == 0) {
|
|
save.poscnt = 0;
|
|
|
|
/* get x position */
|
|
xrm_name [1] = XrmStringToQuark ("x");
|
|
if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value)) {
|
|
XtSetArg (save.posArgs[save.poscnt], XmNx, atoi((char *)value.addr));
|
|
save.poscnt++;
|
|
}
|
|
|
|
/* get y position */
|
|
xrm_name [1] = XrmStringToQuark ("y");
|
|
if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value)) {
|
|
XtSetArg (save.posArgs[save.poscnt], XmNy, atoi((char *)value.addr));
|
|
save.poscnt++;
|
|
}
|
|
|
|
save.restoreFlag = True;
|
|
init_mainWindow(shell);
|
|
}
|
|
}
|
|
else
|
|
_DtSimpleError (progName, DtWarning, NULL, ((char *)GETMESSAGE(4,36,
|
|
"No Dtstyle restore information available for current session")), NULL);
|
|
}
|
|
|
|
/************************************************************************
|
|
* saveMain()
|
|
*
|
|
* This routine will write out to the passed file descriptor any state
|
|
* information this dialog needs. It is called from saveSessionCB with the
|
|
* file already opened.
|
|
* All information is saved in xrm format. There is no restriction
|
|
* on what can be saved. It doesn't have to be defined or be part of any
|
|
* widget or Xt definition. Just name and save it here and recover it in
|
|
* restoreMain. The suggested minimum is whether you are mapped, and your
|
|
* location.
|
|
************************************************************************/
|
|
void
|
|
saveMain(
|
|
int fd )
|
|
{
|
|
Position x,y;
|
|
char bufr[1024]; /* size=[1024], make bigger if needed */
|
|
|
|
if (style.mainWindow != NULL) {
|
|
if (XtIsRealized(style.mainWindow))
|
|
{
|
|
sprintf(bufr, "*mainWindow.ismapped: True\n");
|
|
WRITE_STR2FD(fd, bufr);
|
|
}
|
|
|
|
/* Get and write out the geometry info for our Window */
|
|
x = XtX(XtParent(style.mainWindow));
|
|
y = XtY(XtParent(style.mainWindow));
|
|
snprintf(bufr, sizeof(bufr), "*mainWindow.x: %d\n", x);
|
|
WRITE_STR2FD(fd, bufr);
|
|
snprintf(bufr, sizeof(bufr), "*mainWindow.y: %d\n", y);
|
|
WRITE_STR2FD(fd, bufr);
|
|
}
|
|
}
|
|
|