diff options
author | Bram Moolenaar <Bram@vim.org> | 2004-12-31 20:56:11 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2004-12-31 20:56:11 +0000 |
commit | dfccaf0f00e8308eae09cb8f012fce3e56097f0f (patch) | |
tree | d5c0e8137b95d98e8e606c09af1e6011d9e9d980 /src/gui_motif.c | |
parent | 8fc061c7f7acb3e80d5fd64d89ad71486d88f5e0 (diff) | |
download | vim-git-dfccaf0f00e8308eae09cb8f012fce3e56097f0f.tar.gz |
updated for version 7.0027
Diffstat (limited to 'src/gui_motif.c')
-rw-r--r-- | src/gui_motif.c | 606 |
1 files changed, 527 insertions, 79 deletions
diff --git a/src/gui_motif.c b/src/gui_motif.c index 4fe26ec57..d345af5cb 100644 --- a/src/gui_motif.c +++ b/src/gui_motif.c @@ -93,9 +93,6 @@ static void attachDump(Widget, char *); static void gui_motif_menu_colors __ARGS((Widget id)); static void gui_motif_scroll_colors __ARGS((Widget id)); -#ifdef FEAT_MENU -static void gui_motif_menu_fontlist __ARGS((Widget id)); -#endif #if (XmVersion >= 1002) # define STRING_TAG XmFONTLIST_DEFAULT_TAG @@ -125,17 +122,122 @@ scroll_cb(w, client_data, call_data) gui_drag_scrollbar(sb, value, dragging); } - /* * End of call-back routines */ +#ifndef LESSTIF_VERSION +/* + * Implement three dimensional shading of insensitive labels. + * By Martin Dalecki. + */ + +#include <Xm/XmP.h> +#include <Xm/LabelP.h> + +static XtExposeProc old_label_expose = NULL; + +static void label_expose __ARGS((Widget _w, XEvent *_event, Region _region)); + + static void +label_expose(_w, _event, _region) + Widget _w; + XEvent *_event; + Region _region; +{ + GC insensitiveGC; + XmLabelWidget lw = (XmLabelWidget)_w; + unsigned char label_type = XmSTRING; + + XtVaGetValues(_w, XmNlabelType, &label_type, (XtPointer)0); + + if (XtIsSensitive(_w) || label_type != XmSTRING) + (*old_label_expose)(_w, _event, _region); + else + { + XGCValues values; + XtGCMask mask; + XtGCMask dynamic; + XFontStruct *fs; + + _XmFontListGetDefaultFont(lw->label.font, &fs); + + /* FIXME: we should be doing the whole drawing ourself here. */ + insensitiveGC = lw->label.insensitive_GC; + + mask = GCForeground | GCBackground | GCGraphicsExposures; + dynamic = GCClipMask | GCClipXOrigin | GCClipYOrigin; + values.graphics_exposures = False; + + if (fs != 0) + { + mask |= GCFont; + values.font = fs->fid; + } + + if (lw->primitive.top_shadow_pixmap != None + && lw->primitive.top_shadow_pixmap != XmUNSPECIFIED_PIXMAP) + { + mask |= GCFillStyle | GCTile; + values.fill_style = FillTiled; + values.tile = lw->primitive.top_shadow_pixmap; + } + + lw->label.TextRect.x += 1; + lw->label.TextRect.y += 1; + if (lw->label._acc_text != 0) + { + lw->label.acc_TextRect.x += 1; + lw->label.acc_TextRect.y += 1; + } + + values.foreground = lw->primitive.top_shadow_color; + values.background = lw->core.background_pixel; + + lw->label.insensitive_GC = + XtAllocateGC((Widget) lw, 0, mask, &values, dynamic, 0); + (*old_label_expose)(_w, _event, _region); + XtReleaseGC(_w, lw->label.insensitive_GC); + + lw->label.TextRect.x -= 1; + lw->label.TextRect.y -= 1; + if (lw->label._acc_text != 0) + { + lw->label.acc_TextRect.x -= 1; + lw->label.acc_TextRect.y -= 1; + } + + values.foreground = lw->primitive.bottom_shadow_color; + values.background = lw->core.background_pixel; + + lw->label.insensitive_GC = + XtAllocateGC((Widget) lw, 0, mask, &values, dynamic, 0); + (*old_label_expose)(_w, _event, _region); + XtReleaseGC(_w, lw->label.insensitive_GC); + + lw->label.insensitive_GC = insensitiveGC; + } +} +#endif + + /* * Create all the motif widgets necessary. */ void gui_x11_create_widgets() { +#ifndef LESSTIF_VERSION + /* + * Install the 3D shade effect drawing routines. + */ + if (old_label_expose == NULL) + { + old_label_expose = xmLabelWidgetClass->core_class.expose; + xmLabelWidgetClass->core_class.expose = label_expose; + } +#endif + /* * Start out by adding the configured border width into the border offset */ @@ -329,9 +431,7 @@ gui_x11_set_back_color() * Manage dialog centered on pointer. This could be used by the Athena code as * well. */ -static void manage_centered __ARGS((Widget dialog_child)); - -static void + void manage_centered(dialog_child) Widget dialog_child; { @@ -855,16 +955,15 @@ gui_mch_add_menu_item(menu, idx) xms = XmStringCreate((char *)menu->dname, STRING_TAG); XtSetArg(args[n], XmNlabelString, xms); n++; -#ifndef FEAT_SUN_WORKSHOP - /* Without shadows one can't sense whatever the button has been * pressed or not! However we wan't to save a bit of space... + * Need the highlightThickness to see the focus. */ - XtSetArg(args[n], XmNhighlightThickness, 0); n++; + XtSetArg(args[n], XmNhighlightThickness, 1); n++; XtSetArg(args[n], XmNhighlightOnEnter, True); n++; XtSetArg(args[n], XmNmarginWidth, 0); n++; XtSetArg(args[n], XmNmarginHeight, 0); n++; -#endif + if (menu->image == 0) { XtSetArg(args[n], XmNlabelType, XmSTRING); n++; @@ -1384,7 +1483,6 @@ gui_mch_create_scrollbar(sb, orient) int n; n = 0; - XtSetArg(args[n], XmNshadowThickness, 1); n++; XtSetArg(args[n], XmNminimum, 0); n++; XtSetArg(args[n], XmNorientation, (orient == SBAR_VERT) ? XmVERTICAL : XmHORIZONTAL); n++; @@ -1484,6 +1582,219 @@ gui_x11_get_wid() return(XtWindow(textArea)); } +/* + * Look for a widget in the widget tree w, with a mnemonic matching keycode. + * When one is found, simulate a button press on that widget and give it the + * keyboard focus. If the mnemonic is on a label, look in the userData field + * of the label to see if it points to another widget, and give that the focus. + */ + static void +do_mnemonic(Widget w, unsigned int keycode) +{ + WidgetList children; + int numChildren, i; + Boolean isMenu; + KeySym mnemonic = '\0'; + char mneString[2]; + Widget userData; + unsigned char rowColType; + + if (XtIsComposite(w)) + { + if (XtClass(w) == xmRowColumnWidgetClass) + { + XtVaGetValues(w, XmNrowColumnType, &rowColType, 0); + isMenu = (rowColType != (unsigned char)XmWORK_AREA); + } + else + isMenu = False; + if (!isMenu) + { + XtVaGetValues(w, XmNchildren, &children, XmNnumChildren, + &numChildren, 0); + for (i = 0; i < numChildren; i++) + do_mnemonic(children[i], keycode); + } + } + else + { + XtVaGetValues(w, XmNmnemonic, &mnemonic, 0); + if (mnemonic != '\0') + { + mneString[0] = mnemonic; + mneString[1] = '\0'; + if (XKeysymToKeycode(XtDisplay(XtParent(w)), + XStringToKeysym(mneString)) == keycode) + { + if (XtClass(w) == xmLabelWidgetClass + || XtClass(w) == xmLabelGadgetClass) + { + XtVaGetValues(w, XmNuserData, &userData, 0); + if (userData != NULL && XtIsWidget(userData)) + XmProcessTraversal(userData, XmTRAVERSE_CURRENT); + } + else + { + XKeyPressedEvent keyEvent; + + XmProcessTraversal(w, XmTRAVERSE_CURRENT); + + memset((char *) &keyEvent, 0, sizeof(XKeyPressedEvent)); + keyEvent.type = KeyPress; + keyEvent.serial = 1; + keyEvent.send_event = True; + keyEvent.display = XtDisplay(w); + keyEvent.window = XtWindow(w); + XtCallActionProc(w, "Activate", (XEvent *) & keyEvent, + NULL, 0); + } + } + } + } +} + +/* + * Callback routine for dialog mnemonic processing. + */ +/*ARGSUSED*/ + static void +mnemonic_event(Widget w, XtPointer call_data, XKeyEvent *event) +{ + do_mnemonic(w, event->keycode); +} + + +/* + * Search the widget tree under w for widgets with mnemonics. When found, add + * a passive grab to the dialog widget for the mnemonic character, thus + * directing mnemonic events to the dialog widget. + */ + static void +add_mnemonic_grabs(Widget dialog, Widget w) +{ + char mneString[2]; + WidgetList children; + int numChildren, i; + Boolean isMenu; + KeySym mnemonic = '\0'; + unsigned char rowColType; + + if (XtIsComposite(w)) + { + if (XtClass(w) == xmRowColumnWidgetClass) + { + XtVaGetValues(w, XmNrowColumnType, &rowColType, 0); + isMenu = (rowColType != (unsigned char)XmWORK_AREA); + } + else + isMenu = False; + if (!isMenu) + { + XtVaGetValues(w, XmNchildren, &children, XmNnumChildren, + &numChildren, 0); + for (i = 0; i < numChildren; i++) + add_mnemonic_grabs(dialog, children[i]); + } + } + else + { + XtVaGetValues(w, XmNmnemonic, &mnemonic, 0); + if (mnemonic != '\0') + { + mneString[0] = mnemonic; + mneString[1] = '\0'; + XtGrabKey(dialog, XKeysymToKeycode(XtDisplay(dialog), + XStringToKeysym(mneString)), + Mod1Mask, True, GrabModeAsync, GrabModeAsync); + } + } +} + +/* + * Add a handler for mnemonics in a dialog. Motif itself only handles + * mnemonics in menus. Mnemonics added or changed after this call will be + * ignored. + * + * To add a mnemonic to a text field or list, set the XmNmnemonic resource on + * the appropriate label and set the XmNuserData resource of the label to the + * widget to get the focus when the mnemonic is typed. + */ + static void +activate_dialog_mnemonics(Widget dialog) +{ + if (!dialog) + return; + + XtAddEventHandler(dialog, KeyPressMask, False, + (XtEventHandler) mnemonic_event, (XtPointer) NULL); + add_mnemonic_grabs(dialog, dialog); +} + +/* + * Removes the event handler and key-grabs for dialog mnemonic handling. + */ + static void +suppress_dialog_mnemonics(Widget dialog) +{ + if (!dialog) + return; + + XtUngrabKey(dialog, AnyKey, Mod1Mask); + XtRemoveEventHandler(dialog, KeyPressMask, False, + (XtEventHandler) mnemonic_event, (XtPointer) NULL); +} + +#if defined(FEAT_BROWSE) || defined(FEAT_GUI_DIALOG) +static void set_fontlist __ARGS((Widget wg)); + +/* + * Use the 'guifont' or 'guifontset' as a fontlist for a dialog widget. + */ + static void +set_fontlist(id) + Widget id; +{ + XmFontList fl; + +#ifdef FONTSET_ALWAYS + if (gui.fontset != NOFONTSET) { + fl = gui_motif_fontset2fontlist((XFontSet *)&gui.fontset); + if (fl != NULL) + { + if (XtIsManaged(id)) + { + XtUnmanageChild(id); + XtVaSetValues(id, XmNfontList, fl, NULL); + /* We should force the widget to recalculate it's + * geometry now. */ + XtManageChild(id); + } + else + XtVaSetValues(id, XmNfontList, fl, NULL); + XmFontListFree(fl); + } + } +#else + if (gui.norm_font != NOFONT) { + fl = gui_motif_create_fontlist((XFontStruct *)gui.norm_font); + if (fl != NULL) + { + if (XtIsManaged(id)) + { + XtUnmanageChild(id); + XtVaSetValues(id, XmNfontList, fl, NULL); + /* We should force the widget to recalculate it's + * geometry now. */ + XtManageChild(id); + } + else + XtVaSetValues(id, XmNfontList, fl, NULL); + XmFontListFree(fl); + } + } +#endif +} +#endif #if defined(FEAT_BROWSE) || defined(PROTO) @@ -1517,29 +1828,67 @@ static void DialogAcceptCB __ARGS((Widget, XtPointer, XtPointer)); * - equalize the messages between different GUI implementations as far as * possible. */ -static void set_predefined_label __ARGS((Widget parent, String name, char * new_label)); +static void set_predefined_label __ARGS((Widget parent, String name, char *new_label)); static void set_predefined_label(parent, name, new_label) - Widget parent; - String name; - char * new_label; + Widget parent; + String name; + char *new_label; { - XmString str; - Widget w; + XmString str; + Widget w; + char_u *p, *next; + KeySym mnemonic = NUL; w = XtNameToWidget(parent, name); if (!w) return; - str = XmStringCreate(new_label, STRING_TAG); + p = vim_strsave((char_u *)new_label); + if (p == NULL) + return; + for (next = p; *next; ++next) + { + if (*next == DLG_HOTKEY_CHAR) + { + int len = STRLEN(next); - if (str) + if (len > 0) + { + mch_memmove(next, next + 1, len); + mnemonic = next[0]; + } + } + } + + str = XmStringCreate((char *)p, STRING_TAG); + vim_free(p); + + if (str != NULL) { - XtVaSetValues(w, XmNlabelString, str, NULL); + XtVaSetValues(w, + XmNlabelString, str, + XmNmnemonic, mnemonic, + NULL); XmStringFree(str); } + gui_motif_menu_fontlist(w); +} + +static void +set_predefined_fontlist(parent, name) + Widget parent; + String name; +{ + Widget w; + w = XtNameToWidget(parent, name); + + if (!w) + return; + + set_fontlist(w); } /* @@ -1561,7 +1910,12 @@ gui_mch_browse(saving, title, dflt, ext, initdir, filter) char_u *pattern; char_u *tofree = NULL; - dialog_wgt = XmCreateFileSelectionDialog(vimShell, (char *)title, NULL, 0); + /* There a difference between the resource name and value, Therefore, we + * avoid to (ab-)use the (maybe internationalized!) dialog title as a + * dialog name. + */ + + dialog_wgt = XmCreateFileSelectionDialog(vimShell, "browseDialog", NULL, 0); if (initdir == NULL || *initdir == NUL) { @@ -1614,15 +1968,21 @@ gui_mch_browse(saving, title, dflt, ext, initdir, filter) XmNdialogTitle, XmRString, (char *)title, STRLEN(title) + 1, NULL); - set_predefined_label(dialog_wgt, "Apply", _("Filter")); - set_predefined_label(dialog_wgt, "Cancel", _("Cancel")); + set_predefined_label(dialog_wgt, "Apply", _("&Filter")); + set_predefined_label(dialog_wgt, "Cancel", _("&Cancel")); set_predefined_label(dialog_wgt, "Dir", _("Directories")); set_predefined_label(dialog_wgt, "FilterLabel", _("Filter")); - set_predefined_label(dialog_wgt, "Help", _("Help")); + set_predefined_label(dialog_wgt, "Help", _("&Help")); set_predefined_label(dialog_wgt, "Items", _("Files")); - set_predefined_label(dialog_wgt, "OK", _("OK")); + set_predefined_label(dialog_wgt, "OK", _("&OK")); set_predefined_label(dialog_wgt, "Selection", _("Selection")); + /* This is to save us from silly external settings using not fixed with + * fonts for file selection. + */ + set_predefined_fontlist(dialog_wgt, "DirListSW.DirList"); + set_predefined_fontlist(dialog_wgt, "ItemsListSW.ItemsList"); + gui_motif_menu_colors(dialog_wgt); if (gui.scroll_bg_pixel != INVALCOLOR) XtVaSetValues(dialog_wgt, XmNtroughColor, gui.scroll_bg_pixel, NULL); @@ -1634,6 +1994,7 @@ gui_mch_browse(saving, title, dflt, ext, initdir, filter) (unsigned char)XmDIALOG_HELP_BUTTON)); manage_centered(dialog_wgt); + activate_dialog_mnemonics(dialog_wgt); /* sit in a loop until the dialog box has gone away */ do @@ -1642,6 +2003,7 @@ gui_mch_browse(saving, title, dflt, ext, initdir, filter) (XtInputMask)XtIMAll); } while (XtIsManaged(dialog_wgt)); + suppress_dialog_mnemonics(dialog_wgt); XtDestroyWidget(dialog_wgt); vim_free(tofree); @@ -1746,31 +2108,6 @@ butproc(w, client_data, call_data) dialogStatus = (int)(long)client_data + 1; } -static void gui_motif_set_fontlist __ARGS((Widget wg)); - -/* - * Use the 'guifont' or 'guifontset' as a fontlist for a dialog widget. - */ - static void -gui_motif_set_fontlist(wg) - Widget wg; -{ - XmFontList fl; - - fl = -#ifdef FEAT_XFONTSET - gui.fontset != NOFONTSET ? - gui_motif_fontset2fontlist((XFontSet *)&gui.fontset) - : -#endif - gui_motif_create_fontlist((XFontStruct *)gui.norm_font); - if (fl != NULL) - { - XtVaSetValues(wg, XmNfontList, fl, NULL); - XmFontListFree(fl); - } -} - #ifdef HAVE_XPM static Widget create_pixmap_label(Widget parent, String name, char **data, ArgList args, Cardinal arg); @@ -1853,6 +2190,7 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) XtAppContext app; XmString label; int butcount; + Widget w; Widget dialogform = NULL; Widget form = NULL; Widget dialogtextfield = NULL; @@ -1913,10 +2251,20 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) p = buts; for (butcount = 0; *p; ++butcount) { + KeySym mnemonic = NUL; + for (next = p; *next; ++next) { if (*next == DLG_HOTKEY_CHAR) - mch_memmove(next, next + 1, STRLEN(next)); + { + int len = STRLEN(next); + + if (len > 0) + { + mch_memmove(next, next + 1, len); + mnemonic = next[0]; + } + } if (*next == DLG_BUTTON_SEP) { *next++ = NUL; @@ -1930,12 +2278,14 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) buttons[butcount] = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, dialogform, XmNlabelString, label, + XmNmnemonic, mnemonic, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 4, XmNshowAsDefault, butcount == dfltbutton - 1, XmNdefaultButtonShadowThickness, 1, NULL); XmStringFree(label); + gui_motif_menu_fontlist(buttons[butcount]); /* Layout properly. */ @@ -2041,7 +2391,7 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) XmNbottomAttachment, XmATTACH_FORM, NULL); - gui_motif_set_fontlist(dialogtextfield); + set_fontlist(dialogtextfield); XmTextFieldSetString(dialogtextfield, (char *)textfield); XtManageChild(dialogtextfield); XtAddEventHandler(dialogtextfield, KeyPressMask, False, @@ -2093,13 +2443,19 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) XtManageChild(dialogpixmap); #endif - /* Create the dialog message. */ - label = XmStringLtoRCreate((char *)message, STRING_TAG); + /* Create the dialog message. + * Since LessTif is apparently having problems with the creation of + * properly localized string, we use LtoR here. The symptom is that the + * string sill not show properly in multiple lines as it does in native + * Motif. + */ + label = XmStringCreateLtoR((char *)message, STRING_TAG); if (label == NULL) return -1; - (void)XtVaCreateManagedWidget("dialogMessage", + w = XtVaCreateManagedWidget("dialogMessage", xmLabelGadgetClass, form, XmNlabelString, label, + XmNalignment, XmALIGNMENT_BEGINNING, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 8, #ifdef HAVE_XPM @@ -2115,6 +2471,7 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) XmNbottomOffset, 8, NULL); XmStringFree(label); + set_fontlist(w); if (textfield != NULL) { @@ -2149,6 +2506,7 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) NULL); manage_centered(dialogform); + activate_dialog_mnemonics(dialogform); if (textfield != NULL && *textfield != NUL) { @@ -2185,6 +2543,7 @@ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) } } + suppress_dialog_mnemonics(dialogform); XtDestroyWidget(dialogform); return dialogStatus; @@ -2246,8 +2605,11 @@ gui_mch_set_footer(s) XmString xms; xms = XmStringCreate((char *)s, STRING_TAG); - XtVaSetValues(footer, XmNlabelString, xms, NULL); - XmStringFree(xms); + if (xms != NULL) + { + XtVaSetValues(footer, XmNlabelString, xms, NULL); + XmStringFree(xms); + } } #endif @@ -2522,14 +2884,15 @@ gui_motif_scroll_colors(id) XtVaSetValues(id, XmNforeground, gui.scroll_fg_pixel, NULL); } -#ifdef FEAT_MENU /* * Set the fontlist for Widget "id" to use gui.menu_fontset or gui.menu_font. */ - static void +/*ARGSUSED*/ + void gui_motif_menu_fontlist(id) Widget id; { +#ifdef FEAT_MENU #ifdef FONTSET_ALWAYS if (gui.menu_fontset != NOFONTSET) { @@ -2573,9 +2936,9 @@ gui_motif_menu_fontlist(id) } } #endif +#endif } -#endif /* * We don't create it twice for the sake of speed. @@ -2617,8 +2980,10 @@ find_replace_destroy_callback(w, client_data, call_data) { SharedFindReplace *cd = (SharedFindReplace *)client_data; - if (cd != NULL) + if (cd != NULL) { + /* suppress_dialog_mnemonics(cd->dialog); */ cd->dialog = (Widget)0; + } } /*ARGSUSED*/ @@ -2719,6 +3084,48 @@ find_replace_keypress(w, frdp, event) } static void +set_label(w, label) + Widget w; + char_u *label; +{ + XmString str; + char_u *p, *next; + KeySym mnemonic = NUL; + + if (!w) + return; + + p = vim_strsave(label); + if (p == NULL) + return; + for (next = p; *next; ++next) + { + if (*next == DLG_HOTKEY_CHAR) + { + int len = STRLEN(next); + + if (len > 0) + { + mch_memmove(next, next + 1, len); + mnemonic = next[0]; + } + } + } + + str = XmStringCreateSimple((char *)p); + vim_free(p); + if (str) + { + XtVaSetValues(w, + XmNlabelString, str, + XmNmnemonic, mnemonic, + NULL); + XmStringFree(str); + } + gui_motif_menu_fontlist(w); +} + + static void find_replace_dialog_create(arg, do_replace) char_u *arg; int do_replace; @@ -2746,6 +3153,8 @@ find_replace_dialog_create(arg, do_replace) /* If the dialog already exists, just raise it. */ if (frdp->dialog) { + gui_motif_synch_fonts(); + /* If the window is already up, just pop it to the top */ if (XtIsManaged(frdp->dialog)) XMapRaised(XtDisplay(frdp->dialog), @@ -2789,16 +3198,14 @@ find_replace_dialog_create(arg, do_replace) XmNbottomOffset, 4, NULL); - str = XmStringCreateSimple(_("Find Next")); frdp->find = XtVaCreateManagedWidget("findButton", xmPushButtonWidgetClass, button_form, - XmNlabelString, str, XmNsensitive, True, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); - XmStringFree(str); + set_label(frdp->find, _("Find &Next")); XtAddCallback(frdp->find, XmNactivateCallback, find_replace_callback, @@ -2806,57 +3213,50 @@ find_replace_dialog_create(arg, do_replace) if (do_replace) { - str = XmStringCreateSimple(_("Replace")); frdp->replace = XtVaCreateManagedWidget("replaceButton", xmPushButtonWidgetClass, button_form, - XmNlabelString, str, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frdp->find, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); - XmStringFree(str); + set_label(frdp->replace, _("&Replace")); XtAddCallback(frdp->replace, XmNactivateCallback, find_replace_callback, (XtPointer)FRD_REPLACE); - str = XmStringCreateSimple(_("Replace All")); frdp->all = XtVaCreateManagedWidget("replaceAllButton", xmPushButtonWidgetClass, button_form, - XmNlabelString, str, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frdp->replace, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); - XmStringFree(str); + set_label(frdp->all, _("Replace &All")); XtAddCallback(frdp->all, XmNactivateCallback, find_replace_callback, (XtPointer)FRD_REPLACEALL); - str = XmStringCreateSimple(_("Undo")); frdp->undo = XtVaCreateManagedWidget("undoButton", xmPushButtonWidgetClass, button_form, - XmNlabelString, str, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frdp->all, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); - XmStringFree(str); + set_label(frdp->undo, _("&Undo")); XtAddCallback(frdp->undo, XmNactivateCallback, find_replace_callback, (XtPointer)FRD_UNDO); } - str = XmStringCreateSimple(_("Cancel")); frdp->cancel = XtVaCreateManagedWidget("closeButton", xmPushButtonWidgetClass, button_form, - XmNlabelString, str, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); - XmStringFree(str); + set_label(frdp->cancel, _("&Cancel")); XtAddCallback(frdp->cancel, XmNactivateCallback, find_replace_dismiss_callback, frdp); + gui_motif_menu_fontlist(frdp->cancel); XtManageChild(button_form); @@ -2894,6 +3294,7 @@ find_replace_dialog_create(arg, do_replace) XmNtopOffset, 4, NULL); XmStringFree(str); + gui_motif_menu_fontlist(label_what); frdp->what = XtVaCreateManagedWidget("whatText", xmTextFieldWidgetClass, input_form, @@ -2928,6 +3329,7 @@ find_replace_dialog_create(arg, do_replace) XmNbottomAttachment, XmATTACH_FORM, NULL); XmStringFree(str); + gui_motif_menu_fontlist(label_with); /* * Make the entry activation only change the input focus onto the @@ -2975,6 +3377,7 @@ find_replace_dialog_create(arg, do_replace) { Widget radio_box; + Widget w; frame = XtVaCreateWidget("directionFrame", xmFrameWidgetClass, frdp->dialog, @@ -2988,13 +3391,14 @@ find_replace_dialog_create(arg, do_replace) NULL); str = XmStringCreateSimple(_("Direction")); - (void)XtVaCreateManagedWidget("directionFrameLabel", + w = XtVaCreateManagedWidget("directionFrameLabel", xmLabelGadgetClass, frame, XmNlabelString, str, XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING, XmNchildType, XmFRAME_TITLE_CHILD, NULL); XmStringFree(str); + gui_motif_menu_fontlist(w); radio_box = XmCreateRadioBox(frame, "radioBox", (ArgList)NULL, 0); @@ -3006,6 +3410,7 @@ find_replace_dialog_create(arg, do_replace) XmNset, False, NULL); XmStringFree(str); + gui_motif_menu_fontlist(frdp->up); str = XmStringCreateSimple(_("Down")); frdp->down = XtVaCreateManagedWidget("downRadioButton", @@ -3014,6 +3419,7 @@ find_replace_dialog_create(arg, do_replace) XmNset, True, NULL); XmStringFree(str); + gui_motif_menu_fontlist(frdp->down); XtManageChild(radio_box); XtManageChild(frame); @@ -3057,6 +3463,8 @@ find_replace_dialog_create(arg, do_replace) XmNset, mcase, NULL); XmStringFree(str); + gui_motif_menu_fontlist(frdp->wword); + gui_motif_menu_fontlist(frdp->mcase); XtManageChild(toggle_form); @@ -3064,7 +3472,10 @@ find_replace_dialog_create(arg, do_replace) XmTextFieldSetString(frdp->what, (char *)entry_text); vim_free(entry_text); - XtManageChild(frdp->dialog); + gui_motif_synch_fonts(); + + manage_centered(frdp->dialog); + activate_dialog_mnemonics(frdp->dialog); XmProcessTraversal(frdp->what, XmTRAVERSE_CURRENT); } @@ -3088,3 +3499,40 @@ gui_mch_replace_dialog(eap) find_replace_dialog_create(eap->arg, TRUE); } + +/* + * Synchronize all gui elements, which are dependant upon the + * main text font used. Those are in esp. the find/replace dialogs. + * If you don't understand why this should be needed, please try to + * search for "pięść" in iso8859-2. + */ + void +gui_motif_synch_fonts(void) +{ + SharedFindReplace *frdp; + int do_replace; + XFontStruct *font; + XmFontList font_list; + + /* FIXME: Unless we find out how to create a XmFontList from a XFontSet, + * we just give up here on font synchronization. */ + font = (XFontStruct *)gui.norm_font; + if (font == NULL) + return; + + font_list = gui_motif_create_fontlist(font); + + /* OK this loop is a bit tricky... */ + for (do_replace = 0; do_replace <= 1; ++do_replace) + { + frdp = (do_replace) ? (&repl_widgets) : (&find_widgets); + if (frdp->dialog) + { + XtVaSetValues(frdp->what, XmNfontList, font_list, NULL); + if (do_replace) + XtVaSetValues(frdp->with, XmNfontList, font_list, NULL); + } + } + + XmFontListFree(font_list); +} |