aboutsummaryrefslogtreecommitdiffstats
path: root/lwlib
diff options
context:
space:
mode:
authorJan Djärv2010-04-11 20:25:09 +0200
committerJan Djärv2010-04-11 20:25:09 +0200
commit1ecb2d3f03cc83ce7fa3349458f8cf83c97181f2 (patch)
treebd3902f19cf65c1221dab180493360b0ffe3e873 /lwlib
parent97e53006f6c56bcbe190c56dadb350759644bfaa (diff)
downloademacs-1ecb2d3f03cc83ce7fa3349458f8cf83c97181f2.tar.gz
emacs-1ecb2d3f03cc83ce7fa3349458f8cf83c97181f2.zip
Use XFT in Lucid dialogs if available.
* xmenu.c (apply_systemfont_to_dialog): New. (create_and_show_dialog): Call apply_systemfont_to_dialog if HAVE_XFT. * lwlib-Xaw.c (widget_xft_data): New for Xft data. (fill_xft_data, openFont, get_text_width_and_height) (draw_text, set_text, find_xft_data, command_press) (command_reset): New functions. (xaw_update_one_widget): Call set_text for dialog and buttons if HAVE_XFT. Also set internalHeight for buttons. (xaw_destroy_instance): Free all Xft related data. (button_actions, buttonTrans): New structures. (make_dialog): Call XtAppAddActions for button_actions. Find xft font to use and call fill_xft_data for widgets. (xaw_create_dialog): Pass instance parameter to make_dialog. * lwlib-int.h (_widget_instance): Add Xft data if HAVE_XFT. Override translations for buttons. If depth is 16 or more, tell Xaw3d to not be nice to colormap. Remove separator widget, use XtNhorizDistance on first right button instead. * xresources.texi (Lucid Resources): Mention faceName for dialogs.
Diffstat (limited to 'lwlib')
-rw-r--r--lwlib/ChangeLog20
-rw-r--r--lwlib/lwlib-Xaw.c412
-rw-r--r--lwlib/lwlib-int.h6
3 files changed, 399 insertions, 39 deletions
diff --git a/lwlib/ChangeLog b/lwlib/ChangeLog
index 189e2c65e10..f0f9c34519e 100644
--- a/lwlib/ChangeLog
+++ b/lwlib/ChangeLog
@@ -1,3 +1,23 @@
12010-04-11 Jan Djärv <jan.h.d@swipnet.se>
2
3 * lwlib-Xaw.c (widget_xft_data): New for Xft data.
4 (fill_xft_data, openFont, get_text_width_and_height)
5 (draw_text, set_text, find_xft_data, command_press)
6 (command_reset): New functions.
7 (xaw_update_one_widget): Call set_text for dialog and buttons
8 if HAVE_XFT. Also set internalHeight for buttons.
9 (xaw_destroy_instance): Free all Xft related data.
10 (button_actions, buttonTrans): New structures.
11 (make_dialog): Call XtAppAddActions for button_actions.
12 Find xft font to use and call fill_xft_data for widgets.
13 (xaw_create_dialog): Pass instance parameter to make_dialog.
14
15 * lwlib-int.h (_widget_instance): Add Xft data if HAVE_XFT.
16 Override translations for buttons. If depth is 16 or more, tell
17 Xaw3d to not be nice to colormap.
18 Remove separator widget, use XtNhorizDistance on first right button
19 instead.
20
12010-04-08 Jan Djärv <jan.h.d@swipnet.se> 212010-04-08 Jan Djärv <jan.h.d@swipnet.se>
2 22
3 * xlwmenu.c (xlwmenu_default_font): Make static. 23 * xlwmenu.c (xlwmenu_default_font): Make static.
diff --git a/lwlib/lwlib-Xaw.c b/lwlib/lwlib-Xaw.c
index 2af44cd2e1d..c6bbae7e3c9 100644
--- a/lwlib/lwlib-Xaw.c
+++ b/lwlib/lwlib-Xaw.c
@@ -54,6 +54,22 @@ Boston, MA 02110-1301, USA. */
54 54
55#include <X11/Xatom.h> 55#include <X11/Xatom.h>
56 56
57#ifdef HAVE_XFT
58#include <X11/Xft/Xft.h>
59
60struct widget_xft_data
61{
62 Widget widget;
63 XftFont *xft_font;
64 XftDraw *xft_draw;
65 XftColor xft_fg, xft_bg;
66 int p_width, p_height;
67 Pixmap p;
68};
69
70
71#endif
72
57static void xaw_generic_callback (/*Widget, XtPointer, XtPointer*/); 73static void xaw_generic_callback (/*Widget, XtPointer, XtPointer*/);
58 74
59 75
@@ -130,6 +146,207 @@ xaw_update_scrollbar (instance, widget, val)
130} 146}
131#endif 147#endif
132 148
149#ifdef HAVE_XFT
150static void
151fill_xft_data (struct widget_xft_data *data, Widget widget, XftFont *font)
152{
153 data->widget = widget;
154 data->xft_font = font;
155 Pixel bg, fg;
156 XColor colors[2];
157 int screen = XScreenNumberOfScreen (XtScreen (widget));
158
159 XtVaGetValues (widget,
160 XtNbackground, &bg,
161 XtNforeground, &fg,
162 NULL);
163
164 colors[0].pixel = data->xft_fg.pixel = fg;
165 colors[1].pixel = data->xft_bg.pixel = bg;
166 XQueryColors (XtDisplay (widget),
167 DefaultColormapOfScreen (XtScreen (widget)),
168 colors, 2);
169
170 data->xft_fg.color.alpha = 0xFFFF;
171 data->xft_fg.color.red = colors[0].red;
172 data->xft_fg.color.green = colors[0].green;
173 data->xft_fg.color.blue = colors[0].blue;
174 data->xft_bg.color.alpha = 0xFFFF;
175 data->xft_bg.color.red = colors[1].red;
176 data->xft_bg.color.green = colors[1].green;
177 data->xft_bg.color.blue = colors[1].blue;
178
179 data->p = None;
180 data->xft_draw = 0;
181 data->p_width = data->p_height = 0;
182}
183
184static XftFont*
185openFont (Widget widget, char *name)
186{
187 char *fname = name;
188 int screen = XScreenNumberOfScreen (XtScreen (widget));
189 int len = strlen (fname), i = len-1;
190 XftFont *fn;
191
192 /* Try to convert Gtk-syntax (Sans 9) to Xft syntax Sans-9. */
193 while (i > 0 && isdigit (fname[i]))
194 --i;
195 if (fname[i] == ' ')
196 {
197 fname = xstrdup (name);
198 fname[i] = '-';
199 }
200
201 fn = XftFontOpenName (XtDisplay (widget), screen, fname);
202 if (fname != name) free (fname);
203
204 return fn;
205}
206
207static int
208get_text_width_and_height (Widget widget, char *text,
209 XftFont *xft_font,
210 int *height)
211{
212 int w = 0, h = 0;
213 char *bp = text;
214
215 while (bp && *bp != '\0')
216 {
217 XGlyphInfo gi;
218 char *cp = strchr (bp, '\n');
219 XftTextExtentsUtf8 (XtDisplay (widget), xft_font,
220 (FcChar8 *) bp,
221 cp ? cp - bp : strlen (bp),
222 &gi);
223 bp = cp ? cp + 1 : NULL;
224 h += xft_font->height;
225 if (w < gi.width) w = gi.width;
226 }
227
228 *height = h;
229 return w;
230}
231
232static void
233draw_text (struct widget_xft_data *data, char *lbl, int inverse)
234{
235 Screen *sc = XtScreen (data->widget);
236 int screen = XScreenNumberOfScreen (sc);
237 int y = data->xft_font->ascent;
238 int x = inverse ? 0 : 2;
239 char *bp = lbl;
240
241 data->xft_draw = XftDrawCreate (XtDisplay (data->widget),
242 data->p,
243 DefaultVisual (XtDisplay (data->widget),
244 screen),
245 DefaultColormapOfScreen (sc));
246 XftDrawRect (data->xft_draw,
247 inverse ? &data->xft_fg : &data->xft_bg,
248 0, 0, data->p_width, data->p_height);
249
250 if (!inverse) y += 2;
251 while (bp && *bp != '\0')
252 {
253 char *cp = strchr (bp, '\n');
254 XftDrawStringUtf8 (data->xft_draw,
255 inverse ? &data->xft_bg : &data->xft_fg,
256 data->xft_font, x, y, bp, cp ? cp - bp : strlen (bp));
257 bp = cp ? cp + 1 : NULL;
258 /* 1.2 gives reasonable line spacing. */
259 y += data->xft_font->height * 1.2;
260 }
261
262}
263
264
265static void
266set_text (struct widget_xft_data *data, Widget toplevel, char *lbl, int margin)
267{
268 int screen = XScreenNumberOfScreen (XtScreen (data->widget));
269 int width, height;
270
271 width = get_text_width_and_height (data->widget, lbl, data->xft_font,
272 &height);
273 data->p_width = width + margin;
274 data->p_height = height + margin;
275
276 data->p = XCreatePixmap (XtDisplay (data->widget),
277 XtWindow (toplevel),
278 data->p_width,
279 data->p_height,
280 DefaultDepthOfScreen (XtScreen (data->widget)));
281 draw_text (data, lbl, 0);
282 XtVaSetValues (data->widget, XtNbitmap, data->p, NULL);
283}
284
285static struct widget_xft_data *
286find_xft_data (Widget widget)
287{
288 widget_instance *inst = NULL;
289 Widget parent = XtParent (widget);
290 struct widget_xft_data *data = NULL;
291 int nr;
292 while (parent && !inst)
293 {
294 inst = lw_get_widget_instance (parent);
295 parent = XtParent (parent);
296 }
297 if (!inst || !inst->xft_data || !inst->xft_data[0].xft_font) return;
298
299 for (nr = 0; data == NULL && nr < inst->nr_xft_data; ++nr)
300 {
301 if (inst->xft_data[nr].widget == widget)
302 data = &inst->xft_data[nr];
303 }
304
305 return data;
306}
307
308static void
309command_press (Widget widget,
310 XEvent* event,
311 String *params,
312 Cardinal *num_params)
313{
314 struct widget_xft_data *data = find_xft_data (widget);
315 if (data)
316 {
317 char *lbl;
318 /* Since this isn't used for rectangle buttons, use it to for armed. */
319 XtVaSetValues (widget, XtNcornerRoundPercent, 1, NULL);
320
321 XtVaGetValues (widget, XtNlabel, &lbl, NULL);
322 draw_text (data, lbl, 1);
323 }
324}
325
326static void
327command_reset (Widget widget,
328 XEvent* event,
329 String *params,
330 Cardinal *num_params)
331{
332 struct widget_xft_data *data = find_xft_data (widget);
333 if (data)
334 {
335 Dimension cr;
336 XtVaGetValues (widget, XtNcornerRoundPercent, &cr, NULL);
337 if (cr == 1)
338 {
339 char *lbl;
340 XtVaSetValues (widget, XtNcornerRoundPercent, 0, NULL);
341 XtVaGetValues (widget, XtNlabel, &lbl, NULL);
342 draw_text (data, lbl, 0);
343 }
344 }
345}
346
347
348#endif
349
133void 350void
134#ifdef PROTOTYPES 351#ifdef PROTOTYPES
135xaw_update_one_widget (widget_instance *instance, Widget widget, 352xaw_update_one_widget (widget_instance *instance, Widget widget,
@@ -150,15 +367,21 @@ xaw_update_one_widget (instance, widget, val, deep_p)
150#endif 367#endif
151 if (XtIsSubclass (widget, dialogWidgetClass)) 368 if (XtIsSubclass (widget, dialogWidgetClass))
152 { 369 {
153 Arg al[1]; 370
154 int ac = 0; 371#ifdef HAVE_XFT
155 XtSetArg (al[ac], XtNlabel, val->contents->value); ac++; 372 if (instance->xft_data && instance->xft_data[0].xft_font)
156 XtSetValues (widget, al, ac); 373 {
374 set_text (&instance->xft_data[0], instance->parent,
375 val->contents->value, 10);
376 }
377#endif
378 XtVaSetValues (widget, XtNlabel, val->contents->value, NULL);
157 } 379 }
158 else if (XtIsSubclass (widget, commandWidgetClass)) 380 else if (XtIsSubclass (widget, commandWidgetClass))
159 { 381 {
160 Dimension bw = 0; 382 Dimension bw = 0;
161 Arg al[3]; 383 Arg al[10];
384 int ac = 0;
162 385
163 XtVaGetValues (widget, XtNborderWidth, &bw, NULL); 386 XtVaGetValues (widget, XtNborderWidth, &bw, NULL);
164 if (bw == 0) 387 if (bw == 0)
@@ -174,10 +397,30 @@ xaw_update_one_widget (instance, widget, val, deep_p)
174 } 397 }
175 398
176 XtSetSensitive (widget, val->enabled); 399 XtSetSensitive (widget, val->enabled);
177 XtSetArg (al[0], XtNlabel, val->value); 400 XtSetArg (al[ac], XtNlabel, val->value);ac++;
178 /* Force centered button text. Se above. */ 401 /* Force centered button text. Se above. */
179 XtSetArg (al[1], XtNjustify, XtJustifyCenter); 402 XtSetArg (al[ac], XtNjustify, XtJustifyCenter);ac++;
180 XtSetValues (widget, al, 2); 403#ifdef HAVE_XFT
404 if (instance->xft_data && instance->xft_data[0].xft_font)
405 {
406 int th;
407 int nr;
408 for (nr = 0; nr < instance->nr_xft_data; ++nr)
409 if (instance->xft_data[nr].widget == widget)
410 break;
411 if (nr < instance->nr_xft_data)
412 {
413 set_text (&instance->xft_data[nr], instance->parent,
414 val->value, 6);
415
416 /* Must set internalHeight to twice the highlight thickness,
417 or else it gets overwritten by our pixmap. Probably a bug. */
418 XtVaGetValues (widget, XtNhighlightThickness, &th, NULL);
419 XtSetArg (al[ac], XtNinternalHeight, 2*th);ac++;
420 }
421 }
422#endif
423 XtSetValues (widget, al, ac);
181 XtRemoveAllCallbacks (widget, XtNcallback); 424 XtRemoveAllCallbacks (widget, XtNcallback);
182 XtAddCallback (widget, XtNcallback, xaw_generic_callback, instance); 425 XtAddCallback (widget, XtNcallback, xaw_generic_callback, instance);
183 } 426 }
@@ -198,6 +441,28 @@ void
198xaw_destroy_instance (instance) 441xaw_destroy_instance (instance)
199 widget_instance *instance; 442 widget_instance *instance;
200{ 443{
444#ifdef HAVE_XFT
445 if (instance->xft_data)
446 {
447 int i;
448 for (i = 0; i < instance->nr_xft_data; ++i)
449 {
450 if (instance->xft_data[i].xft_draw)
451 XftDrawDestroy (instance->xft_data[i].xft_draw);
452 if (instance->xft_data[i].p != None)
453 {
454 XtVaSetValues (instance->xft_data[i].widget, XtNbitmap, None,
455 NULL);
456 XFreePixmap (XtDisplay (instance->widget),
457 instance->xft_data[i].p);
458 }
459 }
460 if (instance->xft_data[0].xft_font)
461 XftFontClose (XtDisplay (instance->widget),
462 instance->xft_data[0].xft_font);
463 free (instance->xft_data);
464 }
465#endif
201 if (XtIsSubclass (instance->widget, dialogWidgetClass)) 466 if (XtIsSubclass (instance->widget, dialogWidgetClass))
202 /* Need to destroy the Shell too. */ 467 /* Need to destroy the Shell too. */
203 XtDestroyWidget (XtParent (instance->widget)); 468 XtDestroyWidget (XtParent (instance->widget));
@@ -298,8 +563,21 @@ static XtActionsRec xaw_actions [] = {
298}; 563};
299static Boolean actions_initted = False; 564static Boolean actions_initted = False;
300 565
566#ifdef HAVE_XFT
567static XtActionsRec button_actions[] =
568 {
569 { "my_reset", command_reset },
570 { "my_press", command_press },
571 };
572char buttonTrans[] =
573 "<Leave>: reset() my_reset()\n"
574 "<Btn1Down>: set() my_press()\n"
575 "<Btn1Up>: my_reset() notify() unset()\n";
576#endif
577
301static Widget 578static Widget
302make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot, radio_box, list, left_buttons, right_buttons) 579make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot,
580 radio_box, list, left_buttons, right_buttons, instance)
303 char* name; 581 char* name;
304 Widget parent; 582 Widget parent;
305 Boolean pop_up_p; 583 Boolean pop_up_p;
@@ -310,6 +588,7 @@ make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot, ra
310 Boolean list; 588 Boolean list;
311 int left_buttons; 589 int left_buttons;
312 int right_buttons; 590 int right_buttons;
591 widget_instance *instance;
313{ 592{
314 Arg av [20]; 593 Arg av [20];
315 int ac = 0; 594 int ac = 0;
@@ -319,6 +598,10 @@ make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot, ra
319 Widget dialog; 598 Widget dialog;
320 Widget button; 599 Widget button;
321 XtTranslations override; 600 XtTranslations override;
601#ifdef HAVE_XFT
602 XftFont *xft_font = 0;
603 XtTranslations button_override;
604#endif
322 605
323 if (! pop_up_p) abort (); /* not implemented */ 606 if (! pop_up_p) abort (); /* not implemented */
324 if (text_input_slot) abort (); /* not implemented */ 607 if (text_input_slot) abort (); /* not implemented */
@@ -330,6 +613,10 @@ make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot, ra
330 XtAppContext app = XtWidgetToApplicationContext (parent); 613 XtAppContext app = XtWidgetToApplicationContext (parent);
331 XtAppAddActions (app, xaw_actions, 614 XtAppAddActions (app, xaw_actions,
332 sizeof (xaw_actions) / sizeof (xaw_actions[0])); 615 sizeof (xaw_actions) / sizeof (xaw_actions[0]));
616#ifdef HAVE_XFT
617 XtAppAddActions (app, button_actions,
618 sizeof (button_actions) / sizeof (button_actions[0]));
619#endif
333 actions_initted = True; 620 actions_initted = True;
334 } 621 }
335 622
@@ -351,6 +638,49 @@ make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot, ra
351 override = XtParseTranslationTable (dialogOverride); 638 override = XtParseTranslationTable (dialogOverride);
352 XtOverrideTranslations (dialog, override); 639 XtOverrideTranslations (dialog, override);
353 640
641#ifdef HAVE_XFT
642 {
643 int num;
644 Widget *ch = NULL;
645 Widget w = 0;
646 XtVaGetValues (dialog,
647 XtNnumChildren, &num,
648 XtNchildren, &ch, NULL);
649 for (i = 0; i < num; ++i)
650 {
651 if (!XtIsSubclass (ch[i], commandWidgetClass)
652 && XtIsSubclass (ch[i], labelWidgetClass))
653 {
654 w = ch[i];
655 break;
656 }
657 }
658 instance->xft_data = 0;
659 instance->nr_xft_data = 0;
660 if (w)
661 {
662 XtResource rec[] =
663 { { "faceName", "FaceName", XtRString, sizeof(String), 0, XtRString,
664 (XtPointer)"Sans-14" }};
665 char *faceName;
666 XtVaGetSubresources (dialog, &faceName, "Dialog", "dialog",
667 rec, 1, 0, NULL);
668 if (strcmp ("none", faceName) != 0)
669 xft_font = openFont (dialog, faceName);
670 if (xft_font)
671 {
672 instance->nr_xft_data = left_buttons + right_buttons + 1;
673 instance->xft_data = calloc (instance->nr_xft_data,
674 sizeof(*instance->xft_data));
675
676 fill_xft_data (&instance->xft_data[0], w, xft_font);
677 }
678 }
679
680 button_override = XtParseTranslationTable (buttonTrans);
681 }
682#endif
683
354 bc = 0; 684 bc = 0;
355 button = 0; 685 button = 0;
356 for (i = 0; i < left_buttons; i++) 686 for (i = 0; i < left_buttons; i++)
@@ -362,51 +692,56 @@ make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot, ra
362 XtSetArg (av [ac], XtNtop, XtChainBottom); ac++; 692 XtSetArg (av [ac], XtNtop, XtChainBottom); ac++;
363 XtSetArg (av [ac], XtNbottom, XtChainBottom); ac++; 693 XtSetArg (av [ac], XtNbottom, XtChainBottom); ac++;
364 XtSetArg (av [ac], XtNresizable, True); ac++; 694 XtSetArg (av [ac], XtNresizable, True); ac++;
695#ifdef HAVE_XAW3D
696 if (DefaultDepthOfScreen (XtScreen (dialog)) >= 16)
697 {
698 /* Turn of dithered shadow if we can. Looks bad */
699 XtSetArg (av [ac], "beNiceToColormap", False); ac++;
700 }
701#endif
365 sprintf (button_name, "button%d", ++bc); 702 sprintf (button_name, "button%d", ++bc);
366 button = XtCreateManagedWidget (button_name, commandWidgetClass, 703 button = XtCreateManagedWidget (button_name, commandWidgetClass,
367 dialog, av, ac); 704 dialog, av, ac);
705#ifdef HAVE_XFT
706 if (xft_font)
707 {
708 fill_xft_data (&instance->xft_data[bc], button, xft_font);
709 XtOverrideTranslations (button, button_override);
710 }
711#endif
368 } 712 }
369 if (right_buttons)
370 {
371 /* Create a separator
372 713
373 I want the separator to take up the slack between the buttons on
374 the right and the buttons on the left (that is I want the buttons
375 after the separator to be packed against the right edge of the
376 window) but I can't seem to make it do it.
377 */
378 ac = 0;
379 XtSetArg (av [ac], XtNfromHoriz, button); ac++;
380/* XtSetArg (av [ac], XtNfromVert, XtNameToWidget (dialog, "label")); ac++; */
381 XtSetArg (av [ac], XtNleft, XtChainLeft); ac++;
382 XtSetArg (av [ac], XtNright, XtChainRight); ac++;
383 XtSetArg (av [ac], XtNtop, XtChainBottom); ac++;
384 XtSetArg (av [ac], XtNbottom, XtChainBottom); ac++;
385 XtSetArg (av [ac], XtNlabel, ""); ac++;
386 XtSetArg (av [ac], XtNwidth, 30); ac++; /* #### aaack!! */
387 XtSetArg (av [ac], XtNborderWidth, 0); ac++;
388 XtSetArg (av [ac], XtNshapeStyle, XmuShapeRectangle); ac++;
389 XtSetArg (av [ac], XtNresizable, False); ac++;
390 XtSetArg (av [ac], XtNsensitive, False); ac++;
391 button = XtCreateManagedWidget ("separator",
392 /* labelWidgetClass, */
393 /* This has to be Command to fake out
394 the Dialog widget... */
395 commandWidgetClass,
396 dialog, av, ac);
397 }
398 for (i = 0; i < right_buttons; i++) 714 for (i = 0; i < right_buttons; i++)
399 { 715 {
400 ac = 0; 716 ac = 0;
401 XtSetArg (av [ac], XtNfromHoriz, button); ac++; 717 XtSetArg (av [ac], XtNfromHoriz, button); ac++;
718 if (i == 0)
719 {
720 /* Separator to the other buttons. */
721 XtSetArg (av [ac], XtNhorizDistance, 30); ac++;
722 }
402 XtSetArg (av [ac], XtNleft, XtChainRight); ac++; 723 XtSetArg (av [ac], XtNleft, XtChainRight); ac++;
403 XtSetArg (av [ac], XtNright, XtChainRight); ac++; 724 XtSetArg (av [ac], XtNright, XtChainRight); ac++;
404 XtSetArg (av [ac], XtNtop, XtChainBottom); ac++; 725 XtSetArg (av [ac], XtNtop, XtChainBottom); ac++;
405 XtSetArg (av [ac], XtNbottom, XtChainBottom); ac++; 726 XtSetArg (av [ac], XtNbottom, XtChainBottom); ac++;
406 XtSetArg (av [ac], XtNresizable, True); ac++; 727 XtSetArg (av [ac], XtNresizable, True); ac++;
728#ifdef HAVE_XAW3D
729 if (DefaultDepthOfScreen (XtScreen (dialog)) >= 16)
730 {
731 /* Turn of dithered shadow if we can. Looks bad */
732 XtSetArg (av [ac], "beNiceToColormap", False); ac++;
733 }
734#endif
407 sprintf (button_name, "button%d", ++bc); 735 sprintf (button_name, "button%d", ++bc);
408 button = XtCreateManagedWidget (button_name, commandWidgetClass, 736 button = XtCreateManagedWidget (button_name, commandWidgetClass,
409 dialog, av, ac); 737 dialog, av, ac);
738#ifdef HAVE_XFT
739 if (xft_font)
740 {
741 fill_xft_data (&instance->xft_data[bc], button, xft_font);
742 XtOverrideTranslations (button, button_override);
743 }
744#endif
410 } 745 }
411 746
412 return dialog; 747 return dialog;
@@ -472,8 +807,7 @@ xaw_create_dialog (instance)
472 807
473 widget = make_dialog (name, parent, pop_up_p, 808 widget = make_dialog (name, parent, pop_up_p,
474 shell_name, icon_name, text_input_slot, radio_box, 809 shell_name, icon_name, text_input_slot, radio_box,
475 list, left_buttons, right_buttons); 810 list, left_buttons, right_buttons, instance);
476
477 return widget; 811 return widget;
478} 812}
479 813
diff --git a/lwlib/lwlib-int.h b/lwlib/lwlib-int.h
index 6bcf558dc51..ba48d191752 100644
--- a/lwlib/lwlib-int.h
+++ b/lwlib/lwlib-int.h
@@ -28,11 +28,17 @@ Boston, MA 02110-1301, USA. */
28 28
29extern char *safe_strdup __P ((const char *)); 29extern char *safe_strdup __P ((const char *));
30 30
31struct widget_xft_data;
32
31typedef struct _widget_instance 33typedef struct _widget_instance
32{ 34{
33 Widget widget; 35 Widget widget;
34 Widget parent; 36 Widget parent;
35 Boolean pop_up_p; 37 Boolean pop_up_p;
38#ifdef HAVE_XFT
39 struct widget_xft_data *xft_data;
40 int nr_xft_data;
41#endif
36 struct _widget_info* info; 42 struct _widget_info* info;
37 struct _widget_instance* next; 43 struct _widget_instance* next;
38} widget_instance; 44} widget_instance;