1 /* vi:set ts=8 sts=4 sw=4:
3 * VIM - Vi IMproved by Bram Moolenaar
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
11 * (C) 2001,2005 by Marcin Dalecki <martin@dalecki.de>
13 * Implementation of dialog functions for the Motif GUI variant.
15 * Note about Lesstif: Apparently lesstif doesn't get the widget layout right,
16 * when using a dynamic scrollbar policy.
20 #include <Xm/PushBG.h>
25 #include <Xm/LabelG.h>
26 #include <Xm/ToggleBG.h>
27 #include <Xm/SeparatoG.h>
28 #include <Xm/DialogS.h>
30 #include <Xm/RowColumn.h>
31 #include <Xm/AtomMgr.h>
32 #include <Xm/Protocols.h>
34 #include <X11/keysym.h>
35 #include <X11/Xatom.h>
36 #include <X11/StringDefs.h>
37 #include <X11/Intrinsic.h>
41 extern Widget vimShell
;
44 # define apply_fontlist(w) gui_motif_menu_fontlist(w)
46 # define apply_fontlist(w)
49 /****************************************************************************
50 * Font selection dialogue implementation.
53 static char wild
[3] = "*";
56 * FIXME: This is a generic function, which should be used throughout the whole
59 * Add close_callback, which will be called when the user selects close from
60 * the window menu. The close menu item usually activates f.kill which sends a
61 * WM_DELETE_WINDOW protocol request for the window.
65 add_cancel_action(Widget shell
, XtCallbackProc close_callback
, void *arg
)
67 static Atom wmp_atom
= 0;
68 static Atom dw_atom
= 0;
69 Display
*display
= XtDisplay(shell
);
71 /* deactivate the built-in delete response of killing the application */
72 XtVaSetValues(shell
, XmNdeleteResponse
, XmDO_NOTHING
, NULL
);
74 /* add a delete window protocol callback instead */
77 wmp_atom
= XmInternAtom(display
, "WM_PROTOCOLS", True
);
78 dw_atom
= XmInternAtom(display
, "WM_DELETE_WINDOW", True
);
80 XmAddProtocolCallback(shell
, wmp_atom
, dw_atom
, close_callback
, arg
);
83 #define MAX_FONTS 65535
84 #define MAX_FONT_NAME_LEN 256
85 #define MAX_ENTRIES_IN_LIST 5000
86 #define MAX_DISPLAY_SIZE 150
87 #define TEMP_BUF_SIZE 256
98 typedef struct _SharedFontSelData
103 Widget encoding_pulldown
;
104 Widget encoding_menu
;
108 char **names
; /* font name array of arrays */
109 int num
; /* number of font names */
110 String sel
[NONE
]; /* selection category */
111 Boolean in_pixels
; /* toggle state - size in pixels */
112 char *font_name
; /* current font name */
113 XFontStruct
*old
; /* font data structure for sample display */
114 XmFontList old_list
; /* font data structure for sample display */
115 Boolean exit
; /* used for program exit control */
119 * Checking access to the font name array for validity.
122 fn(SharedFontSelData
*data
, int i
)
124 /* Assertion checks: */
132 return data
->names
[i
];
136 * Get a specific substring from a font name.
139 get_part(char *in
, int pos
, char *out
)
146 for (i
= 0; (pos
> 0) && (in
[i
] != '\0'); ++i
)
153 for (j
= 0; (in
[i
] != '-') && (in
[i
] != '\0'); ++i
, ++j
)
159 * Given a font name this function returns the part used in the first
163 name_part(char *font
, char *buf
)
165 char buf2
[TEMP_BUF_SIZE
];
166 char buf3
[TEMP_BUF_SIZE
];
168 get_part(font
, 2, buf2
);
169 get_part(font
, 1, buf3
);
172 vim_snprintf(buf
, TEMP_BUF_SIZE
, "%s (%s)", buf2
, buf3
);
174 vim_snprintf(buf
, TEMP_BUF_SIZE
, "%s", buf2
);
178 * Given a font name this function returns the part used in the second scroll list.
181 style_part(char *font
, char *buf
)
183 char buf2
[TEMP_BUF_SIZE
];
184 char buf3
[TEMP_BUF_SIZE
];
186 get_part(font
, 3, buf3
);
187 get_part(font
, 5, buf2
);
189 if (!strcmp(buf2
, "normal") && !strcmp(buf2
, "Normal")
190 && !strcmp(buf2
, "NORMAL"))
191 vim_snprintf(buf
, TEMP_BUF_SIZE
, "%s %s", buf3
, buf2
);
195 get_part(font
, 6, buf2
);
198 vim_snprintf(buf3
, TEMP_BUF_SIZE
, "%s %s", buf
, buf2
);
202 get_part(font
, 4, buf2
);
204 if (!strcmp(buf2
, "o") || !strcmp(buf2
, "O"))
205 vim_snprintf(buf
, TEMP_BUF_SIZE
, "%s oblique", buf3
);
206 else if (!strcmp(buf2
, "i") || !strcmp(buf2
, "I"))
207 vim_snprintf(buf
, TEMP_BUF_SIZE
, "%s italic", buf3
);
209 if (!strcmp(buf
, " "))
214 * Given a font name this function returns the part used in the third
218 size_part(char *font
, char *buf
, int inPixels
)
227 get_part(font
, 7, buf
);
231 sprintf(buf
, "%3d", size
);
236 get_part(font
, 8, buf
);
240 temp
= (float)size
/ 10.0;
242 if (buf
[strlen(buf
) - 1] == '0')
243 sprintf(buf
, "%3d", size
);
245 sprintf(buf
, "%4.1f", temp
);
251 * Given a font name this function returns the part used in the choice menu.
254 encoding_part(char *font
, char *buf
)
256 char buf1
[TEMP_BUF_SIZE
];
257 char buf2
[TEMP_BUF_SIZE
];
261 get_part(font
, 13, buf1
);
262 get_part(font
, 14, buf2
);
264 if (strlen(buf1
) > 0 && strlen(buf2
))
265 vim_snprintf(buf
, TEMP_BUF_SIZE
, "%s-%s", buf1
, buf2
);
266 if (!strcmp(buf
, " "))
271 * Inserts a string into correct sorted position in a list.
274 add_to_list(char **buf
, char *item
, int *count
)
279 if (*count
== MAX_ENTRIES_IN_LIST
)
282 /* avoid duplication */
283 for (i
= 0; i
< *count
; ++i
)
285 if (!strcmp(buf
[i
], item
))
289 /* find order place, but make sure that wild card comes first */
290 if (!strcmp(item
, wild
))
293 for (i
= 0; i
< *count
; ++i
)
294 if (strcmp(buf
[i
], item
) > 0 && strcmp(buf
[i
], wild
))
297 /* now insert the item */
298 for (j
= *count
; j
> i
; --j
)
300 buf
[i
] = XtNewString(item
);
306 * True if the font matches some field.
309 match(SharedFontSelData
*data
, enum ListSpecifier l
, int i
)
311 char buf
[TEMP_BUF_SIZE
];
313 /* An empty selection or a wild card matches anything.
315 if (!data
->sel
[l
] || !strcmp(data
->sel
[l
], wild
))
318 /* chunk out the desired part... */
322 encoding_part(fn(data
, i
), buf
);
326 name_part(fn(data
, i
), buf
);
330 style_part(fn(data
, i
), buf
);
334 size_part(fn(data
, i
), buf
, data
->in_pixels
);
340 /* ...and chew it now */
342 return !strcmp(buf
, data
->sel
[l
]);
346 proportional(char *font
)
348 char buf
[TEMP_BUF_SIZE
];
350 get_part(font
, 11, buf
);
352 return !strcmp(buf
, "p") || !strcmp(buf
, "P");
356 static void encoding_callback(Widget w
, SharedFontSelData
*data
,
360 * Parse through the fontlist data and set up the three scroll lists. The fix
361 * parameter can be used to exclude a list from any changes. This is used for
362 * updates after selections caused by the users actions.
365 fill_lists(enum ListSpecifier fix
, SharedFontSelData
*data
)
367 char *list
[NONE
][MAX_ENTRIES_IN_LIST
];
369 char buf
[TEMP_BUF_SIZE
];
370 XmString items
[MAX_ENTRIES_IN_LIST
];
374 for (idx
= (int)ENCODING
; idx
< (int)NONE
; ++idx
)
377 /* First we insert the wild char into every single list. */
379 add_to_list(list
[ENCODING
], wild
, &count
[ENCODING
]);
381 add_to_list(list
[NAME
], wild
, &count
[NAME
]);
383 add_to_list(list
[STYLE
], wild
, &count
[STYLE
]);
385 add_to_list(list
[SIZE
], wild
, &count
[SIZE
]);
387 for (i
= 0; i
< data
->num
&& i
< MAX_ENTRIES_IN_LIST
; i
++)
389 if (proportional(fn(data
, i
)))
393 && match(data
, NAME
, i
)
394 && match(data
, STYLE
, i
)
395 && match(data
, SIZE
, i
))
397 encoding_part(fn(data
, i
), buf
);
398 add_to_list(list
[ENCODING
], buf
, &count
[ENCODING
]);
402 && match(data
, ENCODING
, i
)
403 && match(data
, STYLE
, i
)
404 && match(data
, SIZE
, i
))
406 name_part(fn(data
, i
), buf
);
407 add_to_list(list
[NAME
], buf
, &count
[NAME
]);
411 && match(data
, ENCODING
, i
)
412 && match(data
, NAME
, i
)
413 && match(data
, SIZE
, i
))
415 style_part(fn(data
, i
), buf
);
416 add_to_list(list
[STYLE
], buf
, &count
[STYLE
]);
420 && match(data
, ENCODING
, i
)
421 && match(data
, NAME
, i
)
422 && match(data
, STYLE
, i
))
424 size_part(fn(data
, i
), buf
, data
->in_pixels
);
425 add_to_list(list
[SIZE
], buf
, &count
[SIZE
]);
430 * And now do the preselection in all lists where there was one:
437 Widget selected_button
= 0;
439 /* Get and update the current button list. */
440 XtVaGetValues(data
->encoding_pulldown
,
441 XmNchildren
, &children
,
442 XmNnumChildren
, &n_items
,
445 for (i
= 0; i
< count
[ENCODING
]; ++i
)
449 items
[i
] = XmStringCreateLocalized(list
[ENCODING
][i
]);
451 if (i
< (int)n_items
)
453 /* recycle old button */
454 XtVaSetValues(children
[i
],
455 XmNlabelString
, items
[i
],
458 button
= children
[i
];
462 /* create a new button */
463 button
= XtVaCreateManagedWidget("button",
464 xmPushButtonGadgetClass
,
465 data
->encoding_pulldown
,
466 XmNlabelString
, items
[i
],
469 XtAddCallback(button
, XmNactivateCallback
,
470 (XtCallbackProc
) encoding_callback
, (XtPointer
) data
);
471 XtManageChild(button
);
474 if (data
->sel
[ENCODING
])
476 if (!strcmp(data
->sel
[ENCODING
], list
[ENCODING
][i
]))
477 selected_button
= button
;
479 XtFree(list
[ENCODING
][i
]);
482 /* Destroy all the outstanding menu items.
484 for (i
= count
[ENCODING
]; i
< (int)n_items
; ++i
)
486 XtUnmanageChild(children
[i
]);
487 XtDestroyWidget(children
[i
]);
490 /* Preserve the current selection visually.
494 XtVaSetValues(data
->encoding_menu
,
495 XmNmenuHistory
, selected_button
,
499 for (i
= 0; i
< count
[ENCODING
]; ++i
)
500 XmStringFree(items
[i
]);
504 * Now loop trough the remaining lists and set them up.
506 for (idx
= (int)NAME
; idx
< (int)NONE
; ++idx
)
510 if (fix
== (enum ListSpecifier
)idx
)
513 switch ((enum ListSpecifier
)idx
)
516 w
= data
->list
[NAME
];
519 w
= data
->list
[STYLE
];
522 w
= data
->list
[SIZE
];
525 w
= (Widget
)0; /* for lint */
528 for (i
= 0; i
< count
[idx
]; ++i
)
530 items
[i
] = XmStringCreateLocalized(list
[idx
][i
]);
531 XtFree(list
[idx
][i
]);
533 XmListDeleteAllItems(w
);
534 XmListAddItems(w
, items
, count
[idx
], 1);
537 XmStringFree(items
[0]);
538 items
[0] = XmStringCreateLocalized(data
->sel
[idx
]);
539 XmListSelectItem(w
, items
[0], False
);
540 XmListSetBottomItem(w
, items
[0]);
542 for (i
= 0; i
< count
[idx
]; ++i
)
543 XmStringFree(items
[i
]);
548 stoggle_callback(Widget w UNUSED
,
549 SharedFontSelData
*data
,
550 XmToggleButtonCallbackStruct
*call_data
)
553 char newSize
[TEMP_BUF_SIZE
];
556 if (call_data
->reason
!= (int)XmCR_VALUE_CHANGED
)
559 do_sel
= (data
->sel
[SIZE
] != NULL
) && strcmp(data
->sel
[SIZE
], wild
);
561 for (i
= 0; do_sel
&& (i
< data
->num
); i
++)
562 if (match(data
, ENCODING
, i
)
563 && match(data
, NAME
, i
)
564 && match(data
, STYLE
, i
)
565 && match(data
, SIZE
, i
))
567 size_part(fn(data
, i
), newSize
, !data
->in_pixels
);
571 data
->in_pixels
= !data
->in_pixels
;
574 XtFree(data
->sel
[SIZE
]);
575 data
->sel
[SIZE
] = NULL
;
576 fill_lists(NONE
, data
);
580 str
= XmStringCreateLocalized(newSize
);
581 XmListSelectItem(data
->list
[SIZE
], str
, True
);
582 XmListSetBottomItem(data
->list
[SIZE
], str
);
588 * Show the currently selected font in the sample text label.
591 display_sample(SharedFontSelData
*data
)
596 XmFontList font_list
;
600 display
= XtDisplay(data
->dialog
);
601 font
= XLoadQueryFont(display
, data
->font_name
);
602 font_list
= gui_motif_create_fontlist(font
);
605 str
= XmStringCreateLocalized("AaBbZzYy 0123456789");
606 XtSetArg(args
[n
], XmNlabelString
, str
); n
++;
607 XtSetArg(args
[n
], XmNfontList
, font_list
); n
++;
609 XtSetValues(data
->sample
, args
, n
);
614 XFreeFont(display
, data
->old
);
615 XmFontListFree(data
->old_list
);
618 data
->old_list
= font_list
;
624 SharedFontSelData
*data
,
625 XmListCallbackStruct
*call_data
,
626 enum ListSpecifier which
)
630 XmStringGetLtoR(call_data
->item
, XmSTRING_DEFAULT_CHARSET
, &sel
);
632 if (!data
->sel
[which
])
633 data
->sel
[which
] = XtNewString(sel
);
636 if (!strcmp(data
->sel
[which
], sel
))
638 /* unselecting current selection */
639 XtFree(data
->sel
[which
]);
640 data
->sel
[which
] = NULL
;
642 XmListDeselectItem(w
, call_data
->item
);
646 XtFree(data
->sel
[which
]);
647 data
->sel
[which
] = XtNewString(sel
);
652 fill_lists(which
, data
);
654 /* If there is a font selection, we display it. */
655 if (data
->sel
[ENCODING
]
659 && strcmp(data
->sel
[ENCODING
], wild
)
660 && strcmp(data
->sel
[NAME
], wild
)
661 && strcmp(data
->sel
[STYLE
], wild
)
662 && strcmp(data
->sel
[SIZE
], wild
))
667 XtFree(data
->font_name
);
668 data
->font_name
= NULL
;
670 for (i
= 0; i
< data
->num
; i
++)
672 if (match(data
, ENCODING
, i
)
673 && match(data
, NAME
, i
)
674 && match(data
, STYLE
, i
)
675 && match(data
, SIZE
, i
))
677 data
->font_name
= XtNewString(fn(data
, i
));
684 XmTextSetString(data
->name
, data
->font_name
);
685 display_sample(data
);
689 (char_u
*)_("Error"),
690 (char_u
*)_("Invalid font specification"),
691 (char_u
*)_("&Dismiss"), 1, NULL
);
700 char *nomatch_msg
= _("no specific match");
703 str
= XmStringCreateLocalized(nomatch_msg
);
704 XtSetArg(args
[n
], XmNlabelString
, str
); ++n
;
705 XtSetValues(data
->sample
, args
, n
);
706 apply_fontlist(data
->sample
);
707 XmTextSetString(data
->name
, nomatch_msg
);
715 encoding_callback(Widget w
,
716 SharedFontSelData
*data
,
717 XtPointer dummy UNUSED
)
720 XmListCallbackStruct fake_data
;
722 XtVaGetValues(w
, XmNlabelString
, &str
, NULL
);
727 fake_data
.item
= str
;
729 do_choice(0, data
, &fake_data
, ENCODING
);
733 name_callback(Widget w
,
734 SharedFontSelData
*data
,
735 XmListCallbackStruct
*call_data
)
737 do_choice(w
, data
, call_data
, NAME
);
741 style_callback(Widget w
,
742 SharedFontSelData
*data
,
743 XmListCallbackStruct
*call_data
)
745 do_choice(w
, data
, call_data
, STYLE
);
749 size_callback(Widget w
,
750 SharedFontSelData
*data
,
751 XmListCallbackStruct
*call_data
)
753 do_choice(w
, data
, call_data
, SIZE
);
757 cancel_callback(Widget w UNUSED
,
758 SharedFontSelData
*data
,
759 XmListCallbackStruct
*call_data UNUSED
)
761 if (data
->sel
[ENCODING
])
763 XtFree(data
->sel
[ENCODING
]);
764 data
->sel
[ENCODING
] = NULL
;
768 XtFree(data
->sel
[NAME
]);
769 data
->sel
[NAME
] = NULL
;
771 if (data
->sel
[STYLE
])
773 XtFree(data
->sel
[STYLE
]);
774 data
->sel
[STYLE
] = NULL
;
778 XtFree(data
->sel
[SIZE
]);
779 data
->sel
[SIZE
] = NULL
;
783 XtFree(data
->font_name
);
784 data
->font_name
= NULL
;
787 XFreeFontNames(data
->names
);
793 ok_callback(Widget w UNUSED
,
794 SharedFontSelData
*data
,
795 XmPushButtonCallbackStruct
*call_data UNUSED
)
801 pattern
= XmTextGetString(data
->name
);
802 name
= XListFonts(XtDisplay(data
->dialog
), pattern
, 1, &i
);
808 (char_u
*)_("Error"),
809 (char_u
*)_("Invalid font specification"),
810 (char_u
*)_("&Dismiss"), 1, NULL
);
811 XFreeFontNames(name
);
816 XtFree(data
->font_name
);
817 data
->font_name
= XtNewString(name
[0]);
819 if (data
->sel
[ENCODING
])
821 XtFree(data
->sel
[ENCODING
]);
822 data
->sel
[ENCODING
] = NULL
;
826 XtFree(data
->sel
[NAME
]);
827 data
->sel
[NAME
] = NULL
;
829 if (data
->sel
[STYLE
])
831 XtFree(data
->sel
[STYLE
]);
832 data
->sel
[STYLE
] = NULL
;
836 XtFree(data
->sel
[SIZE
]);
837 data
->sel
[SIZE
] = NULL
;
840 XFreeFontNames(name
);
843 XFreeFontNames(data
->names
);
850 * Returns pointer to an ASCII character string that contains the name of the
851 * selected font (in X format for naming fonts); it is the users responsibility
852 * to free the space allocated to this string.
855 gui_xm_select_font(char_u
*current
)
857 static SharedFontSelData _data
;
870 char big_font
[MAX_FONT_NAME_LEN
];
871 SharedFontSelData
*data
;
876 data
->names
= XListFonts(XtDisplay(parent
), "-*-*-*-*-*-*-*-*-*-*-*-*-*-*",
877 MAX_FONTS
, &data
->num
);
880 * Find the name of the biggest font less than the given limit
881 * MAX_DISPLAY_SIZE used to set up the initial height of the display
892 for (i
= 0, max
= 0; i
< data
->num
; i
++)
894 get_part(fn(data
, i
), 7, buf
);
896 if ((size
> max
) && (size
< MAX_DISPLAY_SIZE
))
902 strcpy(big_font
, fn(data
, idx
));
904 data
->old
= XLoadQueryFont(XtDisplay(parent
), big_font
);
905 data
->old_list
= gui_motif_create_fontlist(data
->old
);
907 /* Set the title of the Dialog window. */
908 data
->dialog
= XmCreateDialogShell(parent
, "fontSelector", NULL
, 0);
909 str
= XmStringCreateLocalized(_("Vim - Font Selector"));
911 /* Create form popup dialog widget. */
912 form
= XtVaCreateWidget("form",
913 xmFormWidgetClass
, data
->dialog
,
915 XmNautoUnmanage
, False
,
916 XmNdialogStyle
, XmDIALOG_FULL_APPLICATION_MODAL
,
920 sub_form
= XtVaCreateManagedWidget("subForm",
921 xmFormWidgetClass
, form
,
922 XmNbottomAttachment
, XmATTACH_FORM
,
924 XmNrightAttachment
, XmATTACH_FORM
,
926 XmNtopAttachment
, XmATTACH_FORM
,
928 XmNorientation
, XmVERTICAL
,
931 data
->ok
= XtVaCreateManagedWidget(_("OK"),
932 xmPushButtonGadgetClass
, sub_form
,
933 XmNleftAttachment
, XmATTACH_FORM
,
934 XmNrightAttachment
, XmATTACH_FORM
,
935 XmNtopAttachment
, XmATTACH_FORM
,
938 apply_fontlist(data
->ok
);
940 data
->cancel
= XtVaCreateManagedWidget(_("Cancel"),
941 xmPushButtonGadgetClass
, sub_form
,
942 XmNrightAttachment
, XmATTACH_FORM
,
943 XmNleftAttachment
, XmATTACH_FORM
,
944 XmNtopAttachment
, XmATTACH_WIDGET
,
945 XmNtopWidget
, data
->ok
,
947 XmNshowAsDefault
, True
,
949 apply_fontlist(data
->cancel
);
951 /* Create the separator for beauty. */
953 XtSetArg(args
[n
], XmNorientation
, XmVERTICAL
); n
++;
954 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_FORM
); n
++;
955 XtSetArg(args
[n
], XmNtopAttachment
, XmATTACH_FORM
); n
++;
956 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_WIDGET
); n
++;
957 XtSetArg(args
[n
], XmNrightWidget
, sub_form
); n
++;
958 XtSetArg(args
[n
], XmNrightOffset
, 4); n
++;
959 separator
= XmCreateSeparatorGadget(form
, "separator", args
, n
);
960 XtManageChild(separator
);
962 /* Create font name text widget and the corresponding label. */
963 data
->name
= XtVaCreateManagedWidget("fontName",
964 xmTextWidgetClass
, form
,
965 XmNbottomAttachment
, XmATTACH_FORM
,
967 XmNleftAttachment
, XmATTACH_FORM
,
969 XmNrightAttachment
, XmATTACH_WIDGET
,
970 XmNrightWidget
, separator
,
973 XmNeditMode
, XmSINGLE_LINE_EDIT
,
974 XmNmaxLength
, MAX_FONT_NAME_LEN
,
978 str
= XmStringCreateLocalized(_("Name:"));
979 name
= XtVaCreateManagedWidget("fontNameLabel",
980 xmLabelGadgetClass
, form
,
982 XmNuserData
, data
->name
,
983 XmNleftAttachment
, XmATTACH_OPPOSITE_WIDGET
,
984 XmNleftWidget
, data
->name
,
985 XmNbottomAttachment
, XmATTACH_WIDGET
,
986 XmNbottomWidget
, data
->name
,
990 apply_fontlist(name
);
992 /* create sample display label widget */
993 disp_frame
= XtVaCreateManagedWidget("sampleFrame",
994 xmFrameWidgetClass
, form
,
995 XmNshadowType
, XmSHADOW_ETCHED_IN
,
996 XmNleftAttachment
, XmATTACH_FORM
,
998 XmNbottomAttachment
, XmATTACH_WIDGET
,
999 XmNbottomWidget
, name
,
1000 XmNrightAttachment
, XmATTACH_WIDGET
,
1001 XmNrightWidget
, separator
,
1003 XmNalignment
, XmALIGNMENT_BEGINNING
,
1006 data
->sample
= XtVaCreateManagedWidget("sampleLabel",
1007 xmLabelWidgetClass
, disp_frame
,
1008 XmNleftAttachment
, XmATTACH_FORM
,
1009 XmNtopAttachment
, XmATTACH_FORM
,
1010 XmNbottomAttachment
, XmATTACH_FORM
,
1011 XmNrightAttachment
, XmATTACH_FORM
,
1012 XmNalignment
, XmALIGNMENT_BEGINNING
,
1013 XmNrecomputeSize
, False
,
1014 XmNfontList
, data
->old_list
,
1017 /* create toggle button */
1018 str
= XmStringCreateLocalized(_("Show size in Points"));
1019 size_toggle
= XtVaCreateManagedWidget("sizeToggle",
1020 xmToggleButtonGadgetClass
, form
,
1021 XmNlabelString
, str
,
1022 XmNleftAttachment
, XmATTACH_FORM
,
1024 XmNbottomAttachment
, XmATTACH_WIDGET
,
1025 XmNbottomWidget
, disp_frame
,
1029 apply_fontlist(size_toggle
);
1030 XtManageChild(size_toggle
);
1032 /* Encoding pulldown menu.
1035 data
->encoding_pulldown
= XmCreatePulldownMenu(form
,
1036 "encodingPulldown", NULL
, 0);
1037 str
= XmStringCreateLocalized(_("Encoding:"));
1039 XtSetArg(args
[n
], XmNsubMenuId
, data
->encoding_pulldown
); ++n
;
1040 XtSetArg(args
[n
], XmNlabelString
, str
); ++n
;
1041 XtSetArg(args
[n
], XmNleftAttachment
, XmATTACH_FORM
); ++n
;
1042 XtSetArg(args
[n
], XmNleftOffset
, 4); ++n
;
1043 XtSetArg(args
[n
], XmNbottomAttachment
, XmATTACH_WIDGET
); ++n
;
1044 XtSetArg(args
[n
], XmNbottomWidget
, size_toggle
); ++n
;
1045 XtSetArg(args
[n
], XmNbottomOffset
, 4); ++n
;
1046 XtSetArg(args
[n
], XmNrightAttachment
, XmATTACH_WIDGET
); ++n
;
1047 XtSetArg(args
[n
], XmNrightWidget
, separator
); ++n
;
1048 XtSetArg(args
[n
], XmNrightOffset
, 4); ++n
;
1049 data
->encoding_menu
= XmCreateOptionMenu(form
, "encodingMenu", args
, n
);
1051 XmAddTabGroup(data
->encoding_menu
);
1054 * Create scroll list widgets in a separate subform used to manage the
1055 * different sizes of the lists.
1058 sub_form
= XtVaCreateManagedWidget("subForm",
1059 xmFormWidgetClass
, form
,
1060 XmNbottomAttachment
, XmATTACH_WIDGET
,
1061 XmNbottomWidget
, data
->encoding_menu
,
1063 XmNleftAttachment
, XmATTACH_FORM
,
1065 XmNrightAttachment
, XmATTACH_WIDGET
,
1066 XmNrightWidget
, separator
,
1068 XmNtopAttachment
, XmATTACH_FORM
,
1070 XmNorientation
, XmVERTICAL
,
1074 frame
= XtVaCreateManagedWidget("frame", xmFrameWidgetClass
, sub_form
,
1075 XmNshadowThickness
, 0,
1076 XmNtopAttachment
, XmATTACH_FORM
,
1077 XmNbottomAttachment
, XmATTACH_FORM
,
1078 XmNleftAttachment
, XmATTACH_FORM
,
1079 XmNrightAttachment
, XmATTACH_POSITION
,
1080 XmNrightPosition
, 50,
1083 str
= XmStringCreateLocalized(_("Font:"));
1084 name
= XtVaCreateManagedWidget("nameListLabel", xmLabelGadgetClass
, frame
,
1085 XmNchildType
, XmFRAME_TITLE_CHILD
,
1086 XmNchildVerticalAlignment
, XmALIGNMENT_CENTER
,
1087 XmNchildHorizontalAlignment
, XmALIGNMENT_BEGINNING
,
1088 XmNlabelString
, str
,
1091 apply_fontlist(name
);
1094 XtSetArg(args
[n
], XmNvisibleItemCount
, 8); ++n
;
1095 XtSetArg(args
[n
], XmNresizable
, True
); ++n
;
1096 XtSetArg(args
[n
], XmNlistSizePolicy
, XmCONSTANT
); ++n
;
1097 XtSetArg(args
[n
], XmNvisualPolicy
, XmVARIABLE
); ++n
;
1098 #ifdef LESSTIF_VERSION
1099 XtSetArg(args
[n
], XmNscrollBarDisplayPolicy
, XmSTATIC
); ++n
;
1101 data
->list
[NAME
] = XmCreateScrolledList(frame
, "fontList", args
, n
);
1102 XtVaSetValues(name
, XmNuserData
, data
->list
[NAME
], NULL
);
1105 frame
= XtVaCreateManagedWidget("frame", xmFrameWidgetClass
, sub_form
,
1106 XmNshadowThickness
, 0,
1107 XmNtopAttachment
, XmATTACH_FORM
,
1108 XmNbottomAttachment
, XmATTACH_FORM
,
1109 XmNleftAttachment
, XmATTACH_POSITION
,
1110 XmNleftPosition
, 50,
1112 XmNrightAttachment
, XmATTACH_POSITION
,
1113 XmNrightPosition
, 80,
1116 str
= XmStringCreateLocalized(_("Style:"));
1117 name
= XtVaCreateManagedWidget("styleListLabel", xmLabelWidgetClass
, frame
,
1118 XmNchildType
, XmFRAME_TITLE_CHILD
,
1119 XmNchildVerticalAlignment
, XmALIGNMENT_CENTER
,
1120 XmNchildHorizontalAlignment
, XmALIGNMENT_BEGINNING
,
1121 XmNlabelString
, str
,
1124 apply_fontlist(name
);
1127 XtSetArg(args
[n
], XmNvisibleItemCount
, 8); ++n
;
1128 XtSetArg(args
[n
], XmNresizable
, True
); ++n
;
1129 XtSetArg(args
[n
], XmNlistSizePolicy
, XmCONSTANT
); ++n
;
1130 XtSetArg(args
[n
], XmNvisualPolicy
, XmVARIABLE
); ++n
;
1131 #ifdef LESSTIF_VERSION
1132 XtSetArg(args
[n
], XmNscrollBarDisplayPolicy
, XmSTATIC
); ++n
;
1134 data
->list
[STYLE
] = XmCreateScrolledList(frame
, "styleList", args
, n
);
1135 XtVaSetValues(name
, XmNuserData
, data
->list
[STYLE
], NULL
);
1138 frame
= XtVaCreateManagedWidget("frame", xmFrameWidgetClass
, sub_form
,
1139 XmNshadowThickness
, 0,
1140 XmNtopAttachment
, XmATTACH_FORM
,
1141 XmNbottomAttachment
, XmATTACH_FORM
,
1142 XmNleftAttachment
, XmATTACH_POSITION
,
1143 XmNleftPosition
, 80,
1145 XmNrightAttachment
, XmATTACH_FORM
,
1148 str
= XmStringCreateLocalized(_("Size:"));
1149 name
= XtVaCreateManagedWidget("sizeListLabel", xmLabelGadgetClass
, frame
,
1150 XmNchildType
, XmFRAME_TITLE_CHILD
,
1151 XmNchildVerticalAlignment
, XmALIGNMENT_CENTER
,
1152 XmNchildHorizontalAlignment
, XmALIGNMENT_BEGINNING
,
1153 XmNlabelString
, str
,
1156 apply_fontlist(name
);
1159 XtSetArg(args
[n
], XmNvisibleItemCount
, 8); ++n
;
1160 XtSetArg(args
[n
], XmNresizable
, True
); ++n
;
1161 XtSetArg(args
[n
], XmNlistSizePolicy
, XmCONSTANT
); ++n
;
1162 XtSetArg(args
[n
], XmNvisualPolicy
, XmVARIABLE
); ++n
;
1163 #ifdef LESSTIF_VERSION
1164 XtSetArg(args
[n
], XmNscrollBarDisplayPolicy
, XmSTATIC
); ++n
;
1166 data
->list
[SIZE
] = XmCreateScrolledList(frame
, "sizeList", args
, n
);
1167 XtVaSetValues(name
, XmNuserData
, data
->list
[SIZE
], NULL
);
1169 /* update form widgets cancel button */
1170 XtVaSetValues(form
, XmNcancelButton
, data
->cancel
, NULL
);
1172 XtAddCallback(size_toggle
, XmNvalueChangedCallback
,
1173 (XtCallbackProc
)stoggle_callback
, (XtPointer
)data
);
1174 XtAddCallback(data
->list
[NAME
], XmNbrowseSelectionCallback
,
1175 (XtCallbackProc
)name_callback
, (XtPointer
)data
);
1176 XtAddCallback(data
->list
[STYLE
], XmNbrowseSelectionCallback
,
1177 (XtCallbackProc
)style_callback
, (XtPointer
)data
);
1178 XtAddCallback(data
->list
[SIZE
], XmNbrowseSelectionCallback
,
1179 (XtCallbackProc
)size_callback
, (XtPointer
)data
);
1180 XtAddCallback(data
->ok
, XmNactivateCallback
,
1181 (XtCallbackProc
)ok_callback
, (XtPointer
)data
);
1182 XtAddCallback(data
->cancel
, XmNactivateCallback
,
1183 (XtCallbackProc
)cancel_callback
, (XtPointer
)data
);
1185 XmProcessTraversal(data
->list
[NAME
], XmTRAVERSE_CURRENT
);
1187 /* setup tabgroups */
1189 XmAddTabGroup(data
->list
[NAME
]);
1190 XmAddTabGroup(data
->list
[STYLE
]);
1191 XmAddTabGroup(data
->list
[SIZE
]);
1192 XmAddTabGroup(size_toggle
);
1193 XmAddTabGroup(data
->name
);
1194 XmAddTabGroup(data
->ok
);
1195 XmAddTabGroup(data
->cancel
);
1197 add_cancel_action(data
->dialog
, (XtCallbackProc
)cancel_callback
, data
);
1199 /* Preset selection data. */
1202 data
->in_pixels
= True
;
1203 data
->sel
[ENCODING
] = NULL
;
1204 data
->sel
[NAME
] = NULL
;
1205 data
->sel
[STYLE
] = NULL
;
1206 data
->sel
[SIZE
] = NULL
;
1207 data
->font_name
= NULL
;
1209 /* set up current font parameters */
1210 if (current
&& current
[0] != '\0')
1215 names
= XListFonts(XtDisplay(form
), (char *) current
, 1, &i
);
1219 char namebuf
[TEMP_BUF_SIZE
];
1220 char stylebuf
[TEMP_BUF_SIZE
];
1221 char sizebuf
[TEMP_BUF_SIZE
];
1222 char encodingbuf
[TEMP_BUF_SIZE
];
1227 name_part(found
, namebuf
);
1228 style_part(found
, stylebuf
);
1229 size_part(found
, sizebuf
, data
->in_pixels
);
1230 encoding_part(found
, encodingbuf
);
1232 if (strlen(namebuf
) > 0
1233 && strlen(stylebuf
) > 0
1234 && strlen(sizebuf
) > 0
1235 && strlen(encodingbuf
) > 0)
1237 data
->sel
[NAME
] = XtNewString(namebuf
);
1238 data
->sel
[STYLE
] = XtNewString(stylebuf
);
1239 data
->sel
[SIZE
] = XtNewString(sizebuf
);
1240 data
->sel
[ENCODING
] = XtNewString(encodingbuf
);
1241 data
->font_name
= XtNewString(names
[0]);
1242 display_sample(data
);
1243 XmTextSetString(data
->name
, data
->font_name
);
1247 /* We can't preset a symbolic name, which isn't a full font
1248 * description. Therefore we just behave the same way as if the
1249 * user didn't have selected anything thus far.
1251 * Unfortunately there is no known way to expand an abbreviated
1255 data
->font_name
= NULL
;
1258 XFreeFontNames(names
);
1261 fill_lists(NONE
, data
);
1263 /* Unfortunately LessTif doesn't align the list widget's properly. I don't
1264 * have currently any idea how to fix this problem.
1266 XtManageChild(data
->list
[NAME
]);
1267 XtManageChild(data
->list
[STYLE
]);
1268 XtManageChild(data
->list
[SIZE
]);
1269 XtManageChild(data
->encoding_menu
);
1270 manage_centered(form
);
1272 /* modal event loop */
1274 XtAppProcessEvent(XtWidgetToApplicationContext(data
->dialog
),
1275 (XtInputMask
)XtIMAll
);
1277 XtDestroyWidget(data
->dialog
);
1281 XFreeFont(XtDisplay(data
->dialog
), data
->old
);
1282 XmFontListFree(data
->old_list
);
1285 gui_motif_synch_fonts();
1287 return (char_u
*) data
->font_name
;