cdesktopenv/cde/lib/DtTerm/TermView/TermViewMenu.c

1625 lines
46 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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
*/
/* *
* (c) Copyright 1993, 1994, 1996 Hewlett-Packard Company *
* (c) Copyright 1993, 1994, 1996 International Business Machines Corp. *
* (c) Copyright 1993, 1994, 1996 Sun Microsystems, Inc. *
* (c) Copyright 1993, 1994, 1996 Novell, Inc. *
* (c) Copyright 1996 Digital Equipment Corporation. *
* (c) Copyright 1996 FUJITSU LIMITED. *
* (c) Copyright 1996 Hitachi. *
*/
#define PULLDOWN_ACCELERATORS
#define WINDOW_SIZE_TOGGLES
#include "TermHeader.h"
#include <string.h> /* for strdup */
#include <errno.h> /* for errno and sys_errlist[] */
#include <Xm/Xm.h>
#include <Xm/RowColumn.h>
#include <Xm/CascadeBG.h>
#include <Xm/ToggleBG.h>
#include <Xm/PushBG.h>
#include <Xm/LabelG.h>
#include <Xm/SeparatoG.h>
#include <Xm/SelectioB.h>
#include <X11/keysym.h>
#include "TermViewMenu.h"
#include "TermViewP.h"
#include "TermPrimFunction.h"
#include "TermViewGlobalDialog.h"
#include "TermViewTerminalDialog.h"
#include "TermPrimMessageCatI.h"
#include "TermPrimSelect.h"
#include "TermFunction.h"
static Widget currentWidget = (Widget ) 0;
/* widget for current menu
* context
*/
static Widget scrollBarToggle;
static Widget menuBarToggle;
static Widget *fontSizeToggles;
static int fontSizeTogglesDefault = -1;
#ifdef WINDOW_SIZE_TOGGLES
static Widget *windowSizeToggles;
#endif /* WINDOW_SIZE_TOGGLES */
static Widget newButton;
/* forward declarations...
*/
static Widget CreateMenu(Widget termView, Widget parent, Boolean menuBar,
Arg menuArglist[], int menuArgcount);
static void removeFromPostFromListCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void setContext(Widget w, XtPointer client_data, XtPointer call_data);
static void exitCallback(Widget w, XtPointer client_data, XtPointer call_data);
static void scrollBarToggleCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void menuBarToggleCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void cloneCallback(Widget w, XtPointer client_data,
XtPointer call_data);
#ifdef HPVUE
static void helpVersionCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpIntroCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpTasksCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpReferenceCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpOnHelpCallback(Widget w, XtPointer client_data,
XtPointer call_data);
#else /* HPVUE */
static void helpOverviewCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpTableOfContentsCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpTasksCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpReferenceCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpKeyboardCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpUsingHelpCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void helpAboutDttermCallback(Widget w, XtPointer client_data,
XtPointer call_data);
#endif /* HPVUE */
static void globalOptionsCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void terminalOptionsCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void sizeChangeCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void defaultSizeCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void fontChangeCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void defaultFontCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void softResetCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void hardResetCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void copyClipboardCallback(Widget w, XtPointer client_data,
XtPointer call_data);
static void pasteClipboardCallback(Widget w, XtPointer client_data,
XtPointer call_data);
/**************************************************************************/
#ifdef TOKEN_CALLBACK
static void
tokenCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
if (client_data) {
(void) printf("%s: button pressed\n", (char *) client_data);
}
}
#endif /* TOKEN_CALLBACK */
/*ARGSUSED*/
static void
postMenu(Widget w, XtPointer client_data, XEvent *event, Boolean *cont)
{
Widget popupMenu = (Widget) client_data;
/* now position and manage the menu... */
(void) XmMenuPosition(popupMenu, &event->xbutton);
(void) XtManageChild(popupMenu);
}
static Widget
createMenuWidget(WidgetClass widgetClass, char *callbackName,
Widget parent, Widget subMenuId, char *label, KeySym mnemonic,
char *accelerator, char *acceleratorText,
XtCallbackProc callback, XtPointer clientData)
{
Widget w;
XmString string;
XmString acceleratorString = (XmString) 0;
Arg arglist[20];
int i;
i = 0;
/* create the label string and stuff it... */
string = XmStringCreateLocalized(label);
(void) XtSetArg(arglist[i], XmNlabelString, string); i++;
/* if a mnemonic was specified, set the mnemonic and mnemonic charset... */
if (mnemonic != NoSymbol) {
(void) XtSetArg(arglist[i], XmNmnemonic, mnemonic); i++;
(void) XtSetArg(arglist[i], XmNmnemonicCharSet, XmFONTLIST_DEFAULT_TAG);
i++;
}
/* if an accelerator was specified, stuff it... */
if (accelerator && *accelerator) {
(void) XtSetArg(arglist[i], XmNaccelerator, accelerator); i++;
}
/* if acceleratorText was specified, create the XmString and stuff it... */
if (acceleratorText && *acceleratorText) {
acceleratorString = XmStringCreateLocalized(acceleratorText);
(void) XtSetArg(arglist[i], XmNacceleratorText, acceleratorString); i++;
}
/* if subMenuId was specified, stuff it... */
if (subMenuId) {
(void) XtSetArg(arglist[i], XmNsubMenuId, subMenuId); i++;
}
/* create the widget... */
w = XtCreateManagedWidget(label, widgetClass, parent, arglist, i);
if (callback) {
(void) XtAddCallback(w, callbackName, callback, clientData);
}
#ifdef TOKEN_CALLBACK
/*DKS -- this is to help debug the menu stuff... */
if (!strcmp(callbackName, XmNactivateCallback)) {
(void) XtAddCallback(w, callbackName, tokenCallback, strdup(label));
}
#endif /* TOKEN_CALLBACK */
/* free up storage... */
(void) XmStringFree(string);
if (acceleratorString)
(void) XmStringFree(acceleratorString);
/* return the widget... */
return(w);
}
Widget
_DtTermViewCreateCascadeButton(Widget parent, Widget subMenuId, char *label,
KeySym mnemonic, char *accelerator, char *acceleratorText,
XtCallbackProc callback, XtPointer clientData)
{
return(createMenuWidget(xmCascadeButtonGadgetClass, XmNactivateCallback,
parent, subMenuId, label, mnemonic, accelerator, acceleratorText,
callback, clientData));
}
Widget
_DtTermViewCreatePushButton(Widget parent, char *label, KeySym mnemonic,
char *accelerator, char *acceleratorText,
XtCallbackProc callback, XtPointer clientData)
{
return(createMenuWidget(xmPushButtonGadgetClass, XmNactivateCallback,
parent, NULL, label, mnemonic, accelerator, acceleratorText,
callback, clientData));
}
Widget
_DtTermViewCreateToggleButton(Widget parent, char *label, KeySym mnemonic,
char *accelerator, char *acceleratorText,
XtCallbackProc callback, XtPointer clientData)
{
return(createMenuWidget(xmToggleButtonGadgetClass, XmNvalueChangedCallback,
parent, NULL, label, mnemonic, accelerator, acceleratorText,
callback, clientData));
}
Widget
_DtTermViewCreateLabel(Widget parent, char *label)
{
return(createMenuWidget(xmLabelGadgetClass, NULL,
parent, NULL, label, 0, NULL, NULL, NULL, NULL));
}
Widget
_DtTermViewCreateSeparator(Widget parent, char *label)
{
return(createMenuWidget(xmSeparatorGadgetClass, NULL,
parent, NULL, label, 0, NULL, NULL, NULL, NULL));
}
static Widget
createPulldown(Widget parent, char *name, Arg *arglist, int argcnt)
{
Widget w;
w = XmCreatePulldownMenu(parent, name, arglist, argcnt);
(void) XtAddCallback(w, XmNmapCallback, setContext, (XtPointer) NULL);
return(w);
}
/*ARGSUSED*/
static void
removeFromPostFromListCallback(Widget w, XtPointer client_data,
XtPointer call_data)
{
(void) XmRemoveFromPostFromList((Widget) client_data, w);
}
static char *
mallocGETMESSAGE(int msgset, int msg, char *defaultString)
{
char *c1;
char *c2;
c2 = GETMESSAGE(msgset, msg, defaultString);
c1 = XtMalloc(strlen(c2) + 1);
(void) strcpy(c1, c2);
return(c1);
}
static void
createSizeMenu
(
Widget w,
Widget menu
)
{
DtTermViewWidget tw = (DtTermViewWidget) w;
Widget submenu;
Widget button;
long i1;
char *c1;
char *c2;
#ifdef NOTDEF
char mnemonics[BUFSIZ];
#endif /* NOTDEF */
char buffer[BUFSIZ];
KeySym ks;
Arg al[20];
int ac;
ac = 0;
(void) XtSetArg(al[ac], XmNradioBehavior, True); ac++;
submenu = createPulldown(menu, "Window Size", al, ac);
#ifdef NOTDEF
/* clear out mnemonics string... */
*mnemonics = '\0';
c1 = mnemonics;
#endif /* NOTDEF */
/* create the size buttons... */
#ifdef WINDOW_SIZE_TOGGLES
windowSizeToggles = (Widget *)
XtMalloc((1 + tw->termview.sizeList.numSizes) *sizeof(Widget));
#endif /* WINDOW_SIZE_TOGGLES */
for (i1 = 0; i1 < tw->termview.sizeList.numSizes; i1++) {
*buffer = '\0';
if (tw->termview.sizeList.sizes[i1].columns > 0) {
(void) sprintf(buffer + strlen(buffer), "%hd",
tw->termview.sizeList.sizes[i1].columns);
}
(void) strcat(buffer, "x");
if (tw->termview.sizeList.sizes[i1].rows > 0) {
(void) sprintf(buffer + strlen(buffer), "%hd",
tw->termview.sizeList.sizes[i1].rows);
}
#ifdef NOTDEF
for (c2 = buffer; *c2; c2++) {
if (!strchr(mnemonics, *c2) && !isspace(*c2)) {
break;
}
}
if (*c2) {
/* add it to the mnemonics list... */
*c1++ = *c2;
ks = XK_A + *c2 - 'A';
} else {
ks = NULL;
}
#endif
#ifdef WINDOW_SIZE_TOGGLES
windowSizeToggles[i1] = _DtTermViewCreateToggleButton(submenu, buffer,
0, NULL, NULL, sizeChangeCallback, (XtPointer) i1);
#else /* WINDOW_SIZE_TOGGLES */
button = _DtTermViewCreatePushButton(submenu, buffer,
0, NULL, NULL, sizeChangeCallback, (XtPointer) i1);
#endif /* WINDOW_SIZE_TOGGLES */
}
/* get a mnemonic for "Default"... */
snprintf(buffer, sizeof(buffer), "%s", (GETMESSAGE(NL_SETN_ViewMenu,1, "Default")));
#ifdef NOTDEF
for (c2 = buffer; *c2; c2++) {
if (!strchr(mnemonics, *c2) && !isspace(*c2))
break;
}
if (*c2) {
/* add it to the mnemonics list... */
*c1++ = *c2;
ks = XK_A + *c2 - 'A';
} else {
ks = NULL;
}
#endif
#ifdef WINDOW_SIZE_TOGGLES
windowSizeToggles[i1] = _DtTermViewCreateToggleButton(submenu, buffer,
0, NULL, NULL, defaultSizeCallback, NULL);
#else /* WINDOW_SIZE_TOGGLES */
button = _DtTermViewCreatePushButton(submenu, buffer,
0, NULL, NULL, defaultSizeCallback, NULL);
#endif /* WINDOW_SIZE_TOGGLES */
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,3, "W"));
(void) _DtTermViewCreateCascadeButton(menu,
submenu, (GETMESSAGE(NL_SETN_ViewMenu,2, "Window Size")),
ks,
NULL, NULL, NULL, NULL);
}
extern char _DtTermViewMenuDefaultFonts[];
typedef struct _fontArrayType {
char *labelName;
char *fontName;
XmFontList fontList;
} fontArrayType;
static fontArrayType *fontArray = (fontArrayType *) 0;
static short fontArrayCount = 0;
static void
createFontMenu
(
Widget w,
Widget menu
)
{
DtTermViewWidget tw = (DtTermViewWidget) w;
Widget submenu;
Widget button;
long i1;
int i2;
char *c1;
char *c2;
char mnemonics[BUFSIZ];
char buffer[BUFSIZ];
char fontName[BUFSIZ];
KeySym ks;
int dpi;
char **fontNames;
int fontNameCount;
float pointSize;
Arg al[20];
int ac;
if (!tw->termview.userFontList || !*tw->termview.userFontList) {
tw->termview.userFontList = _DtTermViewMenuDefaultFonts;
}
/* calculate dots per inch... */
dpi = HeightOfScreen(XtScreen(w)) / (HeightMMOfScreen(XtScreen(w)) / 25.4);
ac = 0;
(void) XtSetArg(al[ac], XmNradioBehavior, True); ac++;
submenu = createPulldown(menu, "Font Size", al, ac);
/* find out how many newlines there are in the userFontList so
* that we can build an array big enough to hold them...
*/
for (i1 = 1, c1 = tw->termview.userFontList; *c1; ) {
if (*c1++ == '\n') {
(void) i1++;
}
}
/* malloc out an array... */
fontArray = (fontArrayType *) XtMalloc(sizeof(fontArrayType) *
i1);
for (i1 = 0, c1 = tw->termview.userFontList; *c1; ) {
/* copy over the userFontList up to the end, or a newline... */
for (c2 = buffer; *c1 && (*c1 != '\n'); ) {
*c2++ = *c1++;
}
/* null term the copy and skip over the newline... */
*c2++ = '\0';
if (*c1 == '\n') {
(void) c1++;
}
/* if this entry is empty, skip it... */
if (!*buffer) {
continue;
}
fontArray[i1].labelName = XtMalloc(strlen(buffer) + 1);
(void) strcpy(fontArray[i1].labelName, buffer);
/* look for a separating '/'... */
if ((c2 = strchr(fontArray[i1].labelName, '/'))) {
/* found, null it out... */
*c2++ = '\0';
/* and assign it to the fontName... */
fontArray[i1].fontName = c2;
} else {
/* calculate the pixelsize for the font... */
fontArray[i1].fontName = fontArray[i1].labelName;
(void) strcpy(fontName, fontArray[i1].labelName);
/* clear out the .labelName... */
fontArray[i1].labelName = (char *) 0;
/* is it a fontset?... */
if (fontName[strlen(fontName) - 1] == ':') {
/* let's turn in into an iso8859-1 name for the query... */
fontName[strlen(fontName) - 1] = '\0';
/* strip off a '-' before the ':' (should not have been
* one, but)...
*/
if (fontName[strlen(fontName) - 1] == '-') {
fontName[strlen(fontName) - 1] = '\0';
}
(void) strcat(fontName, (GETMESSAGE(NL_SETN_ViewMenu,4, "-iso8859-1")));
}
if ((fontNames =
XListFonts(XtDisplay(w), fontName, 1, &fontNameCount))) {
c2 = *fontNames;
for (i2 = 0; i2 < 7; i2++) {
while (*c2 && (*c2 != '-')) {
c2++;
}
if (!*c2) {
break;
}
/* skip over the '-'... */
(void) c2++;
}
if (i2 == 7) {
pointSize = ((float) strtol(c2, (char **) 0, 0)) *
72 / dpi;
/* this was taken from the style manager... */
if (dpi <= 72) {
/* whole points... */
(void) sprintf(fontName, (GETMESSAGE(NL_SETN_ViewMenu,5, "%d point")),
(int) (pointSize + 0.5));
} else if (dpi <= 144) {
/* half points... */
(void) sprintf(fontName, (GETMESSAGE(NL_SETN_ViewMenu,6, "%.1f point")),
((int) (pointSize * 2.0 + 0.5)) / 2.0);
} else if (dpi <= 720) {
/* tenth point... */
(void) sprintf(fontName, (GETMESSAGE(NL_SETN_ViewMenu,7, "%.1f point")),
((int) (pointSize * 10.0 + 0.5)) / 10.0);
} else {
/* hundredth point... */
(void) sprintf(fontName, (GETMESSAGE(NL_SETN_ViewMenu,8, "%.2f point")),
((int) (pointSize * 100.0 + 0.5)) / 100.0);
}
fontArray[i1].labelName = XtMalloc(strlen(fontName) + 1);
(void) strcpy(fontArray[i1].labelName, fontName);
}
/* free up the fontNames... */
(void) XFreeFontNames(fontNames);
}
if (!fontArray[i1].labelName) {
fontArray[i1].labelName = fontArray[i1].fontName;
}
}
/* bump the count... */
(void) i1++;
}
/* we have our list... */
fontArrayCount = i1;
/* clear out mnemonics string... */
*mnemonics = '\0';
/* create the font buttons... */
fontSizeToggles = (Widget *) XtMalloc((fontArrayCount + 1) * sizeof(Widget));
for (i1 = 0; i1 < fontArrayCount; i1++) {
#ifdef NOTDEF
for (c2 = fontArray[i1].labelName; *c2; c2++) {
if (!strchr(mnemonics, *c2) && !isspace(*c2))
break;
}
if (*c2) {
/* add it to the mnemonics list... */
*c1++ = *c2;
ks = XK_A + *c2 - 'A';
} else {
ks = NULL;
}
#endif
fontSizeToggles[i1] = _DtTermViewCreateToggleButton(submenu,
fontArray[i1].labelName,
0, NULL, NULL, fontChangeCallback, (XtPointer) i1);
}
snprintf(buffer, sizeof(buffer), "%s", (GETMESSAGE(NL_SETN_ViewMenu,9, "Default")));
fontSizeToggles[i1] = _DtTermViewCreateToggleButton(submenu, buffer,
0, NULL, NULL, defaultFontCallback, NULL);
fontSizeTogglesDefault = i1;
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,11, "F"));
(void) _DtTermViewCreateCascadeButton(menu, submenu,
(GETMESSAGE(NL_SETN_ViewMenu,10, "Font Size")),
ks,
NULL, NULL, NULL, NULL);
}
#define numPulldowns 5
static Widget
CreateMenu(Widget termView, Widget parent, Boolean menuBar,
Arg menuArglist[], int menuArgcount)
{
Widget menu;
Widget cascade;
static Widget topLevel = (Widget) 0;
static Boolean first = True;
static Boolean firstPopup = True;
static Widget pulldown[numPulldowns];
static Widget popupMenu = (Widget) 0;
int pc;
Widget button;
Widget submenu;
Arg arglist[20];
Arg *newArglist;
int i;
KeySym ks = NoSymbol;
char *accelerator;
char *acceleratorText;
/* if this is the first time, we will need a topLevel widget... */
if (first) {
i = 0;
topLevel = XtAppCreateShell((char *) 0, "Dtterm",
applicationShellWidgetClass, XtDisplay(parent), arglist, i);
}
newArglist = (Arg *) XtMalloc((menuArgcount + 1) * sizeof(Arg));
for (i = 0; i < menuArgcount; i++) {
newArglist[i].name = menuArglist[i].name;
newArglist[i].value = menuArglist[i].value;
}
if (menuBar) {
/* we will create the menubar unmanaged so that our parent can mange
* it when it wants to...
*/
menu = XmCreateMenuBar(parent, "menu_pulldown", newArglist, i);
} else {
if (firstPopup) {
popupMenu = XmCreatePopupMenu(topLevel, "menu_popup", newArglist,
i);
}
menu = popupMenu;
(void) _DtTermViewCreateLabel(menu,
(GETMESSAGE(NL_SETN_ViewMenu,83, "Terminal")));
(void) _DtTermViewCreateSeparator(menu, "Separator");
}
(void) XtFree((char *) newArglist);
pc = 0;
if (first) {
/* create the "Window" pulldown... */
i = 0;
pulldown[pc] = createPulldown(topLevel, "Window", arglist, i);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,13, "N"));
newButton = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,12, "New")),
ks,
NULL, NULL, cloneCallback, NULL);
#ifdef NOTDEF
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,15, "P"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,14, "Print")),
ks,
NULL, NULL, NULL, NULL);
(void) XtSetSensitive(button, False);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,17, "r"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,16, "Print...")),
ks,
NULL, NULL, NULL, NULL);
(void) XtSetSensitive(button, False);
#endif /* NOTDEF */
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,19, "C"));
accelerator = mallocGETMESSAGE(NL_SETN_ViewMenu,62, "Alt F4");
acceleratorText = mallocGETMESSAGE(NL_SETN_ViewMenu,62, "Alt+F4");
(void) _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,18, "Close")),
ks,
accelerator,
acceleratorText,
exitCallback, NULL);
(void) XtFree(accelerator);
(void) XtFree(acceleratorText);
}
if (menuBar || (!menuBar && firstPopup))
#ifdef PULLDOWN_ACCELERATORS
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,21, "W"));
(void) _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,20, "Window")),
ks,
NULL, NULL, NULL, NULL);
#else /* PULLDOWN_ACCELERATORS */
(void) _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,20, "Window")),
NoSymbol, NULL, NULL, NULL, NULL);
#endif /* PULLDOWN_ACCELERATORS */
(void) pc++;
if (first) {
i = 0;
pulldown[pc] = createPulldown(topLevel, "Edit", arglist, i);
accelerator = mallocGETMESSAGE(NL_SETN_ViewMenu,24,
"Ctrl <Key>osfInsert");
acceleratorText = mallocGETMESSAGE(NL_SETN_ViewMenu,25, "Ctrl+Insert");
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,23, "C"));
(void) _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,22, "Copy")),
ks,
accelerator,
acceleratorText,
copyClipboardCallback, NULL);
(void) XtFree(accelerator);
(void) XtFree(acceleratorText);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,27, "P"));
accelerator = mallocGETMESSAGE(NL_SETN_ViewMenu,28,
"Shift <Key>osfInsert");
acceleratorText = mallocGETMESSAGE(NL_SETN_ViewMenu,29, "Shift+Insert");
(void) _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,26, "Paste")),
ks,
accelerator,
acceleratorText,
pasteClipboardCallback, NULL);
(void) XtFree(accelerator);
(void) XtFree(acceleratorText);
}
if (menuBar || (!menuBar && firstPopup))
#ifdef PULLDOWN_ACCELERATORS
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,31, "E"));
(void) _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,30, "Edit")),
ks,
NULL, NULL, NULL, NULL);
#else /* PULLDOWN_ACCELERATORS */
(void) _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,30, "Edit")),
NoSymbol, NULL, NULL, NULL, NULL);
#endif /* PULLDOWN_ACCELERATORS */
(void) pc++;
if (first) {
i = 0;
pulldown[pc] = createPulldown(topLevel, "Options", arglist, i);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,33, "M"));
menuBarToggle = _DtTermViewCreateToggleButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,32, "Menu Bar")),
ks,
NULL, NULL, menuBarToggleCallback, NULL);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,35, "S"));
scrollBarToggle = _DtTermViewCreateToggleButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,34, "Scroll Bar")),
ks,
NULL, NULL, scrollBarToggleCallback, NULL);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,37, "G"));
(void) _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,36, "Global...")),
ks,
NULL, NULL, globalOptionsCallback, NULL);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,39, "T"));
(void) _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,38, "Terminal...")),
ks,
NULL, NULL, terminalOptionsCallback, NULL);
(void) createSizeMenu(termView, pulldown[pc]);
(void) createFontMenu(termView, pulldown[pc]);
i = 0;
submenu = createPulldown(pulldown[pc], "Reset", arglist, i);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,41, "S"));
(void)_DtTermViewCreatePushButton(submenu,
(GETMESSAGE(NL_SETN_ViewMenu,40, "Soft Reset")),
ks,
NULL, NULL, softResetCallback, NULL);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,43, "H"));
(void)_DtTermViewCreatePushButton(submenu,
(GETMESSAGE(NL_SETN_ViewMenu,42, "Hard Reset")),
ks,
NULL, NULL, hardResetCallback, NULL);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,45, "R"));
(void) _DtTermViewCreateCascadeButton(pulldown[pc], submenu,
(GETMESSAGE(NL_SETN_ViewMenu,44, "Reset")),
ks,
NULL, NULL, NULL, NULL);
}
if (menuBar || (!menuBar && firstPopup))
#ifdef PULLDOWN_ACCELERATORS
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,47, "O"));
(void) _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,46, "Options")),
ks,
NULL, NULL, NULL, NULL);
#else /* PULLDOWN_ACCELERATORS */
(void) _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,46, "Options")),
NoSymbol, NULL, NULL, NULL, NULL);
#endif /* PULLDOWN_ACCELERATORS */
(void) pc++;
if (first) {
i = 0;
pulldown[pc] = createPulldown(topLevel, "Help", arglist, i);
#ifdef HPVUE
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,49, "O"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,48, "Overview")),
ks,
NULL, NULL, helpIntroCallback, NULL);
button = _DtTermViewCreateSeparator(pulldown[pc], "Separator");
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,51,"T"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,50, "Tasks")),
ks,
NULL, NULL, helpTasksCallback, NULL);
(void) XtSetSensitive(button, False);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,53,"R"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,52, "Reference")),
ks,
NULL, NULL, helpReferenceCallback, NULL) ;
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,55,"O"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,54, "On Item")),
ks,
NULL, NULL, NULL, NULL);
(void) XtSetSensitive(button, False);
button = _DtTermViewCreateSeparator(pulldown[pc], "Separator");
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,57,"U"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,56, "Using Help")),
ks,
NULL, NULL, helpOnHelpCallback, NULL);
button = _DtTermViewCreateSeparator(pulldown[pc], "Separator");
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,59,"A"));
button = _DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,82, "About Terminal")),
ks,
NULL, NULL, helpVersionCallback, NULL);
}
if (menuBar || (!menuBar && firstPopup))
#ifdef PULLDOWN_ACCELERATORS
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,61,"H"));
cascade = _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,60, "Help")),
ks,
NULL, NULL, NULL, NULL);
#else /* PULLDOWN_ACCELERATORS */
cascade = _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,60, "Help")),
NoSymbol, NULL, NULL, NULL, NULL);
#endif /* PULLDOWN_ACCELERATORS */
#else /* HPVUE */
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,65, "v"));
(void)_DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,64, "Overview")),
ks,
NULL, NULL, helpOverviewCallback, NULL);
(void)_DtTermViewCreateSeparator(pulldown[pc], "Separator");
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,69,"C"));
(void)_DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,68, "Table Of Contents")),
ks,
NULL, NULL, helpTableOfContentsCallback, NULL);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,71,"T"));
(void)_DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,70, "Tasks")),
ks,
NULL, NULL, helpTasksCallback, NULL);
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,73,"R"));
(void)_DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,72, "Reference")),
ks,
NULL, NULL, helpReferenceCallback, NULL) ;
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,75,"K"));
(void)_DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,74, "Keyboard")),
ks,
NULL, NULL, helpKeyboardCallback, NULL) ;
(void)_DtTermViewCreateSeparator(pulldown[pc], "Separator");
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,77,"U"));
(void)_DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,76, "Using Help")),
ks,
NULL, NULL, helpUsingHelpCallback, NULL);
(void)_DtTermViewCreateSeparator(pulldown[pc], "Separator");
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,79,"A"));
(void)_DtTermViewCreatePushButton(pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,83, "About Terminal")),
ks,
NULL, NULL, helpAboutDttermCallback, NULL);
}
if (menuBar || (!menuBar && firstPopup))
#ifdef PULLDOWN_ACCELERATORS
ks = XStringToKeysym(GETMESSAGE(NL_SETN_ViewMenu,81,"H"));
cascade = _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,80, "Help")),
ks,
NULL, NULL, NULL, NULL);
#else /* PULLDOWN_ACCELERATORS */
cascade = _DtTermViewCreateCascadeButton(menu, pulldown[pc],
(GETMESSAGE(NL_SETN_ViewMenu,80, "Help")),
NoSymbol, NULL, NULL, NULL, NULL);
#endif /* PULLDOWN_ACCELERATORS */
#endif /* HPVUE */
if (menuBar) {
/* this is the help button... */
i = 0;
(void) XtSetArg(arglist[i], XmNmenuHelpWidget, cascade); i++;
(void) XtSetValues(menu, arglist, i);
}
if (!menuBar && firstPopup)
firstPopup = False;
if (first)
first = False;
return(menu);
}
Widget
_DtTermViewCreatePulldownMenu
(
Widget termView,
Widget parent,
Arg menuArglist[],
int menuArgcount
)
{
Widget w;
_DtTermProcessLock();
w = CreateMenu(termView, parent, True, menuArglist, menuArgcount);
_DtTermProcessUnlock();
return(w);
}
Widget
_DtTermViewCreatePopupMenu
(
Widget termView,
Widget parent,
Arg menuArglist[],
int menuArgcount
)
{
static Widget popupMenu = (Widget) 0; /* popup widget... */
_DtTermProcessLock();
if (!popupMenu) {
popupMenu = CreateMenu(termView, parent, False,
menuArglist, menuArgcount);
}
_DtTermProcessUnlock();
/* set up a handler to post the menu... */
(void) XtAddEventHandler(parent, ButtonPressMask, False,
postMenu, (XtPointer) popupMenu);
/* and add us to the postfrom list... */
(void) XmAddToPostFromList(popupMenu, parent);
/* set up a callback to remove the post from on destruction... */
(void) XtAddCallback(parent, XmNdestroyCallback,
removeFromPostFromListCallback, (XtPointer) popupMenu);
return(popupMenu);
}
/*ARGSUSED*/
static void
setContext(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
Arg arglist[20];
int i;
Boolean menuBarState;
Boolean scrollBarState;
#ifdef WINDOW_SIZE_TOGGLES
short rows;
short columns;
#endif /* WINDOW_SIZE_TOGGLES */
_DtTermProcessLock();
/* get the widget we were posted from... */
while (w && !XmIsRowColumn(w)) {
w = XtParent(w);
}
if (!w) {
_DtTermProcessUnlock();
return;
}
w = XmGetPostedFromWidget(w);
/* walk up the tree until we find an DtTermView widget... */
while (w && !XtIsShell(w) && !XtIsSubclass(w, dtTermViewWidgetClass)) {
w = XtParent(w);
}
if (!w) {
_DtTermProcessUnlock();
return;
}
/* make sure it is an DtTermView widget... */
if (!XtIsSubclass(w, dtTermViewWidgetClass)) {
/* problem... */
(void) fprintf(stderr,
"unable to find dtTermViewWidgetClass parent for menu\n");
_DtTermProcessUnlock();
return;
}
tw = (DtTermViewWidget) w;
currentWidget = w;
/* update the menu toggle buttons... */
i = 0;
(void) XtSetArg(arglist[i], DtNscrollBar, &scrollBarState); i++;
(void) XtSetArg(arglist[i], DtNmenuBar, &menuBarState); i++;
#ifdef WINDOW_SIZE_TOGGLES
(void) XtSetArg(arglist[i], DtNrows, &rows); i++;
(void) XtSetArg(arglist[i], DtNcolumns, &columns); i++;
#endif /* WINDOW_SIZE_TOGGLES */
(void) XtGetValues(w, arglist, i);
/* set the toggles... */
(void) XmToggleButtonGadgetSetState(scrollBarToggle, scrollBarState, False);
(void) XmToggleButtonGadgetSetState(menuBarToggle, menuBarState, False);
/* set the font toggles...
*/
for (i = 0; i < fontSizeTogglesDefault; i++) {
if (tw->termview.currentFontToggleButtonIndex == i) {
(void) XmToggleButtonGadgetSetState(fontSizeToggles[i],
True, False);
} else {
(void) XmToggleButtonGadgetSetState(fontSizeToggles[i],
False, False);
}
}
if ((tw->termview.currentFontToggleButtonIndex >= fontSizeTogglesDefault) ||
(tw->termview.currentFontToggleButtonIndex < 0)) {
(void) XmToggleButtonGadgetSetState(fontSizeToggles[i],
True, False);
} else {
(void) XmToggleButtonGadgetSetState(fontSizeToggles[i],
False, False);
}
#ifdef WINDOW_SIZE_TOGGLES
/* set the window size toggles...
*/
for (i = 0; i < tw->termview.sizeList.numSizes; i++) {
if (((tw->termview.sizeList.sizes[i].rows <= 0) ||
(rows == tw->termview.sizeList.sizes[i].rows)) &&
((tw->termview.sizeList.sizes[i].columns <= 0) ||
(columns == tw->termview.sizeList.sizes[i].columns))) {
(void) XmToggleButtonGadgetSetState(windowSizeToggles[i],
True, False);
} else {
(void) XmToggleButtonGadgetSetState(windowSizeToggles[i],
False, False);
}
}
if (((tw->termview.sizeDefault.rows <= 0) ||
(tw->termview.sizeDefault.rows == rows)) &&
((tw->termview.sizeDefault.columns <= 0) ||
(tw->termview.sizeDefault.columns == columns))) {
(void) XmToggleButtonGadgetSetState(windowSizeToggles[i],
True, False);
} else {
(void) XmToggleButtonGadgetSetState(windowSizeToggles[i],
False, False);
}
#endif /* WINDOW_SIZE_TOGGLES */
/* set the sensitivity on the new button... */
(void) XtSetSensitive(newButton, DtTermViewGetCloneEnabled(w));
_DtTermProcessUnlock();
}
/*************************************************************************
*
* menu callbacks
*/
/*ARGSUSED*/
static void
exitCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
/* walk up the widget tree to find the shell... */
_DtTermProcessLock();
w = currentWidget;
_DtTermProcessUnlock();
/* invoke the callbacks for this terminal emulator... */
(void) XtCallCallbacks(w, DtNsubprocessTerminationCallback, (XtPointer) 0);
#ifdef NOTDEF
/* make sure things are dead by destroying the interface... */
while (w && !XtIsShell(w)) {
w = XtParent(w);
}
/* destroy the interface... */
(void) XtDestroyWidget(w);
#endif /* NOTDEF */
}
/*ARGSUSED*/
static void
scrollBarToggleCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Arg arglist;
XmToggleButtonCallbackStruct *cb =
(XmToggleButtonCallbackStruct *) call_data;
_DtTermProcessLock();
(void) XtSetArg(arglist, DtNscrollBar, cb->set);
(void) XtSetValues(currentWidget, &arglist, 1);
_DtTermProcessUnlock();
}
void
_DtTermViewMenuToggleMenuBar
(
Widget w
)
{
Arg al;
Boolean toggle;
(void) XtSetArg(al, DtNmenuBar, &toggle);
(void) XtGetValues(w, &al, 1);
(void) XtSetArg(al, DtNmenuBar, !toggle);
(void) XtSetValues(w, &al, 1);
}
/*ARGSUSED*/
static void
menuBarToggleCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Arg arglist;
XmToggleButtonCallbackStruct *cb =
(XmToggleButtonCallbackStruct *) call_data;
_DtTermProcessLock();
(void) XtSetArg(arglist, DtNmenuBar, cb->set);
(void) XtSetValues(currentWidget, &arglist, 1);
_DtTermProcessUnlock();
}
/*ARGSUSED*/
static void
cloneCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) DtTermViewCloneCallback(cw, client_data, call_data);
}
#ifdef HPVUE
/*ARGSUSED*/
static void
helpVersionCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "_copyright");
}
/*ARGSUSED*/
static void
helpIntroCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "_hometopic");
}
/*ARGSUSED*/
static void
helpTasksCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "UsingTermEmulators");
}
/*ARGSUSED*/
static void
helpReferenceCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "dtterm1x");
}
/*ARGSUSED*/
static void
helpOnHelpCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Help4Help", "_hometopic");
}
#else /* HPVUE */
/*ARGSUSED*/
static void
helpOverviewCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "_hometopic");
}
/*ARGSUSED*/
static void
helpTableOfContentsCallback(Widget w, XtPointer client_data,
XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "TableOfContents");
}
/*ARGSUSED*/
static void
helpTasksCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "Tasks");
}
/*ARGSUSED*/
static void
helpReferenceCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "Reference");
}
/*ARGSUSED*/
static void
helpKeyboardCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "Keyboard");
}
/*ARGSUSED*/
static void
helpUsingHelpCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Help4Help", "_hometopic");
}
/*ARGSUSED*/
static void
helpAboutDttermCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget cw;
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
(void) _DtTermViewMapHelp(cw, "Terminal", "_copyright");
}
#endif /* HPVUE */
static void
raiseDialog(Widget w)
{
while (w && !XtIsShell(w)) {
w = XtParent(w);
}
if (w) {
(void) XRaiseWindow(XtDisplay(w), XtWindow(w));
}
}
/*ARGSUSED*/
static void
globalOptionsCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
_DtTermProcessUnlock();
if (tw->termview.globalOptionsDialog) {
(void) XtManageChild(tw->termview.globalOptionsDialog);
(void) raiseDialog(tw->termview.globalOptionsDialog);
} else {
tw->termview.globalOptionsDialog =
_DtTermViewCreateGlobalOptionsDialog((Widget)tw);
(void) raiseDialog(tw->termview.globalOptionsDialog);
}
}
/*ARGSUSED*/
static void
terminalOptionsCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
_DtTermProcessUnlock();
if (tw->termview.terminalOptionsDialog) {
(void) XtManageChild(tw->termview.terminalOptionsDialog);
(void) raiseDialog(tw->termview.terminalOptionsDialog);
} else {
tw->termview.terminalOptionsDialog =
_DtTermViewCreateTerminalOptionsDialog((Widget) tw);
(void) raiseDialog(tw->termview.terminalOptionsDialog);
}
}
/*ARGSUSED*/
static void
sizeChangeCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
Arg al[10];
int ac;
long i1;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
_DtTermProcessUnlock();
i1 = (long) client_data;
ac = 0;
if (tw->termview.sizeList.sizes[i1].columns > 0) {
(void) XtSetArg(al[ac], DtNcolumns,
tw->termview.sizeList.sizes[i1].columns); ac++;
}
if (tw->termview.sizeList.sizes[i1].rows > 0) {
(void) XtSetArg(al[ac], DtNrows,
tw->termview.sizeList.sizes[i1].rows); ac++;
}
if (ac > 0) {
(void) XtSetValues((Widget) tw, al, ac);
}
}
/*ARGSUSED*/
static void
defaultSizeCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
Arg al[10];
int ac;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
_DtTermProcessUnlock();
ac = 0;
if ((tw->termview.sizeDefault.columns > 0) &&
(tw->termview.sizeDefault.rows > 0)) {
(void) XtSetArg(al[ac], DtNcolumns, tw->termview.sizeDefault.columns);
ac++;
(void) XtSetArg(al[ac], DtNrows, tw->termview.sizeDefault.rows); ac++;
(void) XtSetValues((Widget) tw, al, ac);
}
}
/*ARGSUSED*/
static void
fontChangeCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
XrmValue from;
XrmValue to;
Arg al[10];
int ac;
long i1;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
i1 = (long) client_data;
/* generate the fontlist from the font... */
from.size = strlen(fontArray[i1].fontName);
from.addr = (XtPointer) fontArray[i1].fontName;
to.size = sizeof(fontArray[i1].fontList);
to.addr = (XtPointer) &fontArray[i1].fontList;
if (!XtConvertAndStore((Widget) tw, XmRString, &from, XmRFontList,
&to)) {
/* Unable to convert to a fontlist. For now, let's just
* ignore it and return...
*/
_DtTermProcessUnlock();
return;
}
if (tw->termview.userFontName)
XtFree(tw->termview.userFontName);
tw->termview.userFontName = XtNewString(fontArray[i1].fontName);
if (tw->termview.fontList != fontArray[i1].fontList) {
ac = 0;
(void) XtSetArg(al[ac], DtNuserFont, fontArray[i1].fontList); ac++;
(void) XtSetValues((Widget) tw, al, ac);
}
tw->termview.currentFontToggleButtonIndex = i1;
_DtTermProcessUnlock();
}
/*ARGSUSED*/
static void
defaultFontCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
Arg al[10];
int ac;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
_DtTermProcessUnlock();
if (tw->termview.userFontName)
XtFree(tw->termview.userFontName);
tw->termview.userFontName = NULL;
if (tw->termview.fontList != tw->termview.defaultFontList) {
ac = 0;
(void) XtSetArg(al[ac], DtNuserFont, tw->termview.defaultFontList);
ac++;
(void) XtSetValues((Widget) tw, al, ac);
}
tw->termview.currentFontToggleButtonIndex = fontSizeTogglesDefault;
}
/*ARGSUSED*/
static void
softResetCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
_DtTermProcessUnlock();
(void) _DtTermFuncSoftReset(_DtTermViewGetChild((Widget) tw,
DtTermTERM_WIDGET), 1, fromMenu);
}
/*ARGSUSED*/
static void
hardResetCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
DtTermViewWidget tw;
_DtTermProcessLock();
tw = (DtTermViewWidget) currentWidget;
_DtTermProcessUnlock();
(void) _DtTermFuncHardReset(_DtTermViewGetChild((Widget) tw,
DtTermTERM_WIDGET), 1, fromMenu);
}
/*ARGSUSED*/
static void
copyClipboardCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget tw, cw;
/* since this may have been called from an accelerator, we need
* to insure that our context was set...
*/
(void) setContext(w, client_data, call_data);
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
tw = _DtTermViewGetChild(cw, DtTermTERM_WIDGET);
(void) _DtTermPrimSelectCopyClipboard(tw,
XtLastTimestampProcessed(XtDisplay(tw)));
}
/*ARGSUSED*/
static void
pasteClipboardCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget tw, cw;
/* since this may have been called from an accelerator, we need
* to insure that our context was set...
*/
(void) setContext(w, client_data, call_data);
_DtTermProcessLock();
cw = currentWidget;
_DtTermProcessUnlock();
tw = _DtTermViewGetChild(cw, DtTermTERM_WIDGET);
(void) _DtTermPrimSelectPasteClipboard(tw);
}
int
_DtTermViewGetUserFontListIndex
(
Widget w
)
{
DtTermViewWidget tw = (DtTermViewWidget) w;
/* use 0 for default, index + 1 for specific buttons... */
if (tw->termview.currentFontToggleButtonIndex == fontSizeTogglesDefault) {
return(0);
} else {
return(tw->termview.currentFontToggleButtonIndex + 1);
}
}
void
_DtTermViewSetUserFontListIndex
(
Widget w,
long i1
)
{
DtTermViewWidget tw = (DtTermViewWidget) w;
_DtTermWidgetToAppContext(w);
_DtTermAppLock(app);
/* map from 0 for default, index + 1 for specific buttons to currect
* desired button...
*/
if (i1 == 0) {
i1 = fontSizeTogglesDefault;
} else {
i1 -= 1;
}
/* range check... */
if ((i1 < 0) || (i1 > fontSizeTogglesDefault)) {
i1 = fontSizeTogglesDefault;
}
/* set up for the callback... */
_DtTermProcessLock();
currentWidget = w;
if (i1 == fontSizeTogglesDefault) {
(void) defaultFontCallback(w, (XtPointer) i1, (XtPointer) 0);
} else {
(void) fontChangeCallback(w, (XtPointer) i1, (XtPointer) 0);
}
_DtTermProcessUnlock();
_DtTermAppUnlock(app);
}