/* $XConsortium: input.c /main/5 1995/07/15 20:45:41 drk $ */ /* * @OPENGROUP_COPYRIGHT@ * COPYRIGHT NOTICE * Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc. * Copyright (c) 1996, 1997, 1998, 1999, 2000 The Open Group * ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for * the full copyright text. * * This software is subject to an open license. It may only be * used on, with or for operating systems which are themselves open * source systems. You must contact The Open Group for a license * allowing distribution and sublicensing of this software on, with, * or for operating systems which are not Open Source programs. * * See http://www.opengroup.org/openmotif/license for full * details of the license agreement. Any use, reproduction, or * distribution of the program constitutes recipient's acceptance of * this agreement. * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS * PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY * WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY * OR FITNESS FOR A PARTICULAR PURPOSE * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT * NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE * EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ /* * HISTORY */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define WI_INPUT 0 #define WI_MAINWINDOW 1 #define WI_MENUBAR 2 #define WI_FILEMENU 3 #define WI_EXIT 4 #define WI_FILE 5 #define WI_MAIN 6 #define WI_SCROLLEDTEXT 7 #define WI_STFONT 8 #define WI_SCROLLEDTEXT1 20 #define WI_SEPARATOR 21 #define WI_TEXT 22 #define WI_TEXT1 35 #define WI_SEPARATOR1 36 #define WI_TEXTFIELD 37 #define WI_TEXTFIELD1 50 #define WI_HELPMENU 51 #define WI_OVERVIEW 52 #define WI_INPUTINFO 53 #define WI_HELP 54 #define WI_FORM 0 #define WI_FONT 1 #define WI_RADIOBOX 2 #define WI_BUTTON1 3 #define WI_BUTTON2 4 #define WI_BUTTON3 5 #define WI_LABEL 6 #define WI_COLOR 7 #define WI_RADIOBOX1 8 #define WI_BUTTON4 9 #define WI_BUTTON5 10 #define WI_BUTTON6 11 #define WI_LABEL1 12 /* Global data */ typedef struct { String locale_string; String preedit_string; String status_string; String im_info_string; String no_im_string; String no_ic_string; } ApplicationData, *ApplicationDataPtr; static ApplicationData app_resources; static XtResource resources[] = { { "localeString", "LocaleString", XtRString, sizeof (String), XtOffset(ApplicationDataPtr, locale_string), XtRImmediate, "Locale:" }, { "preeditString", "PreeditString", XtRString, sizeof (String), XtOffset(ApplicationDataPtr, preedit_string), XtRImmediate, "Preedit style:" }, { "statusString", "StatusString", XtRString, sizeof (String), XtOffset(ApplicationDataPtr, status_string), XtRImmediate, "Status style:" }, { "noImString", "NoImString", XtRString, sizeof (String), XtOffset(ApplicationDataPtr, no_im_string), XtRImmediate, "No input method has been opened" }, { "noIcString", "NoIcString", XtRString, sizeof (String), XtOffset(ApplicationDataPtr, no_ic_string), XtRImmediate, "No input context(s) created" }, { "imInfoString", "ImInfoString", XtRString, sizeof (String), XtOffset(ApplicationDataPtr, im_info_string), XtRImmediate, "\n\ See VendorShell documentation for more information\n\ on preedit and status styles. For information on\n\ available input methods and invocation of input\n\ methods, refer to your vendor documentation." } }; /* callback functions */ static void ShowIMStatus(Widget widget, XtPointer args, XtPointer calldata); static void SelectFont(Widget widget, XtPointer args, XtPointer calldata); static void SelectColor(Widget widget, XtPointer args, XtPointer calldata); static void Exit(Widget widget, XtPointer args, XtPointer calldata); static void Overview(Widget widget, XtPointer args, XtPointer calldata); /**************************************************************** * * Interface * ****************************************************************/ /**************************************************************** * get_constraint_widget: * Get the right widget for setting form constraints. * Used for the scrolled XmText. * ****************************************************************/ static Widget get_constraint_widget(Widget child, Widget parent) { Widget w; w = child; while (XtParent(w) != parent) w = XtParent(w); return (w); } /**************************************************************** * * Main C code for presentation component * ****************************************************************/ /************************************************************** * form_widget: * Create a form widget with two radio boxes inside a frame, * one for setting fonts and one for setting color. * **************************************************************/ static void form_widget(char * name, Widget parent, Widget * warr_ret) { Arg args[16]; Widget widget_array[13]; XtCallbackList cbl; XtCallbackRec cbs1[2]; XtCallbackRec cbs2[2]; int inc; int n; /***************** object of type : XmForm *****************/ n = 0; XtSetArg(args[n], XmNfractionBase, 8); n++; widget_array[WI_FORM] = XmCreateForm(parent, name, args, n); /***************** font : XmFrame *****************/ widget_array[WI_FONT] = XmCreateFrame(widget_array[WI_FORM], "font", NULL, 0); /***************** radiobox : XmRadioBox *****************/ n = 0; cbl = cbs1; cbl->closure = (XtPointer) NULL; cbl->callback = SelectFont; cbl++; if (cbl != cbs1) { cbl->callback = NULL; XtSetArg(args[n], XmNentryCallback, cbs1); n++; } widget_array[WI_RADIOBOX] = XmCreateRadioBox(widget_array[WI_FONT], "radiobox", args, n); /***************** button1 : XmToggleButton *****************/ widget_array[WI_BUTTON1] = XmCreateToggleButton(widget_array[WI_RADIOBOX], "button1", NULL, 0); /***************** button2 : XmToggleButton *****************/ widget_array[WI_BUTTON2] = XmCreateToggleButton(widget_array[WI_RADIOBOX], "button2", NULL, 0); /***************** button3 : XmToggleButton *****************/ widget_array[WI_BUTTON3] = XmCreateToggleButton(widget_array[WI_RADIOBOX], "button3", NULL, 0); /***************** label : XmLabel *****************/ n = 0; XtSetArg(args[n], XmNchildType, XmFRAME_TITLE_CHILD); n++; XtSetArg(args[n], XmNchildHorizontalAlignment, XmALIGNMENT_CENTER); n++; widget_array[WI_LABEL] = XmCreateLabel(widget_array[WI_FONT], "label", args, n); /***************** color : XmFrame *****************/ widget_array[WI_COLOR] = XmCreateFrame(widget_array[WI_FORM], "color", NULL, 0); /***************** radiobox : XmRadioBox *****************/ n = 0; cbl = cbs2; cbl->closure = (XtPointer) NULL; cbl->callback = SelectColor; cbl++; if (cbl != cbs2) { cbl->callback = NULL; XtSetArg(args[n], XmNentryCallback, cbs2); n++; } widget_array[WI_RADIOBOX1] = XmCreateRadioBox(widget_array[WI_COLOR], "radiobox", args, n); /***************** button1 : XmToggleButton *****************/ n = 0; widget_array[WI_BUTTON4] = XmCreateToggleButton(widget_array[WI_RADIOBOX1], "button1", args, n); /***************** button2 : XmToggleButton *****************/ n = 0; widget_array[WI_BUTTON5] = XmCreateToggleButton(widget_array[WI_RADIOBOX1], "button2", args, n); /***************** button3 : XmToggleButton *****************/ n = 0; widget_array[WI_BUTTON6] = XmCreateToggleButton(widget_array[WI_RADIOBOX1], "button3", args, n); /***************** label : XmLabel *****************/ n = 0; XtSetArg(args[n], XmNchildType, XmFRAME_TITLE_CHILD); n++; XtSetArg(args[n], XmNchildHorizontalAlignment, XmALIGNMENT_CENTER); n++; widget_array[WI_LABEL1] = XmCreateLabel(widget_array[WI_COLOR], "label", args, n); /***************** font : XmFrame *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightPosition, 4); n++; XtSetArg(args[n], XmNtopPosition, 5); n++; XtSetValues(widget_array[WI_FONT], args, n); XtManageChild(widget_array[WI_BUTTON1]); XtManageChild(widget_array[WI_BUTTON2]); XtManageChild(widget_array[WI_BUTTON3]); XtManageChild(widget_array[WI_RADIOBOX]); XtManageChild(widget_array[WI_LABEL]); XtManageChild(widget_array[WI_FONT]); /***************** color : XmFrame *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, widget_array[WI_FONT]); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopPosition, 5); n++; XtSetValues(widget_array[WI_COLOR], args, n); XtManageChild(widget_array[WI_BUTTON4]); XtManageChild(widget_array[WI_BUTTON5]); XtManageChild(widget_array[WI_BUTTON6]); XtManageChild(widget_array[WI_RADIOBOX1]); XtManageChild(widget_array[WI_LABEL1]); XtManageChild(widget_array[WI_COLOR]); XtManageChild(widget_array[WI_FORM]); if (warr_ret != NULL) { (void) memcpy((char *)warr_ret, (char *)widget_array, sizeof(Widget)*13); } } /************************************************************** * create_input_widget: * Creates the application shell and all children except the * two dialogs. **************************************************************/ static Widget create_input_widget(char * name, Display * display, int argc, char ** argv) { Arg args[18]; Arg pargs[5]; Widget tmpw; Widget widget_array[60]; int inc; int n; int pn; /***************** ApplicationShell *****************/ n = 0; /* Setup argc & argv attribute */ XtSetArg(args[n], XtNargc, argc); n++; XtSetArg(args[n], XtNargv, argv); n++; XtSetArg(args[n], XtNallowShellResize, True); n++; /* to allow widgets to change size when font changes */ widget_array[WI_INPUT] = XtAppCreateShell(name, "I18ninput", applicationShellWidgetClass, display, args, n); /***************** mainWindow : XmMainWindow *****************/ widget_array[WI_MAINWINDOW] = XmCreateMainWindow(widget_array[WI_INPUT], "mainWindow", NULL, 0); /***************** menuBar : XmMenuBar *****************/ widget_array[WI_MENUBAR] = XmCreateMenuBar(widget_array[WI_MAINWINDOW], "menuBar", NULL, 0); /***************** filemenu : XmPulldownMenu *****************/ widget_array[WI_FILEMENU] = XmCreatePulldownMenu(widget_array[WI_MENUBAR], "filemenu", NULL, 0); /***************** exit : XmPushButton *****************/ widget_array[WI_EXIT] = XmCreatePushButton(widget_array[WI_FILEMENU], "Exit", NULL, 0); XtAddCallback(widget_array[WI_EXIT], XmNactivateCallback, (XtCallbackProc)Exit, NULL); /***************** file : XmCascadeButton *****************/ n = 0; XtSetArg(args[n], XmNsubMenuId, widget_array[WI_FILEMENU]); n++; widget_array[WI_FILE] = XmCreateCascadeButton(widget_array[WI_MENUBAR], "File", args, n); /***************** helpmenu : XmPulldownMenu *****************/ widget_array[WI_HELPMENU] = XmCreatePulldownMenu(widget_array[WI_MENUBAR], "helpmenu", NULL, 0); /***************** overview : XmPushButton *****************/ widget_array[WI_OVERVIEW] = XmCreatePushButton(widget_array[WI_HELPMENU], "Overview", NULL, 0); XtAddCallback(widget_array[WI_OVERVIEW], XmNactivateCallback, (XtCallbackProc)Overview, NULL); /***************** input : XmPushButton *****************/ widget_array[WI_INPUTINFO] = XmCreatePushButton(widget_array[WI_HELPMENU], "InputInfo", NULL, 0); XtAddCallback(widget_array[WI_INPUTINFO], XmNactivateCallback, (XtCallbackProc)ShowIMStatus, NULL); /***************** help : XmCascadeButton *****************/ n = 0; XtSetArg(args[n], XmNsubMenuId, widget_array[WI_HELPMENU]); n++; widget_array[WI_HELP] = XmCreateCascadeButton(widget_array[WI_MENUBAR], "Help", args, n); n = 0; XtSetArg(args[n], XmNmenuHelpWidget, widget_array[WI_HELP]); n++; XtSetValues(widget_array[WI_MENUBAR], args, n); /***************** main : XmForm *****************/ n = 0; XtSetArg(args[n], XmNfractionBase, 3); n++; widget_array[WI_MAIN] = XmCreateForm(widget_array[WI_MAINWINDOW], "main", args, n); /***************** scrolledtext : XmForm *****************/ form_widget("scrolledtext", widget_array[WI_MAIN], &(widget_array[WI_SCROLLEDTEXT])); /***************** scrolledText : XmScrolledText *****************/ n = 0; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNrows, 8); n++; XtSetArg(args[n], XmNcolumns, 12); n++; widget_array[WI_SCROLLEDTEXT1] = XmCreateScrolledText(widget_array[WI_SCROLLEDTEXT], "scrolledText", args, n); /***************** separator : XmSeparator *****************/ n = 0; XtSetArg(args[n], XmNorientation, XmVERTICAL); n++; XtSetArg(args[n], XmNshadowThickness, 4); n++; widget_array[WI_SEPARATOR] = XmCreateSeparator(widget_array[WI_MAIN], "separator", args, n); /***************** text : XmForm *****************/ form_widget("text", widget_array[WI_MAIN], &(widget_array[WI_TEXT])); /***************** text : XmText *****************/ n = 0; XtSetArg(args[n], XmNcolumns, 12); n++; widget_array[WI_TEXT1] = XmCreateText(widget_array[WI_TEXT], "Text", args, n); /***************** separator1 : XmSeparator *****************/ n = 0; XtSetArg(args[n], XmNorientation, XmVERTICAL); n++; XtSetArg(args[n], XmNshadowThickness, 4); n++; widget_array[WI_SEPARATOR1] = XmCreateSeparator(widget_array[WI_MAIN], "separator1", args, n); /***************** textfield : XmForm *****************/ form_widget("textfield", widget_array[WI_MAIN], &(widget_array[WI_TEXTFIELD])); /***************** textField : XmTextField *****************/ n = 0; XtSetArg(args[n], XmNcolumns, 12); n++; widget_array[WI_TEXTFIELD1] = XmCreateTextField(widget_array[WI_TEXTFIELD], "textField", args, n); XtManageChild(widget_array[WI_EXIT]); XtManageChild(widget_array[WI_FILE]); XtManageChild(widget_array[WI_OVERVIEW]); XtManageChild(widget_array[WI_INPUTINFO]); XtManageChild(widget_array[WI_HELP]); XtManageChild(widget_array[WI_MENUBAR]); /***************** scrolledtext : XmForm *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightPosition, 1); n++; XtSetValues(widget_array[WI_SCROLLEDTEXT], args, n); /***************** scrolledText : XmScrolledText *****************/ pn = 0; XtSetArg(pargs[pn], XmNleftAttachment, XmATTACH_FORM); pn++; XtSetArg(pargs[pn], XmNrightAttachment, XmATTACH_FORM); pn++; XtSetArg(pargs[pn], XmNtopAttachment, XmATTACH_FORM); pn++; XtSetArg(pargs[pn], XmNbottomAttachment, XmATTACH_WIDGET); pn++; XtSetArg(pargs[pn], XmNbottomWidget, widget_array[WI_STFONT]); pn++; tmpw = get_constraint_widget(widget_array[WI_SCROLLEDTEXT1], widget_array[WI_SCROLLEDTEXT]); if (tmpw) XtSetValues(tmpw, pargs, pn); XtManageChild(widget_array[WI_SCROLLEDTEXT1]); XtManageChild(widget_array[WI_SCROLLEDTEXT]); /***************** separator : XmSeparator *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftWidget, widget_array[WI_SCROLLEDTEXT]); n++; XtSetValues(widget_array[WI_SEPARATOR], args, n); XtManageChild(widget_array[WI_SEPARATOR]); /***************** text : XmForm *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, widget_array[WI_SEPARATOR]); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNrightPosition, 2); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetValues(widget_array[WI_TEXT], args, n); /***************** text : XmText *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE); n++; XtSetValues(widget_array[WI_TEXT1], args, n); XtManageChild(widget_array[WI_TEXT1]); XtManageChild(widget_array[WI_TEXT]); /***************** separator1 : XmSeparator *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftWidget, widget_array[WI_TEXT]); n++; XtSetValues(widget_array[WI_SEPARATOR1], args, n); XtManageChild(widget_array[WI_SEPARATOR1]); /***************** textfield : XmForm *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, widget_array[WI_SEPARATOR1]); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetValues(widget_array[WI_TEXTFIELD], args, n); /***************** textField : XmTextField *****************/ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE); n++; XtSetValues(widget_array[WI_TEXTFIELD1], args, n); XtManageChild(widget_array[WI_TEXTFIELD1]); XtManageChild(widget_array[WI_TEXTFIELD]); XtManageChild(widget_array[WI_MAIN]); XtManageChild(widget_array[WI_MAINWINDOW]); /* * Return the first created widget. */ return widget_array[WI_INPUT]; } /**************************************************************** * * Dialog * ****************************************************************/ /**************************************************************** * SelectFont: * Set the font of the Text child of our parent form to the * ****************************************************************/ /*ARGSUSED*/ static void SelectFont(Widget widget, XtPointer args, XtPointer calldata) { XmRowColumnCallbackStruct *cbs = (XmRowColumnCallbackStruct*)calldata; XmFontList fontlist; Widget *children, *swchildren; Cardinal num_children, num_swchildren; Widget form = widget; Boolean set = False; int i, j; XtVaGetValues(cbs->widget, XmNfontList, &fontlist, XmNset, &set, NULL); if (!set) return; /* do not change font when toggle is unset */ /* Find XmForm parent */ while (form && !XmIsForm(form)) form = XtParent(form); if (form) { /* Find an XmText[Field] child and apply XmNfontList */ XtVaGetValues(form, XmNchildren, &children, XmNnumChildren, &num_children, NULL); for (i = 0; i < num_children; i++) { if (XmIsText(children[i]) || XmIsTextField(children[i])) { XtVaSetValues(children[i], XmNfontList, fontlist, NULL); break; } if (XmIsScrolledWindow(children[i])) { /* This may be a scrolled text. Look for an XmText child */ XtVaGetValues(children[i], XmNchildren, &swchildren, XmNnumChildren, &num_swchildren, NULL); for (j = 0; j < num_swchildren; j++) if (XmIsText(swchildren[j])) { XtVaSetValues(swchildren[j], XmNfontList, fontlist, NULL); break; } if (j != num_swchildren) break; } } } } /*ARGSUSED*/ static void SelectColor(Widget widget, XtPointer args, XtPointer calldata) { XmRowColumnCallbackStruct *cbs = (XmRowColumnCallbackStruct*)calldata; Pixel color; Widget *children, *swchildren; Cardinal num_children, num_swchildren; Widget form = widget; Boolean set; int i, j; XtVaGetValues(cbs->widget, XmNforeground, &color, XmNset, &set, NULL); if (!set) return; /* do not change color when toggle is unset */ /* Find XmForm parent */ while (form && !XmIsForm(form)) form = XtParent(form); if (form) { /* Find an XmText[Field] child and apply toggle's XmNforeground to text's XmNbackground */ XtVaGetValues(form, XmNchildren, &children, XmNnumChildren, &num_children, NULL); for (i = 0; i < num_children; i++) { if (XmIsText(children[i]) || XmIsTextField(children[i])) XtVaSetValues(children[i], XmNbackground, color, NULL); if (XmIsScrolledWindow(children[i])) { /* This may be a scrolled text. Look for an XmText child */ XtVaGetValues(children[i], XmNchildren, &swchildren, XmNnumChildren, &num_swchildren, NULL); for (j = 0; j < num_swchildren; j++) if (XmIsText(swchildren[j])) { XtVaSetValues(swchildren[j], XmNbackground, color, NULL); break; } if (j != num_swchildren) break; } } } } /*ARGSUSED*/ static void ShowIMStatus(Widget widget, XtPointer client_data, XtPointer calldata) { static Widget message_dialog = NULL; Widget toplevel; Widget text_widget, tmp_w; XIM xim; XIC xic = NULL; XIMStyle style; char *locale; char *preedit_style = "", *status_style = ""; char *buf; XmString message_str; Arg args[10]; int n; /* Get input method used */ xim = XmImGetXIM(widget); if (!xim) { locale = setlocale(LC_CTYPE, NULL); } else { locale = XLocaleOfIM(xim); } /* Find ApplicationShell */ toplevel = widget; while (toplevel && !XtIsApplicationShell(toplevel)) toplevel = XtParent(toplevel); if (!toplevel) return; /* Get input context info for text widget */ text_widget = XtNameToWidget(toplevel, "*Text"); if (text_widget) xic = XmImSetXIC(text_widget, NULL); if (xic && XGetICValues(xic, XNInputStyle, &style, NULL) == NULL) { if (style & XIMPreeditArea) preedit_style = "OffTheSpot \t(XIMPreeditArea)"; else if (style & XIMPreeditPosition) preedit_style = "OverTheSpot \t(XIMPreeditPosition)"; else if (style & XIMPreeditNothing) preedit_style = "Root \t(XIMPreeditNothing)"; else if (style & XIMPreeditNone) preedit_style = "None \t(XIMPreeditNone)"; if (style & XIMStatusArea) status_style = "OffTheSpot \t(XIMStatusArea)"; else if (style & XIMStatusNothing) status_style = "Root \t(XIMStatusNothing)"; else if (style & XIMStatusNone) status_style = "None \t(XIMStatusNone)"; } /* Create help text */ buf = (char *)XtMalloc(strlen(app_resources.locale_string) + strlen(locale) + strlen(app_resources.preedit_string) + strlen(preedit_style) + strlen(app_resources.status_string) + strlen(status_style) + strlen(app_resources.im_info_string) + 100); if (xim) { if (xic) { sprintf(buf, "%s \t%s\n%s \t%s\n%s \t%s\n%s", app_resources.locale_string, locale, app_resources.preedit_string, preedit_style, app_resources.status_string, status_style, app_resources.im_info_string); } else { sprintf(buf, "%s \t%s\n%s\n%s", app_resources.locale_string, locale, app_resources.no_ic_string, app_resources.im_info_string); } } else { sprintf(buf, "%s \t%s\n%s", app_resources.locale_string, locale, app_resources.no_im_string); } message_str = XmStringGenerate(buf, NULL, XmCHARSET_TEXT, NULL); XtFree((char *)buf); /* put help text in a message dialog */ n = 0; XtSetArg(args[n], XmNmessageString, message_str); n++; if (message_dialog == NULL) { message_dialog = XmCreateMessageDialog(toplevel, "im_info", args, n); /* Only keep OK button */ tmp_w = XmMessageBoxGetChild(message_dialog, XmDIALOG_CANCEL_BUTTON); XtUnmanageChild(tmp_w); tmp_w = XmMessageBoxGetChild(message_dialog, XmDIALOG_HELP_BUTTON); XtUnmanageChild(tmp_w); } else { XtSetValues(message_dialog, args, n); } XtManageChild(message_dialog); XmStringFree(message_str); } /*ARGSUSED*/ static void Overview(Widget widget, XtPointer client_data, XtPointer calldata) { Widget toplevel; static Widget help_window = NULL; Arg args[10]; int n; Position x, y; Dimension width, height; /* Find ApplicationShell */ toplevel = widget; while (toplevel && !XtIsApplicationShell(toplevel)) toplevel = XtParent(toplevel); if (!toplevel) return; /* Position dialog */ n = 0; XtSetArg(args[n], XmNx, &x); n++; XtSetArg(args[n], XmNy, &y); n++; XtSetArg(args[n], XmNwidth, &width); n++; XtSetArg(args[n], XmNheight, &height); n++; XtGetValues(toplevel, args, n); n = 0; XtSetArg(args[n], XmNx, x+width/2); n++; XtSetArg(args[n], XmNy, y+height/2); n++; if (help_window == NULL) { XtSetArg(args[n], XmdNhelpFile, "i18ninput"); n++; XtSetArg(args[n], XmNrenderTable, NULL); n++; /* to get default */ help_window = XmdCreateHelpDialog(toplevel, "help", args, n); } else { XtSetValues(XtParent(help_window), args, n); } XtManageChild(help_window); } /*ARGSUSED*/ static void Exit(Widget widget, XtPointer args, XtPointer calldata) { exit(0); } int dialog_init(int *argc, char **argv, Display *dpy) { Widget appl_w; appl_w = create_input_widget("input", dpy, *argc, argv); XtGetApplicationResources(appl_w, &app_resources, resources, XtNumber(resources), NULL, 0); XtRealizeWidget(appl_w); XtPopup(appl_w, XtGrabNone); return 0; }