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>
53 #include <Xm/DrawingA.h>
54 #include <Xm/DrawingAP.h>
55 #include <Xm/MessageB.h>
56 #include <Xm/RowColumn.h>
57 #include <Xm/MwmUtil.h>
58 #include <Xm/ManagerP.h>
60 #include <Xm/ColorObjP.h>
62 #include <Xm/MenuShell.h>
65 #include <Xm/PushBP.h>
66 #include <Xm/PushBG.h>
67 #include <Xm/CascadeB.h>
68 #include <Xm/CascadeBG.h>
69 #include <Xm/MwmUtil.h>
70 #include <Xm/Protocols.h>
71 #include <Xm/VendorSEP.h>
72 #include <Xm/SeparatoG.h>
73 /* Copied from BaseClassI.h */
74 extern XmWidgetExtData _XmGetWidgetExtData(
76 #if NeedWidePrototypes
77 unsigned int extType) ;
79 unsigned char extType) ;
80 #endif /* NeedWidePrototypes */
82 #include <X11/CoreP.h>
84 #include <X11/ShellP.h>
85 #include <X11/Shell.h>
86 #include <X11/IntrinsicP.h>
87 #include <X11/Intrinsic.h>
88 #include <X11/Shell.h>
89 #include <X11/Xatom.h>
90 #include <Xm/Protocols.h>
91 #include <X11/keysymdef.h>
93 #include <Dt/Session.h>
95 #include <Dt/Connect.h>
97 #include <Dt/Indicator.h>
99 #include <Dt/Message.h>
101 #include <Dt/CommandM.h>
102 #include <Dt/EnvControlP.h>
105 #include <X11/Xmu/Editres.h>
110 #include "ds_widget.h"
111 #include "ds_common.h"
112 #include "ds_popup.h"
117 static XtResource resources[] =
120 "postMenuBar", "PostMenuBar", XmRBoolean, sizeof (Boolean),
121 XtOffset (ApplicationArgsPtr, menuBar), XmRImmediate, (XtPointer) True,
125 "accuracy", "Accuracy", XmRInt, sizeof (int),
126 XtOffset (ApplicationArgsPtr, accuracy), XmRImmediate, (XtPointer) 2,
130 "base", "Base", XmRString, sizeof (char *),
131 XtOffset (ApplicationArgsPtr, base), XmRImmediate, (XtPointer) "decimal",
135 "displayNotation", "DisplayNotation", XmRString, sizeof (char *),
136 XtOffset (ApplicationArgsPtr, display), XmRImmediate, (XtPointer) "fixed",
140 "mode", "Mode", XmRString, sizeof (char *),
141 XtOffset (ApplicationArgsPtr, mode), XmRImmediate, (XtPointer)"scientific",
145 "trigType", "TrigType", XmRString, sizeof (char *),
146 XtOffset (ApplicationArgsPtr, trigType), XmRImmediate,
147 (XtPointer)"degrees",
151 char DTCALC_CLASS_NAME[] = "Dtcalc";
153 extern char *opts[] ; /* Command line option strings. */
156 XmPixelSet pixels[XmCO_MAX_NUM_COLORS];
159 Boolean BlackWhite = False;
161 char * dt_path = NULL;
163 static Widget funBtn = NULL;
164 static Widget constBtn = NULL;
165 static Widget accBtn = NULL;
166 static Widget stoBtn = NULL;
167 static Widget rclBtn = NULL;
168 static Widget exchBtn = NULL;
170 static Atom saveatom ;
171 static Atom command_atom ;
172 static Atom wm_state_atom;
174 Boolean ignore_event = False;
175 XtIntervalId timerId = 0;
177 static int lastArmed[10];
178 static int countArmed = 0;
180 /* Structure used on a save session to see if a dt is iconic */
187 void menu_proc P((Widget, XtPointer, XtPointer)) ;
188 void show_ascii P((Widget, XtPointer, XtPointer)) ;
189 void write_cf_value P((Widget, XtPointer, XtPointer)) ;
190 void close_cf P((Widget, XtPointer, XtPointer)) ;
191 void close_ascii P((Widget, XtPointer, XtPointer)) ;
192 void move_cf P((Widget, XtPointer, XtPointer)) ;
193 void FocusInCB P((Widget, XtPointer, XtPointer)) ;
194 void map_popup P((Widget, XtPointer, XtPointer)) ;
196 static int event_is_keypad P((XEvent *)) ;
197 static int get_next_event P((Widget, int, XEvent *)) ;
198 static int is_window_showing P((Widget)) ;
200 static KeySym keypad_keysym P((XEvent *)) ;
202 static void modelineValueChanged P((Widget, XtPointer, XtPointer)) ;
203 static void dtcalc_kkeyboard_create P((Widget)) ;
204 static void dtcalc_kpanel_create P((Widget)) ;
205 static void confirm_callback P((Widget, XtPointer, XtPointer)) ;
206 static void create_cfframe P(()) ;
207 static void create_menu P((enum menu_type, Widget, int)) ;
208 static void do_button P((Widget, XtPointer, XtPointer)) ;
209 static void do_confirm_notice P((Widget, char *)) ;
210 static void do_continue_notice P((Widget, char *)) ;
211 static void close_reg P((Widget, XtPointer, XtPointer)) ;
212 static void event_proc P((Widget, XtPointer, XEvent *, Boolean *)) ;
213 static void frame_interpose P((Widget, XtPointer, XEvent *, Boolean *)) ;
214 static void menu_handler P((Widget, XtPointer, XEvent *, Boolean *)) ;
215 static void popupHandler P((Widget, XtPointer, XEvent *, Boolean *)) ;
216 static void new_cf_value P((Widget, XtPointer, XtPointer)) ;
217 static void do_memory P((Widget, XtPointer, XtPointer)) ;
218 static void switch_mode P((enum mode_type)) ;
219 static void update_cf_value P(()) ;
220 static void xerror_interpose P((Display *, XErrorEvent *)) ;
222 static Widget button_create P((Widget, int, int, int, int)) ;
223 static void save_state P((Widget, XtPointer, XtPointer)) ;
224 static void SaveSession P(( char *, char * )) ;
225 static void setCalcHints P(()) ;
227 static char * _DtcalcStripSpaces P(( char * )) ;
229 static void ProcessMotifSelection(Widget);
230 static void create_menu_bar(Widget parent);
231 static void init_colors(void);
232 static void create_popup(Widget parent);
235 extern char **environ ;
237 extern char *base_str[] ; /* Strings for each base value. */
238 extern char *calc_res[] ; /* Calctool X resources. */
239 extern char *dtype_str[] ; /* Strings for each display mode value. */
240 extern char *lstrs[] ; /* Labels for various Motif items. */
241 extern char *mess[] ; /* Message strings. */
242 extern char *mode_str[] ; /* Strings for each mode value. */
243 extern char *pstrs[] ; /* Property sheet strings. */
244 extern char *ttype_str[] ; /* Strings for each trig type value. */
245 extern char *vstrs[] ; /* Various strings. */
247 extern struct button buttons[] ; /* Calculator button values. */
248 extern struct button mode_buttons[] ; /* Calculator mode button values. */
249 extern struct menu cmenus[] ; /* Calculator menus. */
250 extern struct menu_entry menu_entries[] ; /* All the menu strings. */
252 extern Vars v ; /* Calctool variables and options. */
254 char translations_return[] = "<Key>Return:ManagerGadgetSelect()";
255 static Boolean NoDisplay=False;
257 extern XtPointer _XmStringUngenerate (
261 XmTextType output_type);
264 main(int argc, char **argv)
268 XtSetLanguageProc(NULL, NULL, NULL);
269 _DtEnvControl(DT_ENV_SET);
270 signal (SIGHUP, SIG_IGN);
272 X = (XVars) LINT_CAST(calloc(1, sizeof(XObject))) ;
273 X->home = getenv("HOME") ;
275 X->kframe = XtVaAppInitialize (&X->app,
276 DTCALC_CLASS_NAME, /* app class */
277 NULL, /* options list */
281 NULL, /* fallback resources */
282 XtNiconName, "dtcalc",
283 XtNiconPixmap, X->icon,
284 XtNiconMask, X->iconmask,
287 X->dpy = XtDisplay (X->kframe);
293 tmpStr = GETMESSAGE(2, 31, "Could not open display.\n");
294 msg = XtNewString(tmpStr);
295 FPRINTF(stderr, "%s", msg) ;
299 X->screen = DefaultScreen(X->dpy) ;
300 X->root = RootWindow(X->dpy, X->screen) ;
301 white_pixel = WhitePixel(X->dpy, X->screen);
302 black_pixel = BlackPixel(X->dpy, X->screen);
307 X->helpMapped = False;
309 if (DtInitialize (X->dpy, X->kframe, argv[0], DTCALC_CLASS_NAME) == False)
311 /* Fatal Error: could not connect to the messaging system. */
312 /* DtInitialize() has already logged an appropriate error msg */
316 /* Get the application defined resources */
317 XtGetApplicationResources(X->kframe, &application_args, resources, 6, NULL,0);
319 v = (Vars) LINT_CAST(calloc(1, sizeof(CalcVars))) ;
321 /* Get the dt path created and initialized */
322 dt_path = _DtCreateDtDirs (X->dpy);
324 init_colors() ; /* get the pixels for the default colors in DT */
325 if(pixels[0].bg == white_pixel || pixels[0].bg == black_pixel)
328 if(colorSrv && !BlackWhite)
330 /* first get the Calculator's Icon */
331 pixmap = XmGetPixmap (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME,
332 pixels[1].fg, pixels[1].bg);
333 if( pixmap != XmUNSPECIFIED_PIXMAP)
336 X->icon = XmUNSPECIFIED_PIXMAP;
338 /* now let's get the mask for the Calculator */
339 pixmap = _DtGetMask (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME);
340 if( pixmap != XmUNSPECIFIED_PIXMAP)
341 X->iconmask = pixmap;
343 X->iconmask = XmUNSPECIFIED_PIXMAP;
347 /* first get the Calculator's Icon */
348 pixmap = XmGetPixmap (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME_BM,
349 white_pixel, black_pixel);
350 if( pixmap != XmUNSPECIFIED_PIXMAP)
353 X->icon = XmUNSPECIFIED_PIXMAP;
355 /* now let's get the mask for the Calculator */
356 pixmap = _DtGetMask (DefaultScreenOfDisplay(X->dpy), CALC_ICON_NAME_BM);
357 if( pixmap != XmUNSPECIFIED_PIXMAP)
358 X->iconmask = pixmap;
360 X->iconmask = XmUNSPECIFIED_PIXMAP;
363 do_dtcalc(argc, argv) ;
376 button_create(Widget owner, int row, int column, int maxrows, int maxcols)
378 int n = row * maxcols + column ;
380 enum menu_type mtype = buttons[n].mtype ;
386 lstr = XmStringCreateLocalized(v->pstr) ;
392 else if(row >= 3 && row < 6)
394 else if(((row == 7 && column == 3) || (row == 13 && column == 3)) &&
397 else if((row >= 6 && row < 8) || (row >= 8 && row < 13 && column == 3) ||
398 (row == 13 && column == 2))
403 button = XtVaCreateManagedWidget(buttons[n].resname,
404 xmPushButtonWidgetClass,
406 XmNtopAttachment, XmATTACH_POSITION,
407 XmNtopPosition, row * maxcols,
408 XmNleftAttachment, XmATTACH_POSITION,
409 XmNleftPosition, column * maxrows,
410 XmNrightAttachment, XmATTACH_POSITION,
411 XmNrightPosition, (column+1) * maxrows,
412 XmNbottomAttachment, XmATTACH_POSITION,
413 XmNbottomPosition, (row+1) * maxcols,
414 XmNlabelString, lstr,
416 XmNtraversalOn, TRUE,
417 XmNalignment, XmALIGNMENT_CENTER,
418 XmNrecomputeSize, False,
419 XmNnavigationType, XmNONE,
423 button = XtVaCreateManagedWidget(buttons[n].resname,
424 xmPushButtonWidgetClass,
426 XmNtopAttachment, XmATTACH_POSITION,
427 XmNtopPosition, row * maxcols,
428 XmNleftAttachment, XmATTACH_POSITION,
429 XmNleftPosition, column * maxrows,
430 XmNrightAttachment, XmATTACH_POSITION,
431 XmNrightPosition, (column+1) * maxrows,
432 XmNbottomAttachment, XmATTACH_POSITION,
433 XmNbottomPosition, (row+1) * maxcols,
434 XmNlabelString, lstr,
435 XmNtraversalOn, TRUE,
436 XmNalignment, XmALIGNMENT_CENTER,
437 XmNrecomputeSize, False,
438 XmNnavigationType, XmNONE,
443 if (mtype != M_NONE) create_menu(mtype, button, n) ;
444 val = (v->curwin << 16) + n ;
445 XtAddCallback(button, XmNactivateCallback, do_button, (XtPointer) val) ;
446 XtAddCallback(button, XmNhelpCallback, HelpRequestCB, (XtPointer) val) ;
447 XtAddEventHandler(button, KeyPressMask | KeyReleaseMask,
448 FALSE, event_proc, NULL) ;
450 if( funBtn == NULL && strcmp(v->pstr, GETMESSAGE(3, 5, "Functions")) == 0)
452 else if( constBtn == NULL && strcmp(v->pstr,
453 GETMESSAGE(3, 6, "Constants")) == 0)
455 else if( accBtn == NULL && strcmp(v->pstr,
456 GETMESSAGE(3, 12, "Accuracy")) == 0)
458 else if( stoBtn == NULL && strcmp(v->pstr, GETMESSAGE(3, 13, "Store")) == 0)
460 else if( rclBtn == NULL && strcmp(v->pstr, GETMESSAGE(3, 14, "Recall")) == 0)
462 else if( exchBtn == NULL && strcmp(v->pstr,
463 GETMESSAGE(3, 15, "Exchange")) == 0)
471 dtcalc_initialize_rframe(Widget owner, int type)
476 XmString label_string;
477 Widget sep, button, frame, form;
481 if (X->rframe) return ;
483 X->rframe = XmCreateFormDialog(owner, "rframe", NULL, 0) ;
485 /* Adjust the decorations for the dialog shell of the dialog */
486 XtSetArg (args[0], XmNmwmFunctions, MWM_FUNC_MOVE);
487 XtSetArg (args[1], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE);
488 XtSetValues (XtParent(X->rframe), args, 2);
490 set_title(FCP_REG, lstrs[(int) L_MEMT]) ;
492 frame = XmCreateFrame(X->rframe, "frame", NULL, 0);
493 XtManageChild(frame);
494 form = (Widget) XmCreateForm(frame, "form", NULL, 0) ;
500 XmNallowShellResize, TRUE,
501 XmNdefaultPosition, FALSE,
504 SPRINTF(str, "register%1d", 0) ;
505 X->registers[0] = XtVaCreateManagedWidget(str,
508 XmNtopAttachment, XmATTACH_FORM,
510 XmNleftAttachment, XmATTACH_FORM,
516 for (i = 1; i < MAXREGS; i++)
518 SPRINTF(str, "register%1d", i) ;
519 X->registers[i] = XtVaCreateManagedWidget(str,
522 XmNtopAttachment, XmATTACH_WIDGET,
523 XmNtopWidget, X->registers[i - 1],
525 XmNleftAttachment, XmATTACH_FORM,
532 XtSetArg (args[0], XmNtopAttachment, XmATTACH_WIDGET);
533 XtSetArg (args[1], XmNtopWidget, X->registers[i - 1]);
534 XtSetArg (args[2], XmNtopOffset, 3);
535 XtSetArg (args[3], XmNleftAttachment, XmATTACH_FORM);
536 XtSetArg (args[4], XmNrightAttachment, XmATTACH_FORM);
537 sep = XmCreateSeparator(form, "sep", args, 5);
540 label_string = XmStringCreateLocalized (GETMESSAGE(2, 32, "Close") );
541 XtSetArg (args[0], XmNmarginHeight, 0);
542 XtSetArg (args[1], XmNmarginWidth, 10);
543 XtSetArg (args[2], XmNlabelString, label_string);
544 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
545 XtSetArg (args[4], XmNtopWidget, sep);
546 XtSetArg (args[5], XmNtopOffset, 5);
547 XtSetArg (args[6], XmNleftAttachment, XmATTACH_POSITION);
548 XtSetArg (args[7], XmNleftPosition, 25);
549 XtSetArg (args[8], XmNbottomAttachment, XmATTACH_FORM);
550 XtSetArg (args[9], XmNbottomOffset, 5);
551 XtSetArg (args[10], XmNshowAsDefault, True);
552 button = XmCreatePushButton(form, "button", args, 11);
553 XmStringFree(label_string);
555 XtAddCallback(button, XmNactivateCallback, close_reg, (XtPointer) (intptr_t) type) ;
557 XtSetArg (args[0], XmNcancelButton, button);
558 XtSetArg (args[1], XmNdefaultButton, button);
559 XtSetValues (X->rframe, args, 2);
561 XtManageChild(button);
565 if (X->frframe) return ;
566 X->frframe = XmCreateFormDialog(owner, "frframe", NULL, 0) ;
568 /* Adjust the decorations for the dialog shell of the dialog */
569 XtSetArg (args[0], XmNmwmFunctions, MWM_FUNC_MOVE);
570 XtSetArg (args[1], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE);
571 XtSetValues (XtParent(X->frframe), args, 2);
573 set_title(FCP_FIN_REG, GETMESSAGE(2, 18, lstrs[(int) L_FINMEMT] ));
575 frame = XmCreateFrame(X->frframe, "frame", NULL, 0);
576 XtManageChild(frame);
577 form = (Widget) XmCreateForm(frame, "form", NULL, 0) ;
583 XmNallowShellResize, TRUE,
584 XmNdefaultPosition, FALSE,
587 SPRINTF(str, "fregister%1d", 0) ;
588 X->fregisters[0] = XtVaCreateManagedWidget(str,
591 XmNtopAttachment, XmATTACH_FORM,
593 XmNleftAttachment, XmATTACH_FORM,
599 for (i = 1; i < FINREGS; i++)
601 SPRINTF(str, "fregister%1d", i) ;
602 X->fregisters[i] = XtVaCreateManagedWidget(str,
605 XmNtopAttachment, XmATTACH_WIDGET,
606 XmNtopWidget, X->fregisters[i - 1],
608 XmNleftAttachment, XmATTACH_FORM,
615 SPRINTF(str, "fregistervals%1d", 0) ;
616 X->fregistersvals[0] = XtVaCreateManagedWidget(str,
619 XmNtopAttachment, XmATTACH_FORM,
621 XmNleftAttachment, XmATTACH_WIDGET,
622 XmNleftWidget, X->fregisters[0],
624 XmNrightAttachment, XmATTACH_FORM,
630 for (i = 1; i < FINREGS; i++)
632 SPRINTF(str, "fregistervals%1d", i) ;
633 X->fregistersvals[i] = XtVaCreateManagedWidget(str,
636 XmNtopAttachment, XmATTACH_WIDGET,
637 XmNtopWidget, X->fregistersvals[i - 1],
639 XmNleftAttachment, XmATTACH_WIDGET,
640 XmNleftWidget, X->fregisters[i],
642 XmNrightAttachment, XmATTACH_FORM,
649 XtSetArg (args[0], XmNtopAttachment, XmATTACH_WIDGET);
650 XtSetArg (args[1], XmNtopWidget, X->fregisters[i - 1]);
651 XtSetArg (args[2], XmNtopOffset, 3);
652 XtSetArg (args[3], XmNleftAttachment, XmATTACH_FORM);
653 XtSetArg (args[4], XmNrightAttachment, XmATTACH_FORM);
654 sep = XmCreateSeparator(form, "sep", args, 5);
657 label_string = XmStringCreateLocalized (GETMESSAGE(2, 32, "Close") );
658 XtSetArg (args[0], XmNmarginHeight, 0);
659 XtSetArg (args[1], XmNmarginWidth, 10);
660 XtSetArg (args[2], XmNlabelString, label_string);
661 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
662 XtSetArg (args[4], XmNtopWidget, sep);
663 XtSetArg (args[5], XmNtopOffset, 5);
664 XtSetArg (args[6], XmNleftAttachment, XmATTACH_POSITION);
665 XtSetArg (args[7], XmNleftPosition, 30);
666 XtSetArg (args[8], XmNbottomAttachment, XmATTACH_FORM);
667 XtSetArg (args[9], XmNbottomOffset, 5);
668 XtSetArg (args[10], XmNshowAsDefault, True);
669 button = XmCreatePushButton(form, "button", args, 11);
670 XmStringFree(label_string);
672 XtSetArg (args[0], XmNcancelButton, button);
673 XtSetArg (args[1], XmNdefaultButton, button);
674 XtSetValues (X->frframe, args, 2);
676 XtAddCallback(button, XmNactivateCallback, close_reg, NULL) ;
678 XtManageChild(button);
684 dtcalc_kkeyboard_create(Widget owner)
689 buttonFrame = XtVaCreateManagedWidget("buttonFrame",
692 XmNshadowThickness, 0,
695 XmNtopAttachment, XmATTACH_WIDGET,
696 XmNtopWidget, X->modeFrame,
697 XmNrightAttachment, XmATTACH_FORM,
698 XmNleftAttachment, XmATTACH_FORM,
699 XmNbottomAttachment, XmATTACH_FORM,
702 X->kkeyboard = XtVaCreateManagedWidget("kkeyboard",
705 XmNfractionBase, BROWS * BCOLS,
706 XmNnavigationType, XmSTICKY_TAB_GROUP,
709 v->curwin = FCP_KEY ;
710 for (row = 0; row < BROWS; row++)
711 for (column = 0; column < BCOLS; column++)
713 X->kbuttons[row][column] = button_create(X->kkeyboard, row, column,
715 XtManageChild(X->kbuttons[row][column]) ;
717 grey_buttons(v->base) ;
722 dtcalc_kpanel_create(Widget owner)
724 static char *mnames[] = { "base", "ttype", "num", "hyp",
725 "inv", "op", "mode" } ;
727 Widget basePulldown, numPulldown, modePulldown, trigPulldown;
729 XmString label_string;
730 Pixel tmp_pixelbg, tmp_pixelfg;
731 XtTranslations trans_table;
733 trans_table = XtParseTranslationTable(translations_return);
739 if(pixels[2].bg == black_pixel)
741 tmp_pixelbg = black_pixel;
742 tmp_pixelfg = white_pixel;
746 tmp_pixelbg = white_pixel;
747 tmp_pixelfg = black_pixel;
752 tmp_pixelbg = pixels[6].bg;
753 tmp_pixelfg = white_pixel;
758 tmp_pixelbg = white_pixel;
759 tmp_pixelfg = black_pixel;
762 X->mainWin = XtVaCreateManagedWidget("mainWin",
763 xmMainWindowWidgetClass,
768 XtAddEventHandler(owner, 0, True,
769 (XtEventHandler) _XEditResCheckMessages,
773 if(application_args.menuBar)
774 create_menu_bar(X->mainWin);
776 X->kFrame = XtVaCreateManagedWidget("kFrame", xmFrameWidgetClass,
778 XmNshadowThickness, 1,
779 XmNshadowType, XmSHADOW_OUT,
784 X->kpanel = XtVaCreateManagedWidget("kpanel",
787 XmNshadowThickness, 0,
788 XmNbackground, tmp_pixelbg,
789 XmNforeground, tmp_pixelfg,
792 create_popup(X->kpanel);
794 X->textFrame = XtVaCreateManagedWidget("textFrame",
797 XmNshadowThickness, 2,
798 XmNshadowType, XmSHADOW_IN,
801 XmNtopAttachment, XmATTACH_FORM,
802 XmNrightAttachment, XmATTACH_FORM,
803 XmNleftAttachment, XmATTACH_FORM,
804 XmNnavigationType, XmTAB_GROUP,
806 XtAddCallback(X->textFrame, XmNhelpCallback, HelpRequestCB,
807 (XtPointer)HELP_DISPLAY) ;
809 X->textForm = XtVaCreateManagedWidget("textForm",
812 XmNshadowThickness, 0,
813 XmNbackground, tmp_pixelbg,
814 XmNforeground, tmp_pixelfg,
816 XtAddCallback(X->textForm, XmNhelpCallback, HelpRequestCB,
817 (XtPointer)HELP_DISPLAY) ;
819 X->modevals[(int) DISPLAYITEM] = XtVaCreateManagedWidget("display",
822 XmNtopAttachment, XmATTACH_FORM,
823 XmNrightAttachment, XmATTACH_FORM,
824 XmNbottomAttachment, XmATTACH_FORM,
825 XmNresizeWidth, TRUE,
826 XmNshadowThickness, 0,
827 XmNhighlightThickness, 0,
829 XmNverifyBell, FALSE,
830 XmNbackground, tmp_pixelbg,
831 XmNforeground, tmp_pixelfg,
833 XtAddCallback(X->modevals[(int) DISPLAYITEM], XmNhelpCallback, HelpRequestCB,
834 (XtPointer) HELP_DISPLAY) ;
835 XtAddEventHandler(X->modevals[(int) DISPLAYITEM],
836 KeyPressMask | KeyReleaseMask, FALSE, event_proc, NULL) ;
839 X->modeFrame = XtVaCreateManagedWidget("modeFrame",
842 XmNshadowThickness, 0,
845 XmNtopAttachment, XmATTACH_WIDGET,
846 XmNtopWidget, X->textFrame,
847 XmNrightAttachment, XmATTACH_FORM,
848 XmNleftAttachment, XmATTACH_FORM,
849 XmNnavigationType, XmTAB_GROUP,
851 XtAddCallback(X->modeFrame, XmNhelpCallback, HelpRequestCB,
852 (XtPointer) HELP_MODELINE) ;
854 X->modeline = XtVaCreateManagedWidget("modeline",
857 XmNshadowThickness, 0,
859 XtAddCallback(X->modeline, XmNhelpCallback, HelpRequestCB,
860 (XtPointer) HELP_MODELINE) ;
862 label_string = XmStringCreateLocalized (" ");
864 X->modevals[i] = XtVaCreateManagedWidget(mnames[i],
867 XmNtopAttachment, XmATTACH_FORM,
868 XmNrightAttachment, XmATTACH_FORM,
869 XmNrecomputeSize, False,
870 XmNalignment, XmALIGNMENT_CENTER,
871 XmNlabelString, label_string,
873 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
874 (XtPointer) HELP_MODELINE) ;
877 X->modevals[i] = XtVaCreateManagedWidget(mnames[i],
880 XmNrightAttachment, XmATTACH_WIDGET,
881 XmNrightWidget, X->modevals[(int) OPITEM],
882 XmNtopAttachment, XmATTACH_FORM,
883 XmNrecomputeSize, False,
884 XmNalignment, XmALIGNMENT_CENTER,
885 XmNlabelString, label_string,
887 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
888 (XtPointer) HELP_MODELINE) ;
891 X->modevals[i] = XtVaCreateManagedWidget(mnames[i],
894 XmNrightAttachment, XmATTACH_WIDGET,
895 XmNrightWidget, X->modevals[(int) HYPITEM],
896 XmNtopAttachment, XmATTACH_FORM,
897 XmNrecomputeSize, False,
898 XmNalignment, XmALIGNMENT_CENTER,
899 XmNlabelString, label_string,
901 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
902 (XtPointer) HELP_MODELINE) ;
903 XmStringFree(label_string);
907 modePulldown = XmCreatePulldownMenu(X->modeline, "modePD", args, 0);
909 XtSetArg(args[0], XmNmarginHeight, 0);
910 XtSetArg(args[1], XmNmarginWidth, 0);
911 val = (v->curwin << 16) +
912 menu_entries[cmenus[(int) M_MODE].mindex + 1].val ;
913 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 9, "Financial") );
914 XtSetArg(args[2], XmNlabelString, label_string);
915 XtSetArg(args[3], XmNuserData, val);
916 modeArry[0] = XmCreatePushButtonGadget(modePulldown, "fin", args, 4);
917 XmStringFree(label_string);
918 XtAddCallback(modeArry[0], XmNactivateCallback, modelineValueChanged,
921 val = (v->curwin << 16) +
922 menu_entries[cmenus[(int) M_MODE].mindex + 2].val ;
923 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 10, "Logical") );
924 XtSetArg(args[2], XmNlabelString, label_string);
925 XtSetArg(args[3], XmNuserData, val);
926 modeArry[1] = XmCreatePushButtonGadget(modePulldown, "logic", args, 4);
927 XmStringFree(label_string);
928 XtAddCallback(modeArry[1], XmNactivateCallback, modelineValueChanged,
931 val = (v->curwin << 16) +
932 menu_entries[cmenus[(int) M_MODE].mindex + 3].val ;
933 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 11, "Scientific") );
934 XtSetArg(args[2], XmNlabelString, label_string);
935 XtSetArg(args[3], XmNuserData, val);
936 modeArry[2] = XmCreatePushButtonGadget(modePulldown, "Sci", args, 4);
937 XmStringFree(label_string);
938 XtAddCallback(modeArry[2], XmNactivateCallback, modelineValueChanged,
941 XtManageChildren(modeArry, 3);
943 /* create the Option Menu and attach it to the Pulldown MenuPane */
945 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
946 XtSetArg (args[n], XmNtopWidget, X->modevals[(int)HYPITEM]); n++;
947 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
948 XtSetArg(args[n], XmNsubMenuId, modePulldown); n++;
949 XtSetArg(args[n], XmNmenuHistory, modeArry[(int)v->modetype]); n++;
950 X->modevals[i] = XmCreateOptionMenu(X->modeline, "mode", args, n);
951 XtManageChild (X->modevals[i]);
952 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
953 (XtPointer) HELP_MODE) ;
955 XtOverrideTranslations(X->modevals[i], trans_table);
957 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
958 FALSE, event_proc, NULL) ;
961 basePulldown = XmCreatePulldownMenu(X->modeline, "basePD", args, 0);
963 val = (v->curwin << 16) +
964 menu_entries[cmenus[(int) M_BASE].mindex].val ;
965 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 1, "Bin") );
966 XtSetArg(args[0], XmNmarginHeight, 0);
967 XtSetArg(args[1], XmNmarginWidth, 0);
968 XtSetArg(args[2], XmNlabelString, label_string);
969 XtSetArg(args[3], XmNuserData, val);
970 X->baseWidgArry[0] = XmCreatePushButtonGadget(basePulldown, "bin", args, 4);
971 XmStringFree(label_string);
972 XtAddCallback(X->baseWidgArry[0], XmNactivateCallback,
973 modelineValueChanged, (XtPointer) M_BASE);
975 val = (v->curwin << 16) +
976 menu_entries[cmenus[(int) M_BASE].mindex + 1].val ;
977 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 2, "Oct") );
978 XtSetArg(args[2], XmNlabelString, label_string);
979 XtSetArg(args[3], XmNuserData, val);
980 X->baseWidgArry[1] = XmCreatePushButtonGadget(basePulldown, "oct", args, 4);
981 XmStringFree(label_string);
982 XtAddCallback(X->baseWidgArry[1], XmNactivateCallback,
983 modelineValueChanged, (XtPointer) M_BASE);
985 val = (v->curwin << 16) +
986 menu_entries[cmenus[(int) M_BASE].mindex + 2].val ;
987 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 3, "Dec") );
988 XtSetArg(args[2], XmNlabelString, label_string);
989 XtSetArg(args[3], XmNuserData, val);
990 X->baseWidgArry[2] = XmCreatePushButtonGadget(basePulldown, "dec", args, 4);
991 XmStringFree(label_string);
992 XtAddCallback(X->baseWidgArry[2], XmNactivateCallback,
993 modelineValueChanged, (XtPointer) M_BASE);
995 val = (v->curwin << 16) +
996 menu_entries[cmenus[(int) M_BASE].mindex + 3].val ;
997 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 4, "Hex") );
998 XtSetArg(args[2], XmNlabelString, label_string);
999 XtSetArg(args[3], XmNuserData, val);
1000 X->baseWidgArry[3] = XmCreatePushButtonGadget(basePulldown, "hex", args, 4);
1001 XmStringFree(label_string);
1002 XtAddCallback(X->baseWidgArry[3], XmNactivateCallback,
1003 modelineValueChanged, (XtPointer) M_BASE);
1005 XtManageChildren(X->baseWidgArry, 4);
1007 /* create the Option Menu and attach it to the Pulldown MenuPane */
1009 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
1010 XtSetArg (args[n], XmNtopWidget, X->modevals[(int)HYPITEM]); n++;
1011 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
1012 XtSetArg(args[n], XmNsubMenuId, basePulldown); n++;
1013 XtSetArg(args[n], XmNmenuHistory, X->baseWidgArry[(int)v->base]); n++;
1014 X->modevals[i] = XmCreateOptionMenu(X->modeline, "base", args, n);
1015 XtManageChild (X->modevals[i]);
1016 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
1017 (XtPointer) HELP_BASE) ;
1019 XtOverrideTranslations(X->modevals[i], trans_table);
1020 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
1021 FALSE, event_proc, NULL) ;
1025 numPulldown = XmCreatePulldownMenu(X->modeline, "numPD", args, 0);
1027 val = (v->curwin << 16) +
1028 menu_entries[cmenus[(int) M_NUM].mindex].val ;
1029 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 5, "Eng") );
1030 XtSetArg(args[0], XmNmarginHeight, 0);
1031 XtSetArg(args[1], XmNmarginWidth, 0);
1032 XtSetArg(args[2], XmNlabelString, label_string);
1033 XtSetArg(args[3], XmNuserData, val);
1034 X->numWidgArry[0] = XmCreatePushButtonGadget(numPulldown, "eng", args, 4);
1035 XmStringFree(label_string);
1036 XtAddCallback(X->numWidgArry[0], XmNactivateCallback, modelineValueChanged,
1039 val = (v->curwin << 16) +
1040 menu_entries[cmenus[(int) M_NUM].mindex + 1].val ;
1041 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 6, "Fix") );
1042 XtSetArg(args[2], XmNlabelString, label_string);
1043 XtSetArg(args[3], XmNuserData, val);
1044 X->numWidgArry[1] = XmCreatePushButtonGadget(numPulldown, "fix", args, 4);
1045 XmStringFree(label_string);
1046 XtAddCallback(X->numWidgArry[1], XmNactivateCallback, modelineValueChanged,
1049 val = (v->curwin << 16) +
1050 menu_entries[cmenus[(int) M_NUM].mindex + 2].val ;
1051 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 7, "Sci") );
1052 XtSetArg(args[2], XmNlabelString, label_string);
1053 XtSetArg(args[3], XmNuserData, val);
1054 X->numWidgArry[2] = XmCreatePushButtonGadget(numPulldown, "sci", args, 4);
1055 XmStringFree(label_string);
1056 XtAddCallback(X->numWidgArry[2], XmNactivateCallback, modelineValueChanged,
1059 XtManageChildren(X->numWidgArry, 3);
1061 /* create the Option Menu and attach it to the Pulldown MenuPane */
1063 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
1064 XtSetArg (args[n], XmNtopWidget, X->modevals[(int)HYPITEM]); n++;
1065 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
1066 XtSetArg(args[n], XmNsubMenuId, numPulldown); n++;
1067 XtSetArg(args[n], XmNmenuHistory, X->numWidgArry[(int)v->dtype]); n++;
1068 X->modevals[i] = XmCreateOptionMenu(X->modeline, "num", args, n);
1069 XtManageChild (X->modevals[i]);
1070 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
1071 (XtPointer) HELP_NOTATION) ;
1073 XtOverrideTranslations(X->modevals[i], trans_table);
1074 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
1075 FALSE, event_proc, NULL) ;
1078 i = (int) TTYPEITEM;
1079 trigPulldown = XmCreatePulldownMenu(X->modeline, "trigPD", args, 0);
1081 XtSetArg(args[0], XmNmarginHeight, 0);
1082 XtSetArg(args[1], XmNmarginWidth, 0);
1083 val = (v->curwin << 16) +
1084 menu_entries[cmenus[(int) M_TRIG].mindex].val ;
1085 label_string = XmStringCreateLocalized ( ttype_str[(int) DEG] );
1086 XtSetArg(args[2], XmNlabelString, label_string);
1087 XtSetArg(args[3], XmNuserData, val);
1088 X->ttypeWidgArry[0] =
1089 XmCreatePushButtonGadget(trigPulldown, "deg", args, 4);
1090 XmStringFree(label_string);
1091 XtAddCallback(X->ttypeWidgArry[0], XmNactivateCallback,
1092 modelineValueChanged, (XtPointer) M_TRIG);
1094 val = (v->curwin << 16) +
1095 menu_entries[cmenus[(int) M_TRIG].mindex + 1].val ;
1096 label_string = XmStringCreateLocalized ( ttype_str[(int) GRAD] );
1097 XtSetArg(args[2], XmNlabelString, label_string);
1098 XtSetArg(args[3], XmNuserData, val);
1099 X->ttypeWidgArry[1] =
1100 XmCreatePushButtonGadget(trigPulldown, "grd", args, 4);
1101 XmStringFree(label_string);
1102 XtAddCallback(X->ttypeWidgArry[1], XmNactivateCallback,
1103 modelineValueChanged, (XtPointer) M_TRIG);
1105 val = (v->curwin << 16) +
1106 menu_entries[cmenus[(int) M_TRIG].mindex + 2].val ;
1107 label_string = XmStringCreateLocalized ( ttype_str[(int) RAD] );
1108 XtSetArg(args[2], XmNlabelString, label_string);
1109 XtSetArg(args[3], XmNuserData, val);
1110 X->ttypeWidgArry[2] =
1111 XmCreatePushButtonGadget(trigPulldown, "rad", args, 4);
1112 XmStringFree(label_string);
1113 XtAddCallback(X->ttypeWidgArry[2], XmNactivateCallback,
1114 modelineValueChanged, (XtPointer) M_TRIG);
1116 XtManageChildren(X->ttypeWidgArry, 3);
1118 /* create the Option Menu and attach it to the Pulldown MenuPane */
1120 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
1121 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
1122 XtSetArg (args[n], XmNtopWidget, X->modevals[(int) HYPITEM]); n++;
1123 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
1124 XtSetArg(args[n], XmNsubMenuId, trigPulldown); n++;
1125 XtSetArg(args[n], XmNmenuHistory, X->ttypeWidgArry[(int)v->ttype]); n++;
1126 X->modevals[i] = XmCreateOptionMenu(X->modeline, "trig", args, n);
1127 XtManageChild (X->modevals[i]);
1128 XtAddCallback(X->modevals[i], XmNhelpCallback, HelpRequestCB,
1129 (XtPointer) HELP_TRIG) ;
1131 XtOverrideTranslations(X->modevals[i], trans_table);
1132 XtSetSensitive(X->modevals[i], True);
1134 XtSetArg (args[0], XmNrightAttachment, XmATTACH_WIDGET);
1135 XtSetArg (args[1], XmNrightWidget, X->modevals[(int)BASEITEM]);
1136 XtSetValues (X->modevals[(int)MODEITEM], args, 2);
1138 XtSetArg (args[0], XmNrightAttachment, XmATTACH_WIDGET);
1139 XtSetArg (args[1], XmNrightWidget, X->modevals[(int)NUMITEM]);
1140 XtSetValues (X->modevals[(int)BASEITEM], args, 2);
1142 XtSetArg (args[0], XmNrightAttachment, XmATTACH_WIDGET);
1143 XtSetArg (args[1], XmNrightWidget, X->modevals[(int)TTYPEITEM]);
1144 XtSetValues (X->modevals[(int)NUMITEM], args, 2);
1147 XtAddEventHandler(X->modevals[i], KeyPressMask | KeyReleaseMask,
1148 FALSE, event_proc, NULL) ;
1155 confirm_callback(Widget widget, XtPointer client_data, XtPointer call_data)
1162 create_cfframe(void) /* Create auxiliary frame for CON/FUN key. */
1167 Widget sep, frame, form;
1168 XmString label_string;
1170 X->CFframe = (Widget) XmCreateFormDialog(X->kframe, "cfframe", NULL, 0) ;
1171 tstr = XmStringCreateLocalized(lstrs[(int) L_NEWCON]) ;
1172 XtVaSetValues(X->CFframe,
1173 XmNdialogTitle, tstr,
1174 XmNautoUnmanage, FALSE,
1175 XmNallowShellResize, FALSE,
1176 XmNdefaultPosition, FALSE,
1178 XmStringFree(tstr) ;
1180 /* Adjust the decorations for the dialog shell of the dialog */
1182 XtSetArg (args[j], XmNmwmFunctions, MWM_FUNC_MOVE); j++;
1183 XtSetArg (args[j], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE); j++;
1184 XtSetValues (XtParent(X->CFframe), args, j);
1186 frame = (Widget) XmCreateFrame(X->CFframe, "frame", NULL, 0) ;
1187 XtManageChild(frame);
1188 form = (Widget) XmCreateForm(frame, "form", NULL, 0) ;
1189 XtManageChild(form);
1192 X->CFpi_cftext = make_textW(form, lstrs[(int) L_CONNO]) ;
1193 X->CFpi_dtext = make_textW(form, lstrs[(int) L_DESC]) ;
1194 X->CFpi_vtext = make_textW(form, lstrs[(int) L_VALUE]) ;
1197 XtSetArg (args[j], XmNtopAttachment, XmATTACH_FORM); j++;
1198 XtSetArg (args[j], XmNtopOffset, 5); j++;
1199 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1200 XtSetArg (args[j], XmNrightOffset, 5); j++;
1201 XtSetValues(X->CFpi_cftext->manager, args, j);
1204 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1205 XtSetArg (args[j], XmNtopWidget, X->CFpi_cftext->manager); j++;
1206 XtSetArg (args[j], XmNtopOffset, 5); j++;
1207 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1208 XtSetArg (args[j], XmNrightOffset, 5); j++;
1209 XtSetValues(X->CFpi_dtext->manager, args, j);
1212 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1213 XtSetArg (args[j], XmNtopWidget, X->CFpi_dtext->manager); j++;
1214 XtSetArg (args[j], XmNtopOffset, 5); j++;
1215 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1216 XtSetArg (args[j], XmNrightOffset, 5); j++;
1217 XtSetValues(X->CFpi_vtext->manager, args, j);
1220 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1221 XtSetArg (args[j], XmNtopWidget, X->CFpi_vtext->manager); j++;
1222 XtSetArg (args[j], XmNtopOffset, 3); j++;
1223 XtSetArg (args[j], XmNleftAttachment, XmATTACH_FORM); j++;
1224 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1225 sep = XmCreateSeparator(form, "sep", args, j);
1229 label_string = XmStringCreateLocalized ( GETMESSAGE(4, 4, "OK") );
1230 XtSetArg (args[j], XmNmarginHeight, 2); j++;
1231 XtSetArg (args[j], XmNmarginWidth, 15); j++;
1232 XtSetArg (args[j], XmNlabelString, label_string); j++;
1233 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1234 XtSetArg (args[j], XmNtopWidget, sep); j++;
1235 XtSetArg (args[j], XmNtopOffset, 5); j++;
1236 XtSetArg (args[j], XmNleftAttachment, XmATTACH_FORM); j++;
1237 XtSetArg (args[j], XmNleftOffset, 15); j++;
1238 XtSetArg (args[j], XmNbottomAttachment, XmATTACH_FORM); j++;
1239 XtSetArg (args[j], XmNbottomOffset, 5); j++;
1240 XtSetArg (args[j], XmNshowAsDefault, True); j++;
1241 XtSetArg (args[j], XmNtraversalOn, True); j++;
1242 X->CFpi_butOK = XmCreatePushButton(form, "button", args, j);
1243 XmStringFree(label_string);
1244 XtManageChild(X->CFpi_butOK);
1247 label_string = XmStringCreateLocalized ( GETMESSAGE(3, 361, "Cancel") );
1248 XtSetArg (args[j], XmNmarginHeight, 2); j++;
1249 XtSetArg (args[j], XmNmarginWidth, 10); j++;
1250 XtSetArg (args[j], XmNlabelString, label_string); j++;
1251 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1252 XtSetArg (args[j], XmNtopWidget, sep); j++;
1253 XtSetArg (args[j], XmNtopOffset, 10); j++;
1254 XtSetArg (args[j], XmNleftAttachment, XmATTACH_WIDGET); j++;
1255 XtSetArg (args[j], XmNleftWidget, X->CFpi_butOK); j++;
1256 XtSetArg (args[j], XmNleftOffset, 33); j++;
1257 XtSetArg (args[j], XmNbottomAttachment, XmATTACH_FORM); j++;
1258 XtSetArg (args[j], XmNbottomOffset, 10); j++;
1259 XtSetArg (args[j], XmNtraversalOn, True); j++;
1260 X->CFpi_butClose = XmCreatePushButton(form, "button", args, j);
1261 XmStringFree(label_string);
1262 XtManageChild(X->CFpi_butClose);
1265 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
1266 XtSetArg (args[j], XmNmarginHeight, 2); j++;
1267 XtSetArg (args[j], XmNmarginWidth, 10); j++;
1268 XtSetArg (args[j], XmNlabelString, label_string); j++;
1269 XtSetArg (args[j], XmNtopAttachment, XmATTACH_WIDGET); j++;
1270 XtSetArg (args[j], XmNtopWidget, sep); j++;
1271 XtSetArg (args[j], XmNtopOffset, 10); j++;
1272 XtSetArg (args[j], XmNrightAttachment, XmATTACH_FORM); j++;
1273 XtSetArg (args[j], XmNrightOffset, 15); j++;
1274 XtSetArg (args[j], XmNleftAttachment, XmATTACH_WIDGET); j++;
1275 XtSetArg (args[j], XmNleftWidget, X->CFpi_butClose); j++;
1276 XtSetArg (args[j], XmNleftOffset, 33); j++;
1277 XtSetArg (args[j], XmNbottomAttachment, XmATTACH_FORM); j++;
1278 XtSetArg (args[j], XmNbottomOffset, 10); j++;
1279 XtSetArg (args[j], XmNtraversalOn, True); j++;
1280 X->CFpi_butHelp = XmCreatePushButton(form, "button", args, j);
1281 XmStringFree(label_string);
1282 XtManageChild(X->CFpi_butHelp);
1284 XtAddCallback(X->CFpi_butOK, XmNactivateCallback, write_cf_value,
1285 (XtPointer) X->CFpi_butOK) ;
1286 XtAddCallback(X->CFpi_butClose, XmNactivateCallback, close_cf,
1289 XtAddCallback(X->CFpi_cftext->textfield, XmNactivateCallback, move_cf,
1290 (XtPointer) X->CFpi_butOK) ;
1291 XtAddCallback(X->CFpi_dtext->textfield, XmNactivateCallback, move_cf,
1292 (XtPointer) X->CFpi_butOK) ;
1293 XtAddCallback(X->CFpi_vtext->textfield, XmNactivateCallback, move_cf,
1294 (XtPointer) X->CFpi_butOK) ;
1296 XtAddCallback(X->CFpi_cftext->textfield, XmNfocusCallback, FocusInCB,
1298 XtAddCallback(X->CFpi_dtext->textfield, XmNactivateCallback, FocusInCB,
1301 XtSetArg (args[j], XmNcancelButton, X->CFpi_butClose); j++;
1302 XtSetValues (X->CFframe, args, j);
1305 XtSetArg (args[j], XmNdefaultButton, X->CFpi_butOK); j++;
1306 XtSetValues (form, args, j);
1308 /* Make the first prompt automatically get the focus. */
1309 XmProcessTraversal(X->CFpi_cftext->textfield, XmTRAVERSE_CURRENT);
1313 /* Create popup menu for dtcalc button. */
1315 create_menu(enum menu_type mtype, Widget button, int n)
1317 char *mstr, *tmpStr, *ptr ;
1321 Boolean isAFunction = False;
1323 if ((mtype != M_CON && mtype != M_FUN) &&
1324 X->menus[(int) mtype] != NULL) return ; /* Already created? */
1326 X->menus[(int) mtype] = menu = XmCreatePopupMenu(button,
1329 X->mrec[(int) mtype] = n ;
1331 XtCreateManagedWidget(cmenus[(int) mtype].title, xmLabelWidgetClass,
1333 XtCreateManagedWidget("separator", xmSeparatorWidgetClass, menu, NULL, 0) ;
1334 XtCreateManagedWidget("separator", xmSeparatorWidgetClass, menu, NULL, 0) ;
1337 for (i = 0; i < cmenus[(int) mtype].total; i++)
1342 case M_CON : if (strlen(v->con_names[i])) /* Constants. */
1343 mstr = v->con_names[i] ;
1346 case M_FUN : if (strlen(v->fun_names[i])) /* Functions. */
1349 mstr = v->fun_names[i] ;
1353 default : mstr = menu_entries[cmenus[(int) mtype].mindex + i].str ;
1358 tmpStr = GETMESSAGE(3, 45, ".");
1359 if(strcmp(tmpStr, ".") != 0)
1361 /* if it's not a "." let's go change it to what it should be */
1362 ptr = DtStrchr(mstr, '.');
1366 mi = XtCreateManagedWidget(mstr, xmPushButtonWidgetClass,
1368 val = (v->curwin << 16) +
1369 menu_entries[cmenus[(int) mtype].mindex + i].val ;
1370 XtAddCallback(mi, XmNactivateCallback, menu_proc, (XtPointer) val) ;
1373 if( !isAFunction && mtype == M_FUN)
1375 mi = XtCreateManagedWidget(GETMESSAGE(2, 35, "No Functions Defined"),
1376 xmPushButtonWidgetClass, menu, NULL, 0) ;
1383 do_button(Widget widget, XtPointer client_data, XtPointer call_data)
1388 intptr_t n = ((intptr_t) client_data) & 0xFFFF ;
1390 XtSetArg(args[0], XmNlabelString, &cstr);
1391 XtGetValues(X->modevals[OPITEM], args, 1);
1393 str = (char *) _XmStringUngenerate(cstr,
1394 XmFONTLIST_DEFAULT_TAG,
1395 XmCHARSET_TEXT, XmCHARSET_TEXT);
1397 if(strcmp(vstrs[(int) V_CLR], str) == 0 &&
1398 (buttons[n].value != KEY_CLR && buttons[n].value != KEY_QUIT))
1404 ProcessMotifSelection(X->modevals[(int) DISPLAYITEM]);
1405 v->curwin = ((intptr_t) client_data) >> 16 ;
1408 v->current = buttons[n].value ;
1411 else if (n >= 0 && n <= NOBUTTONS) process_item(n) ;
1418 do_continue_notice(Widget parent, char *str)
1420 XmString contstr, message, cstr ;
1423 X->notice = (Widget) XmCreateInformationDialog(X->kframe, "continue",
1425 contstr = XmStringCreateLocalized(vstrs[(int) V_CONTINUE]) ;
1426 message = XmStringCreateLocalized( str );
1427 XtVaSetValues(X->notice,
1428 XmNautoUnmanage, FALSE,
1429 XmNcancelLabelString, contstr,
1430 XmNmessageString, message,
1431 XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL,
1433 XmStringFree(contstr) ;
1434 XmStringFree(message) ;
1435 XtUnmanageChild((Widget) XmMessageBoxGetChild(X->notice,
1436 XmDIALOG_OK_BUTTON)) ;
1437 XtUnmanageChild((Widget) XmMessageBoxGetChild(X->notice,
1438 XmDIALOG_HELP_BUTTON)) ;
1440 tmpStr = GETMESSAGE(2, 36, "Continue Notice");
1441 cstr = XmStringCreateLocalized(tmpStr) ;
1442 XtVaSetValues(X->notice, XmNdialogTitle, cstr, NULL) ;
1443 XmStringFree(cstr) ;
1445 XtManageChild(X->notice) ;
1451 do_confirm_notice(Widget parent, char *str)
1453 XmString confirm, cancel, message, cstr ;
1457 X->notice = (Widget) XmCreateInformationDialog(X->kframe, "continue",
1459 confirm = XmStringCreateLocalized(vstrs[(int) V_CONFIRM]) ;
1460 cancel = XmStringCreateLocalized(vstrs[(int) V_CANCEL]) ;
1461 message = XmStringCreateLocalized( str );
1462 XtVaSetValues(X->notice,
1463 XmNautoUnmanage, FALSE,
1464 XmNcancelLabelString, cancel,
1465 XmNokLabelString, confirm,
1466 XmNmessageString, message,
1467 XmNdialogStyle, XmDIALOG_APPLICATION_MODAL,
1469 XmStringFree(confirm) ;
1470 XmStringFree(cancel) ;
1471 XmStringFree(message) ;
1472 XtUnmanageChild((Widget) XmMessageBoxGetChild(X->notice,
1473 XmDIALOG_HELP_BUTTON)) ;
1474 XtAddCallback(X->notice, XmNokCallback, confirm_callback, NULL) ;
1476 tmpStr = GETMESSAGE(2, 37, "Confirmation Notice");
1477 cstr = XmStringCreateLocalized(tmpStr) ;
1478 XtVaSetValues(X->notice, XmNdialogTitle, cstr, NULL) ;
1479 XmStringFree(cstr) ;
1481 XtManageChild(X->notice) ;
1488 close_reg(Widget widget, XtPointer client_data, XtPointer call_data)
1490 intptr_t type = (intptr_t)client_data;
1494 XtUnmanageChild(X->rframe);
1495 XtUnmapWidget(XtParent(X->rframe));
1500 XtUnmanageChild(X->frframe);
1501 XtUnmapWidget(XtParent(X->frframe));
1509 * This routine causes the calculator buttons to looked depressed (armed)
1510 * and undepressed (disarmed) when the user uses the keyboard to select a
1511 * button on the keyboard. It's pretty straight forward:
1512 * The user pressess a key from the keyboard
1513 * The routine event_proc() gets called.
1514 * It determines whether the key from the keyboard is a valid key.
1515 * If it is, it sends that key to process_event()
1516 * This routines then determines whether the key is an active key.
1517 * If it is then it calls this routine to set the key to either armed
1518 * or disarmed. This state is determined by whether it is a keyboard
1519 * up event or a keyboard down event.
1520 * There is some special case code in here also. There was a bug where
1521 * if a user pressed a CNTL character key, the event order could cause
1522 * the key to stay depressed. The typical order is:
1527 * When this typical order was pressed things worked fine. But the problem
1528 * arose when the order was:
1533 * The problem was that when the last "KEY key up" was processed it is not
1534 * recognized as a control key, so the calculator thought is was a "normal"
1535 * key and disarmed that "normal" key button rather then the Control
1536 * key button. This is what the lastArmed and count static variables are
1537 * used for. They check to see if the last "KEY key up" corresponds to
1538 * the last "Control key down" button that was armed. If it doesn't then
1539 * we know we need to disarm the "Control key" button rather then the
1540 * "normal" button that was passed in.
1544 draw_button(int n, enum fcp_type fcptype, int row, int column, int inverted)
1548 int i, j, row2, column2;
1552 widget = X->kbuttons[row][column] ;
1553 lastArmed[countArmed] = n;
1560 for(i = 0; i < countArmed; i++)
1562 if(lastArmed[i] == n)
1565 if(countArmed == i && countArmed != 0)
1568 row2 = lastArmed[i] / MAXCOLS ;
1569 column2 = lastArmed[i] - (row2 * MAXCOLS) ;
1570 widget = X->kbuttons[row2][column2] ;
1571 for(j = i; j < countArmed; j++)
1572 lastArmed[j] = lastArmed[j + 1];
1579 strcpy(str, "Disarm");
1581 /* go call the correct arm/disarm function from Motif */
1582 XtCallActionProc(widget, str, X->event, NULL, 0) ;
1588 event_is_keypad(XEvent *xevent)
1590 if (xevent->type != KeyPress && xevent->type != KeyRelease) return(0) ;
1591 return(X->kparray[xevent->xkey.keycode - X->kcmin] > 0) ;
1597 * This routine is called any time a key on the keyboard is pressed. It
1598 * then determines whether the key is a valid key or whether it is to
1599 * be ignore. If it is a valid key it passes it on to be processed.
1604 event_proc(Widget widget, XtPointer client_data, XEvent *event, Boolean *continue_to_dispatch)
1611 static char count = 0;
1613 /* If the ASCII convert dialog, or the Help dialog
1614 is up and managed, we don't want the keystrokes to go to the calculator
1615 main, just those dialogs
1616 if ((X->Aframe != NULL && XtIsManaged(X->Aframe)) ||
1617 (X->helpDialog != NULL && X->helpMapped))
1629 ignore_event = False;
1630 XtRemoveTimeOut(timerId);
1636 v->event_type = get_next_event(widget, 0, event) ;
1638 /* first check to see if there is an error condition, if there is we
1639 want to beep and return.
1642 XtSetArg(args[0], XmNlabelString, &label);
1643 XtGetValues(X->modevals[OPITEM], args, 1);
1645 str = (char *) _XmStringUngenerate(label,
1646 XmFONTLIST_DEFAULT_TAG,
1647 XmCHARSET_TEXT, XmCHARSET_TEXT);
1649 if(strcmp(vstrs[(int) V_CLR], str) == 0 &&
1650 (v->cur_ch != KEY_CLR && v->cur_ch != KEY_QUIT))
1652 if(v->event_type == KEYBOARD_DOWN)
1656 index = get_index(v->cur_ch);
1658 draw_button(index, v->curwin, v->row, v->column, FALSE);
1663 /* Now lets check to see if the input was for the Constants/Functions
1664 dialog. If it was process it.
1666 if(X->CFframe != NULL && XtIsManaged(X->CFframe))
1668 w = XmGetFocusWidget(X->CFframe);
1669 if(w == X->CFpi_butOK)
1671 if(v->cur_ch == KEY_EQ)
1673 XtCallCallbacks(X->CFpi_butOK, XmNarmCallback, (XtPointer) NULL);
1674 XtCallCallbacks(X->CFpi_butOK, XmNactivateCallback,
1677 if(v->event_type == ARROW || v->event_type == TAB)
1679 XtSetArg(args[0], XmNdefaultButton, X->CFpi_butOK);
1680 XtSetValues(X->CFframe, args, 1);
1685 else if(w == X->CFpi_butClose)
1687 if(v->cur_ch == KEY_EQ)
1689 XtCallCallbacks(X->CFpi_butClose, XmNarmCallback, (XtPointer) NULL);
1690 XtCallCallbacks(X->CFpi_butClose, XmNactivateCallback,
1693 if(v->event_type == ARROW || v->event_type == TAB)
1695 XtSetArg(args[0], XmNdefaultButton, NULL);
1696 XtSetValues(X->CFframe, args, 1);
1701 else if(w == X->CFpi_butHelp)
1703 if(v->cur_ch == KEY_EQ)
1705 XtCallCallbacks(X->CFpi_butHelp, XmNarmCallback, (XtPointer) NULL);
1706 XtCallCallbacks(X->CFpi_butHelp, XmNactivateCallback,
1707 (XtPointer) HELP_CONSTANT);
1709 if(v->event_type == ARROW || v->event_type == TAB)
1711 XtSetArg(args[0], XmNdefaultButton, NULL);
1712 XtSetValues(X->CFframe, args, 1);
1719 index = get_index(v->cur_ch);
1720 if (index != TITEMS)
1721 draw_button(index, v->curwin, v->row, v->column, FALSE);
1723 /* don't worry about this if there is something pending */
1724 if (v->pending == 0) {
1725 /* if the key is an "inactive" key (i.e. desensitized) then we want to
1730 if(v->cur_ch == KEY_2 ||
1731 v->cur_ch == KEY_3 ||
1732 v->cur_ch == KEY_4 ||
1733 v->cur_ch == KEY_5 ||
1734 v->cur_ch == KEY_6 ||
1737 /* intentional fall through */
1739 if(v->cur_ch == KEY_8 ||
1742 /* intentional fall through */
1744 if(v->cur_ch == KEY_A ||
1745 v->cur_ch == KEY_B ||
1746 v->cur_ch == KEY_C ||
1747 v->cur_ch == KEY_D ||
1748 v->cur_ch == KEY_E ||
1751 /* intentional fall through */
1752 default: /* HEX, allow all keys */
1757 /* finally, check to see if it is a key we wish to ignore and motif
1760 if(v->event_type == F4_PRESS || v->event_type == ARROW ||
1761 v->event_type == TAB || v->event_type == CONTROL ||
1762 v->event_type == SHIFT || v->event_type == SPACE ||
1763 v->event_type == ESCAPE || v->event_type == META || v->event_type == ALT)
1765 else if(v->event_type == NUM_LOCK)
1767 v->num_lock = !v->num_lock;
1769 else if (v->cur_ch == CTL('/'))
1773 ProcessMotifSelection(X->modevals[(int) DISPLAYITEM]);
1774 process_event(v->event_type);
1778 if (v->num_lock == True)
1780 draw_button(0, v->curwin, 0, 0, TRUE);
1786 /* ------------------------------------------------------------- */
1787 /* Primarily handles the selection in the display text widget. */
1788 /* Update the display before the event is processed for dtcalc. */
1789 /* ------------------------------------------------------------- */
1792 ProcessMotifSelection(Widget W)
1797 char *display = NULL;
1798 XmTextPosition left, right;
1800 if (XmTextGetSelectionPosition (W, &left, &right) == True)
1803 display = XmTextGetString(W);
1805 bound = ( (long)strlen(display) - right + 1);
1807 for (i = 0; i < bound; i++)
1809 display[i+left] = display[i+right];
1812 index = get_index(v->cur_ch);
1813 key = buttons[index].value;
1815 /* ------------------------------------------------------------ */
1816 /* Append an extra character to be handled by do_delete func. */
1817 /* ------------------------------------------------------------ */
1822 display[i+1] = '\0';
1825 STRCPY(v->display, display);
1835 frame_interpose(Widget widget, XtPointer clientData, XEvent *event, Boolean *continue_to_dispatch)
1837 if (!v->started) return ;
1838 if (event->type == MapNotify)
1840 if (v->rstate) win_display(FCP_REG, TRUE) ;
1841 else if (v->frstate) win_display(FCP_FIN_REG, TRUE) ;
1844 else if (event->type == UnmapNotify) v->iconic = TRUE ;
1850 get_next_event(Widget widget, int ev_action, XEvent *xevent)
1852 char *tmpStr, chs[2] ;
1853 int cval = 0, down, nextc, up ;
1855 XKeyPressedEvent *key_event ;
1857 if (!v->started) return(LASTEVENTPLUSONE) ;
1858 nextc = xevent->type ;
1860 down = xevent->type == ButtonPress || xevent->type == KeyPress ;
1861 up = xevent->type == ButtonRelease || xevent->type == KeyRelease ;
1863 if (nextc == KeyPress || nextc == KeyRelease)
1865 key_event = (XKeyPressedEvent *) xevent ;
1866 chs[0] = chs[1] = (char)0;
1868 * If the user enters a multibyte character, XLookupString()
1869 * will return zero because it only handles Latin-1 characters.
1870 * We can just return then because we're only looking for
1871 * Latin-1 characters anyway (see CDExc15419).
1873 if (!XLookupString(key_event, chs, 1, &ksym,
1874 (XComposeStatus *) NULL))
1876 if (key_event->keycode == NUM_LOCK)
1879 return(LASTEVENTPLUSONE);
1883 Here's how the fix solves the problem:
1885 When you press ctrl-space, the input method converts your composed
1886 input to a Kanji character and sends a keyboard event to dtcalc with
1887 a keycode of 0. The keycode of 0 is the X convention that the
1888 application should call XmbLookupString() to get the Kanji character
1889 from the input method.
1891 dtcalc calls XLookupString() instead though, which being a much older
1892 interface, doesn't know about this convention. XLookupString() isn't
1893 able to map the keycode to anything and just returns 0.
1895 The fix catches this and returns immediately. Otherwise, the code
1896 would go on to call event_is_keypad() to see if the event was a keypad
1897 event like '+', '=', etc. That function would core dump at the
1898 following line because of the negative array index:
1900 return(X->kparray[xevent->xkey.keycode - X->kcmin] > 0) ;
1902 Returning immediately from get_next_event() avoids the core dump and
1903 doesn't hurt anything because dtcalc doesn't actually use any Kanji
1904 characters for its keypad characters, just ASCII ones.
1906 An alternative fix would be to use XmbLookupString() instead of
1907 XLookupString(). That fix would be more complex though, and as
1908 CDExc15419 points out, XLookupString() is fine here (as long as you
1909 check its return value).
1913 XLookupString(key_event, chs, 1, &ksym, (XComposeStatus *) NULL) ;
1915 if (ksym == XK_F4 && down) return(F4_PRESS) ;
1916 else if (ksym == XK_F4 && up) return(F4_PRESS) ;
1917 else if (ksym == XK_Right && down)
1919 if (!event_is_keypad(xevent))
1922 else if (ksym == XK_Left && down)
1924 if (!event_is_keypad(xevent))
1927 else if (ksym == XK_Up && down)
1929 if (!event_is_keypad(xevent))
1932 else if (ksym == XK_Down && down)
1934 if (!event_is_keypad(xevent))
1937 else if (ksym == XK_F10 && down) return(F4_PRESS);
1938 else if (ksym == XK_F10 && up) return(F4_PRESS);
1939 else if (ksym == XK_Tab && down) return(TAB);
1940 else if (ksym == XK_Tab && up) return(TAB);
1941 else if (ksym == XK_Return && down) cval = KEY_EQ;
1942 else if (ksym == XK_Return && up) cval = KEY_EQ;
1943 else if (ksym == XK_Escape && down) return(ESCAPE);
1944 else if (ksym == XK_Escape && up) return(ESCAPE);
1945 else if (ksym == XK_Control_L && down) return(CONTROL);
1946 else if (ksym == XK_Control_L && up) return(CONTROL);
1947 else if (ksym == XK_Control_R && down) return(CONTROL);
1948 else if (ksym == XK_Control_R && up) return(CONTROL);
1949 else if (ksym == XK_Meta_L && down) return(META);
1950 else if (ksym == XK_Meta_L && up) return(META);
1951 else if (ksym == XK_Meta_R && down) return(META);
1952 else if (ksym == XK_Meta_R && up) return(META);
1953 else if (ksym == XK_Alt_L && down) return(ALT);
1954 else if (ksym == XK_Alt_L && up) return(ALT);
1955 else if (ksym == XK_Alt_R && down) return(ALT);
1956 else if (ksym == XK_Alt_R && up) return(ALT);
1957 else if (ksym == XK_Select && down) return(SPACE);
1958 else if (ksym == XK_Select && up) return(SPACE);
1959 else if (ksym == XK_space && down) return(SPACE);
1960 else if (ksym == XK_space && up) return(SPACE);
1961 else if (ksym == XK_Shift_L || ksym == XK_Shift_R)
1962 return(LASTEVENTPLUSONE) ;
1963 else cval = chs[0] ;
1966 tmpStr = GETMESSAGE(3, 45, ".");
1967 if (event_is_keypad(xevent))
1971 * In keypad_keysym(), KeySym associated with xevent->xkey.keycode
1972 * is extracted by calling XKeycodeToKeysym(). But the current
1973 * implementation doesn't care of the modifires state. In this moment,
1974 * we can still use ksym which is got in the above XLookupString().
1975 * Sun's implementation seems to need an attention for this. But AIX
1977 * Still JP kbd NumLock state cannot be handled correctly.
1981 switch (keypad_keysym(xevent))
1984 case XK_KP_0 : v->cur_ch = '0' ;
1986 case XK_KP_1 : v->cur_ch = '1' ;
1988 case XK_KP_2 : v->cur_ch = '2' ;
1990 case XK_KP_3 : v->cur_ch = '3' ;
1992 case XK_KP_4 : v->cur_ch = '4' ;
1994 case XK_KP_5 : v->cur_ch = '5' ;
1996 case XK_KP_6 : v->cur_ch = '6' ;
1998 case XK_KP_7 : v->cur_ch = '7' ;
2000 case XK_KP_8 : v->cur_ch = '8' ;
2002 case XK_KP_9 : v->cur_ch = '9' ;
2004 case XK_KP_Add : v->cur_ch = '+' ;
2006 case XK_KP_Subtract : v->cur_ch = '-' ;
2008 case XK_KP_Multiply : v->cur_ch = 'x' ;
2010 case XK_KP_Divide : v->cur_ch = '/' ;
2013 case XK_KP_Enter : v->cur_ch = '=' ;
2015 case XK_KP_Decimal : v->cur_ch = tmpStr[0] ;
2017 if (down) return(KEYBOARD_DOWN) ;
2018 else if (up) return(KEYBOARD_UP) ;
2020 else if ((nextc == KeyPress || nextc == KeyRelease) &&
2021 (IS_KEY(cval, KEY_BSP) || IS_KEY(cval, KEY_CLR)))
2023 v->cur_ch = cval ; /* Delete and Back Space keys. */
2024 if (down) return(KEYBOARD_DOWN) ;
2025 else if (up) return(KEYBOARD_UP) ;
2028 if ((nextc == KeyPress || nextc == KeyRelease) && cval >= 0 && cval <= 127)
2031 /* If this is a '*' or Return key press, then map to their better known
2032 * equivalents, so that button highlighting works correctly.
2035 if (cval == '*') cval = KEY_MUL ;
2037 /* All the rest of the ASCII characters. */
2040 if (down) return(KEYBOARD_DOWN) ;
2041 else if (up) return(KEYBOARD_UP) ;
2044 return(LASTEVENTPLUSONE) ;
2048 /* Get dtcalc resource from merged database. */
2050 get_resource(enum res_type rtype)
2054 STRCPY(str, calc_res[(int) rtype]) ;
2055 return(ds_get_resource(X->rDB, v->appname, str)) ;
2060 grey_button(int row, int column, int state)
2062 XtSetSensitive(X->kbuttons[row][column], !state) ;
2069 char *tmpStr, *tmpStr1;
2071 tmpStr = GETMESSAGE(2, 12, "Calculator");
2072 tmpStr1 = XtNewString(tmpStr);
2073 XtVaSetValues(X->kframe,
2074 XmNiconName, tmpStr1,
2077 dtcalc_kpanel_create(X->kframe) ;
2078 dtcalc_kkeyboard_create(X->kpanel) ;
2080 XtSetMappedWhenManaged(X->kframe, False);
2081 XtRealizeWidget(X->kframe) ;
2082 XSync(X->dpy, False);
2084 XtSetMappedWhenManaged(X->kframe, True);
2085 XtMapWidget( X->kframe );
2086 XSync(X->dpy, False);
2096 is_window_showing(Widget widget)
2098 return(XtIsManaged(widget)) ;
2109 XDisplayKeycodes(X->dpy, &X->kcmin, &X->kcmax) ;
2110 tmp = XGetKeyboardMapping(X->dpy, X->kcmin, 1, &X->keysyms_per_key) ;
2111 XFree((char *) tmp) ;
2113 X->kparray = (unsigned char *) malloc(X->kcmax - X->kcmin + 1) ;
2115 /* For each key, run through its list of keysyms. If this keysym is a
2116 * keypad keysym, we know this key is on the keypad. Mark it as such in
2120 for (i = X->kcmin; i <= X->kcmax; ++i)
2122 X->kparray[i - X->kcmin] = 0 ;
2123 for (j = 0; j < X->keysyms_per_key; ++j)
2125 ks = XkbKeycodeToKeysym(X->dpy, i, j) ;
2126 if (IsKeypadKey(ks))
2128 X->kparray[i - X->kcmin] = 1 ;
2137 keypad_keysym(XEvent *xevent)
2140 int keycode = xevent->xkey.keycode ;
2143 for (i = 0; i < X->keysyms_per_key; ++i)
2145 ks = XkbKeycodeToKeysym(X->dpy, keycode, i) ;
2146 if (IsKeypadKey(ks))
2149 if(ks != XK_KP_Insert)
2158 load_resources(void)
2160 X->rDB = ds_load_resources(X->dpy) ;
2167 char *tool_label = NULL ;
2170 if (v->titleline == NULL)
2172 tool_label = (char *) calloc(1, strlen(lstrs[(int) L_UCALC]) + 3);
2174 SPRINTF(tool_label, "%s", lstrs[(int) L_UCALC]);
2176 else read_str(&tool_label, v->titleline) ;
2178 X->clipboard = XInternAtom(X->dpy, "CLIPBOARD", FALSE) ;
2179 X->length_atom = XInternAtom(X->dpy, "LENGTH", FALSE) ;
2180 XtAddEventHandler(X->kframe, StructureNotifyMask, FALSE,
2181 frame_interpose, NULL) ;
2182 XtVaSetValues(X->kframe,
2183 XmNtitle, tool_label,
2186 XtVaGetValues(X->kframe,
2190 if(v->titleline == NULL)
2195 make_modewin(void) /* Draw special mode frame plus buttons. */
2197 switch_mode(v->modetype) ;
2200 /* Calculate memory register frame values. */
2202 make_registers(int type)
2204 char line[MAXLINE] ; /* Current memory register line. */
2205 char *ptr, *tmp, *tmpStr;
2208 XmString str, numStr ;
2209 int MPtemp[MP_SIZE];
2213 if (!v->rstate) return ;
2215 else if(type == FIN)
2217 if (!v->frstate) return ;
2220 dtcalc_initialize_rframe(X->kframe, type) ;
2222 tmpStr = GETMESSAGE(3, 45, ".");
2225 for (i = 0; i < MAXREGS; i++)
2227 SPRINTF(line, "%s: %s", menu_entries[i + 10].str,
2228 make_number(v->MPmvals[i], FALSE)) ;
2231 /* if it's not a "." let's go change it to what it should be */
2232 ptr = DtStrrchr(line, '.');
2236 str = XmStringCreateLocalized(line) ;
2237 XtVaSetValues(X->registers[i], XmNlabelString, str, NULL) ;
2243 for (i = 0; i < FINREGS; i++)
2247 mpcdm(&(v->MPfvals[i]), MPtemp);
2248 tmp = make_number(MPtemp, FALSE);
2249 ptr = DtStrchr(tmp, 'e');
2252 ptr = DtStrchr(tmp, '.');
2255 ptr = DtStrchr(tmp, ',');
2266 savAcc = v->accuracy;
2268 mpcdm(&(v->MPfvals[i]), MPtemp);
2269 tmp = make_number(MPtemp, FALSE);
2270 v->accuracy = savAcc;
2275 mpcdm(&(v->MPfvals[i]), MPtemp);
2276 tmp = make_number(MPtemp, FALSE);
2278 if(strcmp(tmpStr, ".") != 0)
2280 /* if it's not a "." let's go change it to what it should be */
2281 ptr = DtStrrchr(tmp, '.');
2285 str = XmStringCreateLocalized(menu_entries[i + 34].str) ;
2286 numStr = XmStringCreateLocalized(tmp);
2287 XtVaSetValues(X->fregisters[i], XmNlabelString, str, NULL) ;
2288 XtVaSetValues(X->fregistersvals[i], XmNlabelString, numStr,
2289 XmNalignment, XmALIGNMENT_END, NULL) ;
2291 XmStringFree(numStr) ;
2299 menu_handler(Widget widget, XtPointer client_data, XEvent *event, Boolean *continue_to_dispatch)
2304 X->mtype = (enum menu_type) client_data ;
2305 menu = X->menus[(int) X->mtype] ;
2306 XtVaGetValues(menu, XmNwhichButton, &button, NULL) ;
2307 if (event->xbutton.button == button)
2309 XmMenuPosition(menu, (XButtonPressedEvent *) event) ;
2310 XtManageChild(menu) ;
2317 menu_proc(Widget widget, XtPointer client_data, XtPointer call_data)
2319 intptr_t choice = ((intptr_t) client_data) & 0xFFFF ;
2321 v->curwin = ((intptr_t) client_data) >> 16 ;
2322 handle_menu_selection(X->mrec[(int) X->mtype], choice) ;
2328 new_cf_value(Widget widget, XtPointer client_data, XtPointer call_data)
2331 for hard testing when there is no Input Method available
2332 wchar_t *wch = (wchar_t *) "wide";
2333 mbchar_t *mbch = (mbchar_t *) "MBYTE";
2336 enum menu_type mtype = (enum menu_type) client_data;
2339 if (X->CFframe == NULL) create_cfframe() ;
2343 set_text_str(X->CFpi_cftext, T_LABEL, lstrs[(int) L_CONNO]) ;
2345 cstr = XmStringCreateLocalized(lstrs[(int) L_NEWCON]) ;
2346 XtVaSetValues(X->CFframe, XmNdialogTitle, cstr, NULL) ;
2347 XmStringFree(cstr) ;
2349 XtRemoveAllCallbacks(X->CFpi_butHelp, XmNactivateCallback);
2350 XtAddCallback(X->CFpi_butHelp, XmNactivateCallback, HelpRequestCB,
2351 (XtPointer) HELP_CONSTANT);
2356 set_text_str(X->CFpi_cftext, T_LABEL, lstrs[(int) L_FUNNO]) ;
2358 cstr = XmStringCreateLocalized(lstrs[(int) L_NEWFUN]) ;
2359 XtVaSetValues(X->CFframe, XmNdialogTitle, cstr, NULL) ;
2360 XmStringFree(cstr) ;
2362 XtRemoveAllCallbacks(X->CFpi_butHelp, XmNactivateCallback);
2363 XtAddCallback(X->CFpi_butHelp, XmNactivateCallback, HelpRequestCB,
2364 (XtPointer) HELP_FUNCTION);
2367 /* Clear text fields. */
2369 set_text_str(X->CFpi_cftext, T_VALUE, "") ;
2370 set_text_str(X->CFpi_dtext, T_VALUE, "") ;
2371 set_text_str(X->CFpi_vtext, T_VALUE, "") ;
2374 for hard testing when there is no Input Method available
2375 XmTextFieldSetStringWcs(X->CFpi_vtext->textfield, wch);
2376 XmTextFieldSetStringWcs(X->CFpi_vtext->textfield, mbch);
2379 XmProcessTraversal(X->CFpi_cftext->textfield, XmTRAVERSE_CURRENT) ;
2381 if (!is_window_showing(X->CFframe))
2382 _DtGenericMapWindow (X->kframe, X->CFframe);
2384 XtManageChild(X->CFframe) ;
2386 /* lets set the focus in the first text widget */
2387 XmProcessTraversal(X->CFpi_cftext->textfield, XmTRAVERSE_CURRENT);
2388 ignore_event = True;
2389 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
2390 TimerEvent, (XtPointer) NULL);
2394 /* Put calc resource into database. */
2396 put_resource(enum res_type rtype, char *value)
2398 ds_put_resource(&(X->dtcalcDB), v->appname, calc_res[(int) rtype], value) ;
2403 redraw_buttons(void)
2405 enum fcp_type scurwin ;
2406 int column, n, row ;
2409 scurwin = v->curwin ;
2410 v->curwin = FCP_KEY ;
2411 for (row = 0; row < BROWS; row++)
2412 for (column = 0; column < BCOLS; column++)
2414 n = row * MAXCOLS + column ;
2416 lstr = XmStringCreateLocalized(v->pstr) ;
2417 XtVaSetValues(X->kbuttons[row][column], XmNlabelString, lstr, NULL);
2418 XmStringFree(lstr) ;
2420 v->curwin = scurwin ;
2425 save_cmdline(int argc, char *argv[])
2427 ds_save_cmdline(X->dpy, XtWindow(X->kframe), argc, argv) ;
2432 save_resources(char *filename)
2434 int reply = ds_save_resources(X->dtcalcDB, filename) ;
2436 if (reply) _DtSimpleError (v->appname, DtWarning, NULL, vstrs[(int) V_NORSAVE]);
2440 ErrorDialog(char *string)
2442 ErrDialog(string, X->mainWin);
2446 set_item(enum item_type itemno, char *str)
2450 char *tmpStr, *ptr, displayStr[50] = "";
2452 if (itemno == DISPLAYITEM)
2456 if(str != NULL && (strcmp(str, "") != 0))
2458 /* Let's get the decimal point, in some languages it's a , */
2459 strcpy(displayStr, str);
2460 tmpStr = GETMESSAGE(3, 45, ".");
2461 if(strcmp(tmpStr, ".") != 0)
2463 /* if it's not a "." let's go change it to what it should be */
2464 ptr = DtStrrchr(displayStr, '.');
2468 w = X->modevals[(int) DISPLAYITEM] ;
2469 XmTextSetString(w, displayStr) ;
2470 XmTextSetInsertionPosition(w, XmTextGetLastPosition(w)) ;
2471 XSync(X->dpy, False);
2480 cstr = XmStringCreateLocalized(str) ;
2481 XtVaSetValues(X->modevals[(int) itemno], XmNlabelString, cstr, NULL) ;
2482 XmStringFree(cstr) ;
2487 /* Set new title for a window. */
2489 set_title(enum fcp_type fcptype, char *str)
2495 if (fcptype == FCP_KEY)
2497 else if (fcptype == FCP_REG)
2499 else if (fcptype == FCP_FIN_REG)
2501 else if (fcptype == FCP_MODE)
2502 w = X->mframe[(int) v->modetype] ;
2504 fprintf(stderr, "Unknown fcptype %d in set_title\n", fcptype);
2508 if (fcptype == FCP_KEY)
2509 XtVaSetValues(w, XmNtitle, str, NULL) ;
2512 cstr = XmStringCreateLocalized(str) ;
2513 XtVaSetValues(w, XmNdialogTitle, cstr, NULL) ;
2514 XmStringFree(cstr) ;
2521 show_ascii(Widget widget, XtPointer client_data, XtPointer call_data)
2526 str = XmTextFieldGetString(X->Api_text->textfield);
2527 val = str[strlen(str) - 1] ;
2528 mpcim(&val, v->MPdisp_val) ;
2529 show_display(v->MPdisp_val) ;
2535 show_ascii_frame(void) /* Display ASCII popup. */
2541 XmString label_string;
2543 if (X->Aframe == NULL)
2545 X->Aframe = (Widget) XmCreateFormDialog(X->kframe, "aframe", NULL, 0) ;
2546 tstr = XmStringCreateLocalized(pstrs[(int) P_ASCIIT]) ;
2547 XtVaSetValues(X->Aframe,
2548 XmNdialogTitle, tstr,
2549 XmNautoUnmanage, FALSE,
2550 XmNallowShellResize, TRUE,
2551 XmNdefaultPosition, FALSE,
2553 XmStringFree(tstr) ;
2555 /* Adjust the decorations for the dialog shell of the dialog */
2556 XtSetArg (args[0], XmNmwmFunctions, MWM_FUNC_MOVE);
2557 XtSetArg (args[1], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE);
2558 XtSetValues (XtParent(X->Aframe), args, 2);
2560 X->Api_text = make_textW(X->Aframe, pstrs[(int) P_CHAR]) ;
2562 XtSetArg (args[0], XmNtopAttachment, XmATTACH_FORM);
2563 XtSetArg (args[1], XmNtopOffset, 5);
2564 XtSetArg (args[2], XmNleftAttachment, XmATTACH_FORM);
2565 XtSetArg (args[3], XmNleftOffset, 5);
2566 XtSetValues(X->Api_text->manager, args, 4);
2568 XtSetArg (args[0], XmNmaxLength, 1);
2569 XtSetValues(X->Api_text->textfield, args, 1);
2571 XtSetArg (args[0], XmNtopAttachment, XmATTACH_WIDGET);
2572 XtSetArg (args[1], XmNtopWidget, X->Api_text->manager);
2573 XtSetArg (args[2], XmNtopOffset, 3);
2574 XtSetArg (args[3], XmNleftAttachment, XmATTACH_FORM);
2575 XtSetArg (args[4], XmNrightAttachment, XmATTACH_FORM);
2576 sep = XmCreateSeparator(X->Aframe, "sep", args, 5);
2579 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 33, "Apply") );
2580 XtSetArg (args[0], XmNmarginHeight, 2);
2581 XtSetArg (args[1], XmNmarginWidth, 15);
2582 XtSetArg (args[2], XmNlabelString, label_string);
2583 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
2584 XtSetArg (args[4], XmNtopWidget, sep);
2585 XtSetArg (args[5], XmNtopOffset, 5);
2586 XtSetArg (args[6], XmNleftAttachment, XmATTACH_FORM);
2587 XtSetArg (args[7], XmNleftOffset, 10);
2588 XtSetArg (args[8], XmNbottomAttachment, XmATTACH_FORM);
2589 XtSetArg (args[9], XmNbottomOffset, 5);
2590 X->Api_butOK = XmCreatePushButton(X->Aframe, "button", args, 10);
2591 XmStringFree(label_string);
2592 XtManageChild(X->Api_butOK);
2594 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 32, "Close") );
2595 XtSetArg (args[0], XmNmarginHeight, 2);
2596 XtSetArg (args[1], XmNmarginWidth, 10);
2597 XtSetArg (args[2], XmNlabelString, label_string);
2598 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
2599 XtSetArg (args[4], XmNtopWidget, sep);
2600 XtSetArg (args[5], XmNtopOffset, 5);
2601 XtSetArg (args[6], XmNleftAttachment, XmATTACH_WIDGET);
2602 XtSetArg (args[7], XmNleftWidget, X->Api_butOK);
2603 XtSetArg (args[8], XmNleftOffset, 10);
2604 XtSetArg (args[9], XmNbottomAttachment, XmATTACH_FORM);
2605 XtSetArg (args[10], XmNbottomOffset, 5);
2606 X->Api_butClose = XmCreatePushButton(X->Aframe, "button", args, 11);
2607 XmStringFree(label_string);
2608 XtManageChild(X->Api_butClose);
2610 label_string = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
2611 XtSetArg (args[0], XmNmarginHeight, 2);
2612 XtSetArg (args[1], XmNmarginWidth, 10);
2613 XtSetArg (args[2], XmNlabelString, label_string);
2614 XtSetArg (args[3], XmNtopAttachment, XmATTACH_WIDGET);
2615 XtSetArg (args[4], XmNtopWidget, sep);
2616 XtSetArg (args[5], XmNtopOffset, 5);
2617 XtSetArg (args[6], XmNleftAttachment, XmATTACH_WIDGET);
2618 XtSetArg (args[7], XmNleftWidget, X->Api_butClose);
2619 XtSetArg (args[8], XmNleftOffset, 10);
2620 XtSetArg (args[9], XmNrightAttachment, XmATTACH_FORM);
2621 XtSetArg (args[10], XmNrightOffset, 10);
2622 XtSetArg (args[11], XmNbottomAttachment, XmATTACH_FORM);
2623 XtSetArg (args[12], XmNbottomOffset, 5);
2624 X->Api_butHelp = XmCreatePushButton(X->Aframe, "button", args, 13);
2625 XmStringFree(label_string);
2626 XtManageChild(X->Api_butHelp);
2628 XtAddCallback(X->Api_text->textfield, XmNactivateCallback,
2630 XtAddCallback(X->Api_butOK, XmNactivateCallback, show_ascii, NULL) ;
2631 XtAddCallback(X->Api_butClose, XmNactivateCallback, close_ascii,
2633 XtAddCallback(X->Api_butHelp, XmNactivateCallback, HelpRequestCB,
2634 (XtPointer) HELP_ASCII) ;
2637 XtSetArg (args[j], XmNcancelButton, X->Api_butClose); j++;
2638 XtSetArg (args[j], XmNdefaultButton, X->Api_butOK); j++;
2639 XtSetValues (X->Aframe, args, j);
2642 if (!is_window_showing(X->Aframe))
2643 _DtGenericMapWindow (X->kframe, X->Aframe);
2645 XtManageChild(X->Aframe) ;
2647 XmProcessTraversal(X->Api_text->textfield, XmTRAVERSE_CURRENT);
2648 ignore_event = True;
2649 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
2650 TimerEvent, (XtPointer) NULL);
2657 saveatom = XmInternAtom(X->dpy, "WM_SAVE_YOURSELF", FALSE) ;
2658 command_atom = XA_WM_COMMAND;
2659 wm_state_atom = XmInternAtom (X->dpy, "WM_STATE", False);
2661 XmAddWMProtocols(X->kframe, &saveatom, 1) ;
2662 XmAddWMProtocolCallback(X->kframe, saveatom, save_state, (XtPointer)NULL) ;
2665 XSetErrorHandler((int (*)())xerror_interpose) ;
2666 XtAddEventHandler(X->kframe, KeyPressMask | KeyReleaseMask,
2667 FALSE, event_proc, NULL) ;
2668 XmProcessTraversal( X->kbuttons[0][0], XmTRAVERSE_CURRENT );
2672 XtAppMainLoop(X->app) ;
2676 clear_buttons(int start)
2682 static Boolean first = True;
2687 if(buttons[i].str != NULL)
2689 XtFree(buttons[i].str);
2690 XtFree(buttons[i].str2);
2691 XtFree(buttons[i].resname);
2693 buttons[i].str = XtNewString("");
2694 buttons[i].str2 = XtNewString("");
2695 buttons[i].resname = XtNewString("blank");
2696 buttons[i].value = 0;
2697 buttons[i].opdisp = OP_SET;
2698 buttons[i].mtype = M_NONE;
2701 lstr = XmStringCreateLocalized(buttons[i].str);
2702 XtSetArg (args[n], XmNlabelString, lstr); n++;
2705 XtSetArg (args[n], XmNbackground, pixels[1].bg); n++;
2706 XtSetArg (args[n], XmNforeground, pixels[1].fg); n++;
2707 XtSetArg (args[n], XmNtopShadowColor, pixels[1].ts); n++;
2708 XtSetArg (args[n], XmNbottomShadowColor, pixels[1].bs); n++;
2709 XtSetArg (args[n], XmNarmColor, pixels[1].sc); n++;
2711 XtSetValues( X->kbuttons[0][0], args, n);
2712 XmStringFree(lstr) ;
2716 row = (start / BCOLS) + 3;
2717 column = start % BCOLS;
2718 for(i = start + 12; i < 24; i++)
2720 XtFree(buttons[i].str);
2721 XtFree(buttons[i].resname);
2722 buttons[i].str = XtNewString("");
2723 buttons[i].resname = XtNewString("blank");
2724 buttons[i].value = 0;
2725 buttons[i].opdisp = OP_SET;
2726 buttons[i].mtype = M_NONE;
2729 lstr = XmStringCreateLocalized(buttons[i].str);
2730 XtSetArg (args[n], XmNlabelString, lstr); n++;
2733 XtSetArg (args[n], XmNbackground, pixels[1].bg); n++;
2734 XtSetArg (args[n], XmNforeground, pixels[1].fg); n++;
2735 XtSetArg (args[n], XmNtopShadowColor, pixels[1].ts); n++;
2736 XtSetArg (args[n], XmNbottomShadowColor, pixels[1].bs); n++;
2737 XtSetArg (args[n], XmNarmColor, pixels[1].sc); n++;
2739 XtSetValues( X->kbuttons[row][column], args, n);
2740 XmStringFree(lstr) ;
2743 if(column % BCOLS == 0)
2752 make_buttons_fin(void)
2761 for(i = 12; i < 24; i++)
2763 if(buttons[i].str != NULL)
2765 XtFree(buttons[i].str);
2766 XtFree(buttons[i].str2);
2767 XtFree(buttons[i].resname);
2769 buttons[i].str = XtNewString(mode_buttons[i - 12].str);
2770 buttons[i].str2 = XtNewString(mode_buttons[i - 12].str2);
2771 buttons[i].resname = XtNewString(mode_buttons[i - 12].resname);
2772 buttons[i].value = mode_buttons[i - 12].value;
2773 buttons[i].opdisp = mode_buttons[i - 12].opdisp;
2774 buttons[i].mtype = mode_buttons[i - 12].mtype;
2775 buttons[i].func = mode_buttons[i - 12].func;
2779 lstr = XmStringCreateLocalized(buttons[i].str2);
2781 lstr = XmStringCreateLocalized(buttons[i].str);
2782 XtSetArg (args[n], XmNlabelString, lstr); n++;
2785 XtSetArg (args[n], XmNbackground, pixels[7].bg); n++;
2786 XtSetArg (args[n], XmNforeground, pixels[7].fg); n++;
2787 XtSetArg (args[n], XmNtopShadowColor, pixels[7].ts); n++;
2788 XtSetArg (args[n], XmNbottomShadowColor, pixels[7].bs); n++;
2789 XtSetArg (args[n], XmNarmColor, pixels[7].sc); n++;
2791 XtSetValues( X->kbuttons[row][column], args, n);
2792 XmStringFree(lstr) ;
2795 if(column % BCOLS == 0)
2805 make_buttons_log(void)
2814 for(i = 12; i < 24; i++)
2816 if(buttons[i].str != NULL)
2818 XtFree(buttons[i].str);
2819 XtFree(buttons[i].str2);
2820 XtFree(buttons[i].resname);
2822 buttons[i].str = XtNewString(mode_buttons[i + 4].str);
2823 buttons[i].str2 = XtNewString(mode_buttons[i + 4].str2);
2824 buttons[i].resname = XtNewString(mode_buttons[i + 4].resname);
2825 buttons[i].value = mode_buttons[i + 4].value;
2826 buttons[i].opdisp = mode_buttons[i + 4].opdisp;
2827 buttons[i].mtype = mode_buttons[i + 4].mtype;
2828 buttons[i].func = mode_buttons[i + 4].func;
2832 lstr = XmStringCreateLocalized(buttons[i].str2);
2834 lstr = XmStringCreateLocalized(buttons[i].str);
2835 XtSetArg (args[n], XmNlabelString, lstr); n++;
2838 XtSetArg (args[n], XmNbackground, pixels[7].bg); n++;
2839 XtSetArg (args[n], XmNforeground, pixels[7].fg); n++;
2840 XtSetArg (args[n], XmNtopShadowColor, pixels[7].ts); n++;
2841 XtSetArg (args[n], XmNbottomShadowColor, pixels[7].bs); n++;
2842 XtSetArg (args[n], XmNarmColor, pixels[7].sc); n++;
2844 XtSetValues( X->kbuttons[row][column], args, n);
2845 XmStringFree(lstr) ;
2848 if(column % BCOLS == 0)
2858 make_buttons_sci(void)
2867 for(i = 12; i < 24; i++)
2869 if(buttons[i].str != NULL)
2871 XtFree(buttons[i].str);
2872 XtFree(buttons[i].str2);
2873 XtFree(buttons[i].resname);
2875 buttons[i].str = XtNewString(mode_buttons[i + 20].str);
2876 buttons[i].str2 = XtNewString(mode_buttons[i + 20].str2);
2877 buttons[i].resname = XtNewString(mode_buttons[i + 20].resname);
2878 buttons[i].value = mode_buttons[i + 20].value;
2879 buttons[i].opdisp = mode_buttons[i + 20].opdisp;
2880 buttons[i].mtype = mode_buttons[i + 20].mtype;
2881 buttons[i].func = mode_buttons[i + 20].func;
2885 lstr = XmStringCreateLocalized(buttons[i].str2);
2887 lstr = XmStringCreateLocalized(buttons[i].str);
2888 XtSetArg (args[n], XmNlabelString, lstr); n++;
2891 XtSetArg (args[n], XmNbackground, pixels[7].bg); n++;
2892 XtSetArg (args[n], XmNforeground, pixels[7].fg); n++;
2893 XtSetArg (args[n], XmNtopShadowColor, pixels[7].ts); n++;
2894 XtSetArg (args[n], XmNbottomShadowColor, pixels[7].bs); n++;
2895 XtSetArg (args[n], XmNarmColor, pixels[7].sc); n++;
2897 XtSetValues( X->kbuttons[row][column], args, n);
2898 XmStringFree(lstr) ;
2901 if(column % BCOLS == 0)
2912 switch_mode(enum mode_type curmode)
2916 v->modetype = curmode ;
2917 XtSetArg(args[0], XmNmenuHistory, modeArry[(int)curmode]);
2918 XtSetValues( X->modevals[(int)MODEITEM], args, 1);
2919 if((int)curmode == (int)FINANCIAL)
2922 XtSetSensitive(X->modevals[(int)TTYPEITEM], False);
2923 set_item(HYPITEM, " ") ;
2924 set_item(INVITEM, " ") ;
2927 else if((int)curmode == (int)LOGICAL)
2930 XtSetSensitive(X->modevals[(int)TTYPEITEM], False);
2931 set_item(HYPITEM, " ") ;
2932 set_item(INVITEM, " ") ;
2937 XtSetSensitive(X->modevals[(int)TTYPEITEM], True);
2938 set_item(HYPITEM, " ") ;
2939 set_item(INVITEM, " ") ;
2946 update_cf_value(void)
2948 char message[MAXLINE] ;
2949 char str[MAXLINE] ; /* Temporary buffer for various strings. */
2950 char result[MAXLINE] ;
2952 double tmp ; /* For converting constant value. */
2954 int n ; /* Set to 1, if constant value is valid. */
2955 char cur_op, current, display[MAXLINE], old_cal_value, fnum[MAX_DIGITS+1];
2956 int cur_ch, toclear, tstate, pending, accuracy;
2957 int MPdisp_val[MP_SIZE], MPlast_input[MP_SIZE], MPresult[MP_SIZE] ;
2961 case M_CON : tmpStr = GETMESSAGE(3, 45, ".");
2962 if(strcmp(tmpStr, ".") != 0)
2964 /* if it's not a "." let's go change it to what it
2966 ptr = DtStrchr(X->vval, tmpStr[0]);
2970 ptr = DtStrchr(X->vval, tmpStr[0]);
2973 /* need to run a "compute" of what was typed in */
2974 len = strlen(X->vval) ;
2975 STRCPY(str, X->vval);
2976 if(X->vval[len - 1] != '=')
2978 /* need to add an '=' at the end of the string so it
2979 computes correctly */
2984 if(strncmp(str, "-", 1) == 0)
2987 for(i=0; i < len -1; i++)
2989 str[i] = str[i+inc];
2990 if(inc == 0 || isdigit((int)str[i]) || str[i] == '.')
2999 /* now let's compute it, first save off some state */
3001 current = v->current;
3002 old_cal_value = v->old_cal_value;
3004 toclear = v->toclear;
3006 pending = v->pending;
3007 STRCPY(display, v->display);
3008 STRCPY(fnum, v->fnum);
3009 mpstr(v->MPdisp_val, MPdisp_val);
3010 mpstr(v->MPlast_input, MPlast_input);
3011 mpstr(v->MPresult, MPresult);
3013 mpcim(&i, v->MPdisp_val) ;
3014 mpcim(&i, v->MPlast_input) ;
3015 mpcim(&i, v->MPresult) ;
3019 process_str(str, M_CON);
3022 /* get the computed value */
3023 accuracy = v->accuracy;
3025 STRCPY(result, make_number(v->MPresult, FALSE)) ;
3026 v->accuracy = accuracy ;
3028 /* return to previous state */
3030 v->current = current;
3031 v->old_cal_value = old_cal_value;
3033 v->toclear = toclear;
3035 v->pending = pending;
3036 STRCPY(v->display, display);
3037 STRCPY(v->fnum, fnum);
3038 mpstr(MPdisp_val, v->MPdisp_val);
3039 mpstr(MPlast_input, v->MPlast_input);
3040 mpstr(MPresult, v->MPresult);
3042 set_item(DISPLAYITEM, v->display);
3044 n = sscanf(result, "%lf", &tmp) ;
3045 ptr = DtStrchr(result, 'e');
3046 if (n != 1 || ptr != NULL || v->error == TRUE)
3048 SPRINTF(message, "%s\n%s", vstrs[(int) V_INVCON],
3049 vstrs[(int) V_NOCHANGE]) ;
3050 do_continue_notice(X->CFframe, message) ;
3051 set_item(OPITEM, "") ;
3052 if(v->cur_op != '?')
3053 set_item(OPITEM, buttons[get_index(v->cur_op)].str);
3058 if(v->cur_op != '?')
3059 set_item(OPITEM, buttons[get_index(v->cur_op)].str);
3061 /* now let's compute it, first save off some state */
3062 if(strncmp(result, "-", 1) == 0)
3064 len = strlen(result);
3066 STRCPY(str, result);
3067 for(i=0; i < len; i++)
3069 MPstr_to_num(str, DEC, v->MPcon_vals[X->cfno]) ;
3070 mpneg(v->MPcon_vals[X->cfno], v->MPcon_vals[X->cfno]) ;
3073 MPstr_to_num(result, DEC, v->MPcon_vals[X->cfno]) ;
3075 if(strncmp(result, "0.", 2) == 0 ||
3076 strncmp(result, "-0.", 3) == 0 )
3078 len = strlen(result);
3079 while(result[len - 1] == '0')
3081 result[len - 1] = '\0';
3085 SPRINTF(v->con_names[X->cfno], "%1d: %s [%s]",
3086 X->cfno, result, X->dval) ;
3088 case M_FUN : tmpStr = GETMESSAGE(3, 45, ".");
3089 if(strcmp(tmpStr, ".") != 0)
3091 /* if it's not a "." let's go change it to what it
3093 ptr = DtStrchr(X->vval, tmpStr[0]);
3097 ptr = DtStrchr(X->vval, tmpStr[0]);
3100 STRCPY(v->fun_vals[X->cfno], convert(X->vval)) ;
3101 if(strcmp(X->vval, "") != 0)
3103 SPRINTF(v->fun_names[X->cfno], "%1d: %s [%s]",
3104 X->cfno, X->vval, X->dval) ;
3107 STRCPY(v->fun_names[X->cfno], "");
3112 XtDestroyWidget(X->menus[(int) X->CFtype]) ;
3113 for (i = 0; i < NOBUTTONS; i++)
3114 if (buttons[i].mtype == X->CFtype)
3115 create_menu(X->CFtype, X->kbuttons[i / BCOLS][i % BCOLS], i) ;
3119 write_rcfile(X->CFtype, X->cfexists, X->cfno,
3123 write_rcfile(X->CFtype, X->cfexists, X->cfno,
3129 ignore_event = True;
3130 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3131 TimerEvent, (XtPointer) NULL);
3137 win_display(enum fcp_type fcptype, int state)
3139 Widget widget = NULL;
3140 Position newX, newY;
3143 if (fcptype == FCP_REG) widget = X->rframe ;
3144 else if (fcptype == FCP_MODE) widget = X->mframe[(int) v->modetype] ;
3145 else if (fcptype == FCP_FIN_REG) widget = X->frframe;
3150 if (state && !is_window_showing(widget))
3152 if (fcptype == FCP_REG || fcptype == FCP_FIN_REG)
3154 XtSetMappedWhenManaged(XtParent(widget), False);
3155 XSync(X->dpy, False);
3157 XtManageChild(widget) ;
3159 _DtChildPosition(widget, X->kframe, &newX, &newY);
3160 XtSetArg(args[0], XmNx, newX);
3161 XtSetArg(args[1], XmNy, newY);
3162 XtSetValues(widget, args, 2);
3164 XtSetMappedWhenManaged(XtParent(widget), True);
3165 XSync(X->dpy, False);
3167 XtMapWidget(XtParent(widget));
3169 else if (fcptype == FCP_MODE)
3170 _DtGenericMapWindow (X->kframe, widget);
3172 if (state) XtManageChild(widget) ;
3173 else XtUnmanageChild(widget) ;
3179 write_cf_value(Widget widget, XtPointer client_data, XtPointer call_data)
3181 char message[MAXLINE] ;
3182 char str[MAXLINE] ; /* Temporary buffer for various strings. */
3183 Widget focus_widget;
3186 focus_widget = XmGetFocusWidget(widget);
3189 if(focus_widget != X->CFpi_vtext->textfield && focus_widget != X->CFpi_butOK)
3193 if(focus_widget == X->CFpi_vtext->textfield)
3195 X->vval = XmTextFieldGetString(X->CFpi_vtext->textfield);
3196 if(strcmp(X->vval, "") == 0)
3204 if(X->cfval != NULL)
3206 X->dval = XmTextFieldGetString(X->CFpi_dtext->textfield);
3207 if(strlen(X->dval) > 41)
3209 X->vval = XmTextFieldGetString(X->CFpi_vtext->textfield);
3210 X->cfval = XmTextFieldGetString(X->CFpi_cftext->textfield);
3211 SSCANF(X->cfval, "%d", &X->cfno) ;
3212 if ((strcmp(X->cfval, "") == 0) || X->cfval[0] < '0' || X->cfval[0] > '9' ||
3213 X->cfno < 0 || X->cfno > 9)
3215 SPRINTF(str, "%s", (X->CFtype == M_CON) ? vstrs[(int) V_LCON]
3216 : vstrs[(int) V_LFUN]) ;
3217 SPRINTF(message, "%s\n%s", str, vstrs[(int) V_RANGE]) ;
3218 do_continue_notice(X->CFframe, message) ;
3222 X->vval = (char *)_DtcalcStripSpaces((char *)X->vval);
3226 case M_CON : X->cfexists = 1 ; /* Always the default constants. */
3228 case M_FUN : if (strlen(v->fun_vals[X->cfno])) X->cfexists = 1 ;
3234 SPRINTF(str, mess[(int) MESS_CON],
3235 (X->CFtype == M_CON) ? vstrs[(int) V_UCON]
3236 : vstrs[(int) V_UFUN], X->cfno) ;
3237 SPRINTF(message, "%s\n%s", str, vstrs[(int) V_OWRITE]) ;
3238 XtUnmanageChild(X->CFframe) ;
3239 do_confirm_notice(X->CFframe, message) ;
3244 XtUnmanageChild(X->CFframe) ;
3247 XtSetArg (args[0], XmNdefaultButton, NULL);
3248 XtSetValues (X->CFframe, args, 1);
3253 xerror_interpose(Display *display, XErrorEvent *error)
3258 XGetErrorText(display, error->error_code, msg1, 80) ;
3259 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);
3260 _DtSimpleError (v->appname, DtError, NULL, msg);
3265 modelineValueChanged(Widget widget, XtPointer client_data, XtPointer call_data)
3271 X->mtype = (enum menu_type) client_data ;
3272 XtSetArg (args[0], XmNuserData, &val);
3273 XtGetValues (widget, args, 1);
3275 choice = val & 0xFFFF ;
3276 v->curwin = ((int) val) >> 16 ;
3277 if(X->mtype == M_BASE)
3278 handle_menu_selection(56, choice) ;
3279 else if(X->mtype == M_NUM)
3280 handle_menu_selection(57, choice) ;
3281 else if(X->mtype == M_MODE)
3282 handle_menu_selection(58, choice) ;
3284 handle_menu_selection(59, choice) ;
3288 create_menu_bar(Widget parent)
3292 Widget WidgList[10];
3295 XmString labelString;
3296 Widget child, mem_reg;
3297 Widget lastCascadeButtonGadget;
3298 Widget lastMenuPane;
3299 Widget helpPulldown;
3302 /* Create the pulldown menu */
3304 XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++;
3305 XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
3306 XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
3307 XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
3308 X->menubar = XmCreateMenuBar(parent, "mainMenu", args, n);
3309 XtManageChild(X->menubar);
3310 XtAddCallback(X->menubar, XmNhelpCallback, HelpRequestCB,
3311 (XtPointer)HELP_MENUBAR);
3313 mnemonic = GETMESSAGE(2, 13, "O");
3314 mnemonic = XtNewString(mnemonic);
3316 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 14, "Options") );
3317 XtSetArg(args[n], XmNlabelString, labelString); n++;
3318 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3319 XtSetArg(args[n], XmNmarginWidth, 6); n++;
3320 lastCascadeButtonGadget =
3321 XmCreateCascadeButtonGadget(X->menubar, "options", args, n);
3322 XtManageChild(lastCascadeButtonGadget);
3323 XmStringFree(labelString);
3326 lastMenuPane = XmCreatePulldownMenu(X->menubar, "optionMenu", NULL, 0);
3328 XtSetArg(args[0], XmNsubMenuId, lastMenuPane);
3329 XtSetValues(lastCascadeButtonGadget, args, 1);
3331 mnemonic = GETMESSAGE(2, 40, "R");
3332 mnemonic = XtNewString(mnemonic);
3334 XmStringCreateLocalized( GETMESSAGE(2, 15, "Memory Registers") );
3335 XtSetArg(args[0], XmNlabelString, labelString );
3336 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3337 mem_reg = XmCreatePushButtonGadget (lastMenuPane, "memR", args, 2);
3338 XtManageChild(mem_reg);
3339 XmStringFree(labelString);
3340 XtAddCallback(mem_reg, XmNactivateCallback, (XtCallbackProc)do_memory,
3343 mnemonic = GETMESSAGE(2, 45, "g");
3344 mnemonic = XtNewString(mnemonic);
3346 XmStringCreateLocalized ( GETMESSAGE(3, 138, "Financial Registers") );
3347 XtSetArg(args[0], XmNlabelString, labelString );
3348 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3349 mem_reg = XmCreatePushButtonGadget (lastMenuPane, "finR", args, 2);
3350 XtManageChild(mem_reg);
3351 XmStringFree(labelString);
3352 XtAddCallback(mem_reg, XmNactivateCallback, (XtCallbackProc)do_memory,
3355 mnemonic = GETMESSAGE(2, 41, "A");
3356 mnemonic = XtNewString(mnemonic);
3357 labelString=XmStringCreateLocalized ( GETMESSAGE(2, 16, "ASCII Convert") );
3358 XtSetArg(args[0], XmNlabelString, labelString );
3359 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3360 child = XmCreatePushButtonGadget (lastMenuPane, "asc", args, 2);
3361 XtManageChild(child);
3362 XmStringFree(labelString);
3363 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)do_ascii,
3366 if(_DtNl_is_multibyte)
3367 XtSetSensitive(child, False);
3369 child = (Widget)XmCreateSeparatorGadget(lastMenuPane, "separator",args,0);
3370 XtManageChild(child);
3372 mnemonic = GETMESSAGE(2, 42, "F");
3373 mnemonic = XtNewString(mnemonic);
3374 labelString = XmStringCreateLocalized ( vstrs[(int) V_FUNWNAME] );
3375 XtSetArg(args[0], XmNlabelString, labelString );
3376 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3377 child = XmCreatePushButtonGadget (lastMenuPane, "enterFunc", args, 2);
3378 XtManageChild(child);
3379 XmStringFree(labelString);
3380 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)new_cf_value,
3381 (XtPointer)(int)M_FUN);
3383 mnemonic = GETMESSAGE(2, 43, "C");
3384 mnemonic = XtNewString(mnemonic);
3385 labelString = XmStringCreateLocalized ( vstrs[(int) V_CONWNAME] );
3386 XtSetArg(args[0], XmNlabelString, labelString );
3387 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3388 child = XmCreatePushButtonGadget (lastMenuPane, "enterCons", args, 2);
3389 XtManageChild(child);
3390 XmStringFree(labelString);
3391 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)new_cf_value,
3392 (XtPointer)(int)M_CON);
3394 child = (Widget)XmCreateSeparatorGadget(lastMenuPane, "separator",args,0);
3395 XtManageChild(child);
3397 mnemonic = GETMESSAGE(2, 44, "x");
3398 mnemonic = XtNewString(mnemonic);
3399 labelString = XmStringCreateLocalized ( GETMESSAGE(3, 403, "Exit") );
3400 XtSetArg(args[0], XmNlabelString, labelString );
3401 XtSetArg(args[1], XmNmnemonic, XStringToKeysym( mnemonic ) );
3402 child = XmCreatePushButtonGadget (lastMenuPane, "exit", args, 2);
3403 XtManageChild(child);
3404 XmStringFree(labelString);
3405 XtAddCallback(child, XmNactivateCallback, (XtCallbackProc)do_frame,
3409 mnemonic = GETMESSAGE(2, 17, "H");
3410 mnemonic = XtNewString(mnemonic);
3411 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
3412 XtSetArg(args[n], XmNlabelString, labelString); n++;
3413 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3414 XtSetArg(args[n], XmNmarginWidth, 6); n++;
3415 lastCascadeButtonGadget =
3416 XmCreateCascadeButtonGadget(X->menubar, "help", args, n);
3417 XmStringFree(labelString);
3420 helpPulldown = XmCreatePulldownMenu(X->menubar, "helpMenu", NULL, 0);
3422 XtSetArg(args[0], XmNsubMenuId, helpPulldown);
3423 XtSetValues(lastCascadeButtonGadget, args, 1);
3425 XtSetArg(args[0], XmNmenuHelpWidget, lastCascadeButtonGadget);
3426 XtSetValues (X->menubar, args, 1);
3428 XtManageChild(lastCascadeButtonGadget);
3433 mnemonic = GETMESSAGE(2, 19, "v");
3434 mnemonic = XtNewString(mnemonic);
3435 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3436 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 20, "Overview") );
3437 XtSetArg(args[n], XmNlabelString, labelString); n++;
3439 XmCreatePushButton(helpPulldown, "introduction", args, n );
3440 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3441 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_INTRODUCTION);
3442 XmStringFree(labelString);
3445 WidgList[count++]= (Widget)XmCreateSeparatorGadget(helpPulldown,
3446 "separator",args,0);
3449 mnemonic = GETMESSAGE(2, 38, "C");
3450 mnemonic = XtNewString(mnemonic);
3451 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3453 XmStringCreateLocalized ( GETMESSAGE(2,39,"Table of Contents") );
3454 XtSetArg(args[n], XmNlabelString, labelString); n++;
3455 WidgList[count++]= XmCreatePushButton(helpPulldown, "toc", args, n );
3456 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3457 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TABLEOFCONTENTS);
3458 XmStringFree(labelString);
3462 mnemonic = GETMESSAGE(2, 21, "T");
3463 mnemonic = XtNewString(mnemonic);
3464 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3465 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 22, "Tasks") );
3466 XtSetArg(args[n], XmNlabelString, labelString); n++;
3467 WidgList[count++]= XmCreatePushButton(helpPulldown, "tasks", args, n );
3468 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3469 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TASKS);
3470 XmStringFree(labelString);
3474 mnemonic = GETMESSAGE(2, 23, "R");
3475 mnemonic = XtNewString(mnemonic);
3476 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3477 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 24, "Reference") );
3478 XtSetArg(args[n], XmNlabelString, labelString); n++;
3479 WidgList[count++]= XmCreatePushButton(helpPulldown, "reference", args, n );
3480 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3481 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_REFERENCE);
3482 XmStringFree(labelString);
3486 mnemonic = GETMESSAGE(2, 25, "O");
3487 mnemonic = XtNewString(mnemonic);
3488 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3489 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 26, "On Item") );
3490 XtSetArg(args[n], XmNlabelString, labelString); n++;
3491 WidgList[count++]= XmCreatePushButton(helpPulldown, "onItem", args, n );
3492 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3493 (XtCallbackProc)HelpModeCB, (XtPointer)NULL);
3494 XmStringFree(labelString);
3497 WidgList[count++]= (Widget)XmCreateSeparatorGadget(helpPulldown,
3498 "separator",args,0);
3501 mnemonic = GETMESSAGE(2, 27, "U");
3502 mnemonic = XtNewString(mnemonic);
3503 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3504 labelString = XmStringCreateLocalized ( GETMESSAGE(2, 28, "Using Help") );
3505 XtSetArg(args[n], XmNlabelString, labelString); n++;
3507 XmCreatePushButton(helpPulldown, "usingHelp", args, n );
3508 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3509 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_USING);
3510 XmStringFree(labelString);
3513 WidgList[count++]= (Widget)XmCreateSeparatorGadget(helpPulldown,
3514 "separator",args,0);
3517 mnemonic = GETMESSAGE(2, 29, "A");
3518 mnemonic = XtNewString(mnemonic);
3519 XtSetArg(args[n], XmNmnemonic, XStringToKeysym( mnemonic ) ); n++;
3521 XmStringCreateLocalized ( GETMESSAGE(2, 30, "About Calculator") );
3522 XtSetArg(args[n], XmNlabelString, labelString); n++;
3523 WidgList[count++]= XmCreatePushButton(helpPulldown, "about", args, n );
3524 XtAddCallback(WidgList[count-1], XmNactivateCallback,
3525 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_VERSION);
3526 XmStringFree(labelString);
3529 XtManageChildren(WidgList, count);
3531 /* Fine tune the menubar */
3532 XtSetArg(args[0], XmNmarginWidth, 2);
3533 XtSetArg(args[1], XmNmarginHeight, 2);
3534 XtSetValues(X->menubar, args, 2);
3542 short act, inact, prim, second;
3544 XmeGetPixelData (X->screen, &colorUse, pixels, &act, &inact,
3547 if(pixels[0].bg == pixels[1].bg && pixels[1].bg == pixels[2].bg &&
3548 pixels[2].bg == pixels[3].bg && pixels[3].bg == pixels[4].bg &&
3549 pixels[4].bg == pixels[5].bg && pixels[5].bg == pixels[6].bg &&
3550 pixels[6].bg == pixels[7].bg && pixels[7].bg == 0)
3558 do_memory(Widget w, XtPointer client_data, XtPointer call_data)
3560 intptr_t type = (intptr_t)client_data;
3567 make_registers(MEM) ;
3569 win_display(FCP_REG, TRUE) ;
3576 make_registers(FIN) ;
3578 win_display(FCP_FIN_REG, TRUE) ;
3580 ignore_event = True;
3581 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3582 TimerEvent, (XtPointer) NULL);
3586 read_resources(void) /* Read all possible resources from the database. */
3591 /* set the accuracy variable */
3592 if(application_args.accuracy > 9)
3594 else if(application_args.accuracy < 0)
3597 v->accuracy = application_args.accuracy;
3600 if(strcmp(application_args.base, "binary") == 0 ||
3601 strcmp(application_args.base, "bin") == 0)
3602 v->base = (enum base_type) 0 ;
3603 else if(strcmp(application_args.base, "octal") == 0 ||
3604 strcmp(application_args.base, "oct") == 0)
3605 v->base = (enum base_type) 1 ;
3606 else if(strcmp(application_args.base, "decimal") == 0 ||
3607 strcmp(application_args.base, "dec") == 0)
3608 v->base = (enum base_type) 2 ;
3609 else if(strcmp(application_args.base, "hexadecimal") == 0 ||
3610 strcmp(application_args.base, "hex") == 0)
3611 v->base = (enum base_type) 3 ;
3614 msg = (char *) XtMalloc(strlen( opts[(int) O_BASE]) + 3);
3615 sprintf(msg, "%s", opts[(int) O_BASE]);
3616 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3618 v->base = (enum base_type) 2;
3621 /* set the display numeration */
3622 if(strcmp(application_args.display, "fixed") == 0)
3623 v->dtype = (enum base_type) 1 ;
3624 else if(strcmp(application_args.display, "eng") == 0 ||
3625 strcmp(application_args.display, "engineering") == 0)
3626 v->dtype = (enum base_type) 0 ;
3627 else if(strcmp(application_args.display, "scientific") == 0 ||
3628 strcmp(application_args.display, "sci") == 0)
3629 v->dtype = (enum base_type) 2 ;
3632 msg = (char *) XtMalloc(strlen( opts[(int) O_DISPLAY]) + strlen(str) + 3);
3633 sprintf(msg, opts[(int) O_DISPLAY], str);
3634 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3636 v->dtype = (enum base_type) 1;
3640 if(strcmp(application_args.mode, "scientific") == 0)
3641 v->modetype = (enum base_type) 2 ;
3642 else if(strcmp(application_args.mode, "financial") == 0)
3643 v->modetype = (enum base_type) 0 ;
3644 else if(strcmp(application_args.mode, "logical") == 0)
3645 v->modetype = (enum base_type) 1 ;
3648 msg = (char *) XtMalloc(strlen( opts[(int) O_MODE]) + strlen(str) + 3);
3649 sprintf(msg, opts[(int) O_MODE], str);
3650 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3652 v->modetype = (enum base_type) 2;
3655 /* set the display numeration */
3656 if(strcmp(application_args.trigType, "deg") == 0 ||
3657 strcmp(application_args.trigType, "degrees") == 0)
3658 v->ttype = (enum base_type) 0 ;
3659 else if(strcmp(application_args.trigType, "rad") == 0 ||
3660 strcmp(application_args.trigType, "radians") == 0)
3661 v->ttype = (enum base_type) 2 ;
3662 else if(strcmp(application_args.trigType, "grad") == 0 ||
3663 strcmp(application_args.trigType, "gradients") == 0)
3664 v->ttype = (enum base_type) 1 ;
3667 msg = (char *) XtMalloc(strlen( opts[(int) O_TRIG]) + strlen(str) + 3);
3668 sprintf(msg, opts[(int) O_TRIG], str);
3669 _DtSimpleError (v->appname, DtWarning, NULL, msg);
3671 v->ttype = (enum base_type) 0;
3677 close_cf(Widget widget, XtPointer client_data, XtPointer call_data)
3681 XtSetArg (args[0], XmNdefaultButton, NULL);
3682 XtSetValues (X->CFframe, args, 1);
3684 XtUnmanageChild(X->CFframe) ;
3685 ignore_event = True;
3686 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3687 TimerEvent, (XtPointer) NULL);
3691 close_ascii(Widget widget, XtPointer client_data, XtPointer call_data)
3693 XtUnmanageChild(X->Aframe) ;
3694 ignore_event = True;
3695 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3696 TimerEvent, (XtPointer) NULL);
3700 FocusInCB(Widget widget, XtPointer client_data, XtPointer call_data)
3704 XtSetArg (args[0], XmNdefaultButton, NULL);
3705 XtSetValues (X->CFframe, args, 1);
3707 XtSetArg(args[0], XmNshowAsDefault, True);
3708 XtSetValues(X->CFpi_butOK, args, 1);
3712 move_cf(Widget widget, XtPointer client_data, XtPointer call_data)
3719 if(widget == X->CFpi_cftext->textfield)
3721 XtSetArg (args[0], XmNdefaultButton, NULL);
3722 XtSetValues (X->CFframe, args, 1);
3724 XtSetArg(args[0], XmNshowAsDefault, True);
3725 XtSetValues(X->CFpi_butOK, args, 1);
3727 input = XmTextFieldGetString(X->CFpi_cftext->textfield);
3728 if(strcmp(input, "") != 0)
3729 XmProcessTraversal(X->CFpi_dtext->textfield, XmTRAVERSE_CURRENT);
3731 else if(widget == X->CFpi_dtext->textfield)
3733 XtSetArg (args[0], XmNdefaultButton, NULL);
3734 XtSetValues (X->CFframe, args, 1);
3736 XtSetArg(args[0], XmNshowAsDefault, True);
3737 XtSetValues(X->CFpi_butOK, args, 1);
3739 XmProcessTraversal(X->CFpi_vtext->textfield, XmTRAVERSE_CURRENT);
3742 else if(widget == X->CFpi_vtext->textfield)
3744 input = XmTextFieldGetString(X->CFpi_vtext->textfield);
3746 ignore_event = True;
3747 timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
3748 TimerEvent, (XtPointer) value);
3752 create_popup(Widget parent)
3756 Widget dummyHelp1, dummyHelp2, memRegs;
3757 Widget helpI, helpToc, helpT, helpR, helpO, helpU, helpV;
3759 X->popupMenu = XmCreatePopupMenu(parent, "popup", NULL, 0) ;
3760 XtCreateManagedWidget(GETMESSAGE(2, 46,"Calculator Popup"),
3761 xmLabelWidgetClass, X->popupMenu, NULL, 0) ;
3762 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3763 X->popupMenu, NULL, 0) ;
3764 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3765 X->popupMenu, NULL, 0) ;
3768 /* The popup menu contains the following entries ......................*/
3769 /* 1. Memory Registers ... */
3770 memRegs = XtVaCreateManagedWidget( "memRegs1",
3771 xmPushButtonWidgetClass,
3773 XmNlabelString, XmStringCreateLocalized(
3774 GETMESSAGE(2, 15, "Memory Registers") ),
3775 XmNmnemonic, XStringToKeysym(
3776 GETMESSAGE(2, 40, "R") ),
3778 XtAddCallback(memRegs, XmNactivateCallback, (XtCallbackProc)do_memory,
3781 /* 2. Finacial Registers ... */
3782 memRegs = XtVaCreateManagedWidget( "memRegs2",
3783 xmPushButtonWidgetClass,
3785 XmNlabelString, XmStringCreateLocalized(
3786 GETMESSAGE(3, 138, "Financial Registers") ),
3787 XmNmnemonic, XStringToKeysym(
3788 GETMESSAGE( 2, 45, "g" ) ),
3790 XtAddCallback(memRegs, XmNactivateCallback, (XtCallbackProc)do_memory,
3793 /* 3. Ascii Converter ... */
3794 X->asciiConv = XtVaCreateManagedWidget("asciiConv",
3795 xmPushButtonWidgetClass,
3798 XmStringCreateLocalized( GETMESSAGE(2, 16, "ASCII Convert") ),
3799 XmNmnemonic, XStringToKeysym(
3800 GETMESSAGE(2, 41, "A") ),
3802 XtAddCallback(X->asciiConv, XmNactivateCallback, (XtCallbackProc)do_ascii,
3805 if(_DtNl_is_multibyte)
3806 XtSetSensitive(X->asciiConv, False);
3808 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3809 X->popupMenu, NULL, 0) ;
3811 /* 4. Enter Functions ... */
3812 X->enterFun = XtVaCreateManagedWidget("enterFun",
3813 xmPushButtonWidgetClass,
3816 XmStringCreateLocalized( vstrs[(int) V_FUNWNAME] ),
3817 XmNmnemonic, XStringToKeysym(
3818 GETMESSAGE(2, 42, "F") ),
3820 XtAddCallback(X->enterFun, XmNactivateCallback, (XtCallbackProc)new_cf_value,
3821 (XtPointer)(int)M_FUN);
3823 /* 5. Enter Constants ... */
3824 X->enterConst = XtVaCreateManagedWidget("enterConst",
3825 xmPushButtonWidgetClass,
3828 XmStringCreateLocalized( vstrs[(int) V_CONWNAME] ),
3829 XmNmnemonic, XStringToKeysym(
3830 GETMESSAGE(2, 43, "C") ),
3832 XtAddCallback(X->enterConst, XmNactivateCallback,(XtCallbackProc)new_cf_value,
3833 (XtPointer)(int)M_CON);
3835 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3836 X->popupMenu, NULL, 0) ;
3841 dummyHelp1 = XtVaCreatePopupShell ("dummyHelp1",
3842 xmMenuShellWidgetClass,
3848 dummyHelp2 = XtVaCreateWidget("dummyHelp2",
3849 xmRowColumnWidgetClass, dummyHelp1,
3850 XmNrowColumnType, XmMENU_PULLDOWN,
3854 label = XmStringCreateLocalized ( GETMESSAGE(2, 20, "Overview") );
3855 helpI = XtVaCreateManagedWidget ("introduction",
3856 xmPushButtonGadgetClass, dummyHelp2,
3857 XmNlabelString, label,
3858 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 19, "v") ),
3862 XtAddCallback(helpI, XmNactivateCallback,
3863 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_INTRODUCTION);
3864 XmStringFree (label);
3866 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3867 dummyHelp2, NULL, 0);
3869 label = XmStringCreateLocalized ( GETMESSAGE(2, 39, "Table of Contents") );
3870 helpToc = XtVaCreateManagedWidget ("toc",
3871 xmPushButtonGadgetClass, dummyHelp2,
3872 XmNlabelString, label,
3873 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 38, "C") ),
3876 XtAddCallback(helpToc, XmNactivateCallback,
3877 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TABLEOFCONTENTS);
3879 XmStringFree(label);
3882 label = XmStringCreateLocalized ( GETMESSAGE(2, 22, "Tasks") );
3883 helpT = XtVaCreateManagedWidget ("tasks",
3884 xmPushButtonGadgetClass, dummyHelp2,
3885 XmNlabelString, label,
3886 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 21, "T") ),
3889 XtAddCallback(helpT, XmNactivateCallback,
3890 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_TASKS);
3892 XmStringFree(label);
3895 label = XmStringCreateLocalized ( GETMESSAGE(2, 24, "Reference") );
3896 helpR = XtVaCreateManagedWidget ("reference",
3897 xmPushButtonGadgetClass, dummyHelp2,
3898 XmNlabelString, label,
3899 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 23, "R" ) ),
3903 XtAddCallback(helpR, XmNactivateCallback,
3904 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_REFERENCE);
3906 XmStringFree(label);
3908 label = XmStringCreateLocalized ( GETMESSAGE(2, 26, "On Item") );
3910 helpO = XtVaCreateManagedWidget ("onItem",
3911 xmPushButtonGadgetClass, dummyHelp2,
3912 XmNlabelString, label,
3913 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 25, "O") ),
3916 XtAddCallback(helpO, XmNactivateCallback,
3917 (XtCallbackProc)HelpModeCB, (XtPointer)NULL);
3919 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3920 dummyHelp2, NULL, 0);
3921 XmStringFree (label);
3923 label = XmStringCreateLocalized ( GETMESSAGE(2, 28, "Using Help") );
3924 helpU = XtVaCreateManagedWidget ("useHelp",
3925 xmPushButtonGadgetClass, dummyHelp2,
3926 XmNlabelString, label,
3927 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 27, "U") ),
3931 XtAddCallback(helpU, XmNactivateCallback,
3932 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_USING);
3934 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3935 dummyHelp2, NULL, 0);
3937 XmStringFree(label);
3939 label = XmStringCreateLocalized (GETMESSAGE(2, 30, "About Calculator") );
3940 helpV = XtVaCreateManagedWidget ("version",
3941 xmPushButtonGadgetClass, dummyHelp2,
3942 XmNlabelString, label,
3943 XmNmnemonic, XStringToKeysym( GETMESSAGE(2, 29, "A" ) ),
3946 XtAddCallback(helpV, XmNactivateCallback,
3947 (XtCallbackProc)HelpRequestCB, (XtPointer)HELP_VERSION);
3949 XmStringFree(label);
3952 mnemonic = GETMESSAGE(2, 17, "H");
3953 label = XmStringCreateLocalized ( GETMESSAGE(2, 18, "Help") );
3954 XtVaCreateManagedWidget("help",
3955 xmCascadeButtonGadgetClass, X->popupMenu,
3956 XmNsubMenuId, dummyHelp2,
3957 XmNmnemonic, XStringToKeysym( mnemonic ),
3958 XmNlabelString, label,
3960 XmStringFree(label);
3962 XtCreateManagedWidget("separator", xmSeparatorWidgetClass,
3963 X->popupMenu, NULL, 0);
3966 label = XmStringCreateLocalized ( GETMESSAGE(3, 403, "Exit") );
3967 X->Close = XtVaCreateManagedWidget("close",
3968 xmPushButtonWidgetClass,
3970 XmNlabelString, label,
3972 XStringToKeysym(GETMESSAGE(2, 44, "X" )),
3974 XmStringFree(label);
3975 XtAddCallback(X->Close, XmNactivateCallback,(XtCallbackProc)do_frame,
3976 (XtPointer)(int)M_FUN);
3978 XtAddEventHandler(parent, ButtonPressMask, FALSE,
3979 popupHandler, (XtPointer) NULL) ;
3980 XtAddCallback(X->popupMenu, XmNmapCallback,(XtCallbackProc)map_popup,
3985 popupHandler(Widget widget, XtPointer client_data, XEvent *event, Boolean *continue_to_dispatch)
3987 XButtonPressedEvent *bevent;
3989 bevent = (XButtonPressedEvent *)event;
3991 if (event->type == ButtonPress && event->xbutton.button == Button3)
3993 if(bevent->x >= funBtn->core.x &&
3994 bevent->x <= funBtn->core.x + funBtn->core.width &&
3995 bevent->y >= funBtn->core.y +
3996 X->modeline->core.height + X->textForm->core.height &&
3997 bevent->y <= funBtn->core.y +funBtn->core.height +
3998 X->modeline->core.height + X->textForm->core.height)
4000 menu_handler(widget, (XtPointer)M_FUN, event, continue_to_dispatch);
4002 else if(bevent->x >= constBtn->core.x &&
4003 bevent->x <= constBtn->core.x + constBtn->core.width &&
4004 bevent->y >= constBtn->core.y +
4005 X->modeline->core.height + X->textForm->core.height &&
4006 bevent->y <= constBtn->core.y + constBtn->core.height +
4007 X->modeline->core.height + X->textForm->core.height)
4009 menu_handler(widget, (XtPointer)M_CON, event, continue_to_dispatch);
4011 else if(bevent->x >= accBtn->core.x &&
4012 bevent->x <= accBtn->core.x + accBtn->core.width &&
4013 bevent->y >= accBtn->core.y +
4014 X->modeline->core.height + X->textForm->core.height &&
4015 bevent->y <= accBtn->core.y + accBtn->core.height +
4016 X->modeline->core.height + X->textForm->core.height)
4018 menu_handler(widget, (XtPointer)M_ACC, event, continue_to_dispatch);
4020 else if(bevent->x >= rclBtn->core.x &&
4021 bevent->x <= rclBtn->core.x + rclBtn->core.width &&
4022 bevent->y >= rclBtn->core.y +
4023 X->modeline->core.height + X->textForm->core.height &&
4024 bevent->y <= rclBtn->core.y + rclBtn->core.height +
4025 X->modeline->core.height + X->textForm->core.height)
4027 menu_handler(widget, (XtPointer)M_RCL, event, continue_to_dispatch);
4029 else if(bevent->x >= stoBtn->core.x &&
4030 bevent->x <= stoBtn->core.x + stoBtn->core.width &&
4031 bevent->y >= stoBtn->core.y +
4032 X->modeline->core.height + X->textForm->core.height &&
4033 bevent->y <= stoBtn->core.y + stoBtn->core.height +
4034 X->modeline->core.height + X->textForm->core.height)
4036 menu_handler(widget, (XtPointer)M_STO, event, continue_to_dispatch);
4038 else if(bevent->x >= exchBtn->core.x &&
4039 bevent->x <= exchBtn->core.x + exchBtn->core.width &&
4040 bevent->y >= exchBtn->core.y +
4041 X->modeline->core.height + X->textForm->core.height &&
4042 bevent->y <= exchBtn->core.y + exchBtn->core.height +
4043 X->modeline->core.height + X->textForm->core.height)
4045 menu_handler(widget, (XtPointer)M_EXCH, event, continue_to_dispatch);
4049 XmMenuPosition(X->popupMenu, (XButtonPressedEvent *) event) ;
4050 XtManageChild(X->popupMenu) ;
4056 set_option_menu(int type, int base)
4060 if(type == BASEITEM)
4061 XtSetArg(args[0], XmNmenuHistory, X->baseWidgArry[base]);
4062 else if(type == NUMITEM)
4063 XtSetArg(args[0], XmNmenuHistory, X->numWidgArry[base]);
4065 XtSetArg(args[0], XmNmenuHistory, X->ttypeWidgArry[base]);
4066 XtSetValues( X->modevals[type], args, 1);
4070 map_popup(Widget widget, XtPointer client_data, XtPointer call_data)
4072 XmAnyCallbackStruct * callback;
4075 callback = (XmAnyCallbackStruct *) call_data;
4076 event = (XEvent *) callback->event;
4078 if(event->type != KeyRelease)
4081 if (v->event_type == F4_PRESS)
4082 XmMenuPosition(widget, (XButtonPressedEvent *) event) ;
4087 save_state(Widget widget, XtPointer client_data, XtPointer call_data)
4089 char *full_path = NULL;
4090 char *file_name = NULL;
4091 char *sessionFileName;
4093 char **restart_argv = NULL;
4094 static char **start_argv = NULL;
4096 int i, restart_argc;
4097 static int start_argc = 0;
4099 Boolean status = False;
4100 static Boolean first = True;
4102 status = DtSessionSavePath(widget, &full_path, &file_name);
4105 sessionFileName = file_name;
4108 XtFree( (char *)full_path);
4109 full_path = (char *) XtMalloc (sizeof (char) * PATH_MAX);
4110 sprintf( full_path, "%s/%s", dt_path, DTCALC_CLASS_NAME);
4111 sessionFileName = full_path;
4114 SaveSession(full_path, file_name);
4116 /* --------------------------------------------------------------- */
4117 /* Original commandline arguments were saved on the top window */
4118 /* They get reset here, take original and append them to restart */
4119 /* --------------------------------------------------------------- */
4124 XGetCommand(X->dpy, XtWindow(X->kframe), &start_argv, &start_argc);
4127 /* Generate the restart command and add it as the property value */
4129 restart_argc = start_argc + 3;
4130 restart_argv = (char **) XtMalloc(restart_argc * sizeof(char *));
4132 if (restart_argv == NULL)
4135 restart_argv[0] = XtNewString(v->progname);
4137 for ( i = 1 ; (i < start_argc && start_argv != NULL) ; i++ )
4139 restart_argv[i] = XtNewString(start_argv[i]);
4142 restart_argv[i] = XtNewString("-session"); i++;
4143 restart_argv[i] = XtNewString(sessionFileName); i++;
4145 XSetCommand(X->dpy, XtWindow(X->kframe), restart_argv, i);
4146 XSync(X->dpy, False);
4148 for ( i = 0 ; i < restart_argc -1 ; i++ )
4149 XtFree ((char *) restart_argv[i]);
4151 XtFree ((char *) full_path);
4152 XtFree ((char *) file_name);
4158 SaveSession(char *path, char *file_name)
4161 Atom * ws_presence = NULL;
4162 char * workspace_name;
4163 unsigned long num_workspaces = 0;
4166 unsigned long nitems;
4167 unsigned long leftover;
4168 WM_STATE * wm_state;
4172 Dimension width, height;
4177 XmVendorShellExtObject vendorExt;
4178 XmWidgetExtData extData;
4183 /* Create the session file */
4185 if ((fd = creat (path, S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP)) == -1)
4187 tmpStr = GETMESSAGE(2, 34, "Could not open the session file.");
4188 msg = XtNewString(tmpStr);
4189 _DtSimpleError (v->appname, DtError, NULL, msg);
4195 /* Getting the WM_STATE property to see if iconified or not */
4196 XGetWindowProperty (X->dpy, XtWindow (X->kframe),
4197 wm_state_atom, 0L, (long) BUFSIZ, False,
4198 wm_state_atom, &actual_type, &actual_format,
4199 &nitems, &leftover, (unsigned char **) &wm_state);
4201 /* Write out if iconified our not */
4202 if (wm_state->state == IconicState)
4203 put_resource(R_ICON, set_bool(True)) ;
4205 put_resource(R_ICON, set_bool(False)) ;
4207 /* does it have a menubar or not */
4208 if ( application_args.menuBar )
4209 put_resource(R_MENUBAR, set_bool(True)) ;
4211 put_resource(R_MENUBAR, set_bool(False)) ;
4213 /* is keys set to on/off */
4215 put_resource(R_KEYS, set_bool(True)) ;
4217 put_resource(R_KEYS, set_bool(False)) ;
4219 /* Get the workspaces for this dt by accessing the property. */
4221 if (DtWsmGetWorkspacesOccupied (X->dpy, XtWindow (X->kframe),
4222 &ws_presence, &num_workspaces) == Success)
4226 string = (char *)XtMalloc(num_workspaces * 40);
4227 for (j = 0; j < num_workspaces; j++)
4229 workspace_name = XGetAtomName (X->dpy, ws_presence[j]);
4231 strcpy(string, workspace_name);
4233 strcat(string, workspace_name);
4234 if(j + 1 != num_workspaces)
4235 strcat(string, " ");
4236 XtFree ((char *) workspace_name);
4238 put_resource(R_WORKSPACE, string) ;
4240 XFree((char *)ws_presence);
4241 XtFree((char *)string);
4246 XtSetArg(args[0], XmNwidth, &width);
4247 XtSetArg(args[1], XmNheight, &height);
4248 XtGetValues(X->kframe, args, 2);
4250 XTranslateCoordinates(XtDisplay(X->kframe),
4251 XtWindow(X->kframe),
4252 RootWindowOfScreen(XtScreen(X->kframe)),
4258 /* Modify x & y to take into account window mgr frames */
4259 extData=_XmGetWidgetExtData(X->kframe, XmSHELL_EXTENSION);
4260 vendorExt = (XmVendorShellExtObject)extData->widget;
4261 x -= vendorExt->vendor.xOffset;
4262 y -= vendorExt->vendor.yOffset;
4264 sprintf(tempStr, "%d", width);
4265 put_resource(R_WIDTH, tempStr) ;
4266 sprintf(tempStr, "%d", height);
4267 put_resource(R_HEIGHT, tempStr) ;
4268 sprintf(tempStr, "%d", x);
4269 put_resource(R_X, tempStr) ;
4270 sprintf(tempStr, "%d", y);
4271 put_resource(R_Y, tempStr) ;
4273 write_resources(path);
4277 RestoreSession(void)
4279 Boolean status=False;
4282 char * full_path = NULL;
4284 int boolval, i, intval ;
4285 int MPtemp[MP_SIZE];
4287 status = DtSessionRestorePath(X->kframe, &full_path,
4288 application_args.session);
4292 path = XtNewString(full_path);
4294 db = XrmGetFileDatabase(path) ;
4295 XrmMergeDatabases(db, &(X->rDB)) ;
4297 if (get_int_resource(R_ACCURACY, &intval))
4299 v->accuracy = intval ;
4300 if (v->accuracy < 0 || v->accuracy > 9)
4302 msg = (char *) XtMalloc(strlen( opts[(int) O_ACCRANGE]) + 3);
4303 sprintf(msg, "%s", opts[(int) O_ACCRANGE]);
4304 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4310 if ((full_path = get_resource(R_BASE)) != NULL)
4312 for (i = 0; i < MAXBASES; i++)
4313 if (EQUAL(full_path, base_str[i])) break ;
4317 msg = (char *) XtMalloc(strlen( opts[(int) O_BASE]) + 3);
4318 sprintf(msg, "%s", opts[(int) O_BASE]);
4319 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4324 v->base = (enum base_type) i ;
4328 if (get_str_resource(R_DISPLAY, str))
4330 for (i = 0; i < MAXDISPMODES; i++)
4331 if (EQUAL(str, dtype_str[i])) break ;
4333 if (i == MAXDISPMODES)
4335 msg = (char *) XtMalloc(strlen( opts[(int) O_DISPLAY]) +
4337 sprintf(msg, opts[(int) O_DISPLAY], str);
4338 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4341 else v->dtype = (enum num_type) i ;
4344 if (get_str_resource(R_MODE, str))
4346 for (i = 0; i < MAXMODES; i++)
4347 if (EQUAL(str, mode_str[i])) break ;
4351 msg = (char *)XtMalloc(strlen( opts[(int) O_MODE]) + strlen(str) + 3);
4352 sprintf(msg, opts[(int) O_MODE], str);
4353 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4356 else v->modetype = (enum mode_type) i ;
4359 if (get_str_resource(R_TRIG, str))
4361 for (i = 0; i < MAXTRIGMODES; i++)
4362 if (EQUAL(str, ttype_str[i])) break ;
4364 if (i == MAXTRIGMODES)
4366 msg = (char *)XtMalloc(strlen( opts[(int) O_TRIG]) + strlen(str) + 3);
4367 sprintf(msg, opts[(int) O_TRIG], str);
4368 _DtSimpleError (v->appname, DtWarning, NULL, msg);
4371 else v->ttype = (enum trig_type) i ;
4374 if (get_bool_resource(R_REGS, &boolval)) v->rstate = boolval ;
4376 /* Get the iconify state */
4377 if (get_bool_resource(R_ICON, &boolval)) v->iconic = boolval;
4379 /* Get the menubar state */
4380 if (get_bool_resource(R_MENUBAR, &boolval))
4381 application_args.menuBar = boolval;
4383 /* Get the keys state */
4384 if (get_bool_resource(R_KEYS, &boolval)) v->tstate = boolval;
4386 /* Get the proper workspaces if needed */
4387 if ((full_path = get_resource(R_WORKSPACE)) != NULL)
4388 v->workspaces = XtNewString(full_path);
4390 /* Get the x, y width, and height */
4391 if (get_int_resource(R_WIDTH, &intval))
4393 if (get_int_resource(R_HEIGHT, &intval))
4394 v->height = intval ;
4395 if (get_int_resource(R_X, &intval))
4397 if (get_int_resource(R_Y, &intval))
4400 if (get_str_resource(R_DISPLAYED, str))
4402 STRCPY(v->display, str);
4403 MPstr_to_num(str, v->base, v->MPdisp_val) ;
4406 if (get_str_resource(R_REG0, str))
4407 MPstr_to_num(str, v->base, v->MPmvals[0]) ;
4408 if (get_str_resource(R_REG1, str))
4409 MPstr_to_num(str, v->base, v->MPmvals[1]) ;
4410 if (get_str_resource(R_REG2, str))
4411 MPstr_to_num(str, v->base, v->MPmvals[2]) ;
4412 if (get_str_resource(R_REG3, str))
4413 MPstr_to_num(str, v->base, v->MPmvals[3]) ;
4414 if (get_str_resource(R_REG4, str))
4415 MPstr_to_num(str, v->base, v->MPmvals[4]) ;
4416 if (get_str_resource(R_REG5, str))
4417 MPstr_to_num(str, v->base, v->MPmvals[5]) ;
4418 if (get_str_resource(R_REG6, str))
4419 MPstr_to_num(str, v->base, v->MPmvals[6]) ;
4420 if (get_str_resource(R_REG7, str))
4421 MPstr_to_num(str, v->base, v->MPmvals[7]) ;
4422 if (get_str_resource(R_REG8, str))
4423 MPstr_to_num(str, v->base, v->MPmvals[8]) ;
4424 if (get_str_resource(R_REG9, str))
4425 MPstr_to_num(str, v->base, v->MPmvals[9]) ;
4427 if (get_str_resource(R_FREG0, str))
4429 MPstr_to_num(str, v->base, MPtemp) ;
4430 mpcmd(MPtemp, &(v->MPfvals[0]));
4432 if (get_str_resource(R_FREG1, str))
4434 MPstr_to_num(str, v->base, MPtemp) ;
4435 mpcmd(MPtemp, &(v->MPfvals[1]));
4437 if (get_str_resource(R_FREG2, str))
4439 MPstr_to_num(str, v->base, MPtemp) ;
4440 mpcmd(MPtemp, &(v->MPfvals[2]));
4442 if (get_str_resource(R_FREG3, str))
4444 MPstr_to_num(str, v->base, MPtemp) ;
4445 mpcmd(MPtemp, &(v->MPfvals[3]));
4447 if (get_str_resource(R_FREG4, str))
4449 MPstr_to_num(str, v->base, MPtemp) ;
4450 mpcmd(MPtemp, &(v->MPfvals[4]));
4452 if (get_str_resource(R_FREG5, str))
4454 MPstr_to_num(str, v->base, MPtemp) ;
4455 mpcmd(MPtemp, &(v->MPfvals[5]));
4464 Atom * workspace_atoms = NULL;
4465 int num_workspaces=0;
4469 if(v->width != 0 && v->height != 0)
4471 WMShellWidget wm = (WMShellWidget)(X->kframe);
4472 wm->wm.size_hints.flags |= USPosition;
4473 XtSetArg (args[0], XmNx, (Position)v->x);
4474 XtSetArg (args[1], XmNy, (Position)v->y);
4475 XtSetArg (args[2], XmNwidth, (Dimension)v->width);
4476 XtSetArg (args[3], XmNheight, (Dimension)v->height);
4477 XtSetValues (X->kframe, args, 4);
4482 /* add the iconify hint to the current shell */
4483 XtSetArg(args[0], XmNinitialState, IconicState);
4484 XtSetValues(X->kframe, args, 1);
4488 /* Remove the iconify hint from the current shell */
4489 wmhints = XGetWMHints(X->dpy, XtWindow(X->kframe));
4490 wmhints->flags |= IconWindowHint;
4491 wmhints->initial_state = NormalState;
4492 XSetWMHints(X->dpy, XtWindow(X->kframe), wmhints);
4500 ptr = DtStrchr (v->workspaces, ' ');
4502 if (ptr != NULL) *ptr = '\0';
4504 workspace_atoms = (Atom *) XtRealloc ((char *)workspace_atoms,
4505 sizeof (Atom) * (num_workspaces + 1));
4507 workspace_atoms[num_workspaces] =
4508 XmInternAtom (X->dpy, v->workspaces, True);
4515 v->workspaces = ptr + 1;
4517 } while (ptr != NULL);
4519 DtWsmSetWorkspacesOccupied (X->dpy, XtWindow (X->kframe),
4520 workspace_atoms, num_workspaces);
4522 XtFree ((char *) workspace_atoms);
4527 TimerEvent( XtPointer client_data, XtIntervalId *id)
4531 ignore_event = False;
4535 XtSetArg (args[0], XmNdefaultButton, X->CFpi_butOK);
4536 XtSetValues (X->CFframe, args, 1);
4541 _DtcalcStripSpaces(char *file)
4548 for (i = 0; i < strlen(file); i++)
4550 if (isspace(file[i]))
4552 for(j = i; file[j] != '\0'; j++)
4553 file[j] = file[j + 1];