annotate lwlib/xlwmenu.c @ 3767:6b2ef948e140

[xemacs-hg @ 2006-12-29 18:09:38 by aidan] etc/ChangeLog addition: 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * unicode/unicode-consortium/8859-7.TXT: Update the mapping to the 2003 version of ISO 8859-7. lisp/ChangeLog addition: 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * mule/cyrillic.el: * mule/cyrillic.el (iso-8859-5): * mule/cyrillic.el (cyrillic-koi8-r-encode-table): Add syntax, case support for Cyrillic; make some parentheses more Lispy. * mule/european.el: Content moved to latin.el, file deleted. * mule/general-late.el: If Unicode tables are to be loaded at dump time, do it here, not in loadup.el. * mule/greek.el: Add syntax, case support for Greek. * mule/latin.el: Move the content of european.el here. Change the case table mappings to use hexadecimal codes, to make cross reference to the standards easier. In all cases, take character syntax from similar characters in Latin-1 , rather than deciding separately what syntax they should take. Add (incomplete) support for case with Turkish. Remove description of the character sets used from the language environments' doc strings, since now that we create variant language environments on the fly, such descriptions will often be inaccurate. Set the native-coding-system language info property while setting the other coding-system properties of the language. * mule/misc-lang.el (ipa): Remove the language environment. The International Phonetic _Alphabet_ is not a language, it's inane to have a corresponding language environment in XEmacs. * mule/mule-cmds.el (create-variant-language-environment): Also modify the coding-priority when creating a new language environment; document that. * mule/mule-cmds.el (get-language-environment-from-locale): Recognise that the 'native-coding-system language-info property can be a list, interpret it correctly when it is one. 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * coding.el (coding-system-category): Use the new 'unicode-type property for finding what sort of Unicode coding system subtype a coding system is, instead of the overshadowed 'type property. * dumped-lisp.el (preloaded-file-list): mule/european.el has been removed. * loadup.el (really-early-error-handler): Unicode tables loaded at dump time are now in mule/general-late.el. * simple.el (count-lines): Add some backslashes to to parentheses in docstrings to help fontification along. * simple.el (what-cursor-position): Wrap a line to fit in 80 characters. * unicode.el: Use the 'unicode-type property, not 'type, for setting the Unicode coding-system subtype. src/ChangeLog addition: 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * file-coding.c: Update the make-coding-system docstring to reflect unicode-type * general-slots.h: New symbol, unicode-type, since 'type was being overridden when accessing a coding system's Unicode subtype. * intl-win32.c: Backslash a few parentheses, to help fontification along. * intl-win32.c (complex_vars_of_intl_win32): Use the 'unicode-type symbol, not 'type, when creating the Microsoft Unicode coding system. * unicode.c (unicode_putprop): * unicode.c (unicode_getprop): * unicode.c (unicode_print): Using 'type as the property name when working out what Unicode subtype a given coding system is was broken, since there's a general coding system property called 'type. Change the former to use 'unicode-type instead.
author aidan
date Fri, 29 Dec 2006 18:09:51 +0000
parents 382b11fa8866
children 03f6627a2e09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Implements a lightweight menubar widget.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1992, 1993, 1994 Lucid, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Tinker Systems and INS Engineering Corp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of the Lucid Widget Library.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 The Lucid Widget Library is free software; you can redistribute it and/or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 modify it under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 The Lucid Widget Library is distributed in the hope that it will be useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 GNU General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Created by devin@lucid.com */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 #include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #include <string.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 #include <ctype.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include <limits.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #ifdef HAVE_UNISTD_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include <unistd.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include <X11/IntrinsicP.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include <X11/ShellP.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include <X11/StringDefs.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include <X11/cursorfont.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include <X11/bitmaps/gray>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include <Xm/Xm.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 #if XmVersion < 1002 /* 1.1 or ancient */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 #undef XmFONTLIST_DEFAULT_TAG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 #define XmFONTLIST_DEFAULT_TAG XmSTRING_DEFAULT_CHARSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #endif /* XmVersion < 1.2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #endif
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
48
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
49 /* #### we may want to turn off USE_XFT here if !USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
50 In fact, maybe that's the right interface overall? */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
51 #include "lwlib-fonts.h"
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
52 #include "lwlib-colors.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 #include "xlwmenuP.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #ifdef USE_DEBUG_MALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 #include <dmalloc.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
59 /* simple, naive integer maximum */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #ifndef max
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #define max(a,b) ((a)>(b)?(a):(b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 static char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 xlwMenuTranslations [] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 "<BtnDown>: start()\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 <BtnMotion>: drag()\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 <BtnUp>: select()\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 ";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 extern Widget lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #define offset(field) XtOffset(XlwMenuWidget, field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 static XtResource
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 xlwMenuResources[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
77 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 /* There are three font list resources, so that we can accept either of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 the resources *fontList: or *font:, and so that we can tell the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 difference between them being specified, and being defaulted to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 font from the XtRString specified here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 {XmNfontList, XmCFontList, XmRFontList, sizeof(XmFontList),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 offset(menu.font_list), XtRImmediate, (XtPointer)0},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 {XtNfont, XtCFont, XmRFontList, sizeof(XmFontList),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 offset(menu.font_list_2),XtRImmediate, (XtPointer)0},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 {XmNfontList, XmCFontList, XmRFontList, sizeof(XmFontList),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 offset(menu.fallback_font_list),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 /* We must use an iso8859-1 font here, or people without $LANG set lose.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 It's fair to assume that those who do have $LANG set also have the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 *fontList resource set, or at least know how to deal with this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 XtRString, (XtPointer) "-*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 offset(menu.font), XtRString, (XtPointer) "XtDefaultFont"},
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
95 #ifdef USE_XFT_MENUBARS
3397
6aa26bef0527 [xemacs-hg @ 2006-05-12 19:25:28 by stephent]
stephent
parents: 3374
diff changeset
96 {XtNfcFontName, XtCFcFontName, XtRString, sizeof (String),
6aa26bef0527 [xemacs-hg @ 2006-05-12 19:25:28 by stephent]
stephent
parents: 3374
diff changeset
97 offset(menu.fcFontName),
3685
382b11fa8866 [xemacs-hg @ 2006-11-17 02:50:22 by stephent]
stephent
parents: 3462
diff changeset
98 XtRString, (XtPointer) NULL},
3397
6aa26bef0527 [xemacs-hg @ 2006-05-12 19:25:28 by stephent]
stephent
parents: 3374
diff changeset
99 /* #### This needs to be fixed to give a proper type and converter for
6aa26bef0527 [xemacs-hg @ 2006-05-12 19:25:28 by stephent]
stephent
parents: 3374
diff changeset
100 XftFonts. See also xlwtabs.c. */
3685
382b11fa8866 [xemacs-hg @ 2006-11-17 02:50:22 by stephent]
stephent
parents: 3462
diff changeset
101 {XtNxftFont, XtCXftFont, XtRString, sizeof(XtPointer),
382b11fa8866 [xemacs-hg @ 2006-11-17 02:50:22 by stephent]
stephent
parents: 3462
diff changeset
102 offset(menu.xftFontName), XtRString, (XtPointer) "Helvetica-12:bold" },
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
103 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 # ifdef USE_XFONTSET
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
105 /* #### Consider using the same method as for Motif; see the comment in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
106 XlwMenuInitialize(). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 {XtNfontSet, XtCFontSet, XtRFontSet, sizeof(XFontSet),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 offset(menu.font_set), XtRString, (XtPointer) "XtDefaultFontSet"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 offset(menu.foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 offset(menu.button_foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 offset(menu.highlight_foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 {XtNtitleForeground, XtCTitleForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 offset(menu.title_foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 offset(menu.margin), XtRImmediate, (XtPointer)2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 {XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 offset(menu.horizontal_margin), XtRImmediate, (XtPointer)2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 {XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 offset(menu.vertical_margin), XtRImmediate, (XtPointer)1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 {XmNspacing, XmCSpacing, XmRHorizontalDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 offset(menu.column_spacing), XtRImmediate, (XtPointer)4},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 {XmNindicatorSize, XmCIndicatorSize, XtRDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 offset(menu.indicator_size), XtRImmediate, (XtPointer)0},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 {XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 sizeof (Dimension), offset (menu.shadow_thickness),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 XtRImmediate, (XtPointer) 2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 {XmNshadowThickness, XmCShadowThickness, XtRDimension,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 sizeof (Dimension), offset (menu.shadow_thickness),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 XtRImmediate, (XtPointer) 2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 {XmNselectColor, XmCSelectColor, XtRPixel, sizeof (Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 offset (menu.select_color), XtRImmediate, (XtPointer)-1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 {XmNtopShadowColor, XmCTopShadowColor, XtRPixel, sizeof (Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 offset (menu.top_shadow_color), XtRImmediate, (XtPointer)-1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 {XmNbottomShadowColor, XmCBottomShadowColor, XtRPixel, sizeof (Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 offset (menu.bottom_shadow_color), XtRImmediate, (XtPointer)-1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 {XmNtopShadowPixmap, XmCTopShadowPixmap, XtRPixmap, sizeof (Pixmap),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 offset (menu.top_shadow_pixmap), XtRImmediate, (XtPointer)None},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 {XmNbottomShadowPixmap, XmCBottomShadowPixmap, XtRPixmap, sizeof (Pixmap),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 offset (menu.bottom_shadow_pixmap), XtRImmediate, (XtPointer)None},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 {XtNopen, XtCCallback, XtRCallback, sizeof(XtPointer),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 offset(menu.open), XtRCallback, (XtPointer)NULL},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 {XtNselect, XtCCallback, XtRCallback, sizeof(XtPointer),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 offset(menu.select), XtRCallback, (XtPointer)NULL},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 {XtNmenu, XtCMenu, XtRPointer, sizeof(XtPointer),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 offset(menu.contents), XtRImmediate, (XtPointer)NULL},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 offset(menu.cursor_shape), XtRString, (XtPointer) "right_ptr"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 {XtNhorizontal, XtCHorizontal, XtRInt, sizeof(int),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 offset(menu.horizontal), XtRImmediate, (XtPointer)True},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 {XtNuseBackingStore, XtCUseBackingStore, XtRBoolean, sizeof (Boolean),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 offset (menu.use_backing_store), XtRImmediate, (XtPointer)False},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 {XtNbounceDown, XtCBounceDown, XtRBoolean, sizeof (Boolean),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 offset (menu.bounce_down), XtRImmediate, (XtPointer)True},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 {XtNresourceLabels, XtCResourceLabels, XtRBoolean, sizeof (Boolean),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 offset (menu.lookup_labels), XtRImmediate, (XtPointer)False},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 #undef offset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
1201
c2569faae8ed [xemacs-hg @ 2003-01-12 10:45:53 by michaels]
michaels
parents: 647
diff changeset
168 static Boolean XlwMenuSetValues (Widget current, Widget request, Widget new_,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 ArgList args, Cardinal *num_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 static void XlwMenuRealize (Widget w, Mask *valueMask,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 XSetWindowAttributes *attributes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 static void XlwMenuRedisplay (Widget w, XEvent *ev, Region region);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 static void XlwMenuResize (Widget w);
1201
c2569faae8ed [xemacs-hg @ 2003-01-12 10:45:53 by michaels]
michaels
parents: 647
diff changeset
174 static void XlwMenuInitialize (Widget request, Widget new_, ArgList args,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 Cardinal *num_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 static void XlwMenuDestroy (Widget w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 static void XlwMenuClassInitialize (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 static void Start (Widget w, XEvent *ev, String *params, Cardinal *num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 static void Drag (Widget w, XEvent *ev, String *params, Cardinal *num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 static void Select(Widget w, XEvent *ev, String *params, Cardinal *num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
182 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 static XFontStruct *default_font_of_font_list (XmFontList);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 static XtActionsRec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 xlwMenuActionsList [] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 {"start", Start},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 {"drag", Drag},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 {"select", Select},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 #define SuperClass ((CoreWidgetClass)&coreClassRec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 XlwMenuClassRec xlwMenuClassRec =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 { /* CoreClass fields initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 (WidgetClass) SuperClass, /* superclass */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 "XlwMenu", /* class_name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 sizeof(XlwMenuRec), /* size */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 XlwMenuClassInitialize, /* class_initialize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 NULL, /* class_part_initialize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 FALSE, /* class_inited */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 XlwMenuInitialize, /* initialize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 NULL, /* initialize_hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 XlwMenuRealize, /* realize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 xlwMenuActionsList, /* actions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 XtNumber(xlwMenuActionsList), /* num_actions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 xlwMenuResources, /* resources */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 XtNumber(xlwMenuResources), /* resource_count */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 NULLQUARK, /* xrm_class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 TRUE, /* compress_motion */
1294
8c5cf108f035 [xemacs-hg @ 2003-02-14 07:38:22 by stephent]
stephent
parents: 1201
diff changeset
214 XtExposeCompressMaximal, /* compress_exposure */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 TRUE, /* compress_enterleave */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 FALSE, /* visible_interest */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 XlwMenuDestroy, /* destroy */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 XlwMenuResize, /* resize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 XlwMenuRedisplay, /* expose */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 XlwMenuSetValues, /* set_values */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 NULL, /* set_values_hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 XtInheritSetValuesAlmost, /* set_values_almost */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 NULL, /* get_values_hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 NULL, /* #### - should this be set for grabs? accept_focus */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 XtVersion, /* version */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 NULL, /* callback_private */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 xlwMenuTranslations, /* tm_table */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 XtInheritQueryGeometry, /* query_geometry */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 XtInheritDisplayAccelerator, /* display_accelerator */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 NULL /* extension */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 }, /* XlwMenuClass fields initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 0 /* dummy */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 WidgetClass xlwMenuWidgetClass = (WidgetClass) &xlwMenuClassRec;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 extern int lw_menu_accelerate;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 /* Utilities */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 #if 0 /* Apparently not used anywhere */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 safe_strdup (char *s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 char *result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 if (! s) return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 result = (char *) malloc (strlen (s) + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 if (! result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 strcpy (result, s);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 push_new_stack (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 if (!mw->menu.new_stack)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 mw->menu.new_stack_length = 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 mw->menu.new_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (widget_value**)XtCalloc (mw->menu.new_stack_length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 else if (mw->menu.new_depth == mw->menu.new_stack_length)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 mw->menu.new_stack_length *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 mw->menu.new_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 (widget_value**)XtRealloc ((char *)mw->menu.new_stack,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 mw->menu.new_stack_length *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 mw->menu.new_stack [mw->menu.new_depth++] = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 pop_new_stack_if_no_contents (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 if (mw->menu.new_depth &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 !mw->menu.new_stack [mw->menu.new_depth - 1]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 mw->menu.new_depth -= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 make_old_stack_space (XlwMenuWidget mw, int n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 if (!mw->menu.old_stack)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 mw->menu.old_stack_length = max (10, n);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 mw->menu.old_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 (widget_value**)XtCalloc (mw->menu.old_stack_length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 else if (mw->menu.old_stack_length < n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 while (mw->menu.old_stack_length < n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 mw->menu.old_stack_length *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 mw->menu.old_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (widget_value**)XtRealloc ((char *)mw->menu.old_stack,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 mw->menu.old_stack_length *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 close_to_reference_time (Widget w, Time reference_time, XEvent *ev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 reference_time &&
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 446
diff changeset
314 ((int) (ev->xbutton.time - reference_time) <
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 446
diff changeset
315 XtGetMultiClickTime (XtDisplay (w)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 /* Size code */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 string_width (XlwMenuWidget mw,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
321 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 XmString s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 char *s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
328 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 Dimension width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 XmStringExtent (mw->menu.font_list, s, &width, &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 return width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 XRectangle ri, rl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 XmbTextExtents (mw->menu.font_set, s, strlen (s), &ri, &rl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 return rl.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 # else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
338 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
339 XGlyphInfo glyphinfo;
3374
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
340 XftTextExtents8 (XtDisplay (mw), mw->menu.renderFont, (FcChar8 *) s,
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
341 strlen (s), &glyphinfo);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
342 return glyphinfo.xOff;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
343 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 XCharStruct xcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 int drop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 XTextExtents (mw->menu.font, s, strlen (s), &drop, &drop, &drop, &xcs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 return xcs.width;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
348 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 # endif /* USE_XFONTSET */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 static char massaged_resource_char[256];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 initialize_massaged_resource_char (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 int j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 for (j = 0; j < (int) sizeof (massaged_resource_char); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 if ((j >= 'a' && j <= 'z') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (j >= 'A' && j <= 'Z') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 (j >= '0' && j <= '9') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 (j == '_') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 (j >= 0xa0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 massaged_resource_char[j] = (char) j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 massaged_resource_char ['_'] = '_';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 massaged_resource_char ['+'] = 'P'; /* Convert C++ to cPP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 massaged_resource_char ['.'] = '_'; /* Convert Buffers... to buffers___ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 string_width_u (XlwMenuWidget mw,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
375 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 XmString string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 char *string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
382 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 Dimension width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 XmString newstring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 XRectangle ri, rl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 # else /* ! USE_XFONTSET */
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
389 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
390 XGlyphInfo glyphinfo;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
391 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 XCharStruct xcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 int drop;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
394 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 char* newchars;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 int charslength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 char *chars;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 int i, j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
402 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 if (!XmStringGetLtoR (string, XmFONTLIST_DEFAULT_TAG, &chars))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 chars = string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 charslength = strlen (chars);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 newchars = (char *) alloca (charslength + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 for (i = j = 0; chars[i] && (j < charslength); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 if (chars[i]=='%'&&chars[i+1]=='_')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 newchars[j++] = chars[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 newchars[j] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
419 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 newstring = XmStringLtoRCreate (newchars, XmFONTLIST_DEFAULT_TAG);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 XmStringExtent (mw->menu.font_list, newstring, &width, &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 XmStringFree (newstring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 XtFree (chars);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 return width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 XmbTextExtents (mw->menu.font_set, newchars, j, &ri, &rl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 return rl.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 # else /* ! USE_XFONTSET */
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
430 #ifdef USE_XFT_MENUBARS
3374
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
431 XftTextExtents8 (XtDisplay (mw), mw->menu.renderFont, (FcChar8 *) newchars,
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
432 j, &glyphinfo);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
433 return glyphinfo.xOff;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
434 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 XTextExtents (mw->menu.font, newchars, j, &drop, &drop, &drop, &xcs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 return xcs.width;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
437 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 # endif /* USE_XFONTSET */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
443 massage_resource_name (const char *in, char *out)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 /* Turn a random string into something suitable for using as a resource.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 "Kill Buffer" -> "killBuffer"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 "Find File..." -> "findFile___"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 "Search and Replace..." -> "searchAndReplace___"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 "C++ Mode Commands" -> "cppModeCommands"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 Valid characters in a resource NAME component are: a-zA-Z0-9_
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 #ifdef PRINT_XLWMENU_RESOURCE_CONVERSIONS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 /* Compile with -DPRINT_XLWMENU_RESOURCE_CONVERSIONS to generate a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 translation file for menu localizations. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 char *save_in = in, *save_out = out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 Boolean firstp = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 while (*in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
465 if (*in == '%' && *(in + 1) == '_')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
466 in += 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
467 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
469 char ch;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
470
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
471 if (*in == '%' && *(in + 1) == '%')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
472 in++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
473 ch = massaged_resource_char[(unsigned char) *in++];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
474 if (ch)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
475 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
476 int int_ch = (int) (unsigned char) ch;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
477 *out++ = firstp ? tolower (int_ch) : toupper (int_ch);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
478 firstp = False;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
479 while ((ch = massaged_resource_char[(unsigned char) *in++])
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
480 != '\0')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
481 *out++ = ch;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
482 if (!*(in-1)) /* Overshot the NULL byte? */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
483 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
484 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 *out = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 #ifdef PRINT_XLWMENU_RESOURCE_CONVERSIONS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 printf ("! Emacs*XlwMenu.%s.labelString:\t%s\n", save_out, save_in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 printf ( "Emacs*XlwMenu.%s.labelString:\n", save_out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 static XtResource
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 nameResource[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 { "labelString", "LabelString", XtRString, sizeof(String),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 0, XtRImmediate, 0 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
502 /* This function searches STRING for parameter inserts of the form:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
503 %[padding]1
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
504 padding is either space (' ') or dash ('-') meaning
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
505 padding to the left or right of the inserted parameter.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
506 In essence, all %1 strings are replaced by VALUE in the return value.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
507 The caller is expected to free the return value using XtFree().
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
508 %% means insert one % (like printf).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
509 %1 means insert VALUE.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
510 %-1 means insert VALUE followed by one space. The latter is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
511 not inserted if VALUE is a zero length string.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
512 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 static char*
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
514 parameterize_string (const char *string, const char *value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
516 const char *percent;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 char *result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 unsigned int done = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 unsigned int ntimes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 if (!string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 result = XtMalloc(1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 result[0] = '\0';
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
525 return result;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 if (!value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 value = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
531 for (ntimes = 1, percent = string;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
532 (percent = strchr (percent, '%'));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 ntimes++)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
534 percent++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 result = XtMalloc ((ntimes * strlen(value)) + strlen(string) + 4);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 result[0] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
539 while ((percent = strchr (string, '%')))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 unsigned int left_pad;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 unsigned int right_pad;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
543 const char *p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 if (percent[1] == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 { /* it's a real % */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 strncat (result, string, 1 + percent - string); /* incl % */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 string = &percent[2]; /* after the second '%' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 continue; /* with the while() loop */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 left_pad = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 right_pad = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 for (p = &percent[1]; /* test *p inside the loop */ ; p++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 if (*p == ' ')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 { /* left pad */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 left_pad++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 else if (*p == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 { /* right pad */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 right_pad++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 else if (*p == '1')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 { /* param and terminator */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 strncat (result, string, percent - string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 if (value[0] != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 unsigned int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 for (i = 0; i < left_pad; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 strcat (result, " ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 strcat (result, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 for (i = 0; i < right_pad; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 strcat (result, " ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 string = &p[1]; /* after the '1' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 done++; /* no need to do old way */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 break; /* out of for() loop */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 { /* bogus, copy the format as is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 /* out of for() loop */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 strncat (result, string, 1 + p - string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 string = (*p ? &p[1] : p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 /* Copy the tail of the string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 strcat (result, string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 /* If we have not processed a % string, and we have a value, tail it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 if (!done && value[0] != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 strcat (result, " ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 strcat (result, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
604 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 static XmString
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 resource_widget_value (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 if (!val->toolkit_data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 char *resourced_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 char *converted_name, *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 XmString complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 char massaged_name [1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 if (mw->menu.lookup_labels)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 /* Convert value style name into resource style name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 eg: "Free Willy" becomes "freeWilly" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 massage_resource_name (val->name, massaged_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 /* If we have a value (parameter) see if we can find a "Named"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 resource. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 if (val->value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 char named_name[1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 sprintf (named_name, "%sNamed", massaged_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 XtGetSubresources ((Widget) mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 (XtPointer) &resourced_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 named_name, named_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 nameResource, 1, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 /* If nothing yet, try to load from the massaged name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 if (!resourced_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 XtGetSubresources ((Widget) mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 (XtPointer) &resourced_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 massaged_name, massaged_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 nameResource, 1, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 } /* if (mw->menu.lookup_labels) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 /* Still nothing yet, use the name as the value. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 if (!resourced_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 resourced_name = val->name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 /* Parameterize the string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 converted_name = parameterize_string (resourced_name, val->value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 /* nuke newline characters to prevent menubar screwups */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 for ( str = converted_name ; *str ; str++ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 if (str[0] == '\n') str[0] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 /* Improve OSF's bottom line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 complete_name = XmStringCreateLocalized (converted_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 complete_name = XmStringCreateLtoR (converted_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 XtFree (converted_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 val->toolkit_data = complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 val->free_toolkit_data = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 return (XmString) val->toolkit_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 /* Unused */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 #if 0
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
674 /* These two routines should be a separate file..djw */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 xlw_create_localized_string (Widget w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 char *name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 char **args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 unsigned int nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 char *string = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 char *arg = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 if (nargs > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 arg = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 XtGetSubresources (w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 (XtPointer)&string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 nameResource, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 if (!string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 string = name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 return parameterize_string (string, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 static XmString
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 xlw_create_localized_xmstring (Widget w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 char *name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 char **args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 unsigned int nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 char * string = xlw_create_localized_string (w, name, args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 XmString xm_string = XmStringCreateLtoR (string, XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 XtFree (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 return xm_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 #else /* !Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 static char*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 resource_widget_value (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 if (!val->toolkit_data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 char *resourced_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 char *complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 char massaged_name [1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 if (mw->menu.lookup_labels)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 massage_resource_name (val->name, massaged_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 XtGetSubresources ((Widget) mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 (XtPointer) &resourced_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 massaged_name, massaged_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 nameResource, 1, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 if (!resourced_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 resourced_name = val->name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 complete_name = parameterize_string (resourced_name, val->value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 val->toolkit_data = complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 /* nuke newline characters to prevent menubar screwups */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 for ( ; *complete_name ; complete_name++ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 if (complete_name[0] == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 complete_name[0] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 val->free_toolkit_data = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 return (char *) val->toolkit_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 #endif /* !Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
752 #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
753 ? ((unsigned long) (x)) : ((unsigned long) (y)))
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
754
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
755 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
756 static int
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
757 x_xft_text_width (Display *dpy, XftFont *xft_font, char *run, int len)
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
758 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
759 static XGlyphInfo glyphinfo;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
760
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
761 XftTextExtents8 (dpy,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
762 xft_font,
3374
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
763 (FcChar8 *) run, len, &glyphinfo);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
764 return glyphinfo.xOff;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
765 }
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
766 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
767
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 /* Code for drawing strings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 string_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 int x, int y,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
773 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
774 XftColor *color,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
775 XftColor *colorBg,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
776 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 GC gc,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
778 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
779 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 XmString string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 char *string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
786 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 XmStringDraw (XtDisplay (mw), window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 mw->menu.font_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 string, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 1000, /* ???? width */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 XmALIGNMENT_BEGINNING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 0, /* ???? layout_direction */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 #else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
796 # ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
797 Display *display = XtDisplay (mw);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
798 Visual *visual = DefaultVisualOfScreen (XtScreen (mw));
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
799 Colormap cmap = mw->core.colormap;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
800 XftDraw *xftDraw = XftDrawCreate (display, window, visual, cmap);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
801 XftFont *renderFont = mw->menu.renderFont;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
802 /* draw background rect */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
803 XftDrawRect (xftDraw, colorBg,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
804 x, y,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
805 x_xft_text_width (display, renderFont, string, strlen (string)),
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
806 renderFont->ascent + renderFont->descent); /* XXX */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
807 /* draw text */
3374
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
808 XftDrawString8 (xftDraw, color, renderFont, x, y + mw->menu.font_ascent,
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
809 (FcChar8 *) string, strlen (string));
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
810 XftDrawDestroy (xftDraw);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
811 # else
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
812 # ifdef USE_XFONTSET
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 XmbDrawString (XtDisplay (mw), window, mw->menu.font_set, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 x, y + mw->menu.font_ascent, string, strlen (string));
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
815 # else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 XDrawString (XtDisplay (mw), window, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 x, y + mw->menu.font_ascent, string, strlen (string));
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
818 # endif /* USE_XFONTSET */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
819 # endif /* USE_XFT_MENUBARS */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
820 #endif /* NEED_MOTIF */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 string_draw_range (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 int x, int y,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
828 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
829 XftColor *color,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
830 XftColor *colorBg,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
831 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 GC gc,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
833 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 char *string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 int start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 int end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
839 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 Dimension width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 XmString newstring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 int c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 if (end <= start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 c = string[end];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 string[end] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 newstring = XmStringLtoRCreate (&string[start], XmFONTLIST_DEFAULT_TAG);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 XmStringDraw (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 XtDisplay (mw), window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 mw->menu.font_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 newstring, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 1000, /* ???? width */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 XmALIGNMENT_BEGINNING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 0, /* ???? layout_direction */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 XmStringExtent (mw->menu.font_list, newstring, &width, &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 XmStringFree (newstring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 string[end] = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 return width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 XRectangle ri, rl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 if (end <= start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 XmbDrawString (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 XtDisplay (mw), window, mw->menu.font_set, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 x, y + mw->menu.font_ascent, &string[start], end - start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 XmbTextExtents (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 mw->menu.font_set, &string[start], end - start, &ri, &rl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 return rl.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 # else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
876 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
877 if (end <= start)
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
878 return 0;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
879 else
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
880 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
881 XGlyphInfo glyphinfo;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
882 Display *display = XtDisplay (mw);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
883 Visual *visual = DefaultVisualOfScreen (XtScreen (mw));
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
884 Colormap cmap = mw->core.colormap;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
885 XftFont *renderFont = mw->menu.renderFont;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
886 /* #### should use parent frame's .xftDraw? */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
887 XftDraw *xftDraw = XftDrawCreate (display, window, visual, cmap);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
888 /* draw background rect */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
889 XftDrawRect (xftDraw, colorBg,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
890 x, y,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
891 x_xft_text_width (display,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
892 renderFont, &string[start], end - start),
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
893 renderFont->ascent + renderFont->descent); /* XXX */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
894 /* draw text */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
895 XftDrawString8 (xftDraw, color, renderFont,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
896 x, y + mw->menu.font_ascent,
3374
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
897 (FcChar8 *) &string[start], end - start);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
898
3374
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
899 XftTextExtents8 (display, renderFont, (FcChar8 *) &string[start],
174eb4da74fb [xemacs-hg @ 2006-05-02 15:30:31 by james]
james
parents: 3157
diff changeset
900 end - start, &glyphinfo);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
901
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
902 /* #### should use parent frame's .xftDraw */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
903 XftDrawDestroy (xftDraw);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
904 return glyphinfo.xOff;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
905 }
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
906 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 XCharStruct xcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 int drop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 if (end <= start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 return 0;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
912 XDrawString ( /* XXX */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 XtDisplay (mw), window, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 x, y + mw->menu.font_ascent, &string[start], end - start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 XTextExtents (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 mw->menu.font, &string[start], end - start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 &drop, &drop, &drop, &xcs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 return xcs.width;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
919 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 string_draw_u (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 int x, int y,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
928 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
929 XftColor *color, XftColor *colorBg, GC gc,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
930 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 GC gc,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
932 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
933 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 XmString string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 char *string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 int i, s = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 char *chars;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
943 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 if (!XmStringGetLtoR (string, XmFONTLIST_DEFAULT_TAG, &chars))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 chars = string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 for (i=0; chars[i]; ++i) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 if (chars[i] == '%' && chars[i+1] == '_') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 int w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
954 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
955 x += string_draw_range (mw, window, x, y, color, colorBg, chars, s, i);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
956 w = string_draw_range (mw, window, x, y, color, colorBg, chars, i+2, i+3);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
957 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 x += string_draw_range (mw, window, x, y, gc, chars, s, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 w = string_draw_range (mw, window, x, y, gc, chars, i+2, i+3);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
960 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 /* underline next character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 XDrawLine (XtDisplay (mw), window, gc, x - 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 y + mw->menu.font_ascent + 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 x + w - 1, y + mw->menu.font_ascent + 1 );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 x += w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 s = i + 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 i += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 }
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
971 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
972 x += string_draw_range (mw, window, x, y, color, colorBg, chars, s, i);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
973 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 x += string_draw_range (mw, window, x, y, gc, chars, s, i);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
975 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
976 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 XtFree (chars);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
981 static void /* XXX */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
982 binding_draw (XlwMenuWidget mw, Window w, int x, int y,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
983 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
984 XftColor *color,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
985 XftColor *colorBg,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
986 #else
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
987 GC gc,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
988 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
989 char *value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
991 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 XmString xm_value = XmStringCreateLtoR(value, XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 string_draw (mw, w, x, y, gc, xm_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 XmStringFree (xm_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 #else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
996 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
997 string_draw (mw, w, x, y, color, colorBg, value);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
998 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 string_draw (mw, w, x, y, gc, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 #endif
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1001 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 /* Low level code for drawing 3-D edges. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 shadow_rectangle_draw (Display *dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 GC top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 GC bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 unsigned int thickness)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 XPoint points [4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 if (!thickness)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 points [1].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 points [1].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 points [2].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 points [2].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 points [3].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 points [3].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 points [0].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 points [1].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 points [1].y = y + height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 points [2].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 points [2].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 points [3].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 points [0].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 points [1].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 points [1].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 points [2].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 points [2].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 points [3].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 points [3].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 points [0].y = y + height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 points [1].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 points [1].y = y + height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 points [2].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 points [2].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 points [3].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 typedef enum e_shadow_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 /* these are Motif compliant */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 SHADOW_BACKGROUND,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 SHADOW_OUT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 SHADOW_IN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 SHADOW_ETCHED_OUT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 SHADOW_ETCHED_IN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 SHADOW_ETCHED_OUT_DASH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 SHADOW_ETCHED_IN_DASH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 SHADOW_SINGLE_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 SHADOW_DOUBLE_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 SHADOW_SINGLE_DASHED_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 SHADOW_DOUBLE_DASHED_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 SHADOW_NO_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 /* these are all non-Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 SHADOW_DOUBLE_ETCHED_OUT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 SHADOW_DOUBLE_ETCHED_IN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 SHADOW_DOUBLE_ETCHED_OUT_DASH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 SHADOW_DOUBLE_ETCHED_IN_DASH
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 } shadow_type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 shadow_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 shadow_type type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 XPoint points [4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 Boolean etched = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 switch (type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 case SHADOW_BACKGROUND:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 top_gc = bottom_gc = mw->menu.background_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 case SHADOW_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 etched = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 case SHADOW_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 etched = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 case SHADOW_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 case SHADOW_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 if (etched)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 unsigned int half = thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 shadow_rectangle_draw (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 width - half, height - half,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 thickness - half);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 shadow_rectangle_draw (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 x + half, y + half,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 width - half , height - half,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 half);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 shadow_rectangle_draw (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 width, height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 arrow_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 Boolean raised)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 GC select_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 XPoint points [4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 int half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 int length = (int)((double)width * 0.87);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 int thick_med = (int)((double)thickness * 1.73);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 if (width & 0x1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 half_width = width/2 + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 half_width = width/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 select_gc = mw->menu.background_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 if (raised)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 /* Fill internal area. We do this first so that the borders have a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 nice sharp edge. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 points [0].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 points [0].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 points [1].x = x + length - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 points [2].x = x + length - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 points [2].y = y + half_width + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 points [3].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 XFillPolygon (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 select_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 points,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 4,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 Convex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 /* left border */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 points [1].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 points [1].y = y + thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 points [2].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 points [2].y = y + width - thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 points [3].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 points [3].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 /* top border */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 points [0].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 points [1].x = x + length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 points [2].x = x + length - (thickness + thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 points [3].y = y + width - thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 /* bottom shadow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 points [1].x = x + length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 points [2].x = x + length - (thickness + thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 points [3].y = y + thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 toggle_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 Boolean set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 GC select_gc = mw->menu.select_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 if (set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 type = SHADOW_IN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 type = SHADOW_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 /* Fill internal area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 if (set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 XFillRectangle (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 select_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 x + thickness,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 y + thickness,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 width - (2*thickness),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 width - (2*thickness));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 shadow_draw (mw, window, x, y, width, width, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 radio_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 Boolean enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 GC select_gc = mw->menu.select_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 XPoint points[6];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 int half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 int npoints;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 if (width & 0x1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 width++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 half_width = width/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 if (enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 #if 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 /* Draw the bottom first, just in case the regions overlap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 The top should cast the longer shadow. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 points [0].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 points [0].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 points [1].x = x + half_width; /* bottom corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 points [1].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 points [2].x = x + half_width; /* bottom inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 points [2].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 points [3].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 points [3].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 points [0].x = x + half_width; /* bottom corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 points [0].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 points [1].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 points [2].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 points [3].x = x + half_width; /* bottom inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 points [3].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 points [0].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 points [0].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 points [1].x = x + half_width; /* top corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 points [1].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 points [2].x = x + half_width; /* top inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 points [2].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 points [3].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 points [3].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 points [0].x = x + half_width; /* top corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 points [1].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 points [2].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 points [3].x = x + half_width; /* top inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 points [3].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 /* Draw the bottom first, just in case the regions overlap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 The top should cast the longer shadow. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 npoints = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 points [npoints].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 points [npoints].x = x + half_width; /* bottom corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 points [npoints++].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 points [npoints].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 points [npoints].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 points [npoints].x = x + half_width; /* bottom inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 points [npoints++].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 points [npoints].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 XFillPolygon (dpy, window, bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 points, npoints, Nonconvex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 npoints = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 points [npoints].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 points [npoints].x = x + half_width; /* top corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 points [npoints++].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 points [npoints].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 points [npoints].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 points [npoints].x = x + half_width; /* top inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 points [npoints++].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 points [npoints].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 XFillPolygon (dpy, window, top_gc, points, npoints, Nonconvex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 /* Fill internal area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 if (enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 points [0].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 points [0].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 points [1].x = x + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 points [1].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 points [2].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 points [3].x = x + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 points [3].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 XFillPolygon (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 select_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 points,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 4,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 Convex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 separator_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 unsigned int width,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
1420 Boolean UNUSED (vertical),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 shadow_type type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 unsigned int offset = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 unsigned int num_separators = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 unsigned int top_line_thickness = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 unsigned int bottom_line_thickness = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 Boolean dashed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 switch (type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 case SHADOW_NO_LINE: /* nothing to do */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 case SHADOW_DOUBLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 case SHADOW_SINGLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 top_gc = bottom_gc = mw->menu.foreground_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 top_line_thickness = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 case SHADOW_DOUBLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 case SHADOW_SINGLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 top_gc = bottom_gc = mw->menu.foreground_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 top_line_thickness = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 dashed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 case SHADOW_DOUBLE_ETCHED_OUT_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 case SHADOW_ETCHED_OUT_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 dashed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 case SHADOW_DOUBLE_ETCHED_IN_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 case SHADOW_ETCHED_IN_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 dashed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 case SHADOW_DOUBLE_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 case SHADOW_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 case SHADOW_DOUBLE_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 case SHADOW_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 if (dashed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 XGCValues values;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 values.line_style = LineOnOffDash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 if (top_line_thickness > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 XChangeGC (dpy, top_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 if (bottom_line_thickness > 0 && bottom_gc != top_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 XChangeGC (dpy, bottom_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 while (num_separators--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 unsigned int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 for (i = 0; i < top_line_thickness; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 XDrawLine (dpy, window, top_gc, x, y + i, x + width, y + i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 for (i = 0; i < bottom_line_thickness; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 XDrawLine (dpy, window, bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 x, y + top_line_thickness + offset + i,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 x + width, y + top_line_thickness + offset + i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 y += (top_line_thickness + offset + bottom_line_thickness + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 if (dashed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 XGCValues values;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 values.line_style = LineSolid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 if (top_line_thickness > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 XChangeGC (dpy, top_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 if (bottom_line_thickness > 0 && bottom_gc != top_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 XChangeGC (dpy, bottom_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 #define SLOPPY_TYPES 0 /* 0=off, 1=error check, 2=easy to please */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 #if SLOPPY_TYPES
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 #if SLOPPY_TYPES < 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 static char *wv_types[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 "UNSPECIFIED",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 "BUTTON",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 "TOGGLE",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 "RADIO",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 "TEXT",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 "SEPARATOR",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 "CASCADE",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 "PUSHRIGHT",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 "INCREMENTAL"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 print_widget_value (widget_value *wv, int just_one, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 char d [200];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 for (i = 0; i < depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 d[i] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 d[depth]=0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 if (!wv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 printf ("%s(null widget value pointer)\n", d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 printf ("%stype: %s\n", d, wv_types [wv->type]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 printf ("%sname: %s\n", d, (wv->name ? wv->name : "(null)"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 if (wv->name) printf ("%sname: %s\n", d, wv->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 if (wv->value) printf ("%svalue: %s\n", d, wv->value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 if (wv->key) printf ("%skey: %s\n", d, wv->key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 printf ("%senabled: %d\n", d, wv->enabled);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 if (wv->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 printf ("\n%scontents: \n", d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 print_widget_value (wv->contents, 0, depth + 5);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 if (!just_one && wv->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 printf ("\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 print_widget_value (wv->next, 0, depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 #endif /* SLOPPY_TYPES < 2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 all_dashes_p (char *s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 char *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 if (!s || s[0] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 return False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 for (p = s; *p == '-'; p++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 if (*p == '!' || *p == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 return True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 return False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 #endif /* SLOPPY_TYPES */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 static widget_value_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 menu_item_type (widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 if (val->type != UNSPECIFIED_TYPE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 return val->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 #if SLOPPY_TYPES
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 else if (all_dashes_p (val->name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 return SEPARATOR_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 else if (val->name && val->name[0] == '\0') /* push right */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 return PUSHRIGHT_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 else if (val->contents) /* cascade */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 return CASCADE_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 else if (val->call_data) /* push button */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 return BUTTON_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 return TEXT_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 #else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
1603 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 abort();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 return UNSPECIFIED_TYPE; /* Not reached */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 label_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 widget_value *val,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
1612 Boolean UNUSED (in_menubar),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 unsigned int *bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 *height = (mw->menu.font_ascent + mw->menu.font_descent +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 2 * mw->menu.vertical_margin +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 2 * mw->menu.shadow_thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 /* no left column decoration */
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
1622 *toggle_width = mw->menu.horizontal_margin + mw->menu.shadow_thickness;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 *label_width = string_width_u (mw, resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 *bindings_width = mw->menu.horizontal_margin + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 label_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 int x, int y,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
1635 unsigned int UNUSED (width),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
1636 unsigned int UNUSED (height),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 unsigned int label_offset,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
1638 unsigned int UNUSED (binding_tab))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 int y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 GC gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1643 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1644 XftColor color, colorBg;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1645 Display *display = XtDisplay (mw);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1646 Colormap cmap = mw->core.colormap;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1647 Visual *visual;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1648 int ignored, pixel, pixelBg;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1649
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1650 visual_info_from_widget ((Widget) mw, &visual, &ignored);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1651 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1652
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 if (!label_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 label_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1656 if (highlighted && (in_menubar || val->contents))
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1657 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1658 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1659 pixel = mw->menu.highlight_foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1660 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1661 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1662 gc = mw->menu.highlight_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1663 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 else if (in_menubar || val->contents)
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1665 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1666 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1667 pixel = mw->menu.foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1668 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1669 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1670 gc = mw->menu.foreground_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1671 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1673 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1674 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1675 pixel = mw->menu.title_foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1676 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1677 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1678 gc = mw->menu.title_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1679 }
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1680 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1681 color = xft_convert_color (display, cmap, visual, pixel, 0);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1682 colorBg = xft_convert_color (display, cmap, visual, pixelBg, 0);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1683 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 /* Draw the label string. */
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1686 string_draw_u (mw, /* XXX */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1687 window,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1688 x + label_offset, y + y_offset,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1689 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1690 &color, &colorBg, gc,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1691 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 gc,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1693 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 push_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 unsigned int *bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 /* inherit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 label_button_size (mw, val, in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 toggle_width, label_width, bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 /* key bindings to display? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 if (!in_menubar && val->key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 int w;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1715 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 XmString key = XmStringCreateLtoR (val->key, XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 w = string_width (mw, key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 XmStringFree (key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 char *key = val->key;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 w = string_width (mw, key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 *bindings_width += w + mw->menu.column_spacing;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 push_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 unsigned int label_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 unsigned int binding_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 int y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 GC gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 Boolean menu_pb = in_menubar && (menu_item_type (val) == BUTTON_TYPE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1744 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1745 XftColor color, colorBg;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1746 Display *display = XtDisplay (mw);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1747 Colormap cmap = mw->core.colormap;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1748 Visual *visual;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1749 int ignored, pixel, pixelBg, dim = 0;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1750
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1751 visual_info_from_widget ((Widget) mw, &visual, &ignored);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1752 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1753
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 /* Draw the label string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 if (!label_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 label_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 if (val->enabled)
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1761 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1762 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1763 pixel = mw->menu.highlight_foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1764 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1765 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1766 gc = mw->menu.highlight_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1767 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1769 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1770 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1771 dim = 1;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1772 pixel = mw->menu.foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1773 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1774 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1775 gc = mw->menu.inactive_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1776 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 else if (menu_pb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 if (val->enabled)
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1781 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1782 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1783 pixel = mw->menu.button_foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1784 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1785 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1786 gc = mw->menu.button_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1787 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1789 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1790 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1791 dim = 1;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1792 pixel = mw->menu.button_foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1793 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1794 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1795 gc = mw->menu.inactive_button_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1796 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 if (val->enabled)
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1801 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1802 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1803 pixel = mw->menu.foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1804 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1805 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1806 gc = mw->menu.foreground_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1807 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1809 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1810 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1811 dim = 1;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1812 pixel = mw->menu.foreground;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1813 pixelBg = mw->core.background_pixel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1814 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1815 gc = mw->menu.inactive_gc;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1816 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1819 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1820 color = xft_convert_color (display, cmap, visual, pixel, dim);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1821 colorBg = xft_convert_color (display, cmap, visual, pixelBg, 0);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1822 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1823
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 string_draw_u (mw,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1825 window,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1826 x + label_offset, y + y_offset,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1827 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1828 &color, &colorBg, gc,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1829 #else
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1830 gc,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1831 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 /* Draw the keybindings */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 if (val->key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 if (!binding_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 unsigned int s_width =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 string_width (mw, resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 binding_offset = label_offset + s_width + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 binding_draw (mw, window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 x + binding_offset + mw->menu.column_spacing,
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1845 y + y_offset,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1846 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1847 &color, &colorBg,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1848 #else
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1849 gc,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1850 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
1851 val->key);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 /* Draw the shadow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 if (menu_pb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 type = SHADOW_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 type = (val->selected ? SHADOW_ETCHED_OUT : SHADOW_ETCHED_IN);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 type = SHADOW_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 type = SHADOW_BACKGROUND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 shadow_draw (mw, window, x, y, width, height, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 arrow_decoration_height (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 int result = (mw->menu.font_ascent + mw->menu.font_descent) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 result += 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 if (result > (mw->menu.font_ascent + mw->menu.font_descent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 result = mw->menu.font_ascent + mw->menu.font_descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 cascade_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 unsigned int *arrow_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 /* inherit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 label_button_size (mw, val, in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 toggle_width, label_width, arrow_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 /* we have a pull aside arrow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 if (!in_menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 *arrow_width += arrow_decoration_height (mw) + mw->menu.column_spacing;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 cascade_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 unsigned int label_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 unsigned int binding_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 /* Draw the label string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 label_button_draw (mw, val, in_menubar, highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 window, x, y, width, height, label_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 binding_offset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 /* Draw the pull aside arrow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 if (!in_menubar && val->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 int y_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 unsigned int arrow_height = arrow_decoration_height (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 (mw->menu.font_ascent+mw->menu.font_descent - arrow_height)/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 if (!binding_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 unsigned int s_width =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 string_width (mw, resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 if (!label_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 label_offset = mw->menu.shadow_thickness +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 binding_offset = label_offset + s_width + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 arrow_decoration_draw (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 x + binding_offset + mw->menu.column_spacing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 y + y_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 arrow_height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 highlighted);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 /* Draw the shadow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 type = SHADOW_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 type = SHADOW_BACKGROUND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 shadow_draw (mw, window, x, y, width, height, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 toggle_decoration_height (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 int rv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 if (mw->menu.indicator_size > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 rv = mw->menu.indicator_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 rv = mw->menu.font_ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 if (rv > (mw->menu.font_ascent + mw->menu.font_descent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 rv = mw->menu.font_ascent + mw->menu.font_descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 /* radio button can't be smaller than its border or a filling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 error will occur. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 if (rv < 2 * mw->menu.shadow_thickness)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 rv = 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 return rv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 toggle_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 unsigned int *bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 /* inherit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 push_button_size (mw, val, in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 toggle_width, label_width, bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 /* we have a toggle */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 *toggle_width += toggle_decoration_height (mw) + mw->menu.column_spacing;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 toggle_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 unsigned int label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 unsigned int binding_tab)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 int x_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 int y_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 unsigned int t_height = toggle_decoration_height (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 /* Draw a toggle. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 x_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 y_offset += (mw->menu.font_ascent + mw->menu.font_descent - t_height)/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 toggle_decoration_draw (mw, window, x + x_offset, y + y_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 t_height, val->selected);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 /* Draw the pushbutton parts. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 push_button_draw (mw, val, in_menubar, highlighted, window, x, y, width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 height, label_tab, binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 radio_decoration_height (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 return toggle_decoration_height (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 radio_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 unsigned int label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 unsigned int binding_tab)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 int x_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 int y_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 unsigned int r_height = radio_decoration_height (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 /* Draw a toggle. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 x_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 y_offset += (mw->menu.font_ascent + mw->menu.font_descent - r_height)/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 radio_decoration_draw (mw, window, x + x_offset, y + y_offset, r_height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 val->selected);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 /* Draw the pushbutton parts. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 push_button_draw (mw, val, in_menubar, highlighted, window, x, y, width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 height, label_tab, binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 static struct _shadow_names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
2066 const char * name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 } shadow_names[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 /* Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 { "singleLine", SHADOW_SINGLE_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 { "doubleLine", SHADOW_DOUBLE_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 { "singleDashedLine", SHADOW_SINGLE_DASHED_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 { "doubleDashedLine", SHADOW_DOUBLE_DASHED_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 { "noLine", SHADOW_NO_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 { "shadowEtchedIn", SHADOW_ETCHED_IN },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 { "shadowEtchedOut", SHADOW_ETCHED_OUT },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 { "shadowEtchedInDash", SHADOW_ETCHED_IN_DASH },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 { "shadowEtchedOutDash", SHADOW_ETCHED_OUT_DASH },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 /* non-Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 { "shadowDoubleEtchedIn", SHADOW_DOUBLE_ETCHED_IN },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 { "shadowDoubleEtchedOut", SHADOW_DOUBLE_ETCHED_OUT },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 { "shadowDoubleEtchedInDash", SHADOW_DOUBLE_ETCHED_IN_DASH },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 { "shadowDoubleEtchedOutDash", SHADOW_DOUBLE_ETCHED_OUT_DASH }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 static shadow_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 separator_type (char *name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 if (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 for (i = 0; i < (int) (XtNumber (shadow_names)); i++ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 if (strcmp (name, shadow_names[i].name) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 return shadow_names[i].type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 return SHADOW_BACKGROUND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 separator_decoration_height (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 switch (separator_type (val->value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 case SHADOW_NO_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 case SHADOW_SINGLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 case SHADOW_SINGLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 case SHADOW_DOUBLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 case SHADOW_DOUBLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 return 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 case SHADOW_DOUBLE_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 case SHADOW_DOUBLE_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 case SHADOW_DOUBLE_ETCHED_OUT_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 case SHADOW_DOUBLE_ETCHED_IN_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 return (1 + 2 * mw->menu.shadow_thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 case SHADOW_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 case SHADOW_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 return mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 separator_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 widget_value *val,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
2130 Boolean UNUSED (in_menubar),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 unsigned int *rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 *height = separator_decoration_height (mw, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 *label_width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 *toggle_width = *rest_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 separator_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 Boolean in_menubar,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
2145 Boolean UNUSED (highlighted),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 unsigned int height,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
2150 unsigned int UNUSED (label_tab),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
2151 unsigned int UNUSED (binding_tab))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 unsigned int sep_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 if (in_menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 sep_width = height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 sep_width = width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 separator_decoration_draw (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 x,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 sep_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 separator_type(val->value));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
2170 pushright_size (XlwMenuWidget UNUSED (mw),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
2171 widget_value *UNUSED (val),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
2172 Boolean UNUSED (in_menubar),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 unsigned int *rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 *height = *label_width = *toggle_width = *rest_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 size_menu_item (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 int horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 unsigned int *rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 void (*function_ptr) (XlwMenuWidget _mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 widget_value *_val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 Boolean _in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 unsigned int *_toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 unsigned int *_label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 unsigned int *_rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 unsigned int *_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 switch (menu_item_type (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 case TOGGLE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 case RADIO_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 function_ptr = toggle_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 case SEPARATOR_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 function_ptr = separator_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 case INCREMENTAL_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 case CASCADE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 function_ptr = cascade_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 case BUTTON_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 function_ptr = push_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 case PUSHRIGHT_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 function_ptr = pushright_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 case TEXT_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 function_ptr = label_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 (*function_ptr) (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 display_menu_item (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 window_state *ws,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 XPoint *where,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 Boolean horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 Boolean just_compute)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 int x = where->x /* + mw->menu.shadow_thickness */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 int y = where->y /* + mw->menu.shadow_thickness */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 unsigned int toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 unsigned int label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 unsigned int binding_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 unsigned int width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 unsigned int height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 unsigned int label_tab;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 unsigned int binding_tab;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 void (*function_ptr) (XlwMenuWidget _mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 widget_value *_val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 Boolean _in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 Boolean _highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 Window _window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 int _x, int _y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 unsigned int _width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 unsigned int _height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 unsigned int _label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 unsigned int _binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 size_menu_item (mw, val, horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 &toggle_width, &label_width, &binding_width, &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 if (horizontal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 width = toggle_width + label_width + binding_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 height = ws->height - 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 width = ws->width - 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 toggle_width = ws->toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 label_width = ws->label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 where->x += width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 where->y += height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 if (just_compute)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 label_tab = toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 binding_tab = toggle_width + label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 switch (menu_item_type (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 case TOGGLE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 function_ptr = toggle_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 case RADIO_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 function_ptr = radio_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 case SEPARATOR_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 function_ptr = separator_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297 case INCREMENTAL_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298 case CASCADE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 function_ptr = cascade_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 case BUTTON_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 function_ptr = push_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 case TEXT_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 function_ptr = label_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 default: /* do no drawing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 (*function_ptr) (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 ws->window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 width, height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 size_menu (XlwMenuWidget mw, int level)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 unsigned int toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 unsigned int label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 unsigned int rest_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 unsigned int height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 unsigned int max_toggle_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 unsigned int max_label_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 unsigned int max_rest_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 unsigned int max_height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 int horizontal_p = mw->menu.horizontal && (level == 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334 widget_value* val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 window_state* ws;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 if (level >= mw->menu.old_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 ws = &mw->menu.windows [level];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 for (val = mw->menu.old_stack [level]->contents; val; val = val->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 size_menu_item (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 horizontal_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 &toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 &label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 &rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 max_label_width += toggle_width + label_width + rest_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 if (height > max_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 max_height = height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 if (max_toggle_width < toggle_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 max_toggle_width = toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 if (max_label_width < label_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 max_label_width = label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 if (max_rest_width < rest_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 max_rest_width = rest_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 max_height += height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 ws->height = max_height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 ws->width = max_label_width + max_rest_width + max_toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 ws->toggle_width = max_toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 ws->label_width = max_label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 ws->width += 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 ws->height += 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 display_menu (XlwMenuWidget mw, int level, Boolean just_compute_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 XPoint *highlighted_pos, XPoint *hit, widget_value **hit_return,
1201
c2569faae8ed [xemacs-hg @ 2003-01-12 10:45:53 by michaels]
michaels
parents: 647
diff changeset
2381 widget_value *this_, widget_value *that)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 widget_value *val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 widget_value *following_item;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 window_state *ws;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 XPoint where;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 int horizontal_p = mw->menu.horizontal && (level == 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 int highlighted_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 int just_compute_this_one_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 if (level >= mw->menu.old_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 if (level < mw->menu.old_depth - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 following_item = mw->menu.old_stack [level + 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 if (lw_menu_accelerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 && level == mw->menu.old_depth - 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 && mw->menu.old_stack [level]->type == CASCADE_TYPE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 just_compute_p = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 following_item = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 #if SLOPPY_TYPES == 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 puts("===================================================================");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 print_widget_value (following_item, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 if (hit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 *hit_return = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 where.x = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 where.y = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 ws = &mw->menu.windows [level];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 for (val = mw->menu.old_stack [level]->contents; val; val = val->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 XPoint start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 highlighted_p = (val == following_item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 /* If this is the partition (the dummy item which says that menus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 after this should be flushright) then figure out how big the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 following items are. This means we walk down the tail of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 list twice, but that's no big deal - it's short.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 if (horizontal_p && (menu_item_type (val) == PUSHRIGHT_TYPE))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 widget_value *rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 XPoint flushright_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 int new_x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 flushright_size.x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 flushright_size.y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 for (rest = val; rest; rest = rest->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 display_menu_item (mw, rest, ws, &flushright_size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 highlighted_p, horizontal_p, True);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 new_x = ws->width - (flushright_size.x + mw->menu.shadow_thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 if (new_x > where.x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 where.x = new_x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 /* We know what we need; don't draw this item. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 if (highlighted_p && highlighted_pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 highlighted_pos->x = where.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 highlighted_pos->y = where.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 just_compute_this_one_p =
1201
c2569faae8ed [xemacs-hg @ 2003-01-12 10:45:53 by michaels]
michaels
parents: 647
diff changeset
2453 just_compute_p || ((this_ || that) && val != this_ && val != that);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 start.x = where.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 start.y = where.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 display_menu_item (mw, val, ws, &where, highlighted_p, horizontal_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 just_compute_this_one_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 if (highlighted_p && highlighted_pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 highlighted_pos->y = ws->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 highlighted_pos->x = ws->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 if (hit && !*hit_return)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 if (horizontal_p && hit->x > start.x && hit->x <= where.x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 *hit_return = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 else if (!horizontal_p && hit->y > start.y && hit->y <= where.y)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 *hit_return = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 where.y = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 where.x = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 /* Draw slab edges around menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 if (!just_compute_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 shadow_draw(mw, ws->window, 0, 0, ws->width, ws->height, SHADOW_OUT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 /* Motion code */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 set_new_state (XlwMenuWidget mw, widget_value *val, int level)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 mw->menu.new_depth = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 for (i = 0; i < level; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 push_new_stack (mw, mw->menu.old_stack [i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 if (val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 push_new_stack (mw, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 make_windows_if_needed (XlwMenuWidget mw, int n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 int start_at;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 XSetWindowAttributes xswa;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 Widget p;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
2507 unsigned long mask;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 int depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 Visual *visual;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 window_state *windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 Window root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 if (mw->menu.windows_length >= n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 root = RootWindowOfScreen (XtScreen(mw));
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2517 /* use visual_info_from_widget() from lwlib-colors.c */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 /* grab the visual and depth from the nearest shell ancestor */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 visual = CopyFromParent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 depth = CopyFromParent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 p = XtParent(mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 while (visual == CopyFromParent && p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 if (XtIsShell(p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 visual = ((ShellWidget)p)->shell.visual;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 depth = p->core.depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 p = XtParent(p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 xswa.save_under = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 xswa.override_redirect = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 xswa.background_pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 xswa.border_pixel = mw->core.border_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 xswa.event_mask = (ExposureMask | ButtonMotionMask
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 | ButtonReleaseMask | ButtonPressMask);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 xswa.cursor = mw->menu.cursor_shape;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 xswa.colormap = mw->core.colormap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 mask = CWSaveUnder | CWOverrideRedirect | CWBackPixel | CWBorderPixel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 | CWEventMask | CWCursor | CWColormap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 if (mw->menu.use_backing_store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 xswa.backing_store = Always;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 mask |= CWBackingStore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 if (!mw->menu.windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 mw->menu.windows =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 (window_state *) XtMalloc (n * sizeof (window_state));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 start_at = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557 mw->menu.windows =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558 (window_state *) XtRealloc ((char *) mw->menu.windows,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 n * sizeof (window_state));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 start_at = mw->menu.windows_length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 mw->menu.windows_length = n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 windows = mw->menu.windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 for (i = start_at; i < n; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 windows [i].x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 windows [i].y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570 windows [i].width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 windows [i].height = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 windows [i].window =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 XCreateWindow (XtDisplay (mw),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 root,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 0, 0, 1, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 0, depth, CopyFromParent, visual, mask, &xswa);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 /* Make the window fit in the screen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 fit_to_screen (XlwMenuWidget mw, window_state *ws, window_state *previous_ws,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 Boolean horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 int screen_width = WidthOfScreen (XtScreen (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 int screen_height = HeightOfScreen (XtScreen (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 if (ws->x < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 ws->x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 else if ((int) (ws->x + ws->width) > screen_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 if (!horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 ws->x = previous_ws->x - ws->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 ws->x = screen_width - ws->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 /* This check is to make sure we cut off the right side
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 instead of the left side if the menu is wider than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 screen. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 if (ws->x < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 ws->x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 if (ws->y < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 ws->y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 else if ((int) (ws->y + ws->height) > screen_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 /* A pulldown must either be entirely above or below the menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 If we're here, the pulldown doesn't fit below the menubar, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 let's determine if it will fit above the menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 Only put it above if there is more room above than below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 Note shadow_thickness offset to allow for slab surround.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 if (ws->y > (screen_height / 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 ws->y = previous_ws->y - ws->height + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 ws->y = screen_height - ws->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 /* if it's taller than the screen, display the topmost part
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624 that will fit, beginning at the top of the screen. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 if (ws->y < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 ws->y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 /* Updates old_stack from new_stack and redisplays. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 remap_menubar (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 int last_same;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 XPoint selection_position;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 int old_depth = mw->menu.old_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 int new_depth = mw->menu.new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 widget_value **old_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 widget_value **new_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 window_state *windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 widget_value *old_selection;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 widget_value *new_selection;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 /* Check that enough windows and old_stack are ready. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 make_windows_if_needed (mw, new_depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 make_old_stack_space (mw, new_depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 windows = mw->menu.windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 old_stack = mw->menu.old_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 new_stack = mw->menu.new_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 /* compute the last identical different entry */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 for (i = 1; i < old_depth && i < new_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 if (old_stack [i] != new_stack [i])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 last_same = i - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 if (lw_menu_accelerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 && last_same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 && last_same == old_depth - 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 && old_stack [last_same]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 last_same--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 /* Memorize the previously selected item to be able to refresh it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 old_selection = last_same + 1 < old_depth ? old_stack [last_same + 1] : NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 new_selection = last_same + 1 < new_depth ? new_stack [last_same + 1] : NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 /* updates old_state from new_state. It has to be done now because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 display_menu (called below) uses the old_stack to know what to display. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 for (i = last_same + 1; i < new_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 old_stack [i] = new_stack [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 mw->menu.old_depth = new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
2676 /* refresh the last selection */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 selection_position.x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 selection_position.y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 display_menu (mw, last_same, new_selection == old_selection,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 &selection_position, NULL, NULL, old_selection, new_selection);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 /* Now popup the new menus */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 for (i = last_same + 1; i < new_depth && new_stack [i]->contents; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 window_state *previous_ws = &windows [i - 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 window_state *ws = &windows [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 if (lw_menu_accelerate && i == new_depth - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 ws->x = previous_ws->x + selection_position.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 ws->y = previous_ws->y + selection_position.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 /* take into account the slab around the new menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 ws->y -= mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 widget_value *val = mw->menu.old_stack [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 if (val->contents->type == INCREMENTAL_TYPE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 /* okay, we're now doing a lisp callback to incrementally generate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 more of the menu. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 XtCallCallbackList ((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704 mw->menu.open,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 (XtPointer)val->contents);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 size_menu (mw, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711 fit_to_screen (mw, ws, previous_ws, mw->menu.horizontal && i == 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 XClearWindow (XtDisplay (mw), ws->window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 XMoveResizeWindow (XtDisplay (mw), ws->window, ws->x, ws->y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 ws->width, ws->height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 XMapRaised (XtDisplay (mw), ws->window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 display_menu (mw, i, False, &selection_position, NULL, NULL, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 /* unmap the menus that popped down */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 last_same = new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 if (lw_menu_accelerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 && last_same > 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 && new_stack [last_same - 1]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 last_same--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 for (i = last_same - 1; i < old_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 if (i >= last_same || !new_stack [i]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 XUnmapWindow (XtDisplay (mw), windows [i].window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 motion_event_is_in_menu (XlwMenuWidget mw, XMotionEvent *ev, int level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735 XPoint *relative_pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 window_state *ws = &mw->menu.windows [level];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 int x = level == 0 ? ws->x : ws->x + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 int y = level == 0 ? ws->y : ws->y + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 relative_pos->x = ev->x_root - x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 relative_pos->y = ev->y_root - y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 return (x < ev->x_root && ev->x_root < (int) (x + ws->width) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 y < ev->y_root && ev->y_root < (int) (y + ws->height));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 map_event_to_widget_value (XlwMenuWidget mw, XMotionEvent *ev,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 widget_value **val_ptr, int *level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 Boolean *inside_menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 XPoint relative_pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 window_state* ws;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 *val_ptr = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 *inside_menu = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 /* Find the window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 #if 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 for (i = mw->menu.old_depth - 1; i >= 0; i--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 for (i = 0; i <= mw->menu.old_depth - 1; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 ws = &mw->menu.windows [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 if (ws && motion_event_is_in_menu (mw, ev, i, &relative_pos))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 *inside_menu = True; /* special logic for menubar below... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769 if ((ev->type == ButtonPress) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 (ev->state != 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 display_menu (mw, i, True, NULL, &relative_pos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 val_ptr, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 if (*val_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 *level = i + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 *inside_menu = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 return True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 else if (mw->menu.horizontal || i == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 /* if we're clicking on empty part of the menubar, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 unpost the stay-up menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 *inside_menu = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 return False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 /* Procedures */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 make_drawing_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 XGCValues xgcv;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2797 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2798 unsigned long flags = (GCForeground | GCBackground);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2799 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800 unsigned long flags = (GCFont | GCForeground | GCBackground);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2801 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2802
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2803 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 xgcv.font = default_font_of_font_list (mw->menu.font_list)->fid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 #else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2806 #ifndef USE_XFT_MENUBARS
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 xgcv.font = mw->menu.font->fid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 #endif
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2809 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 xgcv.foreground = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 xgcv.background = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 mw->menu.background_gc = XtGetGC ((Widget) mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 xgcv.foreground = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 mw->menu.foreground_gc = XtGetGC ((Widget) mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 if (mw->menu.select_color != (Pixel)-1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 xgcv.foreground = mw->menu.select_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 Display *dpy = XtDisplay(mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 if (CellsOfScreen(DefaultScreenOfDisplay(dpy)) <= 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 { /* mono */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 xgcv.foreground = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 { /* color */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 XColor xcolor;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2833 Visual *visual;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2834 int ignore;
3157
44a63e4a23cd [xemacs-hg @ 2005-12-22 13:58:15 by stephent]
stephent
parents: 3094
diff changeset
2835 Colormap cmap;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2836 visual_info_from_widget ((Widget) mw, &visual, &ignore);
3157
44a63e4a23cd [xemacs-hg @ 2005-12-22 13:58:15 by stephent]
stephent
parents: 3094
diff changeset
2837 cmap = mw->core.colormap;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 xcolor.pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 XQueryColor (dpy, cmap, &xcolor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 xcolor.red = (xcolor.red * 17) / 20;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 xcolor.green = (xcolor.green * 17) / 20;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 xcolor.blue = (xcolor.blue * 17) / 20;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2843 if (x_allocate_nearest_color (dpy, cmap, visual, &xcolor))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 xgcv.foreground = xcolor.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 xgcv.background = mw->core.background_pixel;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2848 mw->menu.select_gc = XtGetGC ((Widget) mw, flags, &xgcv);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 xgcv.foreground = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 xgcv.fill_style = FillStippled;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 xgcv.stipple = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 mw->menu.inactive_gc = XtGetGC ((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 (flags | GCFillStyle | GCStipple),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 xgcv.foreground = mw->menu.highlight_foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 mw->menu.highlight_gc = XtGetGC ((Widget)mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862 xgcv.foreground = mw->menu.title_foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 mw->menu.title_gc = XtGetGC ((Widget)mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 xgcv.foreground = mw->menu.button_foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 mw->menu.button_gc = XtGetGC ((Widget)mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 xgcv.fill_style = FillStippled;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 xgcv.stipple = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 mw->menu.inactive_button_gc = XtGetGC ((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 (flags | GCFillStyle | GCStipple),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 release_drawing_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2880
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 XtReleaseGC ((Widget) mw, mw->menu.foreground_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882 XtReleaseGC ((Widget) mw, mw->menu.button_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 XtReleaseGC ((Widget) mw, mw->menu.highlight_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 XtReleaseGC ((Widget) mw, mw->menu.title_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 XtReleaseGC ((Widget) mw, mw->menu.inactive_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 XtReleaseGC ((Widget) mw, mw->menu.background_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 XtReleaseGC ((Widget) mw, mw->menu.select_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 /* let's get some segvs if we try to use these... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 mw->menu.foreground_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 mw->menu.button_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 mw->menu.highlight_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 mw->menu.title_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 mw->menu.inactive_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 mw->menu.inactive_button_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 mw->menu.background_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 mw->menu.select_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 make_shadow_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 XGCValues xgcv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 unsigned long pm = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 Display *dpy = XtDisplay ((Widget) mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 Colormap cmap = mw->core.colormap;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2907 Visual *visual;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2908 int ignored;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 XColor topc, botc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 int top_frobbed = 0, bottom_frobbed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2912 visual_info_from_widget ((Widget) mw, &visual, &ignored);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2913 /* #### Apparently this is called before any shell has a visual?
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2914 or maybe the widget doesn't have a parent yet? */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2915 if (visual == CopyFromParent)
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2916 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2917 Screen *screen = DefaultScreenOfDisplay (dpy);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2918 visual = DefaultVisualOfScreen (screen);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2919 }
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2920
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 if (mw->menu.top_shadow_color == (Pixel) (-1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 mw->menu.top_shadow_color = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 if (mw->menu.bottom_shadow_color == (Pixel) (-1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 mw->menu.bottom_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 if (mw->menu.top_shadow_color == mw->core.background_pixel ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 mw->menu.top_shadow_color == mw->menu.foreground)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 topc.pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 XQueryColor (dpy, cmap, &topc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 /* don't overflow/wrap! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 topc.red = MINL (65535, topc.red * 1.2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 topc.green = MINL (65535, topc.green * 1.2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 topc.blue = MINL (65535, topc.blue * 1.2);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2935 if (x_allocate_nearest_color (dpy, cmap, visual, &topc))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 if (topc.pixel == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 XFreeColors( dpy, cmap, &topc.pixel, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 topc.red = MINL (65535, topc.red + 0x8000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 topc.green = MINL (65535, topc.green + 0x8000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 topc.blue = MINL (65535, topc.blue + 0x8000);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2943 if (x_allocate_nearest_color (dpy, cmap, visual, &topc))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 mw->menu.top_shadow_color = topc.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 mw->menu.top_shadow_color = topc.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 top_frobbed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 if (mw->menu.bottom_shadow_color == mw->menu.foreground ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 mw->menu.bottom_shadow_color == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 botc.pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 XQueryColor (dpy, cmap, &botc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 botc.red = (botc.red * 3) / 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 botc.green = (botc.green * 3) / 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 botc.blue = (botc.blue * 3) / 5;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2964 if (x_allocate_nearest_color (dpy, cmap, visual, &botc))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 if (botc.pixel == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 XFreeColors (dpy, cmap, &botc.pixel, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 botc.red = MINL (65535, botc.red + 0x4000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 botc.green = MINL (65535, botc.green + 0x4000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 botc.blue = MINL (65535, botc.blue + 0x4000);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
2972 if (x_allocate_nearest_color (dpy, cmap, visual, &botc))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 mw->menu.bottom_shadow_color = botc.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 mw->menu.bottom_shadow_color = botc.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 bottom_frobbed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 if (top_frobbed && bottom_frobbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 int top_avg = ((topc.red / 3) + (topc.green / 3) + (topc.blue / 3));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 int bot_avg = ((botc.red / 3) + (botc.green / 3) + (botc.blue / 3));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 if (bot_avg > top_avg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 Pixel tmp = mw->menu.top_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 mw->menu.top_shadow_color = mw->menu.bottom_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 mw->menu.bottom_shadow_color = tmp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 else if (topc.pixel == botc.pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 if (botc.pixel == mw->menu.foreground)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 mw->menu.top_shadow_color = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 mw->menu.bottom_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 if (!mw->menu.top_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 mw->menu.top_shadow_color == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 mw->menu.top_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 if (!mw->menu.bottom_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 mw->menu.bottom_shadow_color == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 mw->menu.bottom_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 xgcv.fill_style = FillOpaqueStippled;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 xgcv.foreground = mw->menu.top_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 /* xgcv.stipple = mw->menu.top_shadow_pixmap; gtb */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 if (mw->menu.top_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 mw->menu.top_shadow_pixmap != XmUNSPECIFIED_PIXMAP)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 xgcv.stipple = mw->menu.top_shadow_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 xgcv.stipple = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 mw->menu.shadow_top_gc =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 XtGetGC((Widget)mw, GCForeground|GCBackground|pm, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 xgcv.foreground = mw->menu.bottom_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 /* xgcv.stipple = mw->menu.bottom_shadow_pixmap; gtb */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 if (mw->menu.bottom_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 mw->menu.bottom_shadow_pixmap != XmUNSPECIFIED_PIXMAP)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 xgcv.stipple = mw->menu.bottom_shadow_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 xgcv.stipple = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 mw->menu.shadow_bottom_gc =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 XtGetGC ((Widget)mw, GCForeground|GCBackground|pm, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 release_shadow_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 extract_font_extents (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 {
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3055 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056 /* Find the maximal ascent/descent of the fonts in the font list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 so that all menu items can be the same height... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 mw->menu.font_ascent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 mw->menu.font_descent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 XmFontContext context;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064 XmFontListEntry fontentry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 XmStringCharSet charset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068 XFontStruct *font;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070 if (! XmFontListInitFontContext (&context, mw->menu.font_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 /* There is a BUG in the 1.2 version of XmFontListGetNextFont() (or more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 specifically, in _XmGetFirstFont()) that can cause a null pointer to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 passed to XFontsOfFontSet. Use XmFontListNextEntry(), which is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076 newer equivalent, instead. Also, it supports font sets, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 older function doesn't. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 while ((fontentry = XmFontListNextEntry (context)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 XmFontType rettype;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 XtPointer one_of_them = XmFontListEntryGetFont (fontentry, &rettype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 if (rettype == XmFONT_IS_FONTSET)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 XFontSet fontset = (XFontSet) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 XFontStruct **fontstruct_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 char **fontname_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 int fontcount = XFontsOfFontSet (fontset, &fontstruct_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 &fontname_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 while (--fontcount >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 font = fontstruct_list[fontcount];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 mw->menu.font_descent = font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 else /* XmFONT_IS_FONT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 font = (XFontStruct *) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 mw->menu.font_descent = font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 #else /* motif 1.1 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 while (XmFontListGetNextFont (context, &charset, &font))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 mw->menu.font_descent = font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 XtFree (charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 #endif /* Motif version */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 XmFontListFreeFontContext (context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 #else /* Not Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 XFontStruct **fontstruct_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 char **fontname_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 XFontStruct *font;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 int fontcount = XFontsOfFontSet(mw->menu.font_set, &fontstruct_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 &fontname_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127 mw->menu.font_ascent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 mw->menu.font_descent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 # if 0 /* nasty, personal debug, Kazz */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 fprintf(stderr, "fontSet count is %d\n", fontcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 while (--fontcount >= 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 font = fontstruct_list[fontcount];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 mw->menu.font_descent = font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3139 # else /* ! USE_XFONTSET */
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3140 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3141 mw->menu.font_ascent = mw->menu.renderFont->ascent;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3142 mw->menu.font_descent = mw->menu.renderFont->descent;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3143 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 mw->menu.font_ascent = mw->menu.font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 mw->menu.font_descent = mw->menu.font->descent;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3146 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 #endif /* NEED_MOTIF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3151 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 static XFontStruct *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 default_font_of_font_list (XmFontList font_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 XFontStruct *font = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 # if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 /* Xm/Label.c does this: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 _XmFontListGetDefaultFont (font_list, &font);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 # else /* !0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 XmFontContext context;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 XmFontListEntry fontentry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 XmFontType rettype;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 XtPointer one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 XmStringCharSet charset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 if (! XmFontListInitFontContext (&context, font_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 /* There is a BUG in the 1.2 version of XmFontListGetNextFont() (or more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 specifically, in _XmGetFirstFont()) that can cause a null pointer to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 passed to XFontsOfFontSet. Use XmFontListNextEntry(), which is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 newer equivalent, instead. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 fontentry = XmFontListNextEntry (context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 one_of_them = XmFontListEntryGetFont (fontentry, &rettype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179 if (rettype == XmFONT_IS_FONTSET)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 XFontSet fontset = (XFontSet) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 XFontStruct **fontstruct_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 char **fontname_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 (void) XFontsOfFontSet (fontset, &fontstruct_list, &fontname_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 font = fontstruct_list[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 else /* XmFONT_IS_FONT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 font = (XFontStruct *) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 if (! XmFontListGetNextFont (context, &charset, &font))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 XtFree (charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 XmFontListFreeFontContext (context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198 # endif /* !0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200 if (! font) abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201 return font;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 #endif /* NEED_MOTIF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3206 XlwMenuInitialize (Widget UNUSED (request), Widget new_, ArgList UNUSED (args),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3207 Cardinal *UNUSED (num_args))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 /* Get the GCs and the widget size */
1201
c2569faae8ed [xemacs-hg @ 2003-01-12 10:45:53 by michaels]
michaels
parents: 647
diff changeset
3210 XlwMenuWidget mw = (XlwMenuWidget)new_;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 Window window = RootWindowOfScreen (DefaultScreenOfDisplay (XtDisplay (mw)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212 Display *display = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 /* mw->menu.cursor = XCreateFontCursor (display, mw->menu.cursor_shape); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 mw->menu.cursor = mw->menu.cursor_shape;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 mw->menu.gray_pixmap =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 XCreatePixmapFromBitmapData (display, window, (char *) gray_bits,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 gray_width, gray_height, 1, 0, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3221 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
3222 /* #### Even if it's a kludge!!!, we should consider doing the same for
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
3223 X Font Sets. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 /* The menu.font_list slot came from the *fontList resource (Motif standard.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225 The menu.font_list_2 slot came from the *font resource, for backward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 compatibility with older versions of this code, and consistency with the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
3227 rest of emacs. If both font and fontList are specified, we use fontList.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228 If only one is specified, we use that. If neither are specified, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 use the "fallback" value. What a kludge!!!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 Note that this has the bug that a more general wildcard like "*fontList:"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 will override a more specific resource like "Emacs*menubar.font:". But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 I can't think of a way around that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 if (mw->menu.font_list) /* if *fontList is specified, use that */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 else if (mw->menu.font_list_2) /* else if *font is specified, use that */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 mw->menu.font_list = mw->menu.font_list_2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 else /* otherwise use default */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 mw->menu.font_list = mw->menu.fallback_font_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3243 #ifdef USE_XFT_MENUBARS
3685
382b11fa8866 [xemacs-hg @ 2006-11-17 02:50:22 by stephent]
stephent
parents: 3462
diff changeset
3244 /* #### kludge for name change */
382b11fa8866 [xemacs-hg @ 2006-11-17 02:50:22 by stephent]
stephent
parents: 3462
diff changeset
3245 if (!mw->menu.fcFontName)
382b11fa8866 [xemacs-hg @ 2006-11-17 02:50:22 by stephent]
stephent
parents: 3462
diff changeset
3246 mw->menu.fcFontName = mw->menu.xftFontName;
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3247 /* to do this right, we should add a new Xt Resource type +
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3248 conversion function
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3249 */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3250 mw->menu.renderFont =
3397
6aa26bef0527 [xemacs-hg @ 2006-05-12 19:25:28 by stephent]
stephent
parents: 3374
diff changeset
3251 xft_open_font_by_name (XtDisplay (mw), mw->menu.fcFontName);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3252 #endif
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3253
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 make_drawing_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 make_shadow_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 extract_font_extents (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 mw->menu.popped_up = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 mw->menu.next_release_must_exit = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262 mw->menu.old_depth = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 mw->menu.old_stack = XtNew (widget_value*);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 mw->menu.old_stack_length = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 mw->menu.old_stack [0] = mw->menu.contents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 mw->menu.new_depth = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 mw->menu.new_stack = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 mw->menu.new_stack_length = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 push_new_stack (mw, mw->menu.contents);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 mw->menu.windows = XtNew (window_state);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273 mw->menu.windows_length = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 mw->menu.windows [0].x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 mw->menu.windows [0].y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 mw->menu.windows [0].width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 mw->menu.windows [0].height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278 size_menu (mw, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 mw->core.width = mw->menu.windows [0].width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 mw->core.height = mw->menu.windows [0].height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 XlwMenuClassInitialize (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 initialize_massaged_resource_char();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 XSetWindowAttributes xswa;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
3295 unsigned long mask;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 (*xlwMenuWidgetClass->core_class.superclass->core_class.realize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 (w, valueMask, attributes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 xswa.save_under = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 xswa.cursor = mw->menu.cursor_shape;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302 mask = CWSaveUnder | CWCursor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 if (mw->menu.use_backing_store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 xswa.backing_store = Always;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 mask |= CWBackingStore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308 XChangeWindowAttributes (XtDisplay (w), XtWindow (w), mask, &xswa);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 mw->menu.windows [0].window = XtWindow (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311 mw->menu.windows [0].x = w->core.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 mw->menu.windows [0].y = w->core.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 mw->menu.windows [0].width = w->core.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314 mw->menu.windows [0].height = w->core.height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 /* Only the toplevel menubar/popup is a widget so it's the only one that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 receives expose events through Xt. So we repaint all the other panes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 when receiving an Expose event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3321 XlwMenuRedisplay (Widget w, XEvent *UNUSED (ev), Region UNUSED (region))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 if (mw->core.being_destroyed) return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328 for (i = 0; i < mw->menu.old_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 display_menu (mw, i, False, NULL, NULL, NULL, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 set_new_state (mw, NULL, mw->menu.old_depth); /* #### - ??? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 remap_menubar (mw); /* #### - do these two lines do anything? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 XlwMenuDestroy (Widget w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 XlwMenuWidget mw = (XlwMenuWidget) w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 if (mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 XtUngrabPointer (w, CurrentTime);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3346 release_drawing_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347 release_shadow_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3349 /* this doesn't come from the resource db but is created explicitly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3350 so we must free it ourselves. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 XFreePixmap (XtDisplay (mw), mw->menu.gray_pixmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352 mw->menu.gray_pixmap = (Pixmap) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 /* Don't free mw->menu.contents because that comes from our creator.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 The `*_stack' elements are just pointers into `contents' so leave
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 that alone too. But free the stacks themselves. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357 if (mw->menu.old_stack) XtFree ((char *) mw->menu.old_stack);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 if (mw->menu.new_stack) XtFree ((char *) mw->menu.new_stack);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 /* Remember, you can't free anything that came from the resource
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 database. This includes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 mw->menu.cursor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 mw->menu.top_shadow_pixmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 mw->menu.bottom_shadow_pixmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365 mw->menu.font
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366 mw->menu.font_set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 Also the color cells of top_shadow_color, bottom_shadow_color,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 foreground, and button_foreground will never be freed until this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 client exits. Nice, eh?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 /* start from 1 because the one in slot 0 is w->core.window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 for (i = 1; i < mw->menu.windows_length; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 XDestroyWindow (XtDisplay (mw), mw->menu.windows [i].window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 if (mw->menu.windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 XtFree ((char *) mw->menu.windows);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 static Boolean
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3380 XlwMenuSetValues (Widget current, Widget UNUSED (request), Widget new_,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3381 ArgList UNUSED (args), Cardinal *UNUSED (num_args))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3383 XlwMenuWidget oldmw = (XlwMenuWidget)current;
1201
c2569faae8ed [xemacs-hg @ 2003-01-12 10:45:53 by michaels]
michaels
parents: 647
diff changeset
3384 XlwMenuWidget newmw = (XlwMenuWidget)new_;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385 Boolean redisplay = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388 if (newmw->menu.contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 && newmw->menu.contents->contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 && newmw->menu.contents->contents->change >= VISIBLE_CHANGE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 redisplay = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3393 if (newmw->core.background_pixel != oldmw->core.background_pixel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394 || newmw->menu.foreground != oldmw->menu.foreground
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 /* For the XEditResource protocol, which may want to change the font. */
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3396 #if defined(NEED_MOTIF) && !defined(USE_XFT_MENUBARS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397 || newmw->menu.font_list != oldmw->menu.font_list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3398 || newmw->menu.font_list_2 != oldmw->menu.font_list_2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 || newmw->menu.fallback_font_list != oldmw->menu.fallback_font_list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400 #else
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3401 #ifdef USE_XFT_MENUBARS
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3402 || newmw->menu.renderFont != oldmw->menu.renderFont
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3403 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404 || newmw->menu.font != oldmw->menu.font
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405 #endif
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2286
diff changeset
3406 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3409 release_drawing_gcs (newmw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410 make_drawing_gcs (newmw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3411 redisplay = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3413 for (i = 0; i < oldmw->menu.windows_length; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415 XSetWindowBackground (XtDisplay (oldmw),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 oldmw->menu.windows [i].window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417 newmw->core.background_pixel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 /* clear windows and generate expose events */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419 XClearArea (XtDisplay (oldmw), oldmw->menu.windows[i].window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 0, 0, 0, 0, True);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 return redisplay;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 XlwMenuResize (Widget w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 mw->menu.windows [0].width = mw->core.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 mw->menu.windows [0].height = mw->core.height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436 /* Action procedures */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 handle_single_motion_event (XlwMenuWidget mw, XMotionEvent *ev,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 Boolean select_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441 widget_value *val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 Boolean stay_up;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3443 int level;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 if (!map_event_to_widget_value (mw, ev, &val, &level, &stay_up))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447 /* we wind up here when: (a) the event is in the menubar, (b) the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3448 event isn't in the menubar or any of the panes, (c) the event is on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 a disabled menu item */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 pop_new_stack_if_no_contents (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 if (select_p && !stay_up) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 /* pop down all menus and exit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 set_new_state(mw, (val = NULL), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 /* we wind up here when: (a) the event pops up a pull_right menu,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 (b) a menu item that is not disabled is highlighted */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 if (select_p && mw->menu.bounce_down
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 && close_to_reference_time((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 mw->menu.menu_bounce_time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 (XEvent *)ev))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466 /* motion can cause more than one event. Don't bounce right back
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 up if we've just bounced down. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468 val = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470 else if (select_p && mw->menu.bounce_down &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 mw->menu.last_selected_val &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472 (mw->menu.last_selected_val == val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474 val = NULL; /* assigned to mw->last_selected_val below */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 mw->menu.menu_bounce_time = ev->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476 /* popdown last menu if we're selecting the same menu item as we did
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 last time and the XlwMenu.bounceDown resource is set, if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 item is on the menubar itself, then exit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 if (level == (mw->menu.popped_up ? 0 : 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 mw->menu.menu_bounce_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484 set_new_state (mw, val, level);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 mw->menu.last_selected_val = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489 /* Sync with the display. Makes it feel better on X terms. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 XFlush (XtDisplay (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 handle_motion_event (XlwMenuWidget mw, XMotionEvent *ev,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495 Boolean select_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497 int x = ev->x_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498 int y = ev->y_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 unsigned int state = ev->state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 XMotionEvent *event= ev, dummy;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3502 /* allow motion events to be generated again */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503 dummy.window = ev->window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 if (ev->is_hint
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505 && XQueryPointer (XtDisplay (mw), dummy.window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3506 &dummy.root, &dummy.subwindow,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 &dummy.x_root, &dummy.y_root,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508 &dummy.x, &dummy.y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 &dummy.state)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510 && dummy.state == state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 && (dummy.x_root != x || dummy.y_root != y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 /* don't handle the event twice or that breaks bounce_down. --Stig */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514 dummy.type = ev->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 event = &dummy;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 lw_menu_accelerate = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 handle_single_motion_event (mw, event, select_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 Time x_focus_timestamp_really_sucks_fix_me_better;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3525 Start (Widget w, XEvent *ev, String *UNUSED (params),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3526 Cardinal *UNUSED (num_params))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3528 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 lw_menubar_widget = w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3532 lw_menu_active = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 if (!mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536 mw->menu.menu_post_time = ev->xbutton.time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 mw->menu.menu_bounce_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 mw->menu.last_selected_val = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 x_focus_timestamp_really_sucks_fix_me_better =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 ((XButtonPressedEvent*)ev)->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 XtCallCallbackList ((Widget)mw, mw->menu.open, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 /* notes the absolute position of the menubar window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 mw->menu.windows [0].x = ev->xmotion.x_root - ev->xmotion.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 mw->menu.windows [0].y = ev->xmotion.y_root - ev->xmotion.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 XtGrabPointer ((Widget)mw, False,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 (ButtonMotionMask | ButtonReleaseMask | ButtonPressMask),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 GrabModeAsync, GrabModeAsync,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 None, mw->menu.cursor_shape,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 ((XButtonPressedEvent*)ev)->time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553 mw->menu.pointer_grabbed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 /* handles the down like a move, slots are mostly compatible */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 handle_motion_event (mw, &ev->xmotion, True);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3561 Drag (Widget w, XEvent *ev, String *UNUSED (params),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3562 Cardinal *UNUSED (num_params))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 handle_motion_event (mw, &ev->xmotion, False);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3569 Select (Widget w, XEvent *ev, String *UNUSED (params),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3570 Cardinal *UNUSED (num_params))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3572 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 widget_value *selected_item = mw->menu.old_stack [mw->menu.old_depth - 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 lw_menu_accelerate = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577 /* If user releases the button quickly, without selecting anything,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 after the initial down-click that brought the menu up,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579 do nothing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580 if ((selected_item == 0 || selected_item->call_data == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 && (!mw->menu.next_release_must_exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 || close_to_reference_time(w, mw->menu.menu_post_time, ev)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 mw->menu.next_release_must_exit = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588 /* pop down everything */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 mw->menu.new_depth = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592 /* Destroy() only gets called for popup menus. Menubar widgets aren't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 destroyed when their menu panes get nuked. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 if (mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 XtUngrabPointer ((Widget)w, ev->xmotion.time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600 if (mw->menu.popped_up)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 mw->menu.popped_up = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 XtPopdown (XtParent (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 lw_menu_active = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 x_focus_timestamp_really_sucks_fix_me_better =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 ((XButtonPressedEvent*)ev)->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611 /* callback */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 XtCallCallbackList ((Widget) mw, mw->menu.select, (XtPointer) selected_item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 /* Action procedures for keyboard accelerators */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 /* set the menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619 xlw_set_menu (Widget w, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 lw_menubar_widget = w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 set_new_state ((XlwMenuWidget)w, val, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3625 /* prepare the menu structure via the call-backs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627 xlw_map_menu (Time t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3628 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3629 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 lw_menu_accelerate = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633 if (!mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3634 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 XWindowAttributes ret;
3462
6c7605dfcf07 [xemacs-hg @ 2006-06-19 18:19:33 by james]
james
parents: 3397
diff changeset
3636 Window parent,root = 0UL;
6c7605dfcf07 [xemacs-hg @ 2006-06-19 18:19:33 by james]
james
parents: 3397
diff changeset
3637 Window *waste = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638 unsigned int num_waste;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 lw_menu_active = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642 mw->menu.menu_post_time = t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3643 mw->menu.menu_bounce_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646 mw->menu.last_selected_val = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3648 XtCallCallbackList ((Widget)mw, mw->menu.open, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3650 /* do this for keyboards too! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651 /* notes the absolute position of the menubar window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653 mw->menu.windows [0].x = ev->xmotion.x_root - ev->xmotion.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3654 mw->menu.windows [0].y = ev->xmotion.y_root - ev->xmotion.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3655 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3657 /* get the geometry of the menubar */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 /* there has to be a better way than this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661 mw->menu.windows [0].x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3662 mw->menu.windows [0].y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664 parent = XtWindow (lw_menubar_widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3665 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667 XGetWindowAttributes (XtDisplay (lw_menubar_widget), parent, &ret);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3668 mw->menu.windows [0].x += ret.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669 mw->menu.windows [0].y += ret.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671 if (parent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672 XQueryTree (XtDisplay (lw_menubar_widget), parent, &root, &parent, &waste,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 &num_waste);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 if (waste)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 XFree (waste);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 while (parent != root);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681 XtGrabPointer ((Widget)mw, False,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682 (ButtonMotionMask | ButtonReleaseMask | ButtonPressMask),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683 GrabModeAsync, GrabModeAsync,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684 None, mw->menu.cursor_shape, t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 mw->menu.pointer_grabbed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 /* display the stupid menu already */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3690 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1294
diff changeset
3691 xlw_display_menu (Time UNUSED (t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3692 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695 lw_menu_accelerate = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3699 /* Sync with the display. Makes it feel better on X terms. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700 XFlush (XtDisplay (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 /* push a sub menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 xlw_push_menu (widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3707 push_new_stack ((XlwMenuWidget)lw_menubar_widget, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710 /* pop a sub menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 xlw_pop_menu (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3714 if (((XlwMenuWidget)lw_menubar_widget)->menu.new_depth > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3715 ((XlwMenuWidget)lw_menubar_widget)->menu.new_depth --;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 xlw_kill_menus (widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726 lw_menu_accelerate = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728 mw->menu.new_depth = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 if (mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733 XtUngrabPointer (lw_menubar_widget, CurrentTime);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3734 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3735 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3736
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3737 lw_menu_active = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3738 XtCallCallbackList (lw_menubar_widget, mw->menu.select, (XtPointer)val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3739 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3741 /* set the menu item */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3742 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3743 xlw_set_item (widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3744 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3745 if (((XlwMenuWidget)lw_menubar_widget)->menu.new_depth > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3746 ((XlwMenuWidget) lw_menubar_widget)->menu.new_depth --;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3747 push_new_stack ((XlwMenuWidget) lw_menubar_widget, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3750 /* get either the current entry or a list of all entries in the current submenu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3751 widget_value *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3752 xlw_get_entries (int allp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 if (allp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757 if (mw->menu.new_depth >= 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3758 return mw->menu.new_stack [mw->menu.new_depth - 2]->contents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3759 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760 return mw->menu.new_stack[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763 if (mw->menu.new_depth >= 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 return mw->menu.new_stack [mw->menu.new_depth - 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770 xlw_menu_level (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 return ((XlwMenuWidget)lw_menubar_widget)->menu.new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 /* Special code to pop-up a menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3777 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778 xlw_pop_up_menu (XlwMenuWidget mw, XButtonPressedEvent *event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 int x = event->x_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 int y = event->y_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782 int w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 int h;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784 int borderwidth = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 Screen* screen = XtScreen (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787 mw->menu.menu_post_time = event->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788 mw->menu.menu_bounce_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790 mw->menu.last_selected_val = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 XtCallCallbackList ((Widget) mw, mw->menu.open, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794 size_menu (mw, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 w = mw->menu.windows [0].width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3797 h = mw->menu.windows [0].height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3799 x -= borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800 y -= borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3802 if (x < borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 x = borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 if (x > WidthOfScreen (screen) - w - 2 * borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 x = WidthOfScreen (screen) - w - 2 * borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 if (y < borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 y = borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 if (y > HeightOfScreen (screen) - h - 2 * borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 y = HeightOfScreen (screen) - h - 2 * borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 mw->menu.popped_up = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 XtConfigureWidget (XtParent (mw), x, y, w, h,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3816 XtParent (mw)->core.border_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817 XtPopup (XtParent (mw), XtGrabExclusive);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 display_menu (mw, 0, False, NULL, NULL, NULL, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 if (!mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 XtGrabPointer ((Widget)mw, False,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 (ButtonMotionMask | ButtonReleaseMask | ButtonPressMask),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823 GrabModeAsync, GrabModeAsync,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 None, mw->menu.cursor_shape, event->time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825 mw->menu.pointer_grabbed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3827
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 mw->menu.windows [0].x = x + borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829 mw->menu.windows [0].y = y + borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3831 handle_motion_event (mw, (XMotionEvent *) event, True);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3832 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3834 /* #### unused */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3836 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837 * This is a horrible function which should not be needed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 * use it to put the resize method back the way the XlwMenu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 * class initializer put it. Motif screws with this when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840 * the XlwMenu class gets instantiated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3843 xlw_unmunge_class_resize (Widget w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3844 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3845 if (w->core.widget_class->core_class.resize != XlwMenuResize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 w->core.widget_class->core_class.resize = XlwMenuResize;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849