2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: motif.c /main/28 1998/07/21 16:17:00 samborn $ */
25 * (c) Copyright 1997, The Open Group
29 * Contains the user interface portion of the Desktop *
32 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
33 * (c) Copyright 1993, 1994 International Business Machines Corp. *
34 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
35 * (c) Copyright 1993, 1994 Novell, Inc. *
45 #include <sys/param.h>
49 #include <X11/keysym.h>
50 #include <X11/Xatom.h>
59 #include <X11/XHPlib.h>
60 #include <X11/HPkeysym.h>
61 #include <X11/Xutil.h>
66 #include <Xm/DrawingA.h>
67 #include <Xm/DrawingAP.h>
68 #include <Xm/MessageB.h>
69 #include <Xm/RowColumn.h>
70 #include <Xm/MwmUtil.h>
71 #include <Xm/ManagerP.h>
73 #include <Xm/ColorObjP.h>
75 #include <Xm/MenuShell.h>
78 #include <Xm/PushBP.h>
79 #include <Xm/PushBG.h>
80 #include <Xm/CascadeB.h>
81 #include <Xm/CascadeBG.h>
82 #include <Xm/MwmUtil.h>
83 #include <Xm/Protocols.h>
84 #include <Xm/VendorSEP.h>
85 #include <Xm/SeparatoG.h>
86 /* Copied from BaseClassI.h */
87 extern XmWidgetExtData _XmGetWidgetExtData(
89 #if NeedWidePrototypes
90 unsigned int extType) ;
92 unsigned char extType) ;
93 #endif /* NeedWidePrototypes */
95 #include <X11/CoreP.h>
97 #include <X11/ShellP.h>
98 #include <X11/Shell.h>
99 #include <X11/IntrinsicP.h>
100 #include <X11/Intrinsic.h>
101 #include <X11/Shell.h>
102 #include <X11/Xatom.h>
103 #include <Xm/Protocols.h>
104 #include <X11/keysymdef.h>
106 #include <Dt/Session.h>
108 #include <Dt/Connect.h>
109 #include <Dt/FileM.h>
110 #include <Dt/Indicator.h>
112 #include <Dt/Message.h>
114 #include <Dt/CommandM.h>
115 #include <Dt/EnvControlP.h>
118 #include <X11/Xmu/Editres.h>
123 #include "ds_widget.h"
124 #include "ds_common.h"
125 #include "ds_popup.h"
130 static XtResource resources[] =
133 "postMenuBar", "PostMenuBar", XmRBoolean, sizeof (Boolean),
134 XtOffset (ApplicationArgsPtr, menuBar), XmRImmediate, (XtPointer) True,
138 "accuracy", "Accuracy", XmRInt, sizeof (int),
139 XtOffset (ApplicationArgsPtr, accuracy), XmRImmediate, (XtPointer) 2,
143 "base", "Base", XmRString, sizeof (char *),
144 XtOffset (ApplicationArgsPtr, base), XmRImmediate, (XtPointer) "decimal",
148 "displayNotation", "DisplayNotation", XmRString, sizeof (char *),
149 XtOffset (ApplicationArgsPtr, display), XmRImmediate, (XtPointer) "fixed",
153 "mode", "Mode", XmRString, sizeof (char *),
154 XtOffset (ApplicationArgsPtr, mode), XmRImmediate, (XtPointer)"scientific",
158 "trigType", "TrigType", XmRString, sizeof (char *),
159 XtOffset (ApplicationArgsPtr, trigType), XmRImmediate,
160 (XtPointer)"degrees",
164 char DTCALC_CLASS_NAME[] = "Dtcalc";
166 extern char *opts[] ; /* Command line option strings. */
169 XmPixelSet pixels[XmCO_MAX_NUM_COLORS];
172 Boolean BlackWhite = False;
174 char * dt_path = NULL;
176 static Widget funBtn = NULL;
177 static Widget constBtn = NULL;
178 static Widget accBtn = NULL;
179 static Widget stoBtn = NULL;
180 static Widget rclBtn = NULL;
181 static Widget exchBtn = NULL;
183 static Atom saveatom ;
184 static Atom command_atom ;
185 static Atom wm_state_atom;
187 Boolean ignore_event = False;
188 XtIntervalId timerId = 0;
190 static int lastArmed[10];
191 static int countArmed = 0;
193 /* Structure used on a save session to see if a dt is iconic */
200 void menu_proc P((Widget, XtPointer, XtPointer)) ;
201 void show_ascii P((Widget, XtPointer, XtPointer)) ;
202 void write_cf_value P((Widget, XtPointer, XtPointer)) ;
203 void close_cf P((Widget, XtPointer, XtPointer)) ;
204 void close_ascii P((Widget, XtPointer, XtPointer)) ;
205 void move_cf P((Widget, XtPointer, XtPointer)) ;
206 void FocusInCB P((Widget, XtPointer, XtPointer)) ;
207 void map_popup P((Widget, XtPointer, XtPointer)) ;
211 static int GetKeyboardID P(()) ;
214 static int event_is_keypad P((XEvent *)) ;
215 static int get_next_event P((Widget, int, XEvent *)) ;
216 static int is_window_showing P((Widget)) ;
218 static KeySym keypad_keysym P((XEvent *)) ;
220 static void modelineValueChanged P((Widget, XtPointer, XtPointer)) ;
221 static void dtcalc_kkeyboard_create P((Widget)) ;
222 static void dtcalc_kpanel_create P((Widget)) ;
223 static void confirm_callback P((Widget, XtPointer, XtPointer)) ;
224 static void create_cfframe P(()) ;
225 static void create_menu P((enum menu_type, Widget, int)) ;
226 static void do_button P((Widget, XtPointer, XtPointer)) ;
227 static void do_confirm_notice P((Widget, char *)) ;
228 static void do_continue_notice P((Widget, char *)) ;
229 static void close_reg P((Widget, XtPointer, XtPointer)) ;
230 static void event_proc P((Widget, XtPointer, XEvent *, Boolean *)) ;
231 static void frame_interpose P((Widget, XtPointer, XEvent *, Boolean *)) ;
232 static void menu_handler P((Widget, XtPointer, XEvent *, Boolean *)) ;
233 static void popupHandler P((Widget, XtPointer, XEvent *, Boolean *)) ;
234 static void new_cf_value P((Widget, XtPointer, XtPointer)) ;
235 static void do_memory P((Widget, XtPointer, XtPointer)) ;
236 static void switch_mode P((enum mode_type)) ;
237 static void update_cf_value P(()) ;
238 static void xerror_interpose P((Display *, XErrorEvent *)) ;
240 static Widget button_create P((Widget, int, int, int, int)) ;
241 static void save_state P((Widget, XtPointer, XtPointer)) ;
242 static void SaveSession P(( char *, char * )) ;
243 static void setCalcHints P(()) ;
245 static char * _DtcalcStripSpaces P(( char * )) ;
247 static void ProcessMotifSelection(Widget);
248 static void create_menu_bar(Widget parent);
249 static void init_colors(void);
250 static void create_popup(Widget parent);
253 extern char **environ ;
255 extern char *base_str[] ; /* Strings for each base value. */
256 extern char *calc_res[] ; /* Calctool X resources. */
257 extern char *dtype_str[] ; /* Strings for each display mode value. */
258 extern char *lstrs[] ; /* Labels for various Motif items. */
259 extern char *mess[] ; /* Message strings. */
260 extern char *mode_str[] ; /* Strings for each mode value. */
261 extern char *pstrs[] ; /* Property sheet strings. */
262 extern char *ttype_str[] ; /* Strings for each trig type value. */
263 extern char *vstrs[] ; /* Various strings. */
265 extern struct button buttons[] ; /* Calculator button values. */
266 extern struct button mode_buttons[] ; /* Calculator mode button values. */
267 extern struct menu cmenus[] ; /* Calculator menus. */
268 extern struct menu_entry menu_entries[] ; /* All the menu strings. */
270 extern Vars v ; /* Calctool variables and options. */
272 char translations_return[] = "<Key>Return:ManagerGadgetSelect()";
273 static Boolean NoDisplay=False;
275 extern XtPointer _XmStringUngenerate (
279 XmTextType output_type);
282 main(int argc, char **argv)
286 XtSetLanguageProc(NULL, NULL, NULL);
287 _DtEnvControl(DT_ENV_SET);
288 signal (SIGHUP, SIG_IGN);
290 X = (XVars) LINT_CAST(calloc(1, sizeof(XObject))) ;
291 X->home = getenv("HOME") ;
293 X->kframe = XtVaAppInitialize (&X->app,
294 DTCALC_CLASS_NAME, /* app class */
295 NULL, /* options list */
299 NULL, /* fallback resources */
300 XtNiconName, "dtcalc",
301 XtNiconPixmap, X->icon,
302 XtNiconMask, X->iconmask,
305 X->dpy = XtDisplay (X->kframe);
311 tmpStr = GETMESSAGE(2, 31, "Could not open display.\n");
312 msg = XtNewString(tmpStr);
313 FPRINTF(stderr, "%s", msg) ;
317 X->screen = DefaultScreen(X->dpy) ;
318 X->root = RootWindow(X->dpy, X->screen) ;
319 white_pixel = WhitePixel(X->dpy, X->screen);
320 black_pixel = BlackPixel(X->dpy, X->screen);
325 X->helpMapped = False;
327 if (DtInitialize (X->dpy, X->kframe, argv[0], DTCALC_CLASS_NAME) == False)
329 /* Fatal Error: could not connect to the messaging system. */
330 /* DtInitialize() has already logged an appropriate error msg */
334 /* Get the application defined resources */
335 XtGetApplicationResources(X->kframe, &application_args, resources, 6, NULL,0);
337 v = (Vars) LINT_CAST(calloc(1, sizeof(CalcVars))) ;
339 /* Get the dt path created and initialized */
340 dt_path = _DtCreateDtDirs (X->dpy);
344 v->keybdID = GetKeyboardID();
347 init_colors() ; /* get the pixels for the default colors in DT */
348 if(pixels[0].bg == white_pixel || pixels[0].bg == black_pixel)
351 if(colorSrv && !BlackWhite)
353 /* first get the Calculator's Icon */
354 pixmap = XmGetPixmap (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME,
355 pixels[1].fg, pixels[1].bg);
356 if( pixmap != XmUNSPECIFIED_PIXMAP)
359 X->icon = XmUNSPECIFIED_PIXMAP;
361 /* now let's get the mask for the Calculator */
362 pixmap = _DtGetMask (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME);
363 if( pixmap != XmUNSPECIFIED_PIXMAP)
364 X->iconmask = pixmap;
366 X->iconmask = XmUNSPECIFIED_PIXMAP;
370 /* first get the Calculator's Icon */
371 pixmap = XmGetPixmap (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME_BM,
372 white_pixel, black_pixel);
373 if( pixmap != XmUNSPECIFIED_PIXMAP)
376 X->icon = XmUNSPECIFIED_PIXMAP;
378 /* now let's get the mask for the Calculator */
379 pixmap = _DtGetMask (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME_BM);
380 if( pixmap != XmUNSPECIFIED_PIXMAP)
381 X->iconmask = pixmap;
383 X->iconmask = XmUNSPECIFIED_PIXMAP;
386 do_dtcalc(argc, argv) ;
399 button_create(Widget owner, int row, int column, int maxrows, int maxcols)
401 int n = row * maxcols + column ;
403 enum menu_type mtype = buttons[n].mtype ;
409 lstr = XmStringCreateLocalized(v->pstr) ;
415 else if(row >= 3 && row < 6)
417 else if(((row == 7 && column == 3) || (row == 13 && column == 3)) &&
420 else if((row >= 6 && row < 8) || (row >= 8 && row < 13 && column == 3) ||
421 (row == 13 && column == 2))
426 button = XtVaCreateManagedWidget(buttons[n].resname,
427 xmPushButtonWidgetClass,
429 XmNtopAttachment, XmATTACH_POSITION,
430 XmNtopPosition, row * maxcols,
431 XmNleftAttachment, XmATTACH_POSITION,
432 XmNleftPosition, column * maxrows,
433 XmNrightAttachment, XmATTACH_POSITION,
434 XmNrightPosition, (column+1) * maxrows,
435 XmNbottomAttachment, XmATTACH_POSITION,
436 XmNbottomPosition, (row+1) * maxcols,
437 XmNlabelString, lstr,
439 XmNtraversalOn, TRUE,
440 XmNalignment, XmALIGNMENT_CENTER,
441 XmNrecomputeSize, False,
442 XmNnavigationType, XmNONE,
446 button = XtVaCreateManagedWidget(buttons[n].resname,
447 xmPushButtonWidgetClass,
449 XmNtopAttachment, XmATTACH_POSITION,
450 XmNtopPosition, row * maxcols,
451 XmNleftAttachment, XmATTACH_POSITION,
452 XmNleftPosition, column * maxrows,
453 XmNrightAttachment, XmATTACH_POSITION,
454 XmNrightPosition, (column+1) * maxrows,
455 XmNbottomAttachment, XmATTACH_POSITION,
456 XmNbottomPosition, (row+1) * maxcols,
457 XmNlabelString, lstr,
458 XmNtraversalOn, TRUE,
459 XmNalignment, XmALIGNMENT_CENTER,
460 XmNrecomputeSize, False,
461 XmNnavigationType, XmNONE,
466 if (mtype != M_NONE) create_menu(mtype, button, n) ;
467 val = (v->curwin << 16) + n ;
468 XtAddCallback(button, XmNactivateCallback, do_button, (XtPointer) val) ;
469 XtAddCallback(button, XmNhelpCallback, HelpRequestCB, (XtPointer) val) ;
470 XtAddEventHandler(button, KeyPressMask | KeyReleaseMask,
471 FALSE, event_proc, NULL) ;
473 if( funBtn == NULL && strcmp(v->pstr, GETMESSAGE(3, 5, "Functions")) == 0)
475 else if( constBtn == NULL && strcmp(v->pstr,
476 GETMESSAGE(3, 6, "Constants")) == 0)
478 else if( accBtn == NULL && strcmp(v->pstr,
479 GETMESSAGE(3, 12, "Accuracy")) == 0)
481 else if( stoBtn == NULL && strcmp(v->pstr, GETMESSAGE(3, 13, "Store")) == 0)
483 else if( rclBtn == NULL && strcmp(v->pstr, GETMESSAGE(3, 14, "Recall")) == 0)
485 else if( exchBtn == NULL && strcmp(v->pstr,
486 GETMESSAGE(3, 15, "Exchange")) == 0)
494 dtcalc_initialize_rframe(Widget owner, int type)
499 XmString label_string;
500 Widget sep, button, frame, form;
504 if (X->rframe) return ;
506 X->rframe = XmCreateFormDialog(owner, "rframe", NULL, 0) ;
508 /* Adjust the decorations for the dialog shell of the dialog */
509 XtSetArg (args[0], XmNmwmFunctions, MWM_FUNC_MOVE);
510 XtSetArg (args[1], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE);
511 XtSetValues (XtParent(X->rframe), args, 2);
513 set_title(FCP_REG, lstrs[(int) L_MEMT]) ;
515 frame = XmCreateFrame(X->rframe, "frame", NULL, 0);
516 XtManageChild(frame);
517 form = (Widget) XmCreateForm(frame, "form", NULL, 0) ;
523 XmNallowShellResize, TRUE,
524 XmNdefaultPosition, FALSE,
527 SPRINTF(str, "register%1d", 0) ;
528 X->registers[0] = XtVaCreateManagedWidget(str,
531 XmNtopAttachment, XmATTACH_FORM,
533 XmNleftAttachment, XmATTACH_FORM,
539 for (i = 1; i < MAXREGS; i++)
541 SPRINTF(str, "register%1d", i) ;
542 X->registers[i] = XtVaCreateManagedWidget(str,
545 XmNtopAttachment, XmATTACH_WIDGET,
546 XmNtopWidget, X->registers[i - 1],
548 XmNleftAttachment, XmATTACH_FORM,
555 XtSetArg (args[0], XmNtopAttachment, XmATTACH_WIDGET);
556 XtSetArg (args[1], XmNtopWidget, X->registers[i - 1]);
557 XtSetArg (args[2], XmNtopOffset, 3);
558 XtSetArg (args[3], XmNleftAttachment, XmATTACH_FORM);
559 XtSetArg (args[4], XmNrightAttachment, XmATTACH_FORM);
560 sep = XmCreateSeparator(form, "sep", args, 5);
563 label_string = XmStringCreateLocalized (GETMESSAGE(2, 32, "Close") );
564 XtSetArg (args[0], XmNmarginHeight, 0);
565 XtSetArg (args[1], XmNmarginWidth, 10);
566 XtSetArg (args[2], XmNlabelString, label_string);
567 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
568 XtSetArg (args[4], XmNtopWidget, sep);
569 XtSetArg (args[5], XmNtopOffset, 5);
570 XtSetArg (args[6], XmNleftAttachment, XmATTACH_POSITION);
571 XtSetArg (args[7], XmNleftPosition, 25);
572 XtSetArg (args[8], XmNbottomAttachment, XmATTACH_FORM);
573 XtSetArg (args[9], XmNbottomOffset, 5);
574 XtSetArg (args[10], XmNshowAsDefault, True);
575 button = XmCreatePushButton(form, "button", args, 11);
576 XmStringFree(label_string);
578 XtAddCallback(button, XmNactivateCallback, close_reg, (XtPointer) (intptr_t) type) ;
580 XtSetArg (args[0], XmNcancelButton, button);
581 XtSetArg (args[1], XmNdefaultButton, button);
582 XtSetValues (X->rframe, args, 2);
584 XtManageChild(button);
588 if (X->frframe) return ;
589 X->frframe = XmCreateFormDialog(owner, "frframe", NULL, 0) ;
591 /* Adjust the decorations for the dialog shell of the dialog */
592 XtSetArg (args[0], XmNmwmFunctions, MWM_FUNC_MOVE);
593 XtSetArg (args[1], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE);
594 XtSetValues (XtParent(X->frframe), args, 2);
596 set_title(FCP_FIN_REG, GETMESSAGE(2, 18, lstrs[(int) L_FINMEMT] ));
598 frame = XmCreateFrame(X->frframe, "frame", NULL, 0);
599 XtManageChild(frame);
600 form = (Widget) XmCreateForm(frame, "form", NULL, 0) ;
606 XmNallowShellResize, TRUE,
607 XmNdefaultPosition, FALSE,
610 SPRINTF(str, "fregister%1d", 0) ;
611 X->fregisters[0] = XtVaCreateManagedWidget(str,
614 XmNtopAttachment, XmATTACH_FORM,
616 XmNleftAttachment, XmATTACH_FORM,
622 for (i = 1; i < FINREGS; i++)
624 SPRINTF(str, "fregister%1d", i) ;
625 X->fregisters[i] = XtVaCreateManagedWidget(str,
628 XmNtopAttachment, XmATTACH_WIDGET,
629 XmNtopWidget, X->fregisters[i - 1],
631 XmNleftAttachment, XmATTACH_FORM,
638 SPRINTF(str, "fregistervals%1d", 0) ;
639 X->fregistersvals[0] = XtVaCreateManagedWidget(str,
642 XmNtopAttachment, XmATTACH_FORM,
644 XmNleftAttachment, XmATTACH_WIDGET,
645 XmNleftWidget, X->fregisters[0],
647 XmNrightAttachment, XmATTACH_FORM,
653 for (i = 1; i < FINREGS; i++)
655 SPRINTF(str, "fregistervals%1d", i) ;
656 X->fregistersvals[i] = XtVaCreateManagedWidget(str,
659 XmNtopAttachment, XmATTACH_WIDGET,
660 XmNtopWidget, X->fregistersvals[i - 1],
662 XmNleftAttachment, XmATTACH_WIDGET,
663 XmNleftWidget, X->fregisters[i],
665 XmNrightAttachment, XmATTACH_FORM,
672 XtSetArg (args[0], XmNtopAttachment, XmATTACH_WIDGET);
673 XtSetArg (args[1], XmNtopWidget, X->fregisters[i - 1]);
674 XtSetArg (args[2], XmNtopOffset, 3);
675 XtSetArg (args[3], XmNleftAttachment, XmATTACH_FORM);
676 XtSetArg (args[4], XmNrightAttachment, XmATTACH_FORM);
677 sep = XmCreateSeparator(form, "sep", args, 5);
680 label_string = XmStringCreateLocalized (GETMESSAGE(2, 32, "Close") );
681 XtSetArg (args[0], XmNmarginHeight, 0);
682 XtSetArg (args[1], XmNmarginWidth, 10);
683 XtSetArg (args[2], XmNlabelString, label_string);
684 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
685 XtSetArg (args[4], XmNtopWidget, sep);
686 XtSetArg (args[5], XmNtopOffset, 5);
687 XtSetArg (args[6], XmNleftAttachment, XmATTACH_POSITION);
688 XtSetArg (args[7], XmNleftPosition, 30);
689 XtSetArg (args[8], XmNbottomAttachment, XmATTACH_FORM);
690 XtSetArg (args[9], XmNbottomOffset, 5);
691 XtSetArg (args[10], XmNshowAsDefault, True);
692 button = XmCreatePushButton(form, "button", args, 11);
693 XmStringFree(label_string);
695 XtSetArg (args[0], XmNcancelButton, button);
696 XtSetArg (args[1], XmNdefaultButton, button);
697 XtSetValues (X->frframe, args, 2);
699 XtAddCallback(button, XmNactivateCallback, close_reg, NULL) ;
701 XtManageChild(button);
707 dtcalc_kkeyboard_create(Widget owner)
712 buttonFrame = XtVaCreateManagedWidget("buttonFrame",
715 XmNshadowThickness, 0,
718 XmNtopAttachment, XmATTACH_WIDGET,
719 XmNtopWidget, X->modeFrame,
720 XmNrightAttachment, XmATTACH_FORM,
721 XmNleftAttachment, XmATTACH_FORM,
722 XmNbottomAttachment, XmATTACH_FORM,
725 X->kkeyboard = XtVaCreateManagedWidget("kkeyboard",
728 XmNfractionBase, BROWS * BCOLS,
729 XmNnavigationType, XmSTICKY_TAB_GROUP,
732 v->curwin = FCP_KEY ;
733 for (row = 0; row < BROWS; row++)
734 for (column = 0; column < BCOLS; column++)
736 X->kbuttons[row][column] = button_create(X->kkeyboard, row, column,
738 XtManageChild(X->kbuttons[row][column]) ;
740 grey_buttons(v->base) ;
745 dtcalc_kpanel_create(Widget owner)
747 static char *mnames[] = { "base", "ttype", "num", "hyp",
748 "inv", "op", "mode" } ;
750 Widget basePulldown, numPulldown, modePulldown, trigPulldown;
752 XmString label_string;
753 Pixel tmp_pixelbg, tmp_pixelfg;
754 XtTranslations trans_table;
756 trans_table = XtParseTranslationTable(translations_return);
762 if(pixels[2].bg == black_pixel)
764 tmp_pixelbg = black_pixel;
765 tmp_pixelfg = white_pixel;
769 tmp_pixelbg = white_pixel;
770 tmp_pixelfg = black_pixel;
775 tmp_pixelbg = pixels[6].bg;
776 tmp_pixelfg = white_pixel;
781 tmp_pixelbg = white_pixel;
782 tmp_pixelfg = black_pixel;
785 X->mainWin = XtVaCreateManagedWidget("mainWin",
786 xmMainWindowWidgetClass,
791 XtAddEventHandler(owner, 0, True,
792 (XtEventHandler) _XEditResCheckMessages,
796 if(application_args.menuBar)
797 create_menu_bar(X->mainWin);
799 X->kFrame = XtVaCreateManagedWidget("kFrame", xmFrameWidgetClass,
801 XmNshadowThickness, 1,
802 XmNshadowType, XmSHADOW_OUT,
807 X->kpanel = XtVaCreateManagedWidget("kpanel",
810 XmNshadowThickness, 0,
811 XmNbackground, tmp_pixelbg,
812 XmNforeground, tmp_pixelfg,
815 create_popup(X->kpanel);
817 X->textFrame = XtVaCreateManagedWidget("textFrame",
820 XmNshadowThickness, 2,
821 XmNshadowType, XmSHADOW_IN,
824 XmNtopAttachment, XmATTACH_FORM,
825 XmNrightAttachment, XmATTACH_FORM,
826 XmNleftAttachment, XmATTACH_FORM,
827 XmNnavigationType, XmTAB_GROUP,
829 XtAddCallback(X->textFrame, XmNhelpCallback, HelpRequestCB,
830 (XtPointer)HELP_DISPLAY) ;
832 X->textForm = XtVaCreateManagedWidget("textForm",
835 XmNshadowThickness, 0,
836 XmNbackground, tmp_pixelbg,
837 XmNforeground, tmp_pixelfg,
839 XtAddCallback(X->textForm, XmNhelpCallback, HelpRequestCB,
840 (XtPointer)HELP_DISPLAY) ;
842 X->modevals[(int) DISPLAYITEM] = XtVaCreateManagedWidget("display",
845 XmNtopAttachment, XmATTACH_FORM,
846 XmNrightAttachment, XmATTACH_FORM,
847 XmNbottomAttachment, XmATTACH_FORM,
848 XmNresizeWidth, TRUE,
849 XmNshadowThickness, 0,
850 XmNhighlightThickness, 0,
852 XmNverifyBell, FALSE,
853 XmNbackground, tmp_pixelbg,
854 XmNforeground, tmp_pixelfg,
856 XtAddCallback(X->modevals[(int) DISPLAYITEM], XmNhelpCallback, HelpRequestCB,
857 (XtPointer) HELP_DISPLAY) ;
858 XtAddEventHandler(X->modevals[(int) DISPLAYITEM],
859 KeyPressMask | KeyReleaseMask, FALSE, event_proc, NULL) ;
862 X->modeFrame = XtVaCreateManagedWidget("modeFrame",
865 XmNshadowThickness, 0,
868 XmNtopAttachment, XmATTACH_WIDGET,
869 XmNtopWidget, X->textFrame,
870 XmNrightAttachment, XmATTACH_FORM,
871 XmNleftAttachment, XmATTACH_FORM,
872 XmNnavigationType, XmTAB_GROUP,
874 XtAddCallback(X->modeFrame, XmNhelpCallback, HelpRequestCB,
875 (XtPointer) HELP_MODELINE) ;
877 X->modeline = XtVaCreateManagedWidget("modeline",
880 XmNshadowThickness, 0,
882 XtAddCallback(X->modeline, XmNhelpCallback, HelpRequestCB,
883 (XtPointer) HELP_MODELINE) ;
885 label_string = XmStringCreateLocalized (" ");
887 X->modevals[i] = XtVaCreateManagedWidget(mnames[i],
890 XmNtopAttachment, XmATTACH_FORM,
891 XmNrightAttachment, XmATTACH_FORM,
892 XmNrecomputeSize, False,
893 XmNalignment, XmALIGNMENT_CENTER,
894 XmNlabelString, label_string,
896 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
897 (XtPointer) HELP_MODELINE) ;
900 X->modevals[i] = XtVaCreateManagedWidget(mnames[i],
903 XmNrightAttachment, XmATTACH_WIDGET,
904 XmNrightWidget, X->modevals[(int) OPITEM],
905 XmNtopAttachment, XmATTACH_FORM,
906 XmNrecomputeSize, False,
907 XmNalignment, XmALIGNMENT_CENTER,
908 XmNlabelString, label_string,
910 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
911 (XtPointer) HELP_MODELINE) ;
914 X->modevals[i] = XtVaCreateManagedWidget(mnames[i],
917 XmNrightAttachment, XmATTACH_WIDGET,
918 XmNrightWidget, X->modevals[(int) HYPITEM],
919 XmNtopAttachment, XmATTACH_FORM,
920 XmNrecomputeSize, False,
921 XmNalignment, XmALIGNMENT_CENTER,
922 XmNlabelString, label_string,
924 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
925 (XtPointer) HELP_MODELINE) ;
926 XmStringFree(label_string);
930 modePulldown = XmCreatePulldownMenu(X->modeline, "modePD", args, 0);
932 XtSetArg(args[0], XmNmarginHeight, 0);
933 XtSetArg(args[1], XmNmarginWidth, 0);
934 val = (v->curwin << 16) +
935 menu_entries[cmenus[(int) M_MODE].mindex + 1].val ;
936 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 9, "Financial") );
937 XtSetArg(args[2], XmNlabelString, label_string);
938 XtSetArg(args[3], XmNuserData, val);
939 modeArry[0] = XmCreatePushButtonGadget(modePulldown, "fin", args, 4);
940 XmStringFree(label_string);
941 XtAddCallback(modeArry[0], XmNactivateCallback, modelineValueChanged,
944 val = (v->curwin << 16) +
945 menu_entries[cmenus[(int) M_MODE].mindex + 2].val ;
946 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 10, "Logical") );
947 XtSetArg(args[2], XmNlabelString, label_string);
948 XtSetArg(args[3], XmNuserData, val);
949 modeArry[1] = XmCreatePushButtonGadget(modePulldown, "logic", args, 4);
950 XmStringFree(label_string);
951 XtAddCallback(modeArry[1], XmNactivateCallback, modelineValueChanged,
954 val = (v->curwin << 16) +
955 menu_entries[cmenus[(int) M_MODE].mindex + 3].val ;
956 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 11, "Scientific") );
957 XtSetArg(args[2], XmNlabelString, label_string);
958 XtSetArg(args[3], XmNuserData, val);
959 modeArry[2] = XmCreatePushButtonGadget(modePulldown, "Sci", args, 4);
960 XmStringFree(label_string);
961 XtAddCallback(modeArry[2], XmNactivateCallback, modelineValueChanged,
964 XtManageChildren(modeArry, 3);
966 /* create the Option Menu and attach it to the Pulldown MenuPane */
968 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
969 XtSetArg (args[n], XmNtopWidget, X->modevals[(int)HYPITEM]); n++;
970 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
971 XtSetArg(args[n], XmNsubMenuId, modePulldown); n++;
972 XtSetArg(args[n], XmNmenuHistory, modeArry[(int)v->modetype]); n++;
973 X->modevals[i] = XmCreateOptionMenu(X->modeline, "mode", args, n);
974 XtManageChild (X->modevals[i]);
975 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
976 (XtPointer) HELP_MODE) ;
978 XtOverrideTranslations(X->modevals[i], trans_table);
980 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
981 FALSE, event_proc, NULL) ;
984 basePulldown = XmCreatePulldownMenu(X->modeline, "basePD", args, 0);
986 val = (v->curwin << 16) +
987 menu_entries[cmenus[(int) M_BASE].mindex].val ;
988 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 1, "Bin") );
989 XtSetArg(args[0], XmNmarginHeight, 0);
990 XtSetArg(args[1], XmNmarginWidth, 0);
991 XtSetArg(args[2], XmNlabelString, label_string);
992 XtSetArg(args[3], XmNuserData, val);
993 X->baseWidgArry[0] = XmCreatePushButtonGadget(basePulldown, "bin", args, 4);
994 XmStringFree(label_string);
995 XtAddCallback(X->baseWidgArry[0], XmNactivateCallback,
996 modelineValueChanged, (XtPointer) M_BASE);
998 val = (v->curwin << 16) +
999 menu_entries[cmenus[(int) M_BASE].mindex + 1].val ;
1000 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 2, "Oct") );
1001 XtSetArg(args[2], XmNlabelString, label_string);
1002 XtSetArg(args[3], XmNuserData, val);
1003 X->baseWidgArry[1] = XmCreatePushButtonGadget(basePulldown, "oct", args, 4);
1004 XmStringFree(label_string);
1005 XtAddCallback(X->baseWidgArry[1], XmNactivateCallback,
1006 modelineValueChanged, (XtPointer) M_BASE);
1008 val = (v->curwin << 16) +
1009 menu_entries[cmenus[(int) M_BASE].mindex + 2].val ;
1010 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 3, "Dec") );
1011 XtSetArg(args[2], XmNlabelString, label_string);
1012 XtSetArg(args[3], XmNuserData, val);
1013 X->baseWidgArry[2] = XmCreatePushButtonGadget(basePulldown, "dec", args, 4);
1014 XmStringFree(label_string);
1015 XtAddCallback(X->baseWidgArry[2], XmNactivateCallback,
1016 modelineValueChanged, (XtPointer) M_BASE);
1018 val = (v->curwin << 16) +
1019 menu_entries[cmenus[(int) M_BASE].mindex + 3].val ;
1020 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 4, "Hex") );
1021 XtSetArg(args[2], XmNlabelString, label_string);
1022 XtSetArg(args[3], XmNuserData, val);
1023 X->baseWidgArry[3] = XmCreatePushButtonGadget(basePulldown, "hex", args, 4);
1024 XmStringFree(label_string);
1025 XtAddCallback(X->baseWidgArry[3], XmNactivateCallback,
1026 modelineValueChanged, (XtPointer) M_BASE);
1028 XtManageChildren(X->baseWidgArry, 4);
1030 /* create the Option Menu and attach it to the Pulldown MenuPane */
1032 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
1033 XtSetArg (args[n], XmNtopWidget, X->modevals[(int)HYPITEM]); n++;
1034 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
1035 XtSetArg(args[n], XmNsubMenuId, basePulldown); n++;
1036 XtSetArg(args[n], XmNmenuHistory, X->baseWidgArry[(int)v->base]); n++;
1037 X->modevals[i] = XmCreateOptionMenu(X->modeline, "base", args, n);
1038 XtManageChild (X->modevals[i]);
1039 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
1040 (XtPointer) HELP_BASE) ;
1042 XtOverrideTranslations(X->modevals[i], trans_table);
1043 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
1044 FALSE, event_proc, NULL) ;
1048 numPulldown = XmCreatePulldownMenu(X->modeline, "numPD", args, 0);
1050 val = (v->curwin << 16) +
1051 menu_entries[cmenus[(int) M_NUM].mindex].val ;
1052 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 5, "Eng") );
1053 XtSetArg(args[0], XmNmarginHeight, 0);
1054 XtSetArg(args[1], XmNmarginWidth, 0);
1055 XtSetArg(args[2], XmNlabelString, label_string);
1056 XtSetArg(args[3], XmNuserData, val);
1057 X->numWidgArry[0] = XmCreatePushButtonGadget(numPulldown, "eng", args, 4);
1058 XmStringFree(label_string);
1059 XtAddCallback(X->numWidgArry[0], XmNactivateCallback, modelineValueChanged,
1062 val = (v->curwin << 16) +
1063 menu_entries[cmenus[(int) M_NUM].mindex + 1].val ;
1064 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 6, "Fix") );
1065 XtSetArg(args[2], XmNlabelString, label_string);
1066 XtSetArg(args[3], XmNuserData, val);
1067 X->numWidgArry[1] = XmCreatePushButtonGadget(numPulldown, "fix", args, 4);
1068 XmStringFree(label_string);
1069 XtAddCallback(X->numWidgArry[1], XmNactivateCallback, modelineValueChanged,
1072 val = (v->curwin << 16) +
1073 menu_entries[cmenus[(int) M_NUM].mindex + 2].val ;
1074 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 7, "Sci") );
1075 XtSetArg(args[2], XmNlabelString, label_string);
1076 XtSetArg(args[3], XmNuserData, val);
1077 X->numWidgArry[2] = XmCreatePushButtonGadget(numPulldown, "sci", args, 4);
1078 XmStringFree(label_string);
1079 XtAddCallback(X->numWidgArry[2], XmNactivateCallback, modelineValueChanged,
1082 XtManageChildren(X->numWidgArry, 3);
1084 /* create the Option Menu and attach it to the Pulldown MenuPane */
1086 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
1087 XtSetArg (args[n], XmNtopWidget, X->modevals[(int)HYPITEM]); n++;
1088 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
1089 XtSetArg(args[n], XmNsubMenuId, numPulldown); n++;
1090 XtSetArg(args[n], XmNmenuHistory, X->numWidgArry[(int)v->dtype]); n++;
1091 X->modevals[i] = XmCreateOptionMenu(X->modeline, "num", args, n);
1092 XtManageChild (X->modevals[i]);
1093 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
1094 (XtPointer) HELP_NOTATION) ;
1096 XtOverrideTranslations(X->modevals[i], trans_table);
1097 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
1098 FALSE, event_proc, NULL) ;
1101 i = (int) TTYPEITEM;
1102 trigPulldown = XmCreatePulldownMenu(X->modeline, "trigPD", args, 0);
1104 XtSetArg(args[0], XmNmarginHeight, 0);
1105 XtSetArg(args[1], XmNmarginWidth, 0);
1106 val = (v->curwin << 16) +
1107 menu_entries[cmenus[(int) M_TRIG].mindex].val ;
1108 label_string = XmStringCreateLocalized ( ttype_str[(int) DEG] );
1109 XtSetArg(args[2], XmNlabelString, label_string);
1110 XtSetArg(args[3], XmNuserData, val);
1111 X->ttypeWidgArry[0] =
1112 XmCreatePushButtonGadget(trigPulldown, "deg", args, 4);
1113 XmStringFree(label_string);
1114 XtAddCallback(X->ttypeWidgArry[0], XmNactivateCallback,
1115 modelineValueChanged, (XtPointer) M_TRIG);
1117 val = (v->curwin << 16) +
1118 menu_entries[cmenus[(int) M_TRIG].mindex + 1].val ;
1119 label_string = XmStringCreateLocalized ( ttype_str[(int) GRAD] );
1120 XtSetArg(args[2], XmNlabelString, label_string);
1121 XtSetArg(args[3], XmNuserData, val);
1122 X->ttypeWidgArry[1] =
1123 XmCreatePushButtonGadget(trigPulldown, "grd", args, 4);
1124 XmStringFree(label_string);
1125 XtAddCallback(X->ttypeWidgArry[1], XmNactivateCallback,
1126 modelineValueChanged, (XtPointer) M_TRIG);
1128 val = (v->curwin << 16) +
1129 menu_entries[cmenus[(int) M_TRIG].mindex + 2].val ;
1130 label_string = XmStringCreateLocalized ( ttype_str[(int) RAD] );
1131 XtSetArg(args[2], XmNlabelString, label_string);
1132 XtSetArg(args[3], XmNuserData, val);
1133 X->ttypeWidgArry[2] =
1134 XmCreatePushButtonGadget(trigPulldown, "rad", args, 4);
1135 XmStringFree(label_string);
1136 XtAddCallback(X->ttypeWidgArry[2], XmNactivateCallback,
1137 modelineValueChanged, (XtPointer) M_TRIG);
1139 XtManageChildren(X->ttypeWidgArry, 3);
1141 /* create the Option Menu and attach it to the Pulldown MenuPane */
1143 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
1144 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
1145 XtSetArg (args[n], XmNtopWidget, X->modevals[(int) HYPITEM]); n++;
1146 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
1147 XtSetArg(args[n], XmNsubMenuId, trigPulldown); n++;
1148 XtSetArg(args[n], XmNmenuHistory, X->ttypeWidgArry[(int)v->ttype]); n++;
1149 X->modevals[i] = XmCreateOptionMenu(X->modeline, "trig", args, n);
1150 XtManageChild (X->modevals[i]);
1151 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
1152 (XtPointer) HELP_TRIG) ;
1154 XtOverrideTranslations(X->modevals[i], trans_table);
1155 XtSetSensitive(X->modevals[i], True);
1157 XtSetArg (args[0], XmNrightAttachment, XmATTACH_WIDGET);
1158 XtSetArg (args[1], XmNrightWidget, X->modevals[(int)BASEITEM]);
1159 XtSetValues (X->modevals[(int)MODEITEM], args, 2);
1161 XtSetArg (args[0], XmNrightAttachment, XmATTACH_WIDGET);
1162 XtSetArg (args[1], XmNrightWidget, X->modevals[(int)NUMITEM]);
1163 XtSetValues (X->modevals[(int)BASEITEM], args, 2);
1165 XtSetArg (args[0], XmNrightAttachment, XmATTACH_WIDGET);
1166 XtSetArg (args[1], XmNrightWidget, X->modevals[(int)TTYPEITEM]);
1167 XtSetValues (X->modevals[(int)NUMITEM], args, 2);
1170 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
1171 FALSE, event_proc, NULL) ;
1178 confirm_callback(Widget widget, XtPointer client_data, XtPointer call_data)
1185 create_cfframe(void) /* Create auxiliary frame for CON/FUN key. */
1190 Widget sep, frame, form;
1191 XmString label_string;
1193 X->CFframe = (Widget) XmCreateFormDialog(X->kframe, "cfframe", NULL, 0) ;
1194 tstr = XmStringCreateLocalized(lstrs[(int) L_NEWCON]) ;
1195 XtVaSetValues(X->CFframe,
1196 XmNdialogTitle, tstr,
1197 XmNautoUnmanage, FALSE,
1198 XmNallowShellResize, FALSE,
1199 XmNdefaultPosition, FALSE,
1201 XmStringFree(tstr) ;
1203 /* Adjust the decorations for the dialog shell of the dialog */
1205 XtSetArg (args[j], XmNmwmFunctions, MWM_FUNC_MOVE); j++;
1206 XtSetArg (args[j], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE); j++;
1207 XtSetValues (XtParent(X->CFframe), args, j);
1209 frame = (Widget) XmCreateFrame(X->CFframe, "frame", NULL, 0) ;
1210 XtManageChild(frame);
1211 form = (Widget) XmCreateForm(frame, "form", NULL, 0) ;
1212 XtManageChild(form);
1215 X->CFpi_cftext = make_textW(form, lstrs[(int) L_CONNO]) ;
1216 X->CFpi_dtext = make_textW(form, lstrs[(int) L_DESC]) ;
1217 X->CFpi_vtext = make_textW(form, lstrs[(int) L_VALUE]) ;
1220 XtSetArg (args[j], XmNtopAttachment, XmATTACH_FORM); j++;
1221 XtSetArg (args[j], XmNtopOffset, 5); j++;
1222 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1223 XtSetArg (args[j], XmNrightOffset, 5); j++;
1224 XtSetValues(X->CFpi_cftext->manager, args, j);
1227 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1228 XtSetArg (args[j], XmNtopWidget, X->CFpi_cftext->manager); j++;
1229 XtSetArg (args[j], XmNtopOffset, 5); j++;
1230 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1231 XtSetArg (args[j], XmNrightOffset, 5); j++;
1232 XtSetValues(X->CFpi_dtext->manager, args, j);
1235 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1236 XtSetArg (args[j], XmNtopWidget, X->CFpi_dtext->manager); j++;
1237 XtSetArg (args[j], XmNtopOffset, 5); j++;
1238 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1239 XtSetArg (args[j], XmNrightOffset, 5); j++;
1240 XtSetValues(X->CFpi_vtext->manager, args, j);
1243 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1244 XtSetArg (args[j], XmNtopWidget, X->CFpi_vtext->manager); j++;
1245 XtSetArg (args[j], XmNtopOffset, 3); j++;
1246 XtSetArg (args[j], XmNleftAttachment, XmATTACH_FORM); j++;
1247 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1248 sep = XmCreateSeparator(form, "sep", args, j);
1252 label_string = XmStringCreateLocalized ( GETMESSAGE(4, 4, "OK") );
1253 XtSetArg (args[j], XmNmarginHeight, 2); j++;
1254 XtSetArg (args[j], XmNmarginWidth, 15); j++;
1255 XtSetArg (args[j], XmNlabelString, label_string); j++;
1256 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1257 XtSetArg (args[j], XmNtopWidget, sep); j++;
1258 XtSetArg (args[j], XmNtopOffset, 5); j++;
1259 XtSetArg (args[j], XmNleftAttachment, XmATTACH_FORM); j++;
1260 XtSetArg (args[j], XmNleftOffset, 15); j++;
1261 XtSetArg (args[j], XmNbottomAttachment, XmATTACH_FORM); j++;
1262 XtSetArg (args[j], XmNbottomOffset, 5); j++;
1263 XtSetArg (args[j], XmNshowAsDefault, True); j++;
1264 XtSetArg (args[j], XmNtraversalOn, True); j++;
1265 X->CFpi_butOK = XmCreatePushButton(form, "button", args, j);
1266 XmStringFree(label_string);
1267 XtManageChild(X->CFpi_butOK);
1270 label_string = XmStringCreateLocalized ( GETMESSAGE(3, 361, "Cancel") );
1271 XtSetArg (args[j], XmNmarginHeight, 2); j++;
1272 XtSetArg (args[j], XmNmarginWidth, 10); j++;
1273 XtSetArg (args[j], XmNlabelString, label_string); j++;
1274 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1275 XtSetArg (args[j], XmNtopWidget, sep); j++;
1276 XtSetArg (args[j], XmNtopOffset, 10); j++;
1277 XtSetArg (args[j], XmNleftAttachment, XmATTACH_WIDGET); j++;
1278 XtSetArg (args[j], XmNleftWidget, X->CFpi_butOK); j++;
1279 XtSetArg (args[j], XmNleftOffset, 33); j++;
1280 XtSetArg (args[j], XmNbottomAttachment, XmATTACH_FORM); j++;
1281 XtSetArg (args[j], XmNbottomOffset, 10); j++;
1282 XtSetArg (args[j], XmNtraversalOn, True); j++;
1283 X->CFpi_butClose = XmCreatePushButton(form, "button", args, j);
1284 XmStringFree(label_string);
1285 XtManageChild(X->CFpi_butClose);
1288 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
1289 XtSetArg (args[j], XmNmarginHeight, 2); j++;
1290 XtSetArg (args[j], XmNmarginWidth, 10); j++;
1291 XtSetArg (args[j], XmNlabelString, label_string); j++;
1292 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1293 XtSetArg (args[j], XmNtopWidget, sep); j++;
1294 XtSetArg (args[j], XmNtopOffset, 10); j++;
1295 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1296 XtSetArg (args[j], XmNrightOffset, 15); j++;
1297 XtSetArg (args[j], XmNleftAttachment, XmATTACH_WIDGET); j++;
1298 XtSetArg (args[j], XmNleftWidget, X->CFpi_butClose); j++;
1299 XtSetArg (args[j], XmNleftOffset, 33); j++;
1300 XtSetArg (args[j], XmNbottomAttachment, XmATTACH_FORM); j++;
1301 XtSetArg (args[j], XmNbottomOffset, 10); j++;
1302 XtSetArg (args[j], XmNtraversalOn, True); j++;
1303 X->CFpi_butHelp = XmCreatePushButton(form, "button", args, j);
1304 XmStringFree(label_string);
1305 XtManageChild(X->CFpi_butHelp);
1307 XtAddCallback(X->CFpi_butOK, XmNactivateCallback, write_cf_value,
1308 (XtPointer) X->CFpi_butOK) ;
1309 XtAddCallback(X->CFpi_butClose, XmNactivateCallback, close_cf,
1312 XtAddCallback(X->CFpi_cftext->textfield, XmNactivateCallback, move_cf,
1313 (XtPointer) X->CFpi_butOK) ;
1314 XtAddCallback(X->CFpi_dtext->textfield, XmNactivateCallback, move_cf,
1315 (XtPointer) X->CFpi_butOK) ;
1316 XtAddCallback(X->CFpi_vtext->textfield, XmNactivateCallback, move_cf,
1317 (XtPointer) X->CFpi_butOK) ;
1319 XtAddCallback(X->CFpi_cftext->textfield, XmNfocusCallback, FocusInCB,
1321 XtAddCallback(X->CFpi_dtext->textfield, XmNactivateCallback, FocusInCB,
1324 XtSetArg (args[j], XmNcancelButton, X->CFpi_butClose); j++;
1325 XtSetValues (X->CFframe, args, j);
1328 XtSetArg (args[j], XmNdefaultButton, X->CFpi_butOK); j++;
1329 XtSetValues (form, args, j);
1331 /* Make the first prompt automatically get the focus. */
1332 XmProcessTraversal(X->CFpi_cftext->textfield, XmTRAVERSE_CURRENT);
1336 /* Create popup menu for dtcalc button. */
1338 create_menu(enum menu_type mtype, Widget button, int n)
1340 char *mstr, *tmpStr, *ptr ;
1344 Boolean isAFunction = False;
1346 if ((mtype != M_CON && mtype != M_FUN) &&
1347 X->menus[(int) mtype] != NULL) return ; /* Already created? */
1349 X->menus[(int) mtype] = menu = XmCreatePopupMenu(button,
1352 X->mrec[(int) mtype] = n ;
1354 XtCreateManagedWidget(cmenus[(int) mtype].title, xmLabelWidgetClass,
1356 XtCreateManagedWidget("separator", xmSeparatorWidgetClass, menu, NULL, 0) ;
1357 XtCreateManagedWidget("separator", xmSeparatorWidgetClass, menu, NULL, 0) ;
1360 for (i = 0; i < cmenus[(int) mtype].total; i++)
1365 case M_CON : if (strlen(v->con_names[i])) /* Constants. */
1366 mstr = v->con_names[i] ;
1369 case M_FUN : if (strlen(v->fun_names[i])) /* Functions. */
1372 mstr = v->fun_names[i] ;
1376 default : mstr = menu_entries[cmenus[(int) mtype].mindex + i].str ;
1381 tmpStr = GETMESSAGE(3, 45, ".");
1382 if(strcmp(tmpStr, ".") != 0)
1384 /* if it's not a "." let's go change it to what it should be */
1385 ptr = DtStrchr(mstr, '.');
1389 mi = XtCreateManagedWidget(mstr, xmPushButtonWidgetClass,
1391 val = (v->curwin << 16) +
1392 menu_entries[cmenus[(int) mtype].mindex + i].val ;
1393 XtAddCallback(mi, XmNactivateCallback, menu_proc, (XtPointer) val) ;
1396 if( !isAFunction && mtype == M_FUN)
1398 mi = XtCreateManagedWidget(GETMESSAGE(2, 35, "No Functions Defined"),
1399 xmPushButtonWidgetClass, menu, NULL, 0) ;
1406 do_button(Widget widget, XtPointer client_data, XtPointer call_data)
1411 intptr_t n = ((intptr_t) client_data) & 0xFFFF ;
1413 XtSetArg(args[0], XmNlabelString, &cstr);
1414 XtGetValues(X->modevals[OPITEM], args, 1);
1416 str = (char *) _XmStringUngenerate(cstr,
1417 XmFONTLIST_DEFAULT_TAG,
1418 XmCHARSET_TEXT, XmCHARSET_TEXT);
1420 if(strcmp(vstrs[(int) V_CLR], str) == 0 &&
1421 (buttons[n].value != KEY_CLR && buttons[n].value != KEY_QUIT))
1427 ProcessMotifSelection(X->modevals[(int) DISPLAYITEM]);
1428 v->curwin = ((intptr_t) client_data) >> 16 ;
1431 v->current = buttons[n].value ;
1434 else if (n >= 0 && n <= NOBUTTONS) process_item(n) ;
1441 do_continue_notice(Widget parent, char *str)
1443 XmString contstr, message, cstr ;
1446 X->notice = (Widget) XmCreateInformationDialog(X->kframe, "continue",
1448 contstr = XmStringCreateLocalized(vstrs[(int) V_CONTINUE]) ;
1449 message = XmStringCreateLocalized( str );
1450 XtVaSetValues(X->notice,
1451 XmNautoUnmanage, FALSE,
1452 XmNcancelLabelString, contstr,
1453 XmNmessageString, message,
1454 XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL,
1456 XmStringFree(contstr) ;
1457 XmStringFree(message) ;
1458 XtUnmanageChild((Widget) XmMessageBoxGetChild(X->notice,
1459 XmDIALOG_OK_BUTTON)) ;
1460 XtUnmanageChild((Widget) XmMessageBoxGetChild(X->notice,
1461 XmDIALOG_HELP_BUTTON)) ;
1463 tmpStr = GETMESSAGE(2, 36, "Continue Notice");
1464 cstr = XmStringCreateLocalized(tmpStr) ;
1465 XtVaSetValues(X->notice, XmNdialogTitle, cstr, NULL) ;
1466 XmStringFree(cstr) ;
1468 XtManageChild(X->notice) ;
1474 do_confirm_notice(Widget parent, char *str)
1476 XmString confirm, cancel, message, cstr ;
1480 X->notice = (Widget) XmCreateInformationDialog(X->kframe, "continue",
1482 confirm = XmStringCreateLocalized(vstrs[(int) V_CONFIRM]) ;
1483 cancel = XmStringCreateLocalized(vstrs[(int) V_CANCEL]) ;
1484 message = XmStringCreateLocalized( str );
1485 XtVaSetValues(X->notice,
1486 XmNautoUnmanage, FALSE,
1487 XmNcancelLabelString, cancel,
1488 XmNokLabelString, confirm,
1489 XmNmessageString, message,
1490 XmNdialogStyle, XmDIALOG_APPLICATION_MODAL,
1492 XmStringFree(confirm) ;
1493 XmStringFree(cancel) ;
1494 XmStringFree(message) ;
1495 XtUnmanageChild((Widget) XmMessageBoxGetChild(X->notice,
1496 XmDIALOG_HELP_BUTTON)) ;
1497 XtAddCallback(X->notice, XmNokCallback, confirm_callback, NULL) ;
1499 tmpStr = GETMESSAGE(2, 37, "Confirmation Notice");
1500 cstr = XmStringCreateLocalized(tmpStr) ;
1501 XtVaSetValues(X->notice, XmNdialogTitle, cstr, NULL) ;
1502 XmStringFree(cstr) ;
1504 XtManageChild(X->notice) ;
1511 close_reg(Widget widget, XtPointer client_data, XtPointer call_data)
1513 intptr_t type = (intptr_t)client_data;
1517 XtUnmanageChild(X->rframe);
1518 XtUnmapWidget(XtParent(X->rframe));
1523 XtUnmanageChild(X->frframe);
1524 XtUnmapWidget(XtParent(X->frframe));
1532 * This routine causes the calculator buttons to looked depressed (armed)
1533 * and undepressed (disarmed) when the user uses the keyboard to select a
1534 * button on the keyboard. It's pretty straight forward:
1535 * The user pressess a key from the keyboard
1536 * The routine event_proc() gets called.
1537 * It determines whether the key from the keyboard is a valid key.
1538 * If it is, it sends that key to process_event()
1539 * This routines then determines whether the key is an active key.
1540 * If it is then it calls this routine to set the key to either armed
1541 * or disarmed. This state is determined by whether it is a keyboard
1542 * up event or a keyboard down event.
1543 * There is some special case code in here also. There was a bug where
1544 * if a user pressed a CNTL character key, the event order could cause
1545 * the key to stay depressed. The typical order is:
1550 * When this typical order was pressed things worked fine. But the problem
1551 * arose when the order was:
1556 * The problem was that when the last "KEY key up" was processed it is not
1557 * recognized as a control key, so the calculator thought is was a "normal"
1558 * key and disarmed that "normal" key button rather then the Control
1559 * key button. This is what the lastArmed and count static variables are
1560 * used for. They check to see if the last "KEY key up" corresponds to
1561 * the last "Control key down" button that was armed. If it doesn't then
1562 * we know we need to disarm the "Control key" button rather then the
1563 * "normal" button that was passed in.
1567 draw_button(int n, enum fcp_type fcptype, int row, int column, int inverted)
1571 int i, j, row2, column2;
1575 widget = X->kbuttons[row][column] ;
1576 lastArmed[countArmed] = n;
1583 for(i = 0; i < countArmed; i++)
1585 if(lastArmed[i] == n)
1588 if(countArmed == i && countArmed != 0)
1591 row2 = lastArmed[i] / MAXCOLS ;
1592 column2 = lastArmed[i] - (row2 * MAXCOLS) ;
1593 widget = X->kbuttons[row2][column2] ;
1594 for(j = i; j < countArmed; j++)
1595 lastArmed[j] = lastArmed[j + 1];
1602 strcpy(str, "Disarm");
1604 /* go call the correct arm/disarm function from Motif */
1605 XtCallActionProc(widget, str, X->event, NULL, 0) ;
1611 event_is_keypad(XEvent *xevent)
1613 if (xevent->type != KeyPress && xevent->type != KeyRelease) return(0) ;
1614 return(X->kparray[xevent->xkey.keycode - X->kcmin] > 0) ;
1620 * This routine is called any time a key on the keyboard is pressed. It
1621 * then determines whether the key is a valid key or whether it is to
1622 * be ignore. If it is a valid key it passes it on to be processed.
1627 event_proc(Widget widget, XtPointer client_data, XEvent *event, Boolean *continue_to_dispatch)
1634 static char count = 0;
1636 /* If the ASCII convert dialog, or the Help dialog
1637 is up and managed, we don't want the keystrokes to go to the calculator
1638 main, just those dialogs
1639 if ((X->Aframe != NULL && XtIsManaged(X->Aframe)) ||
1640 (X->helpDialog != NULL && X->helpMapped))
1652 ignore_event = False;
1653 XtRemoveTimeOut(timerId);
1659 v->event_type = get_next_event(widget, 0, event) ;
1661 /* first check to see if there is an error condition, if there is we
1662 want to beep and return.
1665 XtSetArg(args[0], XmNlabelString, &label);
1666 XtGetValues(X->modevals[OPITEM], args, 1);
1668 str = (char *) _XmStringUngenerate(label,
1669 XmFONTLIST_DEFAULT_TAG,
1670 XmCHARSET_TEXT, XmCHARSET_TEXT);
1672 if(strcmp(vstrs[(int) V_CLR], str) == 0 &&
1673 (v->cur_ch != KEY_CLR && v->cur_ch != KEY_QUIT))
1675 if(v->event_type == KEYBOARD_DOWN)
1679 index = get_index(v->cur_ch);
1681 draw_button(index, v->curwin, v->row, v->column, FALSE);
1686 /* Now lets check to see if the input was for the Constants/Functions
1687 dialog. If it was process it.
1689 if(X->CFframe != NULL && XtIsManaged(X->CFframe))
1691 w = XmGetFocusWidget(X->CFframe);
1692 if(w == X->CFpi_butOK)
1694 if(v->cur_ch == KEY_EQ)
1696 XtCallCallbacks(X->CFpi_butOK, XmNarmCallback, (XtPointer) NULL);
1697 XtCallCallbacks(X->CFpi_butOK, XmNactivateCallback,
1700 if(v->event_type == ARROW || v->event_type == TAB)
1702 XtSetArg(args[0], XmNdefaultButton, X->CFpi_butOK);
1703 XtSetValues(X->CFframe, args, 1);
1708 else if(w == X->CFpi_butClose)
1710 if(v->cur_ch == KEY_EQ)
1712 XtCallCallbacks(X->CFpi_butClose, XmNarmCallback, (XtPointer) NULL);
1713 XtCallCallbacks(X->CFpi_butClose, XmNactivateCallback,
1716 if(v->event_type == ARROW || v->event_type == TAB)
1718 XtSetArg(args[0], XmNdefaultButton, NULL);
1719 XtSetValues(X->CFframe, args, 1);
1724 else if(w == X->CFpi_butHelp)
1726 if(v->cur_ch == KEY_EQ)
1728 XtCallCallbacks(X->CFpi_butHelp, XmNarmCallback, (XtPointer) NULL);
1729 XtCallCallbacks(X->CFpi_butHelp, XmNactivateCallback,
1730 (XtPointer) HELP_CONSTANT);
1732 if(v->event_type == ARROW || v->event_type == TAB)
1734 XtSetArg(args[0], XmNdefaultButton, NULL);
1735 XtSetValues(X->CFframe, args, 1);
1742 index = get_index(v->cur_ch);
1743 if (index != TITEMS)
1744 draw_button(index, v->curwin, v->row, v->column, FALSE);
1746 /* don't worry about this if there is something pending */
1747 if (v->pending == 0) {
1748 /* if the key is an "inactive" key (i.e. desensitized) then we want to
1753 if(v->cur_ch == KEY_2 ||
1754 v->cur_ch == KEY_3 ||
1755 v->cur_ch == KEY_4 ||
1756 v->cur_ch == KEY_5 ||
1757 v->cur_ch == KEY_6 ||
1760 /* intentional fall through */
1762 if(v->cur_ch == KEY_8 ||
1765 /* intentional fall through */
1767 if(v->cur_ch == KEY_A ||
1768 v->cur_ch == KEY_B ||
1769 v->cur_ch == KEY_C ||
1770 v->cur_ch == KEY_D ||
1771 v->cur_ch == KEY_E ||
1774 /* intentional fall through */
1775 default: /* HEX, allow all keys */
1780 /* finally, check to see if it is a key we wish to ignore and motif
1783 if(v->event_type == F4_PRESS || v->event_type == ARROW ||
1784 v->event_type == TAB || v->event_type == CONTROL ||
1785 v->event_type == SHIFT || v->event_type == SPACE ||
1786 v->event_type == ESCAPE || v->event_type == META || v->event_type == ALT)
1788 else if(v->event_type == NUM_LOCK)
1790 v->num_lock = !v->num_lock;
1792 else if (v->cur_ch == CTL('/'))
1796 ProcessMotifSelection(X->modevals[(int) DISPLAYITEM]);
1797 process_event(v->event_type);
1801 if (v->num_lock == True)
1803 draw_button(0, v->curwin, 0, 0, TRUE);
1809 /* ------------------------------------------------------------- */
1810 /* Primarily handles the selection in the display text widget. */
1811 /* Update the display before the event is processed for dtcalc. */
1812 /* ------------------------------------------------------------- */
1815 ProcessMotifSelection(Widget W)
1820 char *display = NULL;
1821 XmTextPosition left, right;
1823 if (XmTextGetSelectionPosition (W, &left, &right) == True)
1826 display = XmTextGetString(W);
1828 bound = ( (long)strlen(display) - right + 1);
1830 for (i = 0; i < bound; i++)
1832 display[i+left] = display[i+right];
1835 index = get_index(v->cur_ch);
1836 key = buttons[index].value;
1838 /* ------------------------------------------------------------ */
1839 /* Append an extra character to be handled by do_delete func. */
1840 /* ------------------------------------------------------------ */
1845 display[i+1] = '\0';
1848 STRCPY(v->display, display);
1858 frame_interpose(Widget widget, XtPointer clientData, XEvent *event, Boolean *continue_to_dispatch)
1860 if (!v->started) return ;
1861 if (event->type == MapNotify)
1863 if (v->rstate) win_display(FCP_REG, TRUE) ;
1864 else if (v->frstate) win_display(FCP_FIN_REG, TRUE) ;
1867 else if (event->type == UnmapNotify) v->iconic = TRUE ;
1873 get_next_event(Widget widget, int ev_action, XEvent *xevent)
1875 char *tmpStr, chs[2] ;
1876 int cval = 0, down, nextc, up ;
1878 XKeyPressedEvent *key_event ;
1880 if (!v->started) return(LASTEVENTPLUSONE) ;
1881 nextc = xevent->type ;
1883 down = xevent->type == ButtonPress || xevent->type == KeyPress ;
1884 up = xevent->type == ButtonRelease || xevent->type == KeyRelease ;
1886 if (nextc == KeyPress || nextc == KeyRelease)
1888 key_event = (XKeyPressedEvent *) xevent ;
1889 chs[0] = chs[1] = (char)0;
1891 * If the user enters a multibyte character, XLookupString()
1892 * will return zero because it only handles Latin-1 characters.
1893 * We can just return then because we're only looking for
1894 * Latin-1 characters anyway (see CDExc15419).
1896 if (!XLookupString(key_event, chs, 1, &ksym,
1897 (XComposeStatus *) NULL))
1899 if (key_event->keycode == NUM_LOCK)
1902 return(LASTEVENTPLUSONE);
1906 Here's how the fix solves the problem:
1908 When you press ctrl-space, the input method converts your composed
1909 input to a Kanji character and sends a keyboard event to dtcalc with
1910 a keycode of 0. The keycode of 0 is the X convention that the
1911 application should call XmbLookupString() to get the Kanji character
1912 from the input method.
1914 dtcalc calls XLookupString() instead though, which being a much older
1915 interface, doesn't know about this convention. XLookupString() isn't
1916 able to map the keycode to anything and just returns 0.
1918 The fix catches this and returns immediately. Otherwise, the code
1919 would go on to call event_is_keypad() to see if the event was a keypad
1920 event like '+', '=', etc. That function would core dump at the
1921 following line because of the negative array index:
1923 return(X->kparray[xevent->xkey.keycode - X->kcmin] > 0) ;
1925 Returning immediately from get_next_event() avoids the core dump and
1926 doesn't hurt anything because dtcalc doesn't actually use any Kanji
1927 characters for its keypad characters, just ASCII ones.
1929 An alternative fix would be to use XmbLookupString() instead of
1930 XLookupString(). That fix would be more complex though, and as
1931 CDExc15419 points out, XLookupString() is fine here (as long as you
1932 check its return value).
1936 XLookupString(key_event, chs, 1, &ksym, (XComposeStatus *) NULL) ;
1938 if (ksym == XK_F4 && down) return(F4_PRESS) ;
1939 else if (ksym == XK_F4 && up) return(F4_PRESS) ;
1940 else if (ksym == XK_Right && down)
1942 if (!event_is_keypad(xevent))
1945 else if (ksym == XK_Left && down)
1947 if (!event_is_keypad(xevent))
1950 else if (ksym == XK_Up && down)
1952 if (!event_is_keypad(xevent))
1955 else if (ksym == XK_Down && down)
1957 if (!event_is_keypad(xevent))
1960 else if (ksym == XK_F10 && down) return(F4_PRESS);
1961 else if (ksym == XK_F10 && up) return(F4_PRESS);
1962 else if (ksym == XK_Tab && down) return(TAB);
1963 else if (ksym == XK_Tab && up) return(TAB);
1965 #ifdef HP_EXTENSIONS
1966 else if (ksym == XK_BackTab && down) return(SHIFT);
1967 else if (ksym == XK_BackTab && up) return(SHIFT);
1968 else if (ksym == hpXK_DeleteChar && down) cval = 127;
1969 else if (ksym == hpXK_DeleteChar && up) cval = 127;
1971 else if (ksym == XK_Return && down) cval = KEY_EQ;
1972 else if (ksym == XK_Return && up) cval = KEY_EQ;
1973 else if (ksym == XK_Escape && down) return(ESCAPE);
1974 else if (ksym == XK_Escape && up) return(ESCAPE);
1975 else if (ksym == XK_Control_L && down) return(CONTROL);
1976 else if (ksym == XK_Control_L && up) return(CONTROL);
1977 else if (ksym == XK_Control_R && down) return(CONTROL);
1978 else if (ksym == XK_Control_R && up) return(CONTROL);
1979 else if (ksym == XK_Meta_L && down) return(META);
1980 else if (ksym == XK_Meta_L && up) return(META);
1981 else if (ksym == XK_Meta_R && down) return(META);
1982 else if (ksym == XK_Meta_R && up) return(META);
1983 else if (ksym == XK_Alt_L && down) return(ALT);
1984 else if (ksym == XK_Alt_L && up) return(ALT);
1985 else if (ksym == XK_Alt_R && down) return(ALT);
1986 else if (ksym == XK_Alt_R && up) return(ALT);
1987 else if (ksym == XK_Select && down) return(SPACE);
1988 else if (ksym == XK_Select && up) return(SPACE);
1989 else if (ksym == XK_space && down) return(SPACE);
1990 else if (ksym == XK_space && up) return(SPACE);
1991 else if (ksym == XK_Shift_L || ksym == XK_Shift_R)
1992 return(LASTEVENTPLUSONE) ;
1993 else cval = chs[0] ;
1996 tmpStr = GETMESSAGE(3, 45, ".");
1997 if (event_is_keypad(xevent))
2001 * In keypad_keysym(), KeySym associated with xevent->xkey.keycode
2002 * is extracted by calling XKeycodeToKeysym(). But the current
2003 * implementation doesn't care of the modifires state. In this moment,
2004 * we can still use ksym which is got in the above XLookupString().
2005 * Sun's implementation seems to need an attention for this. But AIX
2007 * Still JP kbd NumLock state cannot be handled correctly.
2011 switch (keypad_keysym(xevent))
2014 case XK_KP_0 : v->cur_ch = '0' ;
2016 case XK_KP_1 : v->cur_ch = '1' ;
2018 case XK_KP_2 : v->cur_ch = '2' ;
2020 case XK_KP_3 : v->cur_ch = '3' ;
2022 case XK_KP_4 : v->cur_ch = '4' ;
2024 case XK_KP_5 : v->cur_ch = '5' ;
2026 case XK_KP_6 : v->cur_ch = '6' ;
2028 case XK_KP_7 : v->cur_ch = '7' ;
2030 case XK_KP_8 : v->cur_ch = '8' ;
2032 case XK_KP_9 : v->cur_ch = '9' ;
2034 case XK_KP_Add : v->cur_ch = '+' ;
2036 case XK_KP_Subtract : v->cur_ch = '-' ;
2038 case XK_KP_Multiply : v->cur_ch = 'x' ;
2040 case XK_KP_Divide : v->cur_ch = '/' ;
2043 case XK_KP_Enter : v->cur_ch = '=' ;
2045 case XK_KP_Decimal : v->cur_ch = tmpStr[0] ;
2047 if (down) return(KEYBOARD_DOWN) ;
2048 else if (up) return(KEYBOARD_UP) ;
2050 else if ((nextc == KeyPress || nextc == KeyRelease) &&
2051 (IS_KEY(cval, KEY_BSP) || IS_KEY(cval, KEY_CLR)))
2053 v->cur_ch = cval ; /* Delete and Back Space keys. */
2054 if (down) return(KEYBOARD_DOWN) ;
2055 else if (up) return(KEYBOARD_UP) ;
2058 if ((nextc == KeyPress || nextc == KeyRelease) && cval >= 0 && cval <= 127)
2061 /* If this is a '*' or Return key press, then map to their better known
2062 * equivalents, so that button highlighting works correctly.
2065 if (cval == '*') cval = KEY_MUL ;
2067 /* All the rest of the ASCII characters. */
2070 if (down) return(KEYBOARD_DOWN) ;
2071 else if (up) return(KEYBOARD_UP) ;
2074 return(LASTEVENTPLUSONE) ;
2078 /* Get dtcalc resource from merged database. */
2080 get_resource(enum res_type rtype)
2084 STRCPY(str, calc_res[(int) rtype]) ;
2085 return(ds_get_resource(X->rDB, v->appname, str)) ;
2090 grey_button(int row, int column, int state)
2092 XtSetSensitive(X->kbuttons[row][column], !state) ;
2099 char *tmpStr, *tmpStr1;
2101 tmpStr = GETMESSAGE(2, 12, "Calculator");
2102 tmpStr1 = XtNewString(tmpStr);
2103 XtVaSetValues(X->kframe,
2104 XmNiconName, tmpStr1,
2107 dtcalc_kpanel_create(X->kframe) ;
2108 dtcalc_kkeyboard_create(X->kpanel) ;
2110 XtSetMappedWhenManaged(X->kframe, False);
2111 XtRealizeWidget(X->kframe) ;
2112 XSync(X->dpy, False);
2114 XtSetMappedWhenManaged(X->kframe, True);
2115 XtMapWidget( X->kframe );
2116 XSync(X->dpy, False);
2126 is_window_showing(Widget widget)
2128 return(XtIsManaged(widget)) ;
2139 XDisplayKeycodes(X->dpy, &X->kcmin, &X->kcmax) ;
2140 tmp = XGetKeyboardMapping(X->dpy, X->kcmin, 1, &X->keysyms_per_key) ;
2141 XFree((char *) tmp) ;
2143 X->kparray = (unsigned char *) malloc(X->kcmax - X->kcmin + 1) ;
2145 /* For each key, run through its list of keysyms. If this keysym is a
2146 * keypad keysym, we know this key is on the keypad. Mark it as such in
2150 for (i = X->kcmin; i <= X->kcmax; ++i)
2152 X->kparray[i - X->kcmin] = 0 ;
2153 for (j = 0; j < X->keysyms_per_key; ++j)
2155 ks = XKeycodeToKeysym(X->dpy, i, j) ;
2156 if (IsKeypadKey(ks))
2158 X->kparray[i - X->kcmin] = 1 ;
2167 keypad_keysym(XEvent *xevent)
2170 int keycode = xevent->xkey.keycode ;
2173 for (i = 0; i < X->keysyms_per_key; ++i)
2175 ks = XKeycodeToKeysym(X->dpy, keycode, i) ;
2176 if (IsKeypadKey(ks))
2179 if(ks != XK_KP_Insert)
2188 load_resources(void)
2190 X->rDB = ds_load_resources(X->dpy) ;
2197 char *tool_label = NULL ;
2200 if (v->titleline == NULL)
2202 tool_label = (char *) calloc(1, strlen(lstrs[(int) L_UCALC]) + 3);
2204 SPRINTF(tool_label, "%s", lstrs[(int) L_UCALC]);
2206 else read_str(&tool_label, v->titleline) ;
2208 X->clipboard = XInternAtom(X->dpy, "CLIPBOARD", FALSE) ;
2209 X->length_atom = XInternAtom(X->dpy, "LENGTH", FALSE) ;
2210 XtAddEventHandler(X->kframe, StructureNotifyMask, FALSE,
2211 frame_interpose, NULL) ;
2212 XtVaSetValues(X->kframe,
2213 XmNtitle, tool_label,
2216 XtVaGetValues(X->kframe,
2220 if(v->titleline == NULL)
2225 make_modewin(void) /* Draw special mode frame plus buttons. */
2227 switch_mode(v->modetype) ;
2230 /* Calculate memory register frame values. */
2232 make_registers(int type)
2234 char line[MAXLINE] ; /* Current memory register line. */
2235 char *ptr, *tmp, *tmpStr;
2238 XmString str, numStr ;
2239 int MPtemp[MP_SIZE];
2243 if (!v->rstate) return ;
2245 else if(type == FIN)
2247 if (!v->frstate) return ;
2250 dtcalc_initialize_rframe(X->kframe, type) ;
2252 tmpStr = GETMESSAGE(3, 45, ".");
2255 for (i = 0; i < MAXREGS; i++)
2257 SPRINTF(line, "%s: %s", menu_entries[i + 10].str,
2258 make_number(v->MPmvals[i], FALSE)) ;
2261 /* if it's not a "." let's go change it to what it should be */
2262 ptr = DtStrrchr(line, '.');
2266 str = XmStringCreateLocalized(line) ;
2267 XtVaSetValues(X->registers[i], XmNlabelString, str, NULL) ;
2273 for (i = 0; i < FINREGS; i++)
2277 mpcdm(&(v->MPfvals[i]), MPtemp);
2278 tmp = make_number(MPtemp, FALSE);
2279 ptr = DtStrchr(tmp, 'e');
2282 ptr = DtStrchr(tmp, '.');
2285 ptr = DtStrchr(tmp, ',');
2296 savAcc = v->accuracy;
2298 mpcdm(&(v->MPfvals[i]), MPtemp);
2299 tmp = make_number(MPtemp, FALSE);
2300 v->accuracy = savAcc;
2305 mpcdm(&(v->MPfvals[i]), MPtemp);
2306 tmp = make_number(MPtemp, FALSE);
2308 if(strcmp(tmpStr, ".") != 0)
2310 /* if it's not a "." let's go change it to what it should be */
2311 ptr = DtStrrchr(tmp, '.');
2315 str = XmStringCreateLocalized(menu_entries[i + 34].str) ;
2316 numStr = XmStringCreateLocalized(tmp);
2317 XtVaSetValues(X->fregisters[i], XmNlabelString, str, NULL) ;
2318 XtVaSetValues(X->fregistersvals[i], XmNlabelString, numStr,
2319 XmNalignment, XmALIGNMENT_END, NULL) ;
2321 XmStringFree(numStr) ;
2329 menu_handler(Widget widget, XtPointer client_data, XEvent *event, Boolean *continue_to_dispatch)
2334 X->mtype = (enum menu_type) client_data ;
2335 menu = X->menus[(int) X->mtype] ;
2336 XtVaGetValues(menu, XmNwhichButton, &button, NULL) ;
2337 if (event->xbutton.button == button)
2339 XmMenuPosition(menu, (XButtonPressedEvent *) event) ;
2340 XtManageChild(menu) ;
2347 menu_proc(Widget widget, XtPointer client_data, XtPointer call_data)
2349 intptr_t choice = ((intptr_t) client_data) & 0xFFFF ;
2351 v->curwin = ((intptr_t) client_data) >> 16 ;
2352 handle_menu_selection(X->mrec[(int) X->mtype], choice) ;
2358 new_cf_value(Widget widget, XtPointer client_data, XtPointer call_data)
2361 for hard testing when there is no Input Method available
2362 wchar_t *wch = (wchar_t *) "wide";
2363 mbchar_t *mbch = (mbchar_t *) "MBYTE";
2366 enum menu_type mtype = (enum menu_type) client_data;
2369 if (X->CFframe == NULL) create_cfframe() ;
2373 set_text_str(X->CFpi_cftext, T_LABEL, lstrs[(int) L_CONNO]) ;
2375 cstr = XmStringCreateLocalized(lstrs[(int) L_NEWCON]) ;
2376 XtVaSetValues(X->CFframe, XmNdialogTitle, cstr, NULL) ;
2377 XmStringFree(cstr) ;
2379 XtRemoveAllCallbacks(X->CFpi_butHelp, XmNactivateCallback);
2380 XtAddCallback(X->CFpi_butHelp, XmNactivateCallback, HelpRequestCB,
2381 (XtPointer) HELP_CONSTANT);
2386 set_text_str(X->CFpi_cftext, T_LABEL, lstrs[(int) L_FUNNO]) ;
2388 cstr = XmStringCreateLocalized(lstrs[(int) L_NEWFUN]) ;
2389 XtVaSetValues(X->CFframe, XmNdialogTitle, cstr, NULL) ;
2390 XmStringFree(cstr) ;
2392 XtRemoveAllCallbacks(X->CFpi_butHelp, XmNactivateCallback);
2393 XtAddCallback(X->CFpi_butHelp, XmNactivateCallback, HelpRequestCB,
2394 (XtPointer) HELP_FUNCTION);
2397 /* Clear text fields. */
2399 set_text_str(X->CFpi_cftext, T_VALUE, "") ;
2400 set_text_str(X->CFpi_dtext, T_VALUE, "") ;
2401 set_text_str(X->CFpi_vtext, T_VALUE, "") ;
2404 for hard testing when there is no Input Method available
2405 XmTextFieldSetStringWcs(X->CFpi_vtext->textfield, wch);
2406 XmTextFieldSetStringWcs(X->CFpi_vtext->textfield, mbch);
2409 XmProcessTraversal(X->CFpi_cftext->textfield, XmTRAVERSE_CURRENT) ;
2411 if (!is_window_showing(X->CFframe))
2412 _DtGenericMapWindow (X->kframe, X->CFframe);
2414 XtManageChild(X->CFframe) ;
2416 /* lets set the focus in the first text widget */
2417 XmProcessTraversal(X->CFpi_cftext->textfield, XmTRAVERSE_CURRENT);
2418 ignore_event = True;
2419 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
2420 TimerEvent, (XtPointer) NULL);
2424 /* Put calc resource into database. */
2426 put_resource(enum res_type rtype, char *value)
2428 ds_put_resource(&(X->dtcalcDB), v->appname, calc_res[(int) rtype], value) ;
2433 redraw_buttons(void)
2435 enum fcp_type scurwin ;
2436 int column, n, row ;
2439 scurwin = v->curwin ;
2440 v->curwin = FCP_KEY ;
2441 for (row = 0; row < BROWS; row++)
2442 for (column = 0; column < BCOLS; column++)
2444 n = row * MAXCOLS + column ;
2446 lstr = XmStringCreateLocalized(v->pstr) ;
2447 XtVaSetValues(X->kbuttons[row][column], XmNlabelString, lstr, NULL);
2448 XmStringFree(lstr) ;
2450 v->curwin = scurwin ;
2455 save_cmdline(int argc, char *argv[])
2457 ds_save_cmdline(X->dpy, XtWindow(X->kframe), argc, argv) ;
2462 save_resources(char *filename)
2464 int reply = ds_save_resources(X->dtcalcDB, filename) ;
2466 if (reply) _DtSimpleError (v->appname, DtWarning, NULL, vstrs[(int) V_NORSAVE]);
2470 ErrorDialog(char *string)
2472 ErrDialog(string, X->mainWin);
2476 set_item(enum item_type itemno, char *str)
2480 char *tmpStr, *ptr, displayStr[50] = "";
2482 if (itemno == DISPLAYITEM)
2486 if(str != NULL && (strcmp(str, "") != 0))
2488 /* Let's get the decimal point, in some languages it's a , */
2489 strcpy(displayStr, str);
2490 tmpStr = GETMESSAGE(3, 45, ".");
2491 if(strcmp(tmpStr, ".") != 0)
2493 /* if it's not a "." let's go change it to what it should be */
2494 ptr = DtStrrchr(displayStr, '.');
2498 w = X->modevals[(int) DISPLAYITEM] ;
2499 XmTextSetString(w, displayStr) ;
2500 XmTextSetInsertionPosition(w, XmTextGetLastPosition(w)) ;
2501 XSync(X->dpy, False);
2510 cstr = XmStringCreateLocalized(str) ;
2511 XtVaSetValues(X->modevals[(int) itemno], XmNlabelString, cstr, NULL) ;
2512 XmStringFree(cstr) ;
2517 /* Set new title for a window. */
2519 set_title(enum fcp_type fcptype, char *str)
2525 if (fcptype == FCP_KEY)
2527 else if (fcptype == FCP_REG)
2529 else if (fcptype == FCP_FIN_REG)
2531 else if (fcptype == FCP_MODE)
2532 w = X->mframe[(int) v->modetype] ;
2534 fprintf(stderr, "Unknown fcptype %d in set_title\n", fcptype);
2538 if (fcptype == FCP_KEY)
2539 XtVaSetValues(w, XmNtitle, str, NULL) ;
2542 cstr = XmStringCreateLocalized(str) ;
2543 XtVaSetValues(w, XmNdialogTitle, cstr, NULL) ;
2544 XmStringFree(cstr) ;
2551 show_ascii(Widget widget, XtPointer client_data, XtPointer call_data)
2556 str = XmTextFieldGetString(X->Api_text->textfield);
2557 val = str[strlen(str) - 1] ;
2558 mpcim(&val, v->MPdisp_val) ;
2559 show_display(v->MPdisp_val) ;
2565 show_ascii_frame(void) /* Display ASCII popup. */
2571 XmString label_string;
2573 if (X->Aframe == NULL)
2575 X->Aframe = (Widget) XmCreateFormDialog(X->kframe, "aframe", NULL, 0) ;
2576 tstr = XmStringCreateLocalized(pstrs[(int) P_ASCIIT]) ;
2577 XtVaSetValues(X->Aframe,
2578 XmNdialogTitle, tstr,
2579 XmNautoUnmanage, FALSE,
2580 XmNallowShellResize, TRUE,
2581 XmNdefaultPosition, FALSE,
2583 XmStringFree(tstr) ;
2585 /* Adjust the decorations for the dialog shell of the dialog */
2586 XtSetArg (args[0], XmNmwmFunctions, MWM_FUNC_MOVE);
2587 XtSetArg (args[1], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE);
2588 XtSetValues (XtParent(X->Aframe), args, 2);
2590 X->Api_text = make_textW(X->Aframe, pstrs[(int) P_CHAR]) ;
2592 XtSetArg (args[0], XmNtopAttachment, XmATTACH_FORM);
2593 XtSetArg (args[1], XmNtopOffset, 5);
2594 XtSetArg (args[2], XmNleftAttachment, XmATTACH_FORM);
2595 XtSetArg (args[3], XmNleftOffset, 5);
2596 XtSetValues(X->Api_text->manager, args, 4);
2598 XtSetArg (args[0], XmNmaxLength, 1);
2599 XtSetValues(X->Api_text->textfield, args, 1);
2601 XtSetArg (args[0], XmNtopAttachment, XmATTACH_WIDGET);
2602 XtSetArg (args[1], XmNtopWidget, X->Api_text->manager);
2603 XtSetArg (args[2], XmNtopOffset, 3);
2604 XtSetArg (args[3], XmNleftAttachment, XmATTACH_FORM);
2605 XtSetArg (args[4], XmNrightAttachment, XmATTACH_FORM);
2606 sep = XmCreateSeparator(X->Aframe, "sep", args, 5);
2609 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 33, "Apply") );
2610 XtSetArg (args[0], XmNmarginHeight, 2);
2611 XtSetArg (args[1], XmNmarginWidth, 15);
2612 XtSetArg (args[2], XmNlabelString, label_string);
2613 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
2614 XtSetArg (args[4], XmNtopWidget, sep);
2615 XtSetArg (args[5], XmNtopOffset, 5);
2616 XtSetArg (args[6], XmNleftAttachment, XmATTACH_FORM);
2617 XtSetArg (args[7], XmNleftOffset, 10);
2618 XtSetArg (args[8], XmNbottomAttachment, XmATTACH_FORM);
2619 XtSetArg (args[9], XmNbottomOffset, 5);
2620 X->Api_butOK = XmCreatePushButton(X->Aframe, "button", args, 10);
2621 XmStringFree(label_string);
2622 XtManageChild(X->Api_butOK);
2624 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 32, "Close") );
2625 XtSetArg (args[0], XmNmarginHeight, 2);
2626 XtSetArg (args[1], XmNmarginWidth, 10);
2627 XtSetArg (args[2], XmNlabelString, label_string);
2628 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
2629 XtSetArg (args[4], XmNtopWidget, sep);
2630 XtSetArg (args[5], XmNtopOffset, 5);
2631 XtSetArg (args[6], XmNleftAttachment, XmATTACH_WIDGET);
2632 XtSetArg (args[7], XmNleftWidget, X->Api_butOK);
2633 XtSetArg (args[8], XmNleftOffset, 10);
2634 XtSetArg (args[9], XmNbottomAttachment, XmATTACH_FORM);
2635 XtSetArg (args[10], XmNbottomOffset, 5);
2636 X->Api_butClose = XmCreatePushButton(X->Aframe, "button", args, 11);
2637 XmStringFree(label_string);
2638 XtManageChild(X->Api_butClose);
2640 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
2641 XtSetArg (args[0], XmNmarginHeight, 2);
2642 XtSetArg (args[1], XmNmarginWidth, 10);
2643 XtSetArg (args[2], XmNlabelString, label_string);
2644 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
2645 XtSetArg (args[4], XmNtopWidget, sep);
2646 XtSetArg (args[5], XmNtopOffset, 5);
2647 XtSetArg (args[6], XmNleftAttachment, XmATTACH_WIDGET);
2648 XtSetArg (args[7], XmNleftWidget, X->Api_butClose);
2649 XtSetArg (args[8], XmNleftOffset, 10);
2650 XtSetArg (args[9], XmNrightAttachment, XmATTACH_FORM);
2651 XtSetArg (args[10], XmNrightOffset, 10);
2652 XtSetArg (args[11], XmNbottomAttachment, XmATTACH_FORM);
2653 XtSetArg (args[12], XmNbottomOffset, 5);
2654 X->Api_butHelp = XmCreatePushButton(X->Aframe, "button", args, 13);
2655 XmStringFree(label_string);
2656 XtManageChild(X->Api_butHelp);
2658 XtAddCallback(X->Api_text->textfield, XmNactivateCallback,
2660 XtAddCallback(X->Api_butOK, XmNactivateCallback, show_ascii, NULL) ;
2661 XtAddCallback(X->Api_butClose, XmNactivateCallback, close_ascii,
2663 XtAddCallback(X->Api_butHelp, XmNactivateCallback, HelpRequestCB,
2664 (XtPointer) HELP_ASCII) ;
2667 XtSetArg (args[j], XmNcancelButton, X->Api_butClose); j++;
2668 XtSetArg (args[j], XmNdefaultButton, X->Api_butOK); j++;
2669 XtSetValues (X->Aframe, args, j);
2672 if (!is_window_showing(X->Aframe))
2673 _DtGenericMapWindow (X->kframe, X->Aframe);
2675 XtManageChild(X->Aframe) ;
2677 XmProcessTraversal(X->Api_text->textfield, XmTRAVERSE_CURRENT);
2678 ignore_event = True;
2679 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
2680 TimerEvent, (XtPointer) NULL);
2687 saveatom = XmInternAtom(X->dpy, "WM_SAVE_YOURSELF", FALSE) ;
2688 command_atom = XA_WM_COMMAND;
2689 wm_state_atom = XmInternAtom (X->dpy, "WM_STATE", False);
2691 XmAddWMProtocols(X->kframe, &saveatom, 1) ;
2692 XmAddWMProtocolCallback(X->kframe, saveatom, save_state, (XtPointer)NULL) ;
2695 XSetErrorHandler((int (*)())xerror_interpose) ;
2696 XtAddEventHandler(X->kframe, KeyPressMask | KeyReleaseMask,
2697 FALSE, event_proc, NULL) ;
2698 XmProcessTraversal( X->kbuttons[0][0], XmTRAVERSE_CURRENT );
2702 XtAppMainLoop(X->app) ;
2706 clear_buttons(int start)
2712 static Boolean first = True;
2717 if(buttons[i].str != NULL)
2719 XtFree(buttons[i].str);
2720 XtFree(buttons[i].str2);
2721 XtFree(buttons[i].resname);
2723 buttons[i].str = XtNewString("");
2724 buttons[i].str2 = XtNewString("");
2725 buttons[i].resname = XtNewString("blank");
2726 buttons[i].value = 0;
2727 buttons[i].opdisp = OP_SET;
2728 buttons[i].mtype = M_NONE;
2731 lstr = XmStringCreateLocalized(buttons[i].str);
2732 XtSetArg (args[n], XmNlabelString, lstr); n++;
2735 XtSetArg (args[n], XmNbackground, pixels[1].bg); n++;
2736 XtSetArg (args[n], XmNforeground, pixels[1].fg); n++;
2737 XtSetArg (args[n], XmNtopShadowColor, pixels[1].ts); n++;
2738 XtSetArg (args[n], XmNbottomShadowColor, pixels[1].bs); n++;
2739 XtSetArg (args[n], XmNarmColor, pixels[1].sc); n++;
2741 XtSetValues( X->kbuttons[0][0], args, n);
2742 XmStringFree(lstr) ;
2746 row = (start / BCOLS) + 3;
2747 column = start % BCOLS;
2748 for(i = start + 12; i < 24; i++)
2750 XtFree(buttons[i].str);
2751 XtFree(buttons[i].resname);
2752 buttons[i].str = XtNewString("");
2753 buttons[i].resname = XtNewString("blank");
2754 buttons[i].value = 0;
2755 buttons[i].opdisp = OP_SET;
2756 buttons[i].mtype = M_NONE;
2759 lstr = XmStringCreateLocalized(buttons[i].str);
2760 XtSetArg (args[n], XmNlabelString, lstr); n++;
2763 XtSetArg (args[n], XmNbackground, pixels[1].bg); n++;
2764 XtSetArg (args[n], XmNforeground, pixels[1].fg); n++;
2765 XtSetArg (args[n], XmNtopShadowColor, pixels[1].ts); n++;
2766 XtSetArg (args[n], XmNbottomShadowColor, pixels[1].bs); n++;
2767 XtSetArg (args[n], XmNarmColor, pixels[1].sc); n++;
2769 XtSetValues( X->kbuttons[row][column], args, n);
2770 XmStringFree(lstr) ;
2773 if(column % BCOLS == 0)
2782 make_buttons_fin(void)
2791 for(i = 12; i < 24; i++)
2793 if(buttons[i].str != NULL)
2795 XtFree(buttons[i].str);
2796 XtFree(buttons[i].str2);
2797 XtFree(buttons[i].resname);
2799 buttons[i].str = XtNewString(mode_buttons[i - 12].str);
2800 buttons[i].str2 = XtNewString(mode_buttons[i - 12].str2);
2801 buttons[i].resname = XtNewString(mode_buttons[i - 12].resname);
2802 buttons[i].value = mode_buttons[i - 12].value;
2803 buttons[i].opdisp = mode_buttons[i - 12].opdisp;
2804 buttons[i].mtype = mode_buttons[i - 12].mtype;
2805 buttons[i].func = mode_buttons[i - 12].func;
2809 lstr = XmStringCreateLocalized(buttons[i].str2);
2811 lstr = XmStringCreateLocalized(buttons[i].str);
2812 XtSetArg (args[n], XmNlabelString, lstr); n++;
2815 XtSetArg (args[n], XmNbackground, pixels[7].bg); n++;
2816 XtSetArg (args[n], XmNforeground, pixels[7].fg); n++;
2817 XtSetArg (args[n], XmNtopShadowColor, pixels[7].ts); n++;
2818 XtSetArg (args[n], XmNbottomShadowColor, pixels[7].bs); n++;
2819 XtSetArg (args[n], XmNarmColor, pixels[7].sc); n++;
2821 XtSetValues( X->kbuttons[row][column], args, n);
2822 XmStringFree(lstr) ;
2825 if(column % BCOLS == 0)
2835 make_buttons_log(void)
2844 for(i = 12; i < 24; i++)
2846 if(buttons[i].str != NULL)
2848 XtFree(buttons[i].str);
2849 XtFree(buttons[i].str2);
2850 XtFree(buttons[i].resname);
2852 buttons[i].str = XtNewString(mode_buttons[i + 4].str);
2853 buttons[i].str2 = XtNewString(mode_buttons[i + 4].str2);
2854 buttons[i].resname = XtNewString(mode_buttons[i + 4].resname);
2855 buttons[i].value = mode_buttons[i + 4].value;
2856 buttons[i].opdisp = mode_buttons[i + 4].opdisp;
2857 buttons[i].mtype = mode_buttons[i + 4].mtype;
2858 buttons[i].func = mode_buttons[i + 4].func;
2862 lstr = XmStringCreateLocalized(buttons[i].str2);
2864 lstr = XmStringCreateLocalized(buttons[i].str);
2865 XtSetArg (args[n], XmNlabelString, lstr); n++;
2868 XtSetArg (args[n], XmNbackground, pixels[7].bg); n++;
2869 XtSetArg (args[n], XmNforeground, pixels[7].fg); n++;
2870 XtSetArg (args[n], XmNtopShadowColor, pixels[7].ts); n++;
2871 XtSetArg (args[n], XmNbottomShadowColor, pixels[7].bs); n++;
2872 XtSetArg (args[n], XmNarmColor, pixels[7].sc); n++;
2874 XtSetValues( X->kbuttons[row][column], args, n);
2875 XmStringFree(lstr) ;
2878 if(column % BCOLS == 0)
2888 make_buttons_sci(void)
2897 for(i = 12; i < 24; i++)
2899 if(buttons[i].str != NULL)
2901 XtFree(buttons[i].str);
2902 XtFree(buttons[i].str2);
2903 XtFree(buttons[i].resname);
2905 buttons[i].str = XtNewString(mode_buttons[i + 20].str);
2906 buttons[i].str2 = XtNewString(mode_buttons[i + 20].str2);
2907 buttons[i].resname = XtNewString(mode_buttons[i + 20].resname);
2908 buttons[i].value = mode_buttons[i + 20].value;
2909 buttons[i].opdisp = mode_buttons[i + 20].opdisp;
2910 buttons[i].mtype = mode_buttons[i + 20].mtype;
2911 buttons[i].func = mode_buttons[i + 20].func;
2915 lstr = XmStringCreateLocalized(buttons[i].str2);
2917 lstr = XmStringCreateLocalized(buttons[i].str);
2918 XtSetArg (args[n], XmNlabelString, lstr); n++;
2921 XtSetArg (args[n], XmNbackground, pixels[7].bg); n++;
2922 XtSetArg (args[n], XmNforeground, pixels[7].fg); n++;
2923 XtSetArg (args[n], XmNtopShadowColor, pixels[7].ts); n++;
2924 XtSetArg (args[n], XmNbottomShadowColor, pixels[7].bs); n++;
2925 XtSetArg (args[n], XmNarmColor, pixels[7].sc); n++;
2927 XtSetValues( X->kbuttons[row][column], args, n);
2928 XmStringFree(lstr) ;
2931 if(column % BCOLS == 0)
2942 switch_mode(enum mode_type curmode)
2946 v->modetype = curmode ;
2947 XtSetArg(args[0], XmNmenuHistory, modeArry[(int)curmode]);
2948 XtSetValues( X->modevals[(int)MODEITEM], args, 1);
2949 if((int)curmode == (int)FINANCIAL)
2952 XtSetSensitive(X->modevals[(int)TTYPEITEM], False);
2953 set_item(HYPITEM, " ") ;
2954 set_item(INVITEM, " ") ;
2957 else if((int)curmode == (int)LOGICAL)
2960 XtSetSensitive(X->modevals[(int)TTYPEITEM], False);
2961 set_item(HYPITEM, " ") ;
2962 set_item(INVITEM, " ") ;
2967 XtSetSensitive(X->modevals[(int)TTYPEITEM], True);
2968 set_item(HYPITEM, " ") ;
2969 set_item(INVITEM, " ") ;
2976 update_cf_value(void)
2978 char message[MAXLINE] ;
2979 char str[MAXLINE] ; /* Temporary buffer for various strings. */
2980 char result[MAXLINE] ;
2982 double tmp ; /* For converting constant value. */
2984 int n ; /* Set to 1, if constant value is valid. */
2985 char cur_op, current, display[MAXLINE], old_cal_value, fnum[MAX_DIGITS+1];
2986 int cur_ch, toclear, tstate, pending, accuracy;
2987 int MPdisp_val[MP_SIZE], MPlast_input[MP_SIZE], MPresult[MP_SIZE] ;
2991 case M_CON : tmpStr = GETMESSAGE(3, 45, ".");
2992 if(strcmp(tmpStr, ".") != 0)
2994 /* if it's not a "." let's go change it to what it
2996 ptr = DtStrchr(X->vval, tmpStr[0]);
3000 ptr = DtStrchr(X->vval, tmpStr[0]);
3003 /* need to run a "compute" of what was typed in */
3004 len = strlen(X->vval) ;
3005 STRCPY(str, X->vval);
3006 if(X->vval[len - 1] != '=')
3008 /* need to add an '=' at the end of the string so it
3009 computes correctly */
3014 if(strncmp(str, "-", 1) == 0)
3017 for(i=0; i < len -1; i++)
3019 str[i] = str[i+inc];
3020 if(inc == 0 || isdigit((int)str[i]) || str[i] == '.')
3029 /* now let's compute it, first save off some state */
3031 current = v->current;
3032 old_cal_value = v->old_cal_value;
3034 toclear = v->toclear;
3036 pending = v->pending;
3037 STRCPY(display, v->display);
3038 STRCPY(fnum, v->fnum);
3039 mpstr(v->MPdisp_val, MPdisp_val);
3040 mpstr(v->MPlast_input, MPlast_input);
3041 mpstr(v->MPresult, MPresult);
3043 mpcim(&i, v->MPdisp_val) ;
3044 mpcim(&i, v->MPlast_input) ;
3045 mpcim(&i, v->MPresult) ;
3049 process_str(str, M_CON);
3052 /* get the computed value */
3053 accuracy = v->accuracy;
3055 STRCPY(result, make_number(v->MPresult, FALSE)) ;
3056 v->accuracy = accuracy ;
3058 /* return to previous state */
3060 v->current = current;
3061 v->old_cal_value = old_cal_value;
3063 v->toclear = toclear;
3065 v->pending = pending;
3066 STRCPY(v->display, display);
3067 STRCPY(v->fnum, fnum);
3068 mpstr(MPdisp_val, v->MPdisp_val);
3069 mpstr(MPlast_input, v->MPlast_input);
3070 mpstr(MPresult, v->MPresult);
3072 set_item(DISPLAYITEM, v->display);
3074 n = sscanf(result, "%lf", &tmp) ;
3075 ptr = DtStrchr(result, 'e');
3076 if (n != 1 || ptr != NULL || v->error == TRUE)
3078 SPRINTF(message, "%s\n%s", vstrs[(int) V_INVCON],
3079 vstrs[(int) V_NOCHANGE]) ;
3080 do_continue_notice(X->CFframe, message) ;
3081 set_item(OPITEM, "") ;
3082 if(v->cur_op != '?')
3083 set_item(OPITEM, buttons[get_index(v->cur_op)].str);
3088 if(v->cur_op != '?')
3089 set_item(OPITEM, buttons[get_index(v->cur_op)].str);
3091 /* now let's compute it, first save off some state */
3092 if(strncmp(result, "-", 1) == 0)
3094 len = strlen(result);
3096 STRCPY(str, result);
3097 for(i=0; i < len; i++)
3099 MPstr_to_num(str, DEC, v->MPcon_vals[X->cfno]) ;
3100 mpneg(v->MPcon_vals[X->cfno], v->MPcon_vals[X->cfno]) ;
3103 MPstr_to_num(result, DEC, v->MPcon_vals[X->cfno]) ;
3105 if(strncmp(result, "0.", 2) == 0 ||
3106 strncmp(result, "-0.", 3) == 0 )
3108 len = strlen(result);
3109 while(result[len - 1] == '0')
3111 result[len - 1] = '\0';
3115 SPRINTF(v->con_names[X->cfno], "%1d: %s [%s]",
3116 X->cfno, result, X->dval) ;
3118 case M_FUN : tmpStr = GETMESSAGE(3, 45, ".");
3119 if(strcmp(tmpStr, ".") != 0)
3121 /* if it's not a "." let's go change it to what it
3123 ptr = DtStrchr(X->vval, tmpStr[0]);
3127 ptr = DtStrchr(X->vval, tmpStr[0]);
3130 STRCPY(v->fun_vals[X->cfno], convert(X->vval)) ;
3131 if(strcmp(X->vval, "") != 0)
3133 SPRINTF(v->fun_names[X->cfno], "%1d: %s [%s]",
3134 X->cfno, X->vval, X->dval) ;
3137 STRCPY(v->fun_names[X->cfno], "");
3142 XtDestroyWidget(X->menus[(int) X->CFtype]) ;
3143 for (i = 0; i < NOBUTTONS; i++)
3144 if (buttons[i].mtype == X->CFtype)
3145 create_menu(X->CFtype, X->kbuttons[i / BCOLS][i % BCOLS], i) ;
3149 write_rcfile(X->CFtype, X->cfexists, X->cfno,
3153 write_rcfile(X->CFtype, X->cfexists, X->cfno,
3159 ignore_event = True;
3160 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3161 TimerEvent, (XtPointer) NULL);
3167 win_display(enum fcp_type fcptype, int state)
3169 Widget widget = NULL;
3170 Position newX, newY;
3173 if (fcptype == FCP_REG) widget = X->rframe ;
3174 else if (fcptype == FCP_MODE) widget = X->mframe[(int) v->modetype] ;
3175 else if (fcptype == FCP_FIN_REG) widget = X->frframe;
3180 if (state && !is_window_showing(widget))
3182 if (fcptype == FCP_REG || fcptype == FCP_FIN_REG)
3184 XtSetMappedWhenManaged(XtParent(widget), False);
3185 XSync(X->dpy, False);
3187 XtManageChild(widget) ;
3189 _DtChildPosition(widget, X->kframe, &newX, &newY);
3190 XtSetArg(args[0], XmNx, newX);
3191 XtSetArg(args[1], XmNy, newY);
3192 XtSetValues(widget, args, 2);
3194 XtSetMappedWhenManaged(XtParent(widget), True);
3195 XSync(X->dpy, False);
3197 XtMapWidget(XtParent(widget));
3199 else if (fcptype == FCP_MODE)
3200 _DtGenericMapWindow (X->kframe, widget);
3202 if (state) XtManageChild(widget) ;
3203 else XtUnmanageChild(widget) ;
3209 write_cf_value(Widget widget, XtPointer client_data, XtPointer call_data)
3211 char message[MAXLINE] ;
3212 char str[MAXLINE] ; /* Temporary buffer for various strings. */
3213 Widget focus_widget;
3216 focus_widget = XmGetFocusWidget(widget);
3219 if(focus_widget != X->CFpi_vtext->textfield && focus_widget != X->CFpi_butOK)
3223 if(focus_widget == X->CFpi_vtext->textfield)
3225 X->vval = XmTextFieldGetString(X->CFpi_vtext->textfield);
3226 if(strcmp(X->vval, "") == 0)
3234 if(X->cfval != NULL)
3236 X->dval = XmTextFieldGetString(X->CFpi_dtext->textfield);
3237 if(strlen(X->dval) > 41)
3239 X->vval = XmTextFieldGetString(X->CFpi_vtext->textfield);
3240 X->cfval = XmTextFieldGetString(X->CFpi_cftext->textfield);
3241 SSCANF(X->cfval, "%d", &X->cfno) ;
3242 if ((strcmp(X->cfval, "") == 0) || X->cfval[0] < '0' || X->cfval[0] > '9' ||
3243 X->cfno < 0 || X->cfno > 9)
3245 SPRINTF(str, "%s", (X->CFtype == M_CON) ? vstrs[(int) V_LCON]
3246 : vstrs[(int) V_LFUN]) ;
3247 SPRINTF(message, "%s\n%s", str, vstrs[(int) V_RANGE]) ;
3248 do_continue_notice(X->CFframe, message) ;
3252 X->vval = (char *)_DtcalcStripSpaces((char *)X->vval);
3256 case M_CON : X->cfexists = 1 ; /* Always the default constants. */
3258 case M_FUN : if (strlen(v->fun_vals[X->cfno])) X->cfexists = 1 ;
3264 SPRINTF(str, mess[(int) MESS_CON],
3265 (X->CFtype == M_CON) ? vstrs[(int) V_UCON]
3266 : vstrs[(int) V_UFUN], X->cfno) ;
3267 SPRINTF(message, "%s\n%s", str, vstrs[(int) V_OWRITE]) ;
3268 XtUnmanageChild(X->CFframe) ;
3269 do_confirm_notice(X->CFframe, message) ;
3274 XtUnmanageChild(X->CFframe) ;
3277 XtSetArg (args[0], XmNdefaultButton, NULL);
3278 XtSetValues (X->CFframe, args, 1);
3283 xerror_interpose(Display *display, XErrorEvent *error)
3288 XGetErrorText(display, error->error_code, msg1, 80) ;
3289 sprintf(msg, "\nX Error (intercepted): %s\nMajor Request Code : %d\nMinor Request Code : %d\nResource ID (XID) : %lu\nError Serial Number : %lu\n", msg1, error->request_code, error->minor_code, error->resourceid, error->serial);
3290 _DtSimpleError (v->appname, DtError, NULL, msg);
3295 modelineValueChanged(Widget widget, XtPointer client_data, XtPointer call_data)
3301 X->mtype = (enum menu_type) client_data ;
3302 XtSetArg (args[0], XmNuserData, &val);
3303 XtGetValues (widget, args, 1);
3305 choice = val & 0xFFFF ;
3306 v->curwin = ((int) val) >> 16 ;
3307 if(X->mtype == M_BASE)
3308 handle_menu_selection(56, choice) ;
3309 else if(X->mtype == M_NUM)
3310 handle_menu_selection(57, choice) ;
3311 else if(X->mtype == M_MODE)
3312 handle_menu_selection(58, choice) ;
3314 handle_menu_selection(59, choice) ;
3318 create_menu_bar(Widget parent)
3322 Widget WidgList[10];
3325 XmString labelString;
3326 Widget child, mem_reg;
3327 Widget lastCascadeButtonGadget;
3328 Widget lastMenuPane;
3329 Widget helpPulldown;
3332 /* Create the pulldown menu */
3334 XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++;
3335 XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3336 XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
3337 XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
3338 X->menubar = XmCreateMenuBar(parent, "mainMenu", args, n);
3339 XtManageChild(X->menubar);
3340 XtAddCallback(X->menubar, XmNhelpCallback, HelpRequestCB,
3341 (XtPointer)HELP_MENUBAR);
3343 mnemonic = GETMESSAGE(2, 13, "O");
3344 mnemonic = XtNewString(mnemonic);
3346 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 14, "Options") );
3347 XtSetArg(args[n], XmNlabelString, labelString); n++;
3348 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3349 XtSetArg(args[n], XmNmarginWidth, 6); n++;
3350 lastCascadeButtonGadget =
3351 XmCreateCascadeButtonGadget(X->menubar, "options", args, n);
3352 XtManageChild(lastCascadeButtonGadget);
3353 XmStringFree(labelString);
3356 lastMenuPane = XmCreatePulldownMenu(X->menubar, "optionMenu", NULL, 0);
3358 XtSetArg(args[0], XmNsubMenuId, lastMenuPane);
3359 XtSetValues(lastCascadeButtonGadget, args, 1);
3361 mnemonic = GETMESSAGE(2, 40, "R");
3362 mnemonic = XtNewString(mnemonic);
3364 XmStringCreateLocalized( GETMESSAGE(2, 15, "Memory Registers") );
3365 XtSetArg(args[0], XmNlabelString, labelString );
3366 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3367 mem_reg = XmCreatePushButtonGadget (lastMenuPane, "memR", args, 2);
3368 XtManageChild(mem_reg);
3369 XmStringFree(labelString);
3370 XtAddCallback(mem_reg, XmNactivateCallback, (XtCallbackProc)do_memory,
3373 mnemonic = GETMESSAGE(2, 45, "g");
3374 mnemonic = XtNewString(mnemonic);
3376 XmStringCreateLocalized ( GETMESSAGE(3, 138, "Financial Registers") );
3377 XtSetArg(args[0], XmNlabelString, labelString );
3378 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3379 mem_reg = XmCreatePushButtonGadget (lastMenuPane, "finR", args, 2);
3380 XtManageChild(mem_reg);
3381 XmStringFree(labelString);
3382 XtAddCallback(mem_reg, XmNactivateCallback, (XtCallbackProc)do_memory,
3385 mnemonic = GETMESSAGE(2, 41, "A");
3386 mnemonic = XtNewString(mnemonic);
3387 labelString=XmStringCreateLocalized ( GETMESSAGE(2, 16, "ASCII Convert") );
3388 XtSetArg(args[0], XmNlabelString, labelString );
3389 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3390 child = XmCreatePushButtonGadget (lastMenuPane, "asc", args, 2);
3391 XtManageChild(child);
3392 XmStringFree(labelString);
3393 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)do_ascii,
3396 if(_DtNl_is_multibyte)
3397 XtSetSensitive(child, False);
3399 child = (Widget)XmCreateSeparatorGadget(lastMenuPane, "separator",args,0);
3400 XtManageChild(child);
3402 mnemonic = GETMESSAGE(2, 42, "F");
3403 mnemonic = XtNewString(mnemonic);
3404 labelString = XmStringCreateLocalized ( vstrs[(int) V_FUNWNAME] );
3405 XtSetArg(args[0], XmNlabelString, labelString );
3406 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3407 child = XmCreatePushButtonGadget (lastMenuPane, "enterFunc", args, 2);
3408 XtManageChild(child);
3409 XmStringFree(labelString);
3410 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)new_cf_value,
3411 (XtPointer)(int)M_FUN);
3413 mnemonic = GETMESSAGE(2, 43, "C");
3414 mnemonic = XtNewString(mnemonic);
3415 labelString = XmStringCreateLocalized ( vstrs[(int) V_CONWNAME] );
3416 XtSetArg(args[0], XmNlabelString, labelString );
3417 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3418 child = XmCreatePushButtonGadget (lastMenuPane, "enterCons", args, 2);
3419 XtManageChild(child);
3420 XmStringFree(labelString);
3421 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)new_cf_value,
3422 (XtPointer)(int)M_CON);
3424 child = (Widget)XmCreateSeparatorGadget(lastMenuPane, "separator",args,0);
3425 XtManageChild(child);
3427 mnemonic = GETMESSAGE(2, 44, "x");
3428 mnemonic = XtNewString(mnemonic);
3429 labelString = XmStringCreateLocalized ( GETMESSAGE(3, 403, "Exit") );
3430 XtSetArg(args[0], XmNlabelString, labelString );
3431 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3432 child = XmCreatePushButtonGadget (lastMenuPane, "exit", args, 2);
3433 XtManageChild(child);
3434 XmStringFree(labelString);
3435 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)do_frame,
3439 mnemonic = GETMESSAGE(2, 17, "H");
3440 mnemonic = XtNewString(mnemonic);
3441 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
3442 XtSetArg(args[n], XmNlabelString, labelString); n++;
3443 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3444 XtSetArg(args[n], XmNmarginWidth, 6); n++;
3445 lastCascadeButtonGadget =
3446 XmCreateCascadeButtonGadget(X->menubar, "help", args, n);
3447 XmStringFree(labelString);
3450 helpPulldown = XmCreatePulldownMenu(X->menubar, "helpMenu", NULL, 0);
3452 XtSetArg(args[0], XmNsubMenuId, helpPulldown);
3453 XtSetValues(lastCascadeButtonGadget, args, 1);
3455 XtSetArg(args[0], XmNmenuHelpWidget, lastCascadeButtonGadget);
3456 XtSetValues (X->menubar, args, 1);
3458 XtManageChild(lastCascadeButtonGadget);
3463 mnemonic = GETMESSAGE(2, 19, "v");
3464 mnemonic = XtNewString(mnemonic);
3465 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3466 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 20, "Overview") );
3467 XtSetArg(args[n], XmNlabelString, labelString); n++;
3469 XmCreatePushButton(helpPulldown, "introduction", args, n );
3470 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3471 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_INTRODUCTION);
3472 XmStringFree(labelString);
3475 WidgList[count++]= (Widget)XmCreateSeparatorGadget(helpPulldown,
3476 "separator",args,0);
3479 mnemonic = GETMESSAGE(2, 38, "C");
3480 mnemonic = XtNewString(mnemonic);
3481 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3483 XmStringCreateLocalized ( GETMESSAGE(2,39,"Table of Contents") );
3484 XtSetArg(args[n], XmNlabelString, labelString); n++;
3485 WidgList[count++]= XmCreatePushButton(helpPulldown, "toc", args, n );
3486 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3487 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TABLEOFCONTENTS);
3488 XmStringFree(labelString);
3492 mnemonic = GETMESSAGE(2, 21, "T");
3493 mnemonic = XtNewString(mnemonic);
3494 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3495 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 22, "Tasks") );
3496 XtSetArg(args[n], XmNlabelString, labelString); n++;
3497 WidgList[count++]= XmCreatePushButton(helpPulldown, "tasks", args, n );
3498 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3499 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TASKS);
3500 XmStringFree(labelString);
3504 mnemonic = GETMESSAGE(2, 23, "R");
3505 mnemonic = XtNewString(mnemonic);
3506 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3507 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 24, "Reference") );
3508 XtSetArg(args[n], XmNlabelString, labelString); n++;
3509 WidgList[count++]= XmCreatePushButton(helpPulldown, "reference", args, n );
3510 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3511 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_REFERENCE);
3512 XmStringFree(labelString);
3516 mnemonic = GETMESSAGE(2, 25, "O");
3517 mnemonic = XtNewString(mnemonic);
3518 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3519 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 26, "On Item") );
3520 XtSetArg(args[n], XmNlabelString, labelString); n++;
3521 WidgList[count++]= XmCreatePushButton(helpPulldown, "onItem", args, n );
3522 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3523 (XtCallbackProc)HelpModeCB, (XtPointer)NULL);
3524 XmStringFree(labelString);
3527 WidgList[count++]= (Widget)XmCreateSeparatorGadget(helpPulldown,
3528 "separator",args,0);
3531 mnemonic = GETMESSAGE(2, 27, "U");
3532 mnemonic = XtNewString(mnemonic);
3533 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3534 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 28, "Using Help") );
3535 XtSetArg(args[n], XmNlabelString, labelString); n++;
3537 XmCreatePushButton(helpPulldown, "usingHelp", args, n );
3538 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3539 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_USING);
3540 XmStringFree(labelString);
3543 WidgList[count++]= (Widget)XmCreateSeparatorGadget(helpPulldown,
3544 "separator",args,0);
3547 mnemonic = GETMESSAGE(2, 29, "A");
3548 mnemonic = XtNewString(mnemonic);
3549 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3551 XmStringCreateLocalized ( GETMESSAGE(2, 30, "About Calculator") );
3552 XtSetArg(args[n], XmNlabelString, labelString); n++;
3553 WidgList[count++]= XmCreatePushButton(helpPulldown, "about", args, n );
3554 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3555 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_VERSION);
3556 XmStringFree(labelString);
3559 XtManageChildren(WidgList, count);
3561 /* Fine tune the menubar */
3562 XtSetArg(args[0], XmNmarginWidth, 2);
3563 XtSetArg(args[1], XmNmarginHeight, 2);
3564 XtSetValues(X->menubar, args, 2);
3572 short act, inact, prim, second;
3574 XmeGetPixelData (X->screen, &colorUse, pixels, &act, &inact,
3577 if(pixels[0].bg == pixels[1].bg && pixels[1].bg == pixels[2].bg &&
3578 pixels[2].bg == pixels[3].bg && pixels[3].bg == pixels[4].bg &&
3579 pixels[4].bg == pixels[5].bg && pixels[5].bg == pixels[6].bg &&
3580 pixels[6].bg == pixels[7].bg && pixels[7].bg == 0)
3588 do_memory(Widget w, XtPointer client_data, XtPointer call_data)
3590 intptr_t type = (intptr_t)client_data;
3597 make_registers(MEM) ;
3599 win_display(FCP_REG, TRUE) ;
3606 make_registers(FIN) ;
3608 win_display(FCP_FIN_REG, TRUE) ;
3610 ignore_event = True;
3611 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3612 TimerEvent, (XtPointer) NULL);
3616 read_resources(void) /* Read all possible resources from the database. */
3621 /* set the accuracy variable */
3622 if(application_args.accuracy > 9)
3624 else if(application_args.accuracy < 0)
3627 v->accuracy = application_args.accuracy;
3630 if(strcmp(application_args.base, "binary") == 0 ||
3631 strcmp(application_args.base, "bin") == 0)
3632 v->base = (enum base_type) 0 ;
3633 else if(strcmp(application_args.base, "octal") == 0 ||
3634 strcmp(application_args.base, "oct") == 0)
3635 v->base = (enum base_type) 1 ;
3636 else if(strcmp(application_args.base, "decimal") == 0 ||
3637 strcmp(application_args.base, "dec") == 0)
3638 v->base = (enum base_type) 2 ;
3639 else if(strcmp(application_args.base, "hexadecimal") == 0 ||
3640 strcmp(application_args.base, "hex") == 0)
3641 v->base = (enum base_type) 3 ;
3644 msg = (char *) XtMalloc(strlen( opts[(int) O_BASE]) + 3);
3645 sprintf(msg, "%s", opts[(int) O_BASE]);
3646 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3648 v->base = (enum base_type) 2;
3651 /* set the display numeration */
3652 if(strcmp(application_args.display, "fixed") == 0)
3653 v->dtype = (enum base_type) 1 ;
3654 else if(strcmp(application_args.display, "eng") == 0 ||
3655 strcmp(application_args.display, "engineering") == 0)
3656 v->dtype = (enum base_type) 0 ;
3657 else if(strcmp(application_args.display, "scientific") == 0 ||
3658 strcmp(application_args.display, "sci") == 0)
3659 v->dtype = (enum base_type) 2 ;
3662 msg = (char *) XtMalloc(strlen( opts[(int) O_DISPLAY]) + strlen(str) + 3);
3663 sprintf(msg, opts[(int) O_DISPLAY], str);
3664 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3666 v->dtype = (enum base_type) 1;
3670 if(strcmp(application_args.mode, "scientific") == 0)
3671 v->modetype = (enum base_type) 2 ;
3672 else if(strcmp(application_args.mode, "financial") == 0)
3673 v->modetype = (enum base_type) 0 ;
3674 else if(strcmp(application_args.mode, "logical") == 0)
3675 v->modetype = (enum base_type) 1 ;
3678 msg = (char *) XtMalloc(strlen( opts[(int) O_MODE]) + strlen(str) + 3);
3679 sprintf(msg, opts[(int) O_MODE], str);
3680 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3682 v->modetype = (enum base_type) 2;
3685 /* set the display numeration */
3686 if(strcmp(application_args.trigType, "deg") == 0 ||
3687 strcmp(application_args.trigType, "degrees") == 0)
3688 v->ttype = (enum base_type) 0 ;
3689 else if(strcmp(application_args.trigType, "rad") == 0 ||
3690 strcmp(application_args.trigType, "radians") == 0)
3691 v->ttype = (enum base_type) 2 ;
3692 else if(strcmp(application_args.trigType, "grad") == 0 ||
3693 strcmp(application_args.trigType, "gradients") == 0)
3694 v->ttype = (enum base_type) 1 ;
3697 msg = (char *) XtMalloc(strlen( opts[(int) O_TRIG]) + strlen(str) + 3);
3698 sprintf(msg, opts[(int) O_TRIG], str);
3699 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3701 v->ttype = (enum base_type) 0;
3707 close_cf(Widget widget, XtPointer client_data, XtPointer call_data)
3711 XtSetArg (args[0], XmNdefaultButton, NULL);
3712 XtSetValues (X->CFframe, args, 1);
3714 XtUnmanageChild(X->CFframe) ;
3715 ignore_event = True;
3716 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3717 TimerEvent, (XtPointer) NULL);
3721 close_ascii(Widget widget, XtPointer client_data, XtPointer call_data)
3723 XtUnmanageChild(X->Aframe) ;
3724 ignore_event = True;
3725 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3726 TimerEvent, (XtPointer) NULL);
3730 FocusInCB(Widget widget, XtPointer client_data, XtPointer call_data)
3734 XtSetArg (args[0], XmNdefaultButton, NULL);
3735 XtSetValues (X->CFframe, args, 1);
3737 XtSetArg(args[0], XmNshowAsDefault, True);
3738 XtSetValues(X->CFpi_butOK, args, 1);
3742 move_cf(Widget widget, XtPointer client_data, XtPointer call_data)
3749 if(widget == X->CFpi_cftext->textfield)
3751 XtSetArg (args[0], XmNdefaultButton, NULL);
3752 XtSetValues (X->CFframe, args, 1);
3754 XtSetArg(args[0], XmNshowAsDefault, True);
3755 XtSetValues(X->CFpi_butOK, args, 1);
3757 input = XmTextFieldGetString(X->CFpi_cftext->textfield);
3758 if(strcmp(input, "") != 0)
3759 XmProcessTraversal(X->CFpi_dtext->textfield, XmTRAVERSE_CURRENT);
3761 else if(widget == X->CFpi_dtext->textfield)
3763 XtSetArg (args[0], XmNdefaultButton, NULL);
3764 XtSetValues (X->CFframe, args, 1);
3766 XtSetArg(args[0], XmNshowAsDefault, True);
3767 XtSetValues(X->CFpi_butOK, args, 1);
3769 XmProcessTraversal(X->CFpi_vtext->textfield, XmTRAVERSE_CURRENT);
3772 else if(widget == X->CFpi_vtext->textfield)
3774 input = XmTextFieldGetString(X->CFpi_vtext->textfield);
3776 ignore_event = True;
3777 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3778 TimerEvent, (XtPointer) value);
3782 create_popup(Widget parent)
3786 Widget dummyHelp1, dummyHelp2, memRegs;
3787 Widget helpI, helpToc, helpT, helpR, helpO, helpU, helpV;
3789 X->popupMenu = XmCreatePopupMenu(parent, "popup", NULL, 0) ;
3790 XtCreateManagedWidget(GETMESSAGE(2, 46,"Calculator Popup"),
3791 xmLabelWidgetClass, X->popupMenu, NULL, 0) ;
3792 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3793 X->popupMenu, NULL, 0) ;
3794 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3795 X->popupMenu, NULL, 0) ;
3798 /* The popup menu contains the following entries ......................*/
3799 /* 1. Memory Registers ... */
3800 memRegs = XtVaCreateManagedWidget( "memRegs1",
3801 xmPushButtonWidgetClass,
3803 XmNlabelString, XmStringCreateLocalized(
3804 GETMESSAGE(2, 15, "Memory Registers") ),
3805 XmNmnemonic, XStringToKeysym(
3806 GETMESSAGE(2, 40, "R") ),
3808 XtAddCallback(memRegs, XmNactivateCallback, (XtCallbackProc)do_memory,
3811 /* 2. Finacial Registers ... */
3812 memRegs = XtVaCreateManagedWidget( "memRegs2",
3813 xmPushButtonWidgetClass,
3815 XmNlabelString, XmStringCreateLocalized(
3816 GETMESSAGE(3, 138, "Financial Registers") ),
3817 XmNmnemonic, XStringToKeysym(
3818 GETMESSAGE( 2, 45, "g" ) ),
3820 XtAddCallback(memRegs, XmNactivateCallback, (XtCallbackProc)do_memory,
3823 /* 3. Ascii Converter ... */
3824 X->asciiConv = XtVaCreateManagedWidget("asciiConv",
3825 xmPushButtonWidgetClass,
3828 XmStringCreateLocalized( GETMESSAGE(2, 16, "ASCII Convert") ),
3829 XmNmnemonic, XStringToKeysym(
3830 GETMESSAGE(2, 41, "A") ),
3832 XtAddCallback(X->asciiConv, XmNactivateCallback, (XtCallbackProc)do_ascii,
3835 if(_DtNl_is_multibyte)
3836 XtSetSensitive(X->asciiConv, False);
3838 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3839 X->popupMenu, NULL, 0) ;
3841 /* 4. Enter Functions ... */
3842 X->enterFun = XtVaCreateManagedWidget("enterFun",
3843 xmPushButtonWidgetClass,
3846 XmStringCreateLocalized( vstrs[(int) V_FUNWNAME] ),
3847 XmNmnemonic, XStringToKeysym(
3848 GETMESSAGE(2, 42, "F") ),
3850 XtAddCallback(X->enterFun, XmNactivateCallback, (XtCallbackProc)new_cf_value,
3851 (XtPointer)(int)M_FUN);
3853 /* 5. Enter Constants ... */
3854 X->enterConst = XtVaCreateManagedWidget("enterConst",
3855 xmPushButtonWidgetClass,
3858 XmStringCreateLocalized( vstrs[(int) V_CONWNAME] ),
3859 XmNmnemonic, XStringToKeysym(
3860 GETMESSAGE(2, 43, "C") ),
3862 XtAddCallback(X->enterConst, XmNactivateCallback,(XtCallbackProc)new_cf_value,
3863 (XtPointer)(int)M_CON);
3865 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3866 X->popupMenu, NULL, 0) ;
3871 dummyHelp1 = XtVaCreatePopupShell ("dummyHelp1",
3872 xmMenuShellWidgetClass,
3878 dummyHelp2 = XtVaCreateWidget("dummyHelp2",
3879 xmRowColumnWidgetClass, dummyHelp1,
3880 XmNrowColumnType, XmMENU_PULLDOWN,
3884 label = XmStringCreateLocalized ( GETMESSAGE(2, 20, "Overview") );
3885 helpI = XtVaCreateManagedWidget ("introduction",
3886 xmPushButtonGadgetClass, dummyHelp2,
3887 XmNlabelString, label,
3888 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 19, "v") ),
3892 XtAddCallback(helpI, XmNactivateCallback,
3893 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_INTRODUCTION);
3894 XmStringFree (label);
3896 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3897 dummyHelp2, NULL, 0);
3899 label = XmStringCreateLocalized ( GETMESSAGE(2, 39, "Table of Contents") );
3900 helpToc = XtVaCreateManagedWidget ("toc",
3901 xmPushButtonGadgetClass, dummyHelp2,
3902 XmNlabelString, label,
3903 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 38, "C") ),
3906 XtAddCallback(helpToc, XmNactivateCallback,
3907 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TABLEOFCONTENTS);
3909 XmStringFree(label);
3912 label = XmStringCreateLocalized ( GETMESSAGE(2, 22, "Tasks") );
3913 helpT = XtVaCreateManagedWidget ("tasks",
3914 xmPushButtonGadgetClass, dummyHelp2,
3915 XmNlabelString, label,
3916 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 21, "T") ),
3919 XtAddCallback(helpT, XmNactivateCallback,
3920 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TASKS);
3922 XmStringFree(label);
3925 label = XmStringCreateLocalized ( GETMESSAGE(2, 24, "Reference") );
3926 helpR = XtVaCreateManagedWidget ("reference",
3927 xmPushButtonGadgetClass, dummyHelp2,
3928 XmNlabelString, label,
3929 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 23, "R" ) ),
3933 XtAddCallback(helpR, XmNactivateCallback,
3934 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_REFERENCE);
3936 XmStringFree(label);
3938 label = XmStringCreateLocalized ( GETMESSAGE(2, 26, "On Item") );
3940 helpO = XtVaCreateManagedWidget ("onItem",
3941 xmPushButtonGadgetClass, dummyHelp2,
3942 XmNlabelString, label,
3943 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 25, "O") ),
3946 XtAddCallback(helpO, XmNactivateCallback,
3947 (XtCallbackProc)HelpModeCB, (XtPointer)NULL);
3949 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3950 dummyHelp2, NULL, 0);
3951 XmStringFree (label);
3953 label = XmStringCreateLocalized ( GETMESSAGE(2, 28, "Using Help") );
3954 helpU = XtVaCreateManagedWidget ("useHelp",
3955 xmPushButtonGadgetClass, dummyHelp2,
3956 XmNlabelString, label,
3957 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 27, "U") ),
3961 XtAddCallback(helpU, XmNactivateCallback,
3962 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_USING);
3964 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3965 dummyHelp2, NULL, 0);
3967 XmStringFree(label);
3969 label = XmStringCreateLocalized (GETMESSAGE(2, 30, "About Calculator") );
3970 helpV = XtVaCreateManagedWidget ("version",
3971 xmPushButtonGadgetClass, dummyHelp2,
3972 XmNlabelString, label,
3973 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 29, "A" ) ),
3976 XtAddCallback(helpV, XmNactivateCallback,
3977 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_VERSION);
3979 XmStringFree(label);
3982 mnemonic = GETMESSAGE(2, 17, "H");
3983 label = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
3984 XtVaCreateManagedWidget("help",
3985 xmCascadeButtonGadgetClass, X->popupMenu,
3986 XmNsubMenuId, dummyHelp2,
3987 XmNmnemonic, XStringToKeysym( mnemonic ),
3988 XmNlabelString, label,
3990 XmStringFree(label);
3992 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3993 X->popupMenu, NULL, 0);
3996 label = XmStringCreateLocalized ( GETMESSAGE(3, 403, "Exit") );
3997 X->Close = XtVaCreateManagedWidget("close",
3998 xmPushButtonWidgetClass,
4000 XmNlabelString, label,
4002 XStringToKeysym(GETMESSAGE(2, 44, "X" )),
4004 XmStringFree(label);
4005 XtAddCallback(X->Close, XmNactivateCallback,(XtCallbackProc)do_frame,
4006 (XtPointer)(int)M_FUN);
4008 XtAddEventHandler(parent, ButtonPressMask, FALSE,
4009 popupHandler, (XtPointer) NULL) ;
4010 XtAddCallback(X->popupMenu, XmNmapCallback,(XtCallbackProc)map_popup,
4015 popupHandler(Widget widget, XtPointer client_data, XEvent *event, Boolean *continue_to_dispatch)
4017 XButtonPressedEvent *bevent;
4019 bevent = (XButtonPressedEvent *)event;
4021 if (event->type == ButtonPress && event->xbutton.button == Button3)
4023 if(bevent->x >= funBtn->core.x &&
4024 bevent->x <= funBtn->core.x + funBtn->core.width &&
4025 bevent->y >= funBtn->core.y +
4026 X->modeline->core.height + X->textForm->core.height &&
4027 bevent->y <= funBtn->core.y +funBtn->core.height +
4028 X->modeline->core.height + X->textForm->core.height)
4030 menu_handler(widget, (XtPointer)M_FUN, event, continue_to_dispatch);
4032 else if(bevent->x >= constBtn->core.x &&
4033 bevent->x <= constBtn->core.x + constBtn->core.width &&
4034 bevent->y >= constBtn->core.y +
4035 X->modeline->core.height + X->textForm->core.height &&
4036 bevent->y <= constBtn->core.y + constBtn->core.height +
4037 X->modeline->core.height + X->textForm->core.height)
4039 menu_handler(widget, (XtPointer)M_CON, event, continue_to_dispatch);
4041 else if(bevent->x >= accBtn->core.x &&
4042 bevent->x <= accBtn->core.x + accBtn->core.width &&
4043 bevent->y >= accBtn->core.y +
4044 X->modeline->core.height + X->textForm->core.height &&
4045 bevent->y <= accBtn->core.y + accBtn->core.height +
4046 X->modeline->core.height + X->textForm->core.height)
4048 menu_handler(widget, (XtPointer)M_ACC, event, continue_to_dispatch);
4050 else if(bevent->x >= rclBtn->core.x &&
4051 bevent->x <= rclBtn->core.x + rclBtn->core.width &&
4052 bevent->y >= rclBtn->core.y +
4053 X->modeline->core.height + X->textForm->core.height &&
4054 bevent->y <= rclBtn->core.y + rclBtn->core.height +
4055 X->modeline->core.height + X->textForm->core.height)
4057 menu_handler(widget, (XtPointer)M_RCL, event, continue_to_dispatch);
4059 else if(bevent->x >= stoBtn->core.x &&
4060 bevent->x <= stoBtn->core.x + stoBtn->core.width &&
4061 bevent->y >= stoBtn->core.y +
4062 X->modeline->core.height + X->textForm->core.height &&
4063 bevent->y <= stoBtn->core.y + stoBtn->core.height +
4064 X->modeline->core.height + X->textForm->core.height)
4066 menu_handler(widget, (XtPointer)M_STO, event, continue_to_dispatch);
4068 else if(bevent->x >= exchBtn->core.x &&
4069 bevent->x <= exchBtn->core.x + exchBtn->core.width &&
4070 bevent->y >= exchBtn->core.y +
4071 X->modeline->core.height + X->textForm->core.height &&
4072 bevent->y <= exchBtn->core.y + exchBtn->core.height +
4073 X->modeline->core.height + X->textForm->core.height)
4075 menu_handler(widget, (XtPointer)M_EXCH, event, continue_to_dispatch);
4079 XmMenuPosition(X->popupMenu, (XButtonPressedEvent *) event) ;
4080 XtManageChild(X->popupMenu) ;
4086 set_option_menu(int type, int base)
4090 if(type == BASEITEM)
4091 XtSetArg(args[0], XmNmenuHistory, X->baseWidgArry[base]);
4092 else if(type == NUMITEM)
4093 XtSetArg(args[0], XmNmenuHistory, X->numWidgArry[base]);
4095 XtSetArg(args[0], XmNmenuHistory, X->ttypeWidgArry[base]);
4096 XtSetValues( X->modevals[type], args, 1);
4100 map_popup(Widget widget, XtPointer client_data, XtPointer call_data)
4102 XmAnyCallbackStruct * callback;
4105 callback = (XmAnyCallbackStruct *) call_data;
4106 event = (XEvent *) callback->event;
4108 if(event->type != KeyRelease)
4111 if (v->event_type == F4_PRESS)
4112 XmMenuPosition(widget, (XButtonPressedEvent *) event) ;
4117 save_state(Widget widget, XtPointer client_data, XtPointer call_data)
4119 char *full_path = NULL;
4120 char *file_name = NULL;
4121 char *sessionFileName;
4123 char **restart_argv = NULL;
4124 static char **start_argv = NULL;
4126 int i, restart_argc;
4127 static int start_argc = 0;
4129 Boolean status = False;
4130 static Boolean first = True;
4132 status = DtSessionSavePath(widget, &full_path, &file_name);
4135 sessionFileName = file_name;
4138 XtFree( (char *)full_path);
4139 full_path = (char *) XtMalloc (sizeof (char) * PATH_MAX);
4140 sprintf( full_path, "%s/%s", dt_path, DTCALC_CLASS_NAME);
4141 sessionFileName = full_path;
4144 SaveSession(full_path, file_name);
4146 /* --------------------------------------------------------------- */
4147 /* Original commandline arguments were saved on the top window */
4148 /* They get reset here, take original and append them to restart */
4149 /* --------------------------------------------------------------- */
4154 XGetCommand(X->dpy, XtWindow(X->kframe), &start_argv, &start_argc);
4157 /* Generate the restart command and add it as the property value */
4159 restart_argc = start_argc + 3;
4160 restart_argv = (char **) XtMalloc(restart_argc * sizeof(char *));
4162 if (restart_argv == NULL)
4165 restart_argv[0] = XtNewString(v->progname);
4167 for ( i = 1 ; (i < start_argc && start_argv != NULL) ; i++ )
4169 restart_argv[i] = XtNewString(start_argv[i]);
4172 restart_argv[i] = XtNewString("-session"); i++;
4173 restart_argv[i] = XtNewString(sessionFileName); i++;
4175 XSetCommand(X->dpy, XtWindow(X->kframe), restart_argv, i);
4176 XSync(X->dpy, False);
4178 for ( i = 0 ; i < restart_argc -1 ; i++ )
4179 XtFree ((char *) restart_argv[i]);
4181 XtFree ((char *) full_path);
4182 XtFree ((char *) file_name);
4188 SaveSession(char *path, char *file_name)
4191 Atom * ws_presence = NULL;
4192 char * workspace_name;
4193 unsigned long num_workspaces = 0;
4196 unsigned long nitems;
4197 unsigned long leftover;
4198 WM_STATE * wm_state;
4202 Dimension width, height;
4207 XmVendorShellExtObject vendorExt;
4208 XmWidgetExtData extData;
4213 /* Create the session file */
4215 if ((fd = creat (path, S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP)) == -1)
4217 tmpStr = GETMESSAGE(2, 34, "Could not open the session file.");
4218 msg = XtNewString(tmpStr);
4219 _DtSimpleError (v->appname, DtError, NULL, msg);
4225 /* Getting the WM_STATE property to see if iconified or not */
4226 XGetWindowProperty (X->dpy, XtWindow (X->kframe),
4227 wm_state_atom, 0L, (long) BUFSIZ, False,
4228 wm_state_atom, &actual_type, &actual_format,
4229 &nitems, &leftover, (unsigned char **) &wm_state);
4231 /* Write out if iconified our not */
4232 if (wm_state->state == IconicState)
4233 put_resource(R_ICON, set_bool(True)) ;
4235 put_resource(R_ICON, set_bool(False)) ;
4237 /* does it have a menubar or not */
4238 if ( application_args.menuBar )
4239 put_resource(R_MENUBAR, set_bool(True)) ;
4241 put_resource(R_MENUBAR, set_bool(False)) ;
4243 /* is keys set to on/off */
4245 put_resource(R_KEYS, set_bool(True)) ;
4247 put_resource(R_KEYS, set_bool(False)) ;
4249 /* Get the workspaces for this dt by accessing the property. */
4251 if (DtWsmGetWorkspacesOccupied (X->dpy, XtWindow (X->kframe),
4252 &ws_presence, &num_workspaces) == Success)
4256 string = (char *)XtMalloc(num_workspaces * 40);
4257 for (j = 0; j < num_workspaces; j++)
4259 workspace_name = XGetAtomName (X->dpy, ws_presence[j]);
4261 strcpy(string, workspace_name);
4263 strcat(string, workspace_name);
4264 if(j + 1 != num_workspaces)
4265 strcat(string, " ");
4266 XtFree ((char *) workspace_name);
4268 put_resource(R_WORKSPACE, string) ;
4270 XFree((char *)ws_presence);
4271 XtFree((char *)string);
4276 XtSetArg(args[0], XmNwidth, &width);
4277 XtSetArg(args[1], XmNheight, &height);
4278 XtGetValues(X->kframe, args, 2);
4280 XTranslateCoordinates(XtDisplay(X->kframe),
4281 XtWindow(X->kframe),
4282 RootWindowOfScreen(XtScreen(X->kframe)),
4288 /* Modify x & y to take into account window mgr frames */
4289 extData=_XmGetWidgetExtData(X->kframe, XmSHELL_EXTENSION);
4290 vendorExt = (XmVendorShellExtObject)extData->widget;
4291 x -= vendorExt->vendor.xOffset;
4292 y -= vendorExt->vendor.yOffset;
4294 sprintf(tempStr, "%d", width);
4295 put_resource(R_WIDTH, tempStr) ;
4296 sprintf(tempStr, "%d", height);
4297 put_resource(R_HEIGHT, tempStr) ;
4298 sprintf(tempStr, "%d", x);
4299 put_resource(R_X, tempStr) ;
4300 sprintf(tempStr, "%d", y);
4301 put_resource(R_Y, tempStr) ;
4303 write_resources(path);
4307 RestoreSession(void)
4309 Boolean status=False;
4312 char * full_path = NULL;
4314 int boolval, i, intval ;
4315 int MPtemp[MP_SIZE];
4317 status = DtSessionRestorePath(X->kframe, &full_path,
4318 application_args.session);
4322 path = XtNewString(full_path);
4324 db = XrmGetFileDatabase(path) ;
4325 XrmMergeDatabases(db, &(X->rDB)) ;
4327 if (get_int_resource(R_ACCURACY, &intval))
4329 v->accuracy = intval ;
4330 if (v->accuracy < 0 || v->accuracy > 9)
4332 msg = (char *) XtMalloc(strlen( opts[(int) O_ACCRANGE]) + 3);
4333 sprintf(msg, "%s", opts[(int) O_ACCRANGE]);
4334 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4340 if ((full_path = get_resource(R_BASE)) != NULL)
4342 for (i = 0; i < MAXBASES; i++)
4343 if (EQUAL(full_path, base_str[i])) break ;
4347 msg = (char *) XtMalloc(strlen( opts[(int) O_BASE]) + 3);
4348 sprintf(msg, "%s", opts[(int) O_BASE]);
4349 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4354 v->base = (enum base_type) i ;
4358 if (get_str_resource(R_DISPLAY, str))
4360 for (i = 0; i < MAXDISPMODES; i++)
4361 if (EQUAL(str, dtype_str[i])) break ;
4363 if (i == MAXDISPMODES)
4365 msg = (char *) XtMalloc(strlen( opts[(int) O_DISPLAY]) +
4367 sprintf(msg, opts[(int) O_DISPLAY], str);
4368 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4371 else v->dtype = (enum num_type) i ;
4374 if (get_str_resource(R_MODE, str))
4376 for (i = 0; i < MAXMODES; i++)
4377 if (EQUAL(str, mode_str[i])) break ;
4381 msg = (char *)XtMalloc(strlen( opts[(int) O_MODE]) + strlen(str) + 3);
4382 sprintf(msg, opts[(int) O_MODE], str);
4383 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4386 else v->modetype = (enum mode_type) i ;
4389 if (get_str_resource(R_TRIG, str))
4391 for (i = 0; i < MAXTRIGMODES; i++)
4392 if (EQUAL(str, ttype_str[i])) break ;
4394 if (i == MAXTRIGMODES)
4396 msg = (char *)XtMalloc(strlen( opts[(int) O_TRIG]) + strlen(str) + 3);
4397 sprintf(msg, opts[(int) O_TRIG], str);
4398 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4401 else v->ttype = (enum trig_type) i ;
4404 if (get_bool_resource(R_REGS, &boolval)) v->rstate = boolval ;
4406 /* Get the iconify state */
4407 if (get_bool_resource(R_ICON, &boolval)) v->iconic = boolval;
4409 /* Get the menubar state */
4410 if (get_bool_resource(R_MENUBAR, &boolval))
4411 application_args.menuBar = boolval;
4413 /* Get the keys state */
4414 if (get_bool_resource(R_KEYS, &boolval)) v->tstate = boolval;
4416 /* Get the proper workspaces if needed */
4417 if ((full_path = get_resource(R_WORKSPACE)) != NULL)
4418 v->workspaces = XtNewString(full_path);
4420 /* Get the x, y width, and height */
4421 if (get_int_resource(R_WIDTH, &intval))
4423 if (get_int_resource(R_HEIGHT, &intval))
4424 v->height = intval ;
4425 if (get_int_resource(R_X, &intval))
4427 if (get_int_resource(R_Y, &intval))
4430 if (get_str_resource(R_DISPLAYED, str))
4432 STRCPY(v->display, str);
4433 MPstr_to_num(str, v->base, v->MPdisp_val) ;
4436 if (get_str_resource(R_REG0, str))
4437 MPstr_to_num(str, v->base, v->MPmvals[0]) ;
4438 if (get_str_resource(R_REG1, str))
4439 MPstr_to_num(str, v->base, v->MPmvals[1]) ;
4440 if (get_str_resource(R_REG2, str))
4441 MPstr_to_num(str, v->base, v->MPmvals[2]) ;
4442 if (get_str_resource(R_REG3, str))
4443 MPstr_to_num(str, v->base, v->MPmvals[3]) ;
4444 if (get_str_resource(R_REG4, str))
4445 MPstr_to_num(str, v->base, v->MPmvals[4]) ;
4446 if (get_str_resource(R_REG5, str))
4447 MPstr_to_num(str, v->base, v->MPmvals[5]) ;
4448 if (get_str_resource(R_REG6, str))
4449 MPstr_to_num(str, v->base, v->MPmvals[6]) ;
4450 if (get_str_resource(R_REG7, str))
4451 MPstr_to_num(str, v->base, v->MPmvals[7]) ;
4452 if (get_str_resource(R_REG8, str))
4453 MPstr_to_num(str, v->base, v->MPmvals[8]) ;
4454 if (get_str_resource(R_REG9, str))
4455 MPstr_to_num(str, v->base, v->MPmvals[9]) ;
4457 if (get_str_resource(R_FREG0, str))
4459 MPstr_to_num(str, v->base, MPtemp) ;
4460 mpcmd(MPtemp, &(v->MPfvals[0]));
4462 if (get_str_resource(R_FREG1, str))
4464 MPstr_to_num(str, v->base, MPtemp) ;
4465 mpcmd(MPtemp, &(v->MPfvals[1]));
4467 if (get_str_resource(R_FREG2, str))
4469 MPstr_to_num(str, v->base, MPtemp) ;
4470 mpcmd(MPtemp, &(v->MPfvals[2]));
4472 if (get_str_resource(R_FREG3, str))
4474 MPstr_to_num(str, v->base, MPtemp) ;
4475 mpcmd(MPtemp, &(v->MPfvals[3]));
4477 if (get_str_resource(R_FREG4, str))
4479 MPstr_to_num(str, v->base, MPtemp) ;
4480 mpcmd(MPtemp, &(v->MPfvals[4]));
4482 if (get_str_resource(R_FREG5, str))
4484 MPstr_to_num(str, v->base, MPtemp) ;
4485 mpcmd(MPtemp, &(v->MPfvals[5]));
4494 Atom * workspace_atoms = NULL;
4495 int num_workspaces=0;
4499 if(v->width != 0 && v->height != 0)
4501 WMShellWidget wm = (WMShellWidget)(X->kframe);
4502 wm->wm.size_hints.flags |= USPosition;
4503 XtSetArg (args[0], XmNx, (Position)v->x);
4504 XtSetArg (args[1], XmNy, (Position)v->y);
4505 XtSetArg (args[2], XmNwidth, (Dimension)v->width);
4506 XtSetArg (args[3], XmNheight, (Dimension)v->height);
4507 XtSetValues (X->kframe, args, 4);
4512 /* add the iconify hint to the current shell */
4513 XtSetArg(args[0], XmNinitialState, IconicState);
4514 XtSetValues(X->kframe, args, 1);
4518 /* Remove the iconify hint from the current shell */
4519 wmhints = XGetWMHints(X->dpy, XtWindow(X->kframe));
4520 wmhints->flags |= IconWindowHint;
4521 wmhints->initial_state = NormalState;
4522 XSetWMHints(X->dpy, XtWindow(X->kframe), wmhints);
4530 ptr = DtStrchr (v->workspaces, ' ');
4532 if (ptr != NULL) *ptr = '\0';
4534 workspace_atoms = (Atom *) XtRealloc ((char *)workspace_atoms,
4535 sizeof (Atom) * (num_workspaces + 1));
4537 workspace_atoms[num_workspaces] =
4538 XmInternAtom (X->dpy, v->workspaces, True);
4545 v->workspaces = ptr + 1;
4547 } while (ptr != NULL);
4549 DtWsmSetWorkspacesOccupied (X->dpy, XtWindow (X->kframe),
4550 workspace_atoms, num_workspaces);
4552 XtFree ((char *) workspace_atoms);
4557 TimerEvent( XtPointer client_data, XtIntervalId *id)
4561 ignore_event = False;
4565 XtSetArg (args[0], XmNdefaultButton, X->CFpi_butOK);
4566 XtSetValues (X->CFframe, args, 1);
4571 #ifdef HP_EXTENSIONS
4575 XHPDeviceList *list, *slist;
4576 int ndevices = 0, i, kbd = 0;
4578 slist = XHPListInputDevices(X->dpy, &ndevices);
4579 for (i = 0, list = slist; i < ndevices; i++, list++)
4581 if (list->type != KEYBOARD && strcmp(list->name, PS2_DIN_NAME))
4583 if (list->detailed_id & (HP_ITF_KBD | HP_HIL) == (HP_ITF_KBD | HP_HIL))
4588 else if (list->detailed_id & (PC101_KBD|HP_HIL) == (PC101_KBD|HP_HIL))
4590 kbd = HIL_PC101_KBD;
4593 else if (list->detailed_id & (PC101_KBD|SERIAL) == (PC101_KBD|SERIAL))
4595 kbd = SERIAL_PC101_KBD;
4601 if (strcmp(list->name, PS2_DIN_NAME) == 0)
4603 kbd = SERIAL_PC101_KBD;
4606 else if (list->hil_id >= FIRST_HIL_KBD &&
4607 list->hil_id <= LAST_HIL_KBD)
4609 if (list->io_byte & LED_BITS)
4611 kbd = HIL_PC101_KBD;
4622 XHPFreeDeviceList (slist);
4628 _DtcalcStripSpaces(char *file)
4635 for (i = 0; i < strlen(file); i++)
4637 if (isspace(file[i]))
4639 for(j = i; file[j] != '\0'; j++)
4640 file[j] = file[j + 1];