annotate lwlib/xlwmenu.c @ 502:7039e6323819

[xemacs-hg @ 2001-05-04 22:41:46 by ben] ----------------------- byte-comp warning fixes ----------------- New functions for cleanly eliminating byte-compiler warnings. Their definitions require no changes at all in bytecomp.el, meaning that any package that wants to use them and be compatible with older versions of XEmacs need only copy the code and rename the functions (i.e. prefix them with the package name). Eliminate byte-compiler warnings using the new functions in bytecomp-runtime.el. Move coding-system-put,get,category, since they're not Mule-specific and are used in prefer-coding-system. font.el was incredibly ugly. Clean it up. Avoid using defsubst for any exported functions, to avoid possible compatibility problems if we later change the internal interface. (It happened before, with face accessors, between 19.8 and 19.9). Fix tons of warnings. Clean up (new function gpm-is-supported-p eliminates duplicate code in gpm-create/delete-device-hook) and eliminate warnings. ---------- make byte-recompile-directory work in the --------- core `lisp' dir, even in the absence of a Mule XEmacs (i.e. make it skip the Mule files rather than trying to compile them). now you should be able to do `touch *.el' in the `lisp' dir, then M-x byte-recompile-directory, and get no warnings. Avoid trying to compile Mule files in byte-recompile-directory when we're not in a Mule XEmacs, since we're highly likely to get syntax errors. Add a coding-system cookie to all Mule files so that byte-recompile-directory ignores them. Magic cookie function moved to files.el from code-files.el (for use by bytecomp even in a non-coding-system XEmacs), and changed names and semantics for use by bytecomp. NOTE: IMO this is an internal function that we can change as we like (and there is absolutely no code anywhere else using the function). ---------------- GUI improvements: menus, help ------------------- Rearrange order of keymap declarations to be alphabetical. Improve help on help to include all bindings, and group by category. Add bindings for new Info commands. Remove warnings. Use command-hyper-apropos in place of command-apropos. Add a function to do the equivalent of command-apropos. Evals its help-text argument so you can put expressions there. Used now by help-for-help. Add binding to continue text searches. Expand index searches to work over multiple info documents. Add commands to search text/index in User and Lispref. Add new entry, "Uncomment Region" (parallels "Comment Out Region"). Redo Help menu; add bindings for new Info commands to search the index or text of the User and Lispref manuals. Add command for mark-paragraph, activate-region. Make Edit->R accelerator be rectangle, not register (more commonly used), and put rectangle first. Fix the Edit Init File entry to never load the .elc file. Simplify the default-popup-menu. Add Cmds->Tabs menu. Use kp-left not kp_left, etc. ---------------- Miscellaneous bug fixes/cleanup ------------------- byte-compiler-options: Correct doc string. easy-menu-do-define: fix extra quote. fill-paragraph-or-region:Rewrite to be more correct -- use call-interactively so that we always get exactly the same behavior as if the functions were called directly. No need to fiddle with zmacs-region-stays, now that bogus clearing of it (2001-04-28 src/ChangeLog) is removed. Put dialog titles back in -- this time correctly. Fix various other problems with leaks and such. key-sequence-list-description: Clean up fun to always correctly canonicalize. Clean up Kinsoku comments, synch comment-region with FSF 20.7. * simple.el (region-exists-p): * simple.el (region-active-p): Add comment about which one is correct to use in menu specs. * sound.el (load-sound-file): Minor code clean up. * startup.el: * startup.el (command-line-early): * startup.el (initial-scratch-message): Comment changes. Add info about sample.init.el to splash screen. Improve initial-scratch-message and clarify purpose of Scratch buffer. Fix byte-compile warning. ------------------------ Added features ------------------------- Add new variable to control whether etags checks all parent directories for tag files. (On by default.) * hash-table.el: New file, useful utility functions. * dumped-lisp.el (preloaded-file-list): Dump hash-table.el. ------------ notable bug fix: Windows event code -------------- Get critical quit working. ------------ notable bug fix and new feature: regex code -------------- Shy groups were implemented in a horrible, half-assed way that would cause them to screw up regex searching in most cases. Fixed to work correctly. Also extended back-reference syntax past 9. Only is recognized as such if there are at least that many non-shy groups; and optionally will warn about such uses, to catch old code that might be using them differently. (Added variable to control this in search.c -- `warn-about-possibly-incompatible-back- references', on by default for the moment. Declared in lisp.h. ---------------- process/SIGIO improvements ------------------- define USE_GETADDRINFO to replace more complex conditional, and use it. the code conditionalized on this in unix_open_network_stream had *serious* problems handling errors. it's now fixed, and major amounts of duplicate code between the two versions were combined. don't disable SIGIO and other interrupts unless CONNECT_NEEDS_SLOWED_INTERRUPTS is defined -- don't penalize OS's without bugs. similarly for a freebsd bug that was affecting all OS's. * s\ultrix.h: define CONNECT_NEEDS_SLOWED_INTERRUPTS, since that's the OS mentioned as having a kernel bug. * sysdep.c (request_sigio_on_device): * sysdep.c (unrequest_sigio_on_device): fix SIGIO problems on Linux. add check for O_ASYNC in case it's defined and FASYNC isn't. add comment about other ways to do SIGIO on Linux. * callproc.c (Fold_call_process_internal): * process.c (Fstart_process_internal): Deal with the possibility that `default-directory' doesn't have terminating slash. Correct comments about vfork. ---------------- Miscellaneous bug fixes/cleanup ------------------- * callint.c (Finteractive): Add lots of documentation -- exactly what the Lisp equivalents of all the interactive specs are. * console.h (struct console): change type of quit_char to Emchar. * event-msw.c (lstream_type_create_mswindows_selectable): spacing change. Eliminate events-mod.h and combine into events.h. * emacs.c: * emacs.c (make_arg_list_1): * emacs.c (main_1): A couple of char->Extbyte changes, add a comment. * glyphs-msw.c: Correct indentation of function defns to not exceed 80 cols. Try (sort of) to fix some code that sets the colors of the progress gauge. (Commented out) * keymap.c (syms_of_keymap): use DEFSYMBOL. * process.c (read_process_output): No need to fiddle with zmacs_region_stays, now that bogus clearing of it (see below) is removed. * search.c (Freplace_match): warning fix.
author ben
date Fri, 04 May 2001 22:42:35 +0000
parents 1ccc32a20af4
children b39c14581166
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 #include "xlwmenuP.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 #ifdef USE_DEBUG_MALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #include <dmalloc.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
54 /* simple, naive integer maximum */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #ifndef max
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 #define max(a,b) ((a)>(b)?(a):(b))
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 static char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 xlwMenuTranslations [] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 "<BtnDown>: start()\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 <BtnMotion>: drag()\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 <BtnUp>: select()\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 ";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 extern Widget lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 #define offset(field) XtOffset(XlwMenuWidget, field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 static XtResource
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 xlwMenuResources[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 /* 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
74 the resources *fontList: or *font:, and so that we can tell the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 difference between them being specified, and being defaulted to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 font from the XtRString specified here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 {XmNfontList, XmCFontList, XmRFontList, sizeof(XmFontList),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 offset(menu.font_list), XtRImmediate, (XtPointer)0},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 {XtNfont, XtCFont, XmRFontList, sizeof(XmFontList),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 offset(menu.font_list_2),XtRImmediate, (XtPointer)0},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 {XmNfontList, XmCFontList, XmRFontList, sizeof(XmFontList),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 offset(menu.fallback_font_list),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 /* 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
84 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
85 *fontList resource set, or at least know how to deal with this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 XtRString, (XtPointer) "-*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 offset(menu.font), XtRString, (XtPointer) "XtDefaultFont"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 # ifdef USE_XFONTSET
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
91 /* #### 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
92 XlwMenuInitialize(). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 {XtNfontSet, XtCFontSet, XtRFontSet, sizeof(XFontSet),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 offset(menu.font_set), XtRString, (XtPointer) "XtDefaultFontSet"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 offset(menu.foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 offset(menu.button_foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 offset(menu.highlight_foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 {XtNtitleForeground, XtCTitleForeground, XtRPixel, sizeof(Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 offset(menu.title_foreground), XtRString, (XtPointer) "XtDefaultForeground"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 offset(menu.margin), XtRImmediate, (XtPointer)2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 {XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 offset(menu.horizontal_margin), XtRImmediate, (XtPointer)2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 {XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 offset(menu.vertical_margin), XtRImmediate, (XtPointer)1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 {XmNspacing, XmCSpacing, XmRHorizontalDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 offset(menu.column_spacing), XtRImmediate, (XtPointer)4},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 {XmNindicatorSize, XmCIndicatorSize, XtRDimension, sizeof(Dimension),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 offset(menu.indicator_size), XtRImmediate, (XtPointer)0},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 {XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 sizeof (Dimension), offset (menu.shadow_thickness),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 XtRImmediate, (XtPointer) 2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 {XmNshadowThickness, XmCShadowThickness, XtRDimension,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 sizeof (Dimension), offset (menu.shadow_thickness),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 XtRImmediate, (XtPointer) 2},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 {XmNselectColor, XmCSelectColor, XtRPixel, sizeof (Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 offset (menu.select_color), XtRImmediate, (XtPointer)-1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 {XmNtopShadowColor, XmCTopShadowColor, XtRPixel, sizeof (Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 offset (menu.top_shadow_color), XtRImmediate, (XtPointer)-1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 {XmNbottomShadowColor, XmCBottomShadowColor, XtRPixel, sizeof (Pixel),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 offset (menu.bottom_shadow_color), XtRImmediate, (XtPointer)-1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 {XmNtopShadowPixmap, XmCTopShadowPixmap, XtRPixmap, sizeof (Pixmap),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 offset (menu.top_shadow_pixmap), XtRImmediate, (XtPointer)None},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 {XmNbottomShadowPixmap, XmCBottomShadowPixmap, XtRPixmap, sizeof (Pixmap),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 offset (menu.bottom_shadow_pixmap), XtRImmediate, (XtPointer)None},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 {XtNopen, XtCCallback, XtRCallback, sizeof(XtPointer),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 offset(menu.open), XtRCallback, (XtPointer)NULL},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 {XtNselect, XtCCallback, XtRCallback, sizeof(XtPointer),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 offset(menu.select), XtRCallback, (XtPointer)NULL},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 {XtNmenu, XtCMenu, XtRPointer, sizeof(XtPointer),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 offset(menu.contents), XtRImmediate, (XtPointer)NULL},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 offset(menu.cursor_shape), XtRString, (XtPointer) "right_ptr"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 {XtNhorizontal, XtCHorizontal, XtRInt, sizeof(int),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 offset(menu.horizontal), XtRImmediate, (XtPointer)True},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 {XtNuseBackingStore, XtCUseBackingStore, XtRBoolean, sizeof (Boolean),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 offset (menu.use_backing_store), XtRImmediate, (XtPointer)False},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 {XtNbounceDown, XtCBounceDown, XtRBoolean, sizeof (Boolean),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 offset (menu.bounce_down), XtRImmediate, (XtPointer)True},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 {XtNresourceLabels, XtCResourceLabels, XtRBoolean, sizeof (Boolean),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 offset (menu.lookup_labels), XtRImmediate, (XtPointer)False},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 #undef offset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 static Boolean XlwMenuSetValues (Widget current, Widget request, Widget new,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 ArgList args, Cardinal *num_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 static void XlwMenuRealize (Widget w, Mask *valueMask,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 XSetWindowAttributes *attributes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 static void XlwMenuRedisplay (Widget w, XEvent *ev, Region region);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 static void XlwMenuResize (Widget w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 static void XlwMenuInitialize (Widget request, Widget new, ArgList args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 Cardinal *num_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 static void XlwMenuDestroy (Widget w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 static void XlwMenuClassInitialize (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 static void Start (Widget w, XEvent *ev, String *params, Cardinal *num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 static void Drag (Widget w, XEvent *ev, String *params, Cardinal *num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 static void Select(Widget w, XEvent *ev, String *params, Cardinal *num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 static XFontStruct *default_font_of_font_list (XmFontList);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 static XtActionsRec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 xlwMenuActionsList [] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 {"start", Start},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 {"drag", Drag},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 {"select", Select},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 #define SuperClass ((CoreWidgetClass)&coreClassRec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 XlwMenuClassRec xlwMenuClassRec =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 { /* CoreClass fields initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (WidgetClass) SuperClass, /* superclass */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 "XlwMenu", /* class_name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 sizeof(XlwMenuRec), /* size */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 XlwMenuClassInitialize, /* class_initialize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 NULL, /* class_part_initialize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 FALSE, /* class_inited */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 XlwMenuInitialize, /* initialize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 NULL, /* initialize_hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 XlwMenuRealize, /* realize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 xlwMenuActionsList, /* actions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 XtNumber(xlwMenuActionsList), /* num_actions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 xlwMenuResources, /* resources */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 XtNumber(xlwMenuResources), /* resource_count */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 NULLQUARK, /* xrm_class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 TRUE, /* compress_motion */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 TRUE, /* compress_exposure */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 TRUE, /* compress_enterleave */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 FALSE, /* visible_interest */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 XlwMenuDestroy, /* destroy */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 XlwMenuResize, /* resize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 XlwMenuRedisplay, /* expose */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 XlwMenuSetValues, /* set_values */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 NULL, /* set_values_hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 XtInheritSetValuesAlmost, /* set_values_almost */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 NULL, /* get_values_hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 NULL, /* #### - should this be set for grabs? accept_focus */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 XtVersion, /* version */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 NULL, /* callback_private */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 xlwMenuTranslations, /* tm_table */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 XtInheritQueryGeometry, /* query_geometry */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 XtInheritDisplayAccelerator, /* display_accelerator */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 NULL /* extension */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 }, /* XlwMenuClass fields initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 0 /* dummy */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 WidgetClass xlwMenuWidgetClass = (WidgetClass) &xlwMenuClassRec;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 extern int lw_menu_accelerate;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 /* Utilities */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 #if 0 /* Apparently not used anywhere */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 safe_strdup (char *s)
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 char *result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 if (! s) return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 result = (char *) malloc (strlen (s) + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 if (! result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 strcpy (result, s);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 return result;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 #endif /* 0 */
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 /* Replacement for XAllocColor() that tries to return the nearest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 available color if the colormap is full. From FSF Emacs. */
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 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 allocate_nearest_color (Display *display, Colormap screen_colormap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 XColor *color_def)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 int status = XAllocColor (display, screen_colormap, color_def);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 if (status)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 return status;
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 /* If we got to this point, the colormap is full, so we're
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 going to try to get the next closest color.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 The algorithm used is a least-squares matching, which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 what X uses for closest color matching with StaticColor visuals. */
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 int nearest, x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 unsigned long nearest_delta = ULONG_MAX;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 int no_cells = XDisplayCells (display, XDefaultScreen (display));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 /* Don't use alloca here because lwlib doesn't have the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 necessary configuration information that src does. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 XColor *cells = (XColor *) malloc (sizeof (XColor) * no_cells);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 for (x = 0; x < no_cells; x++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 cells[x].pixel = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 XQueryColors (display, screen_colormap, cells, no_cells);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 for (nearest = 0, x = 0; x < no_cells; x++)
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 long dred = (color_def->red >> 8) - (cells[x].red >> 8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 long dgreen = (color_def->green >> 8) - (cells[x].green >> 8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 long dblue = (color_def->blue >> 8) - (cells[x].blue >> 8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 unsigned long delta = dred * dred + dgreen * dgreen + dblue * dblue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 if (delta < nearest_delta)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 nearest = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 nearest_delta = delta;
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 color_def->red = cells[nearest].red;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 color_def->green = cells[nearest].green;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 color_def->blue = cells[nearest].blue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 free (cells);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 return XAllocColor (display, screen_colormap, color_def);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 push_new_stack (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 if (!mw->menu.new_stack)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 mw->menu.new_stack_length = 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 mw->menu.new_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (widget_value**)XtCalloc (mw->menu.new_stack_length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 else if (mw->menu.new_depth == mw->menu.new_stack_length)
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 mw->menu.new_stack_length *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 mw->menu.new_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 (widget_value**)XtRealloc ((char *)mw->menu.new_stack,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 mw->menu.new_stack_length *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 mw->menu.new_stack [mw->menu.new_depth++] = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 pop_new_stack_if_no_contents (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 if (mw->menu.new_depth &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 !mw->menu.new_stack [mw->menu.new_depth - 1]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 mw->menu.new_depth -= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 make_old_stack_space (XlwMenuWidget mw, int n)
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 if (!mw->menu.old_stack)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 mw->menu.old_stack_length = max (10, n);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 mw->menu.old_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 (widget_value**)XtCalloc (mw->menu.old_stack_length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 else if (mw->menu.old_stack_length < n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 while (mw->menu.old_stack_length < n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 mw->menu.old_stack_length *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 mw->menu.old_stack =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (widget_value**)XtRealloc ((char *)mw->menu.old_stack,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 mw->menu.old_stack_length *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 sizeof (widget_value*));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 close_to_reference_time (Widget w, Time reference_time, XEvent *ev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 reference_time &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 (ev->xbutton.time - reference_time < XtGetMultiClickTime (XtDisplay (w)));
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 /* Size code */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 string_width (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 XmString s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 char *s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 Dimension width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 XmStringExtent (mw->menu.font_list, s, &width, &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 return width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 XRectangle ri, rl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 XmbTextExtents (mw->menu.font_set, s, strlen (s), &ri, &rl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 return rl.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 XCharStruct xcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 int drop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 XTextExtents (mw->menu.font, s, strlen (s), &drop, &drop, &drop, &xcs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 return xcs.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 # endif /* USE_XFONTSET */
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 static char massaged_resource_char[256];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 initialize_massaged_resource_char (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 int j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 for (j = 0; j < (int) sizeof (massaged_resource_char); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 if ((j >= 'a' && j <= 'z') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (j >= 'A' && j <= 'Z') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 (j >= '0' && j <= '9') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (j == '_') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 (j >= 0xa0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 massaged_resource_char[j] = (char) j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 massaged_resource_char ['_'] = '_';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 massaged_resource_char ['+'] = 'P'; /* Convert C++ to cPP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 massaged_resource_char ['.'] = '_'; /* Convert Buffers... to buffers___ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 string_width_u (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 XmString string
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 char *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 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 Dimension width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 XmString newstring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 XRectangle ri, rl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 # else /* ! USE_XFONTSET */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 XCharStruct xcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 int drop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 char* newchars;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 int charslength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 char *chars;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 int i, j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 if (!XmStringGetLtoR (string, XmFONTLIST_DEFAULT_TAG, &chars))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 chars = string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 charslength = strlen (chars);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 newchars = (char *) alloca (charslength + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 for (i = j = 0; chars[i] && (j < charslength); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 if (chars[i]=='%'&&chars[i+1]=='_')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 newchars[j++] = chars[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 newchars[j] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 newstring = XmStringLtoRCreate (newchars, XmFONTLIST_DEFAULT_TAG);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 XmStringExtent (mw->menu.font_list, newstring, &width, &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 XmStringFree (newstring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 XtFree (chars);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 return width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 XmbTextExtents (mw->menu.font_set, newchars, j, &ri, &rl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 return rl.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 # else /* ! USE_XFONTSET */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 XTextExtents (mw->menu.font, newchars, j, &drop, &drop, &drop, &xcs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 return xcs.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 # endif /* USE_XFONTSET */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
462 massage_resource_name (const char *in, char *out)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 /* Turn a random string into something suitable for using as a resource.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 "Kill Buffer" -> "killBuffer"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 "Find File..." -> "findFile___"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 "Search and Replace..." -> "searchAndReplace___"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 "C++ Mode Commands" -> "cppModeCommands"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 Valid characters in a resource NAME component are: a-zA-Z0-9_
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 #ifdef PRINT_XLWMENU_RESOURCE_CONVERSIONS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 /* Compile with -DPRINT_XLWMENU_RESOURCE_CONVERSIONS to generate a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 translation file for menu localizations. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 char *save_in = in, *save_out = out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 Boolean firstp = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 while (*in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
484 if (*in == '%' && *(in + 1) == '_')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
485 in += 2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
486 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
488 char ch;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
489
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
490 if (*in == '%' && *(in + 1) == '%')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
491 in++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
492 ch = massaged_resource_char[(unsigned char) *in++];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
493 if (ch)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
494 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
495 int int_ch = (int) (unsigned char) ch;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
496 *out++ = firstp ? tolower (int_ch) : toupper (int_ch);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
497 firstp = False;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
498 while ((ch = massaged_resource_char[(unsigned char) *in++])
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
499 != '\0')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
500 *out++ = ch;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
501 if (!*(in-1)) /* Overshot the NULL byte? */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
502 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
503 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 *out = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 #ifdef PRINT_XLWMENU_RESOURCE_CONVERSIONS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 printf ("! Emacs*XlwMenu.%s.labelString:\t%s\n", save_out, save_in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 printf ( "Emacs*XlwMenu.%s.labelString:\n", save_out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 static XtResource
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 nameResource[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 { "labelString", "LabelString", XtRString, sizeof(String),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 0, XtRImmediate, 0 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
521 /* This function searches STRING for parameter inserts of the form:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
522 %[padding]1
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
523 padding is either space (' ') or dash ('-') meaning
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
524 padding to the left or right of the inserted parameter.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
525 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
526 The caller is expected to free the return value using XtFree().
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
527 %% means insert one % (like printf).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
528 %1 means insert VALUE.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
529 %-1 means insert VALUE followed by one space. The latter is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
530 not inserted if VALUE is a zero length string.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
531 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 static char*
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
533 parameterize_string (const char *string, const char *value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
535 const char *percent;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 char *result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 unsigned int done = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 unsigned int ntimes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 if (!string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 result = XtMalloc(1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 result[0] = '\0';
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
544 return result;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 if (!value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 value = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
550 for (ntimes = 1, percent = string;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
551 (percent = strchr (percent, '%'));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 ntimes++)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
553 percent++;
428
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 result = XtMalloc ((ntimes * strlen(value)) + strlen(string) + 4);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 result[0] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
558 while ((percent = strchr (string, '%')))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 unsigned int left_pad;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 unsigned int right_pad;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
562 const char *p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 if (percent[1] == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 { /* it's a real % */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 strncat (result, string, 1 + percent - string); /* incl % */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 string = &percent[2]; /* after the second '%' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 continue; /* with the while() loop */
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 left_pad = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 right_pad = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 for (p = &percent[1]; /* test *p inside the loop */ ; p++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 if (*p == ' ')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 { /* left pad */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 left_pad++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 else if (*p == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 { /* right pad */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 right_pad++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 else if (*p == '1')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 { /* param and terminator */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 strncat (result, string, percent - string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 if (value[0] != '\0')
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 unsigned int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 for (i = 0; i < left_pad; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 strcat (result, " ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 strcat (result, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 for (i = 0; i < right_pad; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 strcat (result, " ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 string = &p[1]; /* after the '1' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 done++; /* no need to do old way */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 break; /* out of for() loop */
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 { /* bogus, copy the format as is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 /* out of for() loop */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 strncat (result, string, 1 + p - string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 string = (*p ? &p[1] : p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 /* Copy the tail of the string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 strcat (result, string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 /* 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
614 if (!done && value[0] != '\0')
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 strcat (result, " ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 strcat (result, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 return result;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 static XmString
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 resource_widget_value (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 if (!val->toolkit_data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 char *resourced_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 char *converted_name, *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 XmString complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 char massaged_name [1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 if (mw->menu.lookup_labels)
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 /* Convert value style name into resource style name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 eg: "Free Willy" becomes "freeWilly" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 massage_resource_name (val->name, massaged_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 /* 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
642 resource. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 if (val->value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 char named_name[1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 sprintf (named_name, "%sNamed", massaged_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 XtGetSubresources ((Widget) mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 (XtPointer) &resourced_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 named_name, named_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 nameResource, 1, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 /* If nothing yet, try to load from the massaged name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 if (!resourced_name)
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 XtGetSubresources ((Widget) mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 (XtPointer) &resourced_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 massaged_name, massaged_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 nameResource, 1, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 } /* if (mw->menu.lookup_labels) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 /* Still nothing yet, use the name as the value. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 if (!resourced_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 resourced_name = val->name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 /* Parameterize the string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 converted_name = parameterize_string (resourced_name, val->value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 /* nuke newline characters to prevent menubar screwups */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 for ( str = converted_name ; *str ; str++ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 if (str[0] == '\n') str[0] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 /* Improve OSF's bottom line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 complete_name = XmStringCreateLocalized (converted_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 complete_name = XmStringCreateLtoR (converted_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 XtFree (converted_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 val->toolkit_data = complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 val->free_toolkit_data = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 return (XmString) val->toolkit_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 /* Unused */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 #if 0
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
693 /* These two routines should be a separate file..djw */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 xlw_create_localized_string (Widget w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 char *name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 char **args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 unsigned int nargs)
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 char *string = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 char *arg = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 if (nargs > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 arg = args[0];
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 XtGetSubresources (w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 (XtPointer)&string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 nameResource, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 NULL, 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 if (!string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 string = name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 return parameterize_string (string, arg);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 static XmString
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 xlw_create_localized_xmstring (Widget w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 char *name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 char **args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 unsigned int nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 char * string = xlw_create_localized_string (w, name, args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 XmString xm_string = XmStringCreateLtoR (string, XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 XtFree (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 return xm_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 #else /* !Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 static char*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 resource_widget_value (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 if (!val->toolkit_data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 char *resourced_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 char *complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 char massaged_name [1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 if (mw->menu.lookup_labels)
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 massage_resource_name (val->name, massaged_name);
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 XtGetSubresources ((Widget) mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (XtPointer) &resourced_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 massaged_name, massaged_name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 nameResource, 1, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 if (!resourced_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 resourced_name = val->name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 complete_name = parameterize_string (resourced_name, val->value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 val->toolkit_data = complete_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 /* nuke newline characters to prevent menubar screwups */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 for ( ; *complete_name ; complete_name++ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 if (complete_name[0] == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 complete_name[0] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 val->free_toolkit_data = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 return (char *) val->toolkit_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 #endif /* !Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 /* Code for drawing strings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 string_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 GC gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 XmString string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 char *string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 XmStringDraw (XtDisplay (mw), window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 mw->menu.font_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 string, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 1000, /* ???? width */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 XmALIGNMENT_BEGINNING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 0, /* ???? layout_direction */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 XmbDrawString (XtDisplay (mw), window, mw->menu.font_set, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 x, y + mw->menu.font_ascent, string, strlen (string));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 XDrawString (XtDisplay (mw), window, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 x, y + mw->menu.font_ascent, string, strlen (string));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 # endif /* USE_XFONTSET */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 string_draw_range (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 GC gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 char *string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 int start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 int end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 Dimension width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 XmString newstring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 int c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 if (end <= start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 c = string[end];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 string[end] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 newstring = XmStringLtoRCreate (&string[start], XmFONTLIST_DEFAULT_TAG);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 XmStringDraw (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 XtDisplay (mw), window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 mw->menu.font_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 newstring, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 1000, /* ???? width */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 XmALIGNMENT_BEGINNING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 0, /* ???? layout_direction */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 XmStringExtent (mw->menu.font_list, newstring, &width, &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 XmStringFree (newstring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 string[end] = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 return width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 XRectangle ri, rl;
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 XmbDrawString (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 XtDisplay (mw), window, mw->menu.font_set, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 x, y + mw->menu.font_ascent, &string[start], end - start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 XmbTextExtents (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 mw->menu.font_set, &string[start], end - start, &ri, &rl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 return rl.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 XCharStruct xcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 int drop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 if (end <= start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 XDrawString (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 XtDisplay (mw), window, gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 x, y + mw->menu.font_ascent, &string[start], end - start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 XTextExtents (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 mw->menu.font, &string[start], end - start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 &drop, &drop, &drop, &xcs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 return xcs.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 string_draw_u (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 GC gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 XmString string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 char *string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 int i, s = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 char *chars;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 if (!XmStringGetLtoR (string, XmFONTLIST_DEFAULT_TAG, &chars))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 chars = "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 chars = string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 for (i=0; chars[i]; ++i) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 if (chars[i] == '%' && chars[i+1] == '_') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 int w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 x += string_draw_range (mw, window, x, y, gc, chars, s, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 w = string_draw_range (mw, window, x, y, gc, chars, i+2, i+3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 /* underline next character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 XDrawLine (XtDisplay (mw), window, gc, x - 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 y + mw->menu.font_ascent + 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 x + w - 1, y + mw->menu.font_ascent + 1 );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 x += w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 s = i + 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 i += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 x += string_draw_range (mw, window, x, y, gc, chars, s, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 XtFree (chars);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 binding_draw (XlwMenuWidget mw, Window w, int x, int y, GC gc, char *value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 XmString xm_value = XmStringCreateLtoR(value, XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 string_draw (mw, w, x, y, gc, xm_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 XmStringFree (xm_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 string_draw (mw, w, x, y, gc, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 #endif
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 /* Low level code for drawing 3-D edges. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 shadow_rectangle_draw (Display *dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 GC top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 GC bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 unsigned int thickness)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 XPoint points [4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 if (!thickness)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 points [1].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 points [1].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 points [2].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 points [2].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 points [3].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 points [3].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 points [0].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 points [1].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 points [1].y = y + height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 points [2].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 points [2].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 points [3].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 points [0].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 points [1].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 points [1].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 points [2].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 points [2].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 points [3].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 points [3].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 points [0].y = y + height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 points [1].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 points [1].y = y + height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 points [2].x = x + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 points [2].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 points [3].y = y + height - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 typedef enum e_shadow_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 /* these are Motif compliant */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 SHADOW_BACKGROUND,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 SHADOW_OUT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 SHADOW_IN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 SHADOW_ETCHED_OUT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 SHADOW_ETCHED_IN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 SHADOW_ETCHED_OUT_DASH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 SHADOW_ETCHED_IN_DASH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 SHADOW_SINGLE_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 SHADOW_DOUBLE_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 SHADOW_SINGLE_DASHED_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 SHADOW_DOUBLE_DASHED_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 SHADOW_NO_LINE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 /* these are all non-Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 SHADOW_DOUBLE_ETCHED_OUT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 SHADOW_DOUBLE_ETCHED_IN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 SHADOW_DOUBLE_ETCHED_OUT_DASH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 SHADOW_DOUBLE_ETCHED_IN_DASH
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 } shadow_type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 shadow_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 shadow_type type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 XPoint points [4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 Boolean etched = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 switch (type)
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 case SHADOW_BACKGROUND:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 top_gc = bottom_gc = mw->menu.background_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 case SHADOW_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 etched = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 case SHADOW_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 etched = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 case SHADOW_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 case SHADOW_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 if (etched)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 unsigned int half = thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 shadow_rectangle_draw (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 width - half, height - half,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 thickness - half);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 shadow_rectangle_draw (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 x + half, y + half,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 width - half , height - half,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 half);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 shadow_rectangle_draw (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 top_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 width, height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 arrow_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 Boolean raised)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 GC select_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 XPoint points [4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 int half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 int length = (int)((double)width * 0.87);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 int thick_med = (int)((double)thickness * 1.73);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 if (width & 0x1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 half_width = width/2 + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 half_width = width/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 select_gc = mw->menu.background_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 if (raised)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 /* 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
1110 nice sharp edge. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 points [0].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 points [0].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 points [1].x = x + length - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 points [2].x = x + length - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 points [2].y = y + half_width + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 points [3].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 XFillPolygon (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 select_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 points,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 4,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 Convex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 /* left border */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 points [1].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 points [1].y = y + thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 points [2].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 points [2].y = y + width - thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 points [3].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 points [3].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 /* top border */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 points [0].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 points [1].x = x + length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 points [2].x = x + length - (thickness + thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 points [3].y = y + width - thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
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 /* bottom shadow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 points [0].x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 points [1].x = x + length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 points [2].x = x + length - (thickness + thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 points [3].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 points [3].y = y + thick_med;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 toggle_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 Boolean set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 GC select_gc = mw->menu.select_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 (set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 type = SHADOW_IN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 type = SHADOW_OUT;
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 /* Fill internal area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 if (set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 XFillRectangle (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 select_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 x + thickness,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 y + thickness,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 width - (2*thickness),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 width - (2*thickness));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 shadow_draw (mw, window, x, y, width, width, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 radio_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 Boolean enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 GC select_gc = mw->menu.select_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 int thickness = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 XPoint points[6];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 int half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 int npoints;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 if (width & 0x1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 width++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 half_width = width/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 if (enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 }
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 #if 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 /* Draw the bottom first, just in case the regions overlap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 The top should cast the longer shadow. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 points [0].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 points [0].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 points [1].x = x + half_width; /* bottom corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 points [1].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 points [2].x = x + half_width; /* bottom inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 points [2].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 points [3].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 points [3].y = y + half_width;
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, bottom_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 points [0].x = x + half_width; /* bottom corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 points [0].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 points [1].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 points [2].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 points [3].x = x + half_width; /* bottom inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 points [3].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 XFillPolygon (dpy, window, bottom_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 points [0].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 points [0].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 points [1].x = x + half_width; /* top corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 points [1].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 points [2].x = x + half_width; /* top inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 points [2].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 points [3].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 points [3].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 points [0].x = x + half_width; /* top corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 points [0].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 points [1].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 points [1].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 points [2].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 points [3].x = x + half_width; /* top inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 points [3].y = y + thickness;
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 XFillPolygon (dpy, window, top_gc, points, 4, Convex, CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 /* Draw the bottom first, just in case the regions overlap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 The top should cast the longer shadow. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 npoints = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 points [npoints].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 points [npoints].x = x + half_width; /* bottom corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 points [npoints++].y = y + width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 points [npoints].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 points [npoints].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 points [npoints].x = x + half_width; /* bottom inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 points [npoints++].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 points [npoints].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 points [npoints++].y = y + half_width;
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 XFillPolygon (dpy, window, bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 points, npoints, Nonconvex, CoordModeOrigin);
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 npoints = 0;
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 points [npoints].x = x; /* left corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 points [npoints].x = x + half_width; /* top corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 points [npoints++].y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 points [npoints].x = x + width; /* right corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 points [npoints].x = x + width - thickness; /* right inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 points [npoints].x = x + half_width; /* top inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 points [npoints++].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 points [npoints].x = x + thickness; /* left inside corner */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 points [npoints++].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 XFillPolygon (dpy, window, top_gc, points, npoints, Nonconvex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 /* Fill internal area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 if (enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 points [0].x = x + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 points [0].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 points [1].x = x + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 points [1].y = y + thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 points [2].x = x + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 points [2].y = y + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 points [3].x = x + half_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 points [3].y = y + width - thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 XFillPolygon (dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 select_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 points,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 4,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 Convex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 CoordModeOrigin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 separator_decoration_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 Boolean vertical,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 shadow_type type)
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 Display *dpy = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 GC top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 GC bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 unsigned int offset = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 unsigned int num_separators = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 unsigned int top_line_thickness = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 unsigned int bottom_line_thickness = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 Boolean dashed = False;
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 switch (type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 case SHADOW_NO_LINE: /* nothing to do */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 case SHADOW_DOUBLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 case SHADOW_SINGLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 top_gc = bottom_gc = mw->menu.foreground_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 top_line_thickness = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 case SHADOW_DOUBLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 case SHADOW_SINGLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 top_gc = bottom_gc = mw->menu.foreground_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 top_line_thickness = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 dashed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 case SHADOW_DOUBLE_ETCHED_OUT_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 case SHADOW_ETCHED_OUT_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 dashed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 case SHADOW_DOUBLE_ETCHED_IN_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 case SHADOW_ETCHED_IN_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 dashed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 case SHADOW_DOUBLE_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 case SHADOW_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 top_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 bottom_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 case SHADOW_DOUBLE_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 num_separators = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 case SHADOW_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 top_gc = mw->menu.shadow_bottom_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 bottom_gc = mw->menu.shadow_top_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 top_line_thickness = mw->menu.shadow_thickness/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 bottom_line_thickness = mw->menu.shadow_thickness - top_line_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 if (dashed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 XGCValues values;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 values.line_style = LineOnOffDash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 if (top_line_thickness > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 XChangeGC (dpy, top_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 if (bottom_line_thickness > 0 && bottom_gc != top_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 XChangeGC (dpy, bottom_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 while (num_separators--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 unsigned int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 for (i = 0; i < top_line_thickness; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 XDrawLine (dpy, window, top_gc, x, y + i, x + width, y + i);
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 for (i = 0; i < bottom_line_thickness; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 XDrawLine (dpy, window, bottom_gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 x, y + top_line_thickness + offset + i,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 x + width, y + top_line_thickness + offset + i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 y += (top_line_thickness + offset + bottom_line_thickness + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 if (dashed)
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 XGCValues values;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 values.line_style = LineSolid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 if (top_line_thickness > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 XChangeGC (dpy, top_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 if (bottom_line_thickness > 0 && bottom_gc != top_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 XChangeGC (dpy, bottom_gc, GCLineStyle, &values);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 #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
1442 #if SLOPPY_TYPES
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 #if SLOPPY_TYPES < 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 static char *wv_types[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 "UNSPECIFIED",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 "BUTTON",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 "TOGGLE",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 "RADIO",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 "TEXT",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 "SEPARATOR",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 "CASCADE",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 "PUSHRIGHT",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 "INCREMENTAL"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 print_widget_value (widget_value *wv, int just_one, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 char d [200];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 for (i = 0; i < depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 d[i] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 d[depth]=0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 if (!wv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 printf ("%s(null widget value pointer)\n", d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 printf ("%stype: %s\n", d, wv_types [wv->type]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 printf ("%sname: %s\n", d, (wv->name ? wv->name : "(null)"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 if (wv->name) printf ("%sname: %s\n", d, wv->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 if (wv->value) printf ("%svalue: %s\n", d, wv->value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 if (wv->key) printf ("%skey: %s\n", d, wv->key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 printf ("%senabled: %d\n", d, wv->enabled);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 if (wv->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 printf ("\n%scontents: \n", d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 print_widget_value (wv->contents, 0, depth + 5);
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 if (!just_one && wv->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 printf ("\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 print_widget_value (wv->next, 0, depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 #endif /* SLOPPY_TYPES < 2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 all_dashes_p (char *s)
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 char *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 if (!s || s[0] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 return False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 for (p = s; *p == '-'; p++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 if (*p == '!' || *p == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 return True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 return False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 #endif /* SLOPPY_TYPES */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 static widget_value_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 menu_item_type (widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 if (val->type != UNSPECIFIED_TYPE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 return val->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 #if SLOPPY_TYPES
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 else if (all_dashes_p (val->name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 return SEPARATOR_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 else if (val->name && val->name[0] == '\0') /* push right */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 return PUSHRIGHT_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 else if (val->contents) /* cascade */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 return CASCADE_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 else if (val->call_data) /* push button */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 return BUTTON_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 return TEXT_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 #else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
1524 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 abort();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 return UNSPECIFIED_TYPE; /* Not reached */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 label_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 unsigned int *bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 *height = (mw->menu.font_ascent + mw->menu.font_descent +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 2 * mw->menu.vertical_margin +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 2 * mw->menu.shadow_thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 /* no left column decoration */
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
1543 *toggle_width = mw->menu.horizontal_margin + mw->menu.shadow_thickness;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 *label_width = string_width_u (mw, resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 *bindings_width = mw->menu.horizontal_margin + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 label_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 unsigned int label_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 unsigned int binding_tab)
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 int y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 GC gc;
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 (!label_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 label_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 if (highlighted && (in_menubar || val->contents))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 gc = mw->menu.highlight_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 else if (in_menubar || val->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 gc = mw->menu.foreground_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 gc = mw->menu.title_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 /* Draw the label string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 string_draw_u (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 x + label_offset, y + y_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 push_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 unsigned int *bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 /* inherit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 label_button_size (mw, val, in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 toggle_width, label_width, bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 /* key bindings to display? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 if (!in_menubar && val->key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 int w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 XmString key = XmStringCreateLtoR (val->key, XmSTRING_DEFAULT_CHARSET);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 w = string_width (mw, key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 XmStringFree (key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 char *key = val->key;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 w = string_width (mw, key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 *bindings_width += w + mw->menu.column_spacing;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 push_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 unsigned int label_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 unsigned int binding_offset)
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 int y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 GC gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 Boolean menu_pb = in_menubar && (menu_item_type (val) == BUTTON_TYPE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 /* Draw the label string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 if (!label_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 label_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 if (val->enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 gc = mw->menu.highlight_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 gc = mw->menu.inactive_gc;
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 else if (menu_pb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 if (val->enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 gc = mw->menu.button_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 gc = mw->menu.inactive_button_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 if (val->enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 gc = mw->menu.foreground_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 gc = mw->menu.inactive_gc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 string_draw_u (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 x + label_offset, y + y_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 gc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 /* Draw the keybindings */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 if (val->key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 if (!binding_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 unsigned int s_width =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 string_width (mw, resource_widget_value (mw, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 binding_offset = label_offset + s_width + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 binding_draw (mw, window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 x + binding_offset + mw->menu.column_spacing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 y + y_offset, gc, val->key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 /* Draw the shadow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 if (menu_pb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 type = SHADOW_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 type = (val->selected ? SHADOW_ETCHED_OUT : SHADOW_ETCHED_IN);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 else
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 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 type = SHADOW_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 type = SHADOW_BACKGROUND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 shadow_draw (mw, window, x, y, width, height, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 arrow_decoration_height (XlwMenuWidget mw)
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 int result = (mw->menu.font_ascent + mw->menu.font_descent) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 result += 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 if (result > (mw->menu.font_ascent + mw->menu.font_descent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 result = mw->menu.font_ascent + mw->menu.font_descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 return result;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 cascade_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 unsigned int *arrow_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 /* inherit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 label_button_size (mw, val, in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 toggle_width, label_width, arrow_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 /* we have a pull aside arrow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 if (!in_menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 *arrow_width += arrow_decoration_height (mw) + 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 cascade_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 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 /* Draw the label string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 label_button_draw (mw, val, in_menubar, highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 window, x, y, width, height, label_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 binding_offset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 /* Draw the pull aside arrow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 if (!in_menubar && val->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 int y_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 unsigned int arrow_height = arrow_decoration_height (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 (mw->menu.font_ascent+mw->menu.font_descent - arrow_height)/2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 if (!binding_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 unsigned int s_width =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 string_width (mw, resource_widget_value (mw, val));
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 (!label_offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 label_offset = mw->menu.shadow_thickness +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 binding_offset = label_offset + s_width + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 arrow_decoration_draw (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 x + binding_offset + mw->menu.column_spacing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 y + y_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 arrow_height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 highlighted);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 /* Draw the shadow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 if (highlighted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 type = SHADOW_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 type = SHADOW_BACKGROUND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 shadow_draw (mw, window, x, y, width, height, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 toggle_decoration_height (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 int rv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 if (mw->menu.indicator_size > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 rv = mw->menu.indicator_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 rv = mw->menu.font_ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 if (rv > (mw->menu.font_ascent + mw->menu.font_descent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 rv = mw->menu.font_ascent + mw->menu.font_descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 /* radio button can't be smaller than its border or a filling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 error will occur. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 if (rv < 2 * mw->menu.shadow_thickness)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 rv = 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 return rv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 toggle_button_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 unsigned int *bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 /* inherit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 push_button_size (mw, val, in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 toggle_width, label_width, bindings_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 /* we have a toggle */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 *toggle_width += toggle_decoration_height (mw) + mw->menu.column_spacing;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 toggle_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 unsigned int label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831 unsigned int binding_tab)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 int x_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 int y_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 unsigned int t_height = toggle_decoration_height (mw);
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 /* Draw a toggle. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 x_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 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
1841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 toggle_decoration_draw (mw, window, x + x_offset, y + y_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 t_height, val->selected);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 /* Draw the pushbutton parts. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 push_button_draw (mw, val, in_menubar, highlighted, window, x, y, width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 height, label_tab, binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 radio_decoration_height (XlwMenuWidget mw)
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 return toggle_decoration_height (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 radio_button_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 unsigned int label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 unsigned int binding_tab)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 int x_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 int y_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 unsigned int r_height = radio_decoration_height (mw);
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 /* Draw a toggle. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 x_offset = mw->menu.shadow_thickness + mw->menu.horizontal_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 y_offset = mw->menu.shadow_thickness + mw->menu.vertical_margin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 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
1876
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 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
1878 val->selected);
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 /* Draw the pushbutton parts. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 push_button_draw (mw, val, in_menubar, highlighted, window, x, y, width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 height, label_tab, binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 }
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 static struct _shadow_names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
1887 const char * name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 shadow_type type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 } shadow_names[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 /* Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 { "singleLine", SHADOW_SINGLE_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 { "doubleLine", SHADOW_DOUBLE_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 { "singleDashedLine", SHADOW_SINGLE_DASHED_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 { "doubleDashedLine", SHADOW_DOUBLE_DASHED_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 { "noLine", SHADOW_NO_LINE },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 { "shadowEtchedIn", SHADOW_ETCHED_IN },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 { "shadowEtchedOut", SHADOW_ETCHED_OUT },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 { "shadowEtchedInDash", SHADOW_ETCHED_IN_DASH },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 { "shadowEtchedOutDash", SHADOW_ETCHED_OUT_DASH },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 /* non-Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 { "shadowDoubleEtchedIn", SHADOW_DOUBLE_ETCHED_IN },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 { "shadowDoubleEtchedOut", SHADOW_DOUBLE_ETCHED_OUT },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 { "shadowDoubleEtchedInDash", SHADOW_DOUBLE_ETCHED_IN_DASH },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 { "shadowDoubleEtchedOutDash", SHADOW_DOUBLE_ETCHED_OUT_DASH }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 static shadow_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 separator_type (char *name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 if (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 for (i = 0; i < (int) (XtNumber (shadow_names)); i++ )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 if (strcmp (name, shadow_names[i].name) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 return shadow_names[i].type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 }
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 return SHADOW_BACKGROUND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 separator_decoration_height (XlwMenuWidget mw, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 switch (separator_type (val->value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 case SHADOW_NO_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 case SHADOW_SINGLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 case SHADOW_SINGLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 case SHADOW_DOUBLE_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 case SHADOW_DOUBLE_DASHED_LINE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 return 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 case SHADOW_DOUBLE_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 case SHADOW_DOUBLE_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 case SHADOW_DOUBLE_ETCHED_OUT_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 case SHADOW_DOUBLE_ETCHED_IN_DASH:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 return (1 + 2 * mw->menu.shadow_thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 case SHADOW_ETCHED_OUT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 case SHADOW_ETCHED_IN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 return mw->menu.shadow_thickness;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 separator_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 unsigned int *rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 *height = separator_decoration_height (mw, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 *label_width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 *toggle_width = *rest_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 }
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 separator_draw (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 Window window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 unsigned int width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 unsigned int height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 unsigned int label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 unsigned int binding_tab)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 unsigned int sep_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 if (in_menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 sep_width = height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 sep_width = width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 separator_decoration_draw (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 x,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 sep_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 separator_type(val->value));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 pushright_size (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 Boolean in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 unsigned int *rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 unsigned int *height)
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 *height = *label_width = *toggle_width = *rest_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 size_menu_item (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 int horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 unsigned int *toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 unsigned int *label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 unsigned int *rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 unsigned int *height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 void (*function_ptr) (XlwMenuWidget _mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 widget_value *_val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 Boolean _in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 unsigned int *_toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 unsigned int *_label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 unsigned int *_rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 unsigned int *_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 switch (menu_item_type (val))
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 case TOGGLE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 case RADIO_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 function_ptr = toggle_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 case SEPARATOR_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 function_ptr = separator_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 case INCREMENTAL_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 case CASCADE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 function_ptr = cascade_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 case BUTTON_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 function_ptr = push_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 case PUSHRIGHT_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 function_ptr = pushright_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 case TEXT_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 function_ptr = label_button_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 (*function_ptr) (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 display_menu_item (XlwMenuWidget mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 widget_value *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 window_state *ws,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 XPoint *where,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 Boolean highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 Boolean horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 Boolean just_compute)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 {
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 int x = where->x /* + mw->menu.shadow_thickness */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 int y = where->y /* + mw->menu.shadow_thickness */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 unsigned int toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 unsigned int label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 unsigned int binding_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 unsigned int width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 unsigned int height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 unsigned int label_tab;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 unsigned int binding_tab;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 void (*function_ptr) (XlwMenuWidget _mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 widget_value *_val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 Boolean _in_menubar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 Boolean _highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 Window _window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 int _x, int _y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 unsigned int _width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 unsigned int _height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 unsigned int _label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 unsigned int _binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 size_menu_item (mw, val, horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 &toggle_width, &label_width, &binding_width, &height);
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 if (horizontal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 width = toggle_width + label_width + binding_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 height = ws->height - 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 width = ws->width - 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 toggle_width = ws->toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 label_width = ws->label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 }
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 where->x += width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 where->y += height;
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 if (just_compute)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 label_tab = toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 binding_tab = toggle_width + label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 switch (menu_item_type (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 case TOGGLE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 function_ptr = toggle_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 case RADIO_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 function_ptr = radio_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 case SEPARATOR_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 function_ptr = separator_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 case INCREMENTAL_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 case CASCADE_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 function_ptr = cascade_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 case BUTTON_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 function_ptr = push_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 case TEXT_TYPE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 function_ptr = label_button_draw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 default: /* do no drawing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 (*function_ptr) (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 horizontal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 highlighted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 ws->window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 x, y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 width, height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 label_tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 binding_tab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 size_menu (XlwMenuWidget mw, int level)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 unsigned int toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 unsigned int label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 unsigned int rest_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 unsigned int height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 unsigned int max_toggle_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 unsigned int max_label_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 unsigned int max_rest_width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 unsigned int max_height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 int horizontal_p = mw->menu.horizontal && (level == 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 widget_value* val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 window_state* ws;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 if (level >= mw->menu.old_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 ws = &mw->menu.windows [level];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 for (val = mw->menu.old_stack [level]->contents; val; val = val->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 size_menu_item (mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 horizontal_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 &toggle_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 &label_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 &rest_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 &height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 max_label_width += toggle_width + label_width + rest_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 if (height > max_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 max_height = 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 else
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 if (max_toggle_width < toggle_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 max_toggle_width = toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 if (max_label_width < label_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 max_label_width = label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 if (max_rest_width < rest_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 max_rest_width = rest_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 max_height += height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 }
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 ws->height = max_height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 ws->width = max_label_width + max_rest_width + max_toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 ws->toggle_width = max_toggle_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 ws->label_width = max_label_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 ws->width += 2 * mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 ws->height += 2 * mw->menu.shadow_thickness;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 display_menu (XlwMenuWidget mw, int level, Boolean just_compute_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 XPoint *highlighted_pos, XPoint *hit, widget_value **hit_return,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 widget_value *this, widget_value *that)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 widget_value *val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 widget_value *following_item;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 window_state *ws;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 XPoint where;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 int horizontal_p = mw->menu.horizontal && (level == 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 int highlighted_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 int just_compute_this_one_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 if (level >= mw->menu.old_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 if (level < mw->menu.old_depth - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 following_item = mw->menu.old_stack [level + 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 if (lw_menu_accelerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 && level == mw->menu.old_depth - 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 && mw->menu.old_stack [level]->type == CASCADE_TYPE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 just_compute_p = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 following_item = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 #if SLOPPY_TYPES == 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 puts("===================================================================");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 print_widget_value (following_item, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 #endif
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 if (hit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 *hit_return = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 where.x = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 where.y = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 ws = &mw->menu.windows [level];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 for (val = mw->menu.old_stack [level]->contents; val; val = val->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 XPoint start;
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 highlighted_p = (val == following_item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 /* If this is the partition (the dummy item which says that menus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 after this should be flushright) then figure out how big the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 following items are. This means we walk down the tail of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 list twice, but that's no big deal - it's short.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 if (horizontal_p && (menu_item_type (val) == PUSHRIGHT_TYPE))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 widget_value *rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 XPoint flushright_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 int new_x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 flushright_size.x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 flushright_size.y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 for (rest = val; rest; rest = rest->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 display_menu_item (mw, rest, ws, &flushright_size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 highlighted_p, horizontal_p, True);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 new_x = ws->width - (flushright_size.x + mw->menu.shadow_thickness);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 if (new_x > where.x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 where.x = new_x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 /* We know what we need; don't draw this item. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 }
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 (highlighted_p && highlighted_pos)
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 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 highlighted_pos->x = where.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 highlighted_pos->y = where.y;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 just_compute_this_one_p =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 just_compute_p || ((this || that) && val != this && val != that);
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 start.x = where.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 start.y = where.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 display_menu_item (mw, val, ws, &where, highlighted_p, horizontal_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 just_compute_this_one_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 if (highlighted_p && highlighted_pos)
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 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 highlighted_pos->y = ws->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 highlighted_pos->x = ws->width;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 if (hit && !*hit_return)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 if (horizontal_p && hit->x > start.x && hit->x <= where.x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 *hit_return = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 else if (!horizontal_p && hit->y > start.y && hit->y <= where.y)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 *hit_return = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298 where.y = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 where.x = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 /* Draw slab edges around menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 if (!just_compute_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 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
2306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 /* Motion code */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 set_new_state (XlwMenuWidget mw, widget_value *val, int level)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 mw->menu.new_depth = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 for (i = 0; i < level; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 push_new_stack (mw, mw->menu.old_stack [i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 if (val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 push_new_stack (mw, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 }
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 make_windows_if_needed (XlwMenuWidget mw, int n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 int start_at;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 XSetWindowAttributes xswa;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 Widget p;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
2328 unsigned long mask;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 int depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 Visual *visual;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 window_state *windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 Window root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334 if (mw->menu.windows_length >= n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 return;
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 root = RootWindowOfScreen (XtScreen(mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 /* grab the visual and depth from the nearest shell ancestor */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 visual = CopyFromParent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 depth = CopyFromParent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341 p = XtParent(mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 while (visual == CopyFromParent && p)
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 if (XtIsShell(p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 visual = ((ShellWidget)p)->shell.visual;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 depth = p->core.depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 p = XtParent(p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 xswa.save_under = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 xswa.override_redirect = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 xswa.background_pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 xswa.border_pixel = mw->core.border_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 xswa.event_mask = (ExposureMask | ButtonMotionMask
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 | ButtonReleaseMask | ButtonPressMask);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 xswa.cursor = mw->menu.cursor_shape;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 xswa.colormap = mw->core.colormap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 mask = CWSaveUnder | CWOverrideRedirect | CWBackPixel | CWBorderPixel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 | CWEventMask | CWCursor | CWColormap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 if (mw->menu.use_backing_store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 xswa.backing_store = Always;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 mask |= CWBackingStore;
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 if (!mw->menu.windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 mw->menu.windows =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 (window_state *) XtMalloc (n * sizeof (window_state));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 start_at = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 else
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 mw->menu.windows =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 (window_state *) XtRealloc ((char *) mw->menu.windows,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 n * sizeof (window_state));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 start_at = mw->menu.windows_length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 mw->menu.windows_length = n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 windows = mw->menu.windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 for (i = start_at; i < n; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 windows [i].x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 windows [i].y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 windows [i].width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 windows [i].height = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 windows [i].window =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 XCreateWindow (XtDisplay (mw),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 root,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 0, 0, 1, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 0, depth, CopyFromParent, visual, mask, &xswa);
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 /* Make the window fit in the screen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 fit_to_screen (XlwMenuWidget mw, window_state *ws, window_state *previous_ws,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 Boolean horizontal_p)
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 int screen_width = WidthOfScreen (XtScreen (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 int screen_height = HeightOfScreen (XtScreen (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 if (ws->x < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 ws->x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 else if ((int) (ws->x + ws->width) > screen_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 if (!horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 ws->x = previous_ws->x - ws->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 else
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->x = screen_width - ws->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 /* This check is to make sure we cut off the right side
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 instead of the left side if the menu is wider than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 screen. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 if (ws->x < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 ws->x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 if (ws->y < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 ws->y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 else if ((int) (ws->y + ws->height) > screen_height)
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 if (horizontal_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 /* A pulldown must either be entirely above or below the menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 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
2433 let's determine if it will fit above the menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 Only put it above if there is more room above than below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 Note shadow_thickness offset to allow for slab surround.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 if (ws->y > (screen_height / 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 ws->y = previous_ws->y - ws->height + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 ws->y = screen_height - ws->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 /* if it's taller than the screen, display the topmost part
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 that will fit, beginning at the top of the screen. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 if (ws->y < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 ws->y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 }
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 /* Updates old_stack from new_stack and redisplays. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453 remap_menubar (XlwMenuWidget mw)
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 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 int last_same;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 XPoint selection_position;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 int old_depth = mw->menu.old_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 int new_depth = mw->menu.new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 widget_value **old_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 widget_value **new_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 window_state *windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 widget_value *old_selection;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 widget_value *new_selection;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 /* Check that enough windows and old_stack are ready. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 make_windows_if_needed (mw, new_depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 make_old_stack_space (mw, new_depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 windows = mw->menu.windows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 old_stack = mw->menu.old_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 new_stack = mw->menu.new_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 /* compute the last identical different entry */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 for (i = 1; i < old_depth && i < new_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 if (old_stack [i] != new_stack [i])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 last_same = i - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 if (lw_menu_accelerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 && last_same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 && last_same == old_depth - 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 && old_stack [last_same]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 last_same--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 /* Memorize the previously selected item to be able to refresh it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 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
2487 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
2488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 /* 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
2490 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
2491 for (i = last_same + 1; i < new_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 old_stack [i] = new_stack [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 mw->menu.old_depth = new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
2496 /* refresh the last selection */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 selection_position.x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 selection_position.y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 display_menu (mw, last_same, new_selection == old_selection,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 &selection_position, NULL, NULL, old_selection, new_selection);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 /* Now popup the new menus */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 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
2504 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 window_state *previous_ws = &windows [i - 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 window_state *ws = &windows [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 if (lw_menu_accelerate && i == new_depth - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 ws->x = previous_ws->x + selection_position.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 ws->y = previous_ws->y + selection_position.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 /* take into account the slab around the new menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 ws->y -= mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 widget_value *val = mw->menu.old_stack [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 if (val->contents->type == INCREMENTAL_TYPE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 /* okay, we're now doing a lisp callback to incrementally generate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 more of the menu. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 XtCallCallbackList ((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 mw->menu.open,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 (XtPointer)val->contents);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 }
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 size_menu (mw, i);
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 fit_to_screen (mw, ws, previous_ws, mw->menu.horizontal && i == 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 XClearWindow (XtDisplay (mw), ws->window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 XMoveResizeWindow (XtDisplay (mw), ws->window, ws->x, ws->y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 ws->width, ws->height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 XMapRaised (XtDisplay (mw), ws->window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 display_menu (mw, i, False, &selection_position, NULL, NULL, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 /* unmap the menus that popped down */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 last_same = new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 if (lw_menu_accelerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 && last_same > 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 && new_stack [last_same - 1]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 last_same--;
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 for (i = last_same - 1; i < old_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 if (i >= last_same || !new_stack [i]->contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 XUnmapWindow (XtDisplay (mw), windows [i].window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 motion_event_is_in_menu (XlwMenuWidget mw, XMotionEvent *ev, int level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 XPoint *relative_pos)
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 window_state *ws = &mw->menu.windows [level];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558 int x = level == 0 ? ws->x : ws->x + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 int y = level == 0 ? ws->y : ws->y + mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 relative_pos->x = ev->x_root - x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 relative_pos->y = ev->y_root - y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 return (x < ev->x_root && ev->x_root < (int) (x + ws->width) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563 y < ev->y_root && ev->y_root < (int) (y + ws->height));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 }
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 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 map_event_to_widget_value (XlwMenuWidget mw, XMotionEvent *ev,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 widget_value **val_ptr, int *level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 Boolean *inside_menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 XPoint relative_pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 window_state* ws;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 *val_ptr = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 *inside_menu = False;
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 /* Find the window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 #if 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 for (i = mw->menu.old_depth - 1; i >= 0; i--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 for (i = 0; i <= mw->menu.old_depth - 1; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 #endif
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 ws = &mw->menu.windows [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 if (ws && motion_event_is_in_menu (mw, ev, i, &relative_pos))
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 *inside_menu = True; /* special logic for menubar below... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 if ((ev->type == ButtonPress) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 (ev->state != 0))
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 display_menu (mw, i, True, NULL, &relative_pos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 val_ptr, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 if (*val_ptr)
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 *level = i + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 *inside_menu = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 return True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 else if (mw->menu.horizontal || i == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 /* if we're clicking on empty part of the menubar, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 unpost the stay-up menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 *inside_menu = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 }
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 return False;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 /* Procedures */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 make_drawing_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 XGCValues xgcv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 unsigned long flags = (GCFont | GCForeground | GCBackground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 xgcv.font = default_font_of_font_list (mw->menu.font_list)->fid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 xgcv.font = mw->menu.font->fid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 xgcv.foreground = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 xgcv.background = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 mw->menu.background_gc = XtGetGC ((Widget) mw, flags, &xgcv);
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 xgcv.foreground = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 mw->menu.foreground_gc = XtGetGC ((Widget) mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 if (mw->menu.select_color != (Pixel)-1)
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 xgcv.foreground = mw->menu.select_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 Display *dpy = XtDisplay(mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 if (CellsOfScreen(DefaultScreenOfDisplay(dpy)) <= 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 { /* mono */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 xgcv.foreground = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 { /* color */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 XColor xcolor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 Colormap cmap = mw->core.colormap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 xcolor.pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 XQueryColor (dpy, cmap, &xcolor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 xcolor.red = (xcolor.red * 17) / 20;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 xcolor.green = (xcolor.green * 17) / 20;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 xcolor.blue = (xcolor.blue * 17) / 20;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 if (allocate_nearest_color (dpy, cmap, &xcolor))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 xgcv.foreground = xcolor.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 mw->menu.select_gc = XtGetGC ((Widget)mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 xgcv.foreground = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 xgcv.fill_style = FillStippled;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 xgcv.stipple = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 mw->menu.inactive_gc = XtGetGC ((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 (flags | GCFillStyle | GCStipple),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 xgcv.foreground = mw->menu.highlight_foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 mw->menu.highlight_gc = XtGetGC ((Widget)mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 xgcv.foreground = mw->menu.title_foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 mw->menu.title_gc = XtGetGC ((Widget)mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 xgcv.foreground = mw->menu.button_foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 mw->menu.button_gc = XtGetGC ((Widget)mw, flags, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 xgcv.fill_style = FillStippled;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 xgcv.stipple = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 mw->menu.inactive_button_gc = XtGetGC ((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 (flags | GCFillStyle | GCStipple),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 release_drawing_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 XtReleaseGC ((Widget) mw, mw->menu.foreground_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 XtReleaseGC ((Widget) mw, mw->menu.button_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 XtReleaseGC ((Widget) mw, mw->menu.highlight_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693 XtReleaseGC ((Widget) mw, mw->menu.title_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 XtReleaseGC ((Widget) mw, mw->menu.inactive_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696 XtReleaseGC ((Widget) mw, mw->menu.background_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 XtReleaseGC ((Widget) mw, mw->menu.select_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 /* let's get some segvs if we try to use these... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 mw->menu.foreground_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 mw->menu.button_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 mw->menu.highlight_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 mw->menu.title_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 mw->menu.inactive_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704 mw->menu.inactive_button_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 mw->menu.background_gc = (GC) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 mw->menu.select_gc = (GC) -1;
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 #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710 ? ((unsigned long) (x)) : ((unsigned long) (y)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 make_shadow_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 XGCValues xgcv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 unsigned long pm = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 Display *dpy = XtDisplay ((Widget) mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 Colormap cmap = mw->core.colormap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 XColor topc, botc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 int top_frobbed = 0, bottom_frobbed = 0;
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 if (mw->menu.top_shadow_color == (Pixel) (-1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 mw->menu.top_shadow_color = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 if (mw->menu.bottom_shadow_color == (Pixel) (-1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 mw->menu.bottom_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 if (mw->menu.top_shadow_color == mw->core.background_pixel ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 mw->menu.top_shadow_color == mw->menu.foreground)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 topc.pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 XQueryColor (dpy, cmap, &topc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 /* don't overflow/wrap! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 topc.red = MINL (65535, topc.red * 1.2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 topc.green = MINL (65535, topc.green * 1.2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735 topc.blue = MINL (65535, topc.blue * 1.2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 if (allocate_nearest_color (dpy, cmap, &topc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 if (topc.pixel == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 XFreeColors( dpy, cmap, &topc.pixel, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 topc.red = MINL (65535, topc.red + 0x8000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 topc.green = MINL (65535, topc.green + 0x8000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 topc.blue = MINL (65535, topc.blue + 0x8000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 if (allocate_nearest_color (dpy, cmap, &topc))
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 mw->menu.top_shadow_color = topc.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 else
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 mw->menu.top_shadow_color = topc.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 top_frobbed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 if (mw->menu.bottom_shadow_color == mw->menu.foreground ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 mw->menu.bottom_shadow_color == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 botc.pixel = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 XQueryColor (dpy, cmap, &botc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 botc.red = (botc.red * 3) / 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 botc.green = (botc.green * 3) / 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 botc.blue = (botc.blue * 3) / 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 if (allocate_nearest_color (dpy, cmap, &botc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 if (botc.pixel == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769 XFreeColors (dpy, cmap, &botc.pixel, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 botc.red = MINL (65535, botc.red + 0x4000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 botc.green = MINL (65535, botc.green + 0x4000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 botc.blue = MINL (65535, botc.blue + 0x4000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 if (allocate_nearest_color (dpy, cmap, &botc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 mw->menu.bottom_shadow_color = botc.pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 else
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 mw->menu.bottom_shadow_color = botc.pixel;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 bottom_frobbed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 }
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 if (top_frobbed && bottom_frobbed)
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 int top_avg = ((topc.red / 3) + (topc.green / 3) + (topc.blue / 3));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 int bot_avg = ((botc.red / 3) + (botc.green / 3) + (botc.blue / 3));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791 if (bot_avg > top_avg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 Pixel tmp = mw->menu.top_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 mw->menu.top_shadow_color = mw->menu.bottom_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 mw->menu.bottom_shadow_color = tmp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 else if (topc.pixel == botc.pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 if (botc.pixel == mw->menu.foreground)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800 mw->menu.top_shadow_color = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 mw->menu.bottom_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 if (!mw->menu.top_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 mw->menu.top_shadow_color == mw->core.background_pixel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 mw->menu.top_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 if (!mw->menu.bottom_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 mw->menu.bottom_shadow_color == mw->core.background_pixel)
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 mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 mw->menu.bottom_shadow_color = mw->menu.foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 }
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 xgcv.fill_style = FillOpaqueStippled;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 xgcv.foreground = mw->menu.top_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 xgcv.background = mw->core.background_pixel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 /* xgcv.stipple = mw->menu.top_shadow_pixmap; gtb */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 if (mw->menu.top_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 mw->menu.top_shadow_pixmap != XmUNSPECIFIED_PIXMAP)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 xgcv.stipple = mw->menu.top_shadow_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 xgcv.stipple = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 mw->menu.shadow_top_gc =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 XtGetGC((Widget)mw, GCForeground|GCBackground|pm, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 xgcv.foreground = mw->menu.bottom_shadow_color;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 /* xgcv.stipple = mw->menu.bottom_shadow_pixmap; gtb */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 if (mw->menu.bottom_shadow_pixmap &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 mw->menu.bottom_shadow_pixmap != XmUNSPECIFIED_PIXMAP)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 xgcv.stipple = mw->menu.bottom_shadow_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 xgcv.stipple = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 mw->menu.shadow_bottom_gc =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 XtGetGC ((Widget)mw, GCForeground|GCBackground|pm, &xgcv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 release_shadow_gcs (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 extract_font_extents (XlwMenuWidget mw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857 /* Find the maximal ascent/descent of the fonts in the font list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 so that all menu items can be the same height... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 mw->menu.font_ascent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 mw->menu.font_descent = 0;
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 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863 XmFontContext context;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 XmFontListEntry fontentry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 XmStringCharSet charset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869 XFontStruct *font;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 if (! XmFontListInitFontContext (&context, mw->menu.font_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 /* 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
2875 specifically, in _XmGetFirstFont()) that can cause a null pointer to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876 passed to XFontsOfFontSet. Use XmFontListNextEntry(), which is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 newer equivalent, instead. Also, it supports font sets, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 older function doesn't. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 while ((fontentry = XmFontListNextEntry (context)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 XmFontType rettype;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 XtPointer one_of_them = XmFontListEntryGetFont (fontentry, &rettype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 if (rettype == XmFONT_IS_FONTSET)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 XFontSet fontset = (XFontSet) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 XFontStruct **fontstruct_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 char **fontname_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 int fontcount = XFontsOfFontSet (fontset, &fontstruct_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 &fontname_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 while (--fontcount >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 font = fontstruct_list[fontcount];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 mw->menu.font_descent = font->descent;
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 else /* XmFONT_IS_FONT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 font = (XFontStruct *) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 mw->menu.font_descent = font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 #else /* motif 1.1 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 while (XmFontListGetNextFont (context, &charset, &font))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 mw->menu.font_descent = font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 XtFree (charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 #endif /* Motif version */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 XmFontListFreeFontContext (context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 #else /* Not Motif */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 # ifdef USE_XFONTSET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 XFontStruct **fontstruct_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 char **fontname_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 XFontStruct *font;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 int fontcount = XFontsOfFontSet(mw->menu.font_set, &fontstruct_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 &fontname_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 mw->menu.font_ascent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 mw->menu.font_descent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 # if 0 /* nasty, personal debug, Kazz */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 fprintf(stderr, "fontSet count is %d\n", fontcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 while (--fontcount >= 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 font = fontstruct_list[fontcount];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 if (font->ascent > (int) mw->menu.font_ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 mw->menu.font_ascent = font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 if (font->descent > (int) mw->menu.font_descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 mw->menu.font_descent = font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 # else /* ! USE_XFONTSET */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 mw->menu.font_ascent = mw->menu.font->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 mw->menu.font_descent = mw->menu.font->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 #endif /* NEED_MOTIF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 }
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 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 static XFontStruct *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 default_font_of_font_list (XmFontList font_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 XFontStruct *font = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 # if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 /* Xm/Label.c does this: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 _XmFontListGetDefaultFont (font_list, &font);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 # else /* !0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 XmFontContext context;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 XmFontListEntry fontentry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 XmFontType rettype;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 XtPointer one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 XmStringCharSet charset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 #endif
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 (! XmFontListInitFontContext (&context, font_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 #if (XmVersion >= 1002)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 /* 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
2970 specifically, in _XmGetFirstFont()) that can cause a null pointer to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 passed to XFontsOfFontSet. Use XmFontListNextEntry(), which is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 newer equivalent, instead. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 fontentry = XmFontListNextEntry (context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 one_of_them = XmFontListEntryGetFont (fontentry, &rettype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 if (rettype == XmFONT_IS_FONTSET)
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 XFontSet fontset = (XFontSet) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 XFontStruct **fontstruct_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 char **fontname_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 (void) XFontsOfFontSet (fontset, &fontstruct_list, &fontname_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981 font = fontstruct_list[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 else /* XmFONT_IS_FONT */
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 font = (XFontStruct *) one_of_them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 if (! XmFontListGetNextFont (context, &charset, &font))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 XtFree (charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 XmFontListFreeFontContext (context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 # endif /* !0 */
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 if (! font) abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 return font;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 #endif /* NEED_MOTIF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 XlwMenuInitialize (Widget request, Widget new, ArgList args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 Cardinal *num_args)
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 /* Get the GCs and the widget size */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 XlwMenuWidget mw = (XlwMenuWidget)new;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 Window window = RootWindowOfScreen (DefaultScreenOfDisplay (XtDisplay (mw)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 Display *display = XtDisplay (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 /* mw->menu.cursor = XCreateFontCursor (display, mw->menu.cursor_shape); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 mw->menu.cursor = mw->menu.cursor_shape;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 mw->menu.gray_pixmap =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 XCreatePixmapFromBitmapData (display, window, (char *) gray_bits,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 gray_width, gray_height, 1, 0, 1);
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 #ifdef NEED_MOTIF
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
3018 /* #### 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
3019 X Font Sets. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 /* The menu.font_list slot came from the *fontList resource (Motif standard.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 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
3022 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
3023 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
3024 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
3025 use the "fallback" value. What a kludge!!!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 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
3028 will override a more specific resource like "Emacs*menubar.font:". But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 I can't think of a way around that.
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 if (mw->menu.font_list) /* if *fontList is specified, use that */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 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
3034 mw->menu.font_list = mw->menu.font_list_2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 else /* otherwise use default */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 mw->menu.font_list = mw->menu.fallback_font_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 make_drawing_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 make_shadow_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 extract_font_extents (mw);
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 mw->menu.popped_up = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 mw->menu.next_release_must_exit = False;
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 mw->menu.old_depth = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 mw->menu.old_stack = XtNew (widget_value*);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 mw->menu.old_stack_length = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 mw->menu.old_stack [0] = mw->menu.contents;
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 mw->menu.new_depth = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 mw->menu.new_stack = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 mw->menu.new_stack_length = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 push_new_stack (mw, mw->menu.contents);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 mw->menu.windows = XtNew (window_state);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 mw->menu.windows_length = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 mw->menu.windows [0].x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 mw->menu.windows [0].y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 mw->menu.windows [0].width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 mw->menu.windows [0].height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 size_menu (mw, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 mw->core.width = mw->menu.windows [0].width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 mw->core.height = mw->menu.windows [0].height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070 XlwMenuClassInitialize (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 initialize_massaged_resource_char();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076 XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 XSetWindowAttributes xswa;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
3080 unsigned long mask;
428
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 (*xlwMenuWidgetClass->core_class.superclass->core_class.realize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 (w, valueMask, attributes);
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 xswa.save_under = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 xswa.cursor = mw->menu.cursor_shape;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 mask = CWSaveUnder | CWCursor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 if (mw->menu.use_backing_store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 xswa.backing_store = Always;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 mask |= CWBackingStore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 XChangeWindowAttributes (XtDisplay (w), XtWindow (w), mask, &xswa);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 mw->menu.windows [0].window = XtWindow (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 mw->menu.windows [0].x = w->core.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 mw->menu.windows [0].y = w->core.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 mw->menu.windows [0].width = w->core.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 mw->menu.windows [0].height = w->core.height;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 /* 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
3103 receives expose events through Xt. So we repaint all the other panes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 when receiving an Expose event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 XlwMenuRedisplay (Widget w, XEvent *ev, Region region)
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 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 int i;
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 (mw->core.being_destroyed) return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 for (i = 0; i < mw->menu.old_depth; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 display_menu (mw, i, False, NULL, NULL, NULL, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 set_new_state (mw, NULL, mw->menu.old_depth); /* #### - ??? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 remap_menubar (mw); /* #### - do these two lines do anything? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 XlwMenuDestroy (Widget w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 XlwMenuWidget mw = (XlwMenuWidget) w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 if (mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127 XtUngrabPointer (w, CurrentTime);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 release_drawing_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 release_shadow_gcs (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 /* this doesn't come from the resource db but is created explicitly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 so we must free it ourselves. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 XFreePixmap (XtDisplay (mw), mw->menu.gray_pixmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 mw->menu.gray_pixmap = (Pixmap) -1;
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 /* Don't free mw->menu.contents because that comes from our creator.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 The `*_stack' elements are just pointers into `contents' so leave
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 that alone too. But free the stacks themselves. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 if (mw->menu.old_stack) XtFree ((char *) mw->menu.old_stack);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 if (mw->menu.new_stack) XtFree ((char *) mw->menu.new_stack);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 /* Remember, you can't free anything that came from the resource
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 database. This includes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 mw->menu.cursor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 mw->menu.top_shadow_pixmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 mw->menu.bottom_shadow_pixmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 mw->menu.font
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 mw->menu.font_set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 Also the color cells of top_shadow_color, bottom_shadow_color,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 foreground, and button_foreground will never be freed until this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 client exits. Nice, eh?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 /* 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
3158 for (i = 1; i < mw->menu.windows_length; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 XDestroyWindow (XtDisplay (mw), mw->menu.windows [i].window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 if (mw->menu.windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 XtFree ((char *) mw->menu.windows);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 static Boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 XlwMenuSetValues (Widget current, Widget request, Widget new, ArgList args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 Cardinal *num_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 XlwMenuWidget oldmw = (XlwMenuWidget)current;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169 XlwMenuWidget newmw = (XlwMenuWidget)new;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 Boolean redisplay = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 if (newmw->menu.contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 && newmw->menu.contents->contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 && newmw->menu.contents->contents->change >= VISIBLE_CHANGE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 redisplay = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 if (newmw->core.background_pixel != oldmw->core.background_pixel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179 || newmw->menu.foreground != oldmw->menu.foreground
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 /* For the XEditResource protocol, which may want to change the font. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 #ifdef NEED_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 || newmw->menu.font_list != oldmw->menu.font_list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 || newmw->menu.font_list_2 != oldmw->menu.font_list_2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 || newmw->menu.fallback_font_list != oldmw->menu.fallback_font_list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 || newmw->menu.font != oldmw->menu.font
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 #endif
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 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 release_drawing_gcs (newmw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 make_drawing_gcs (newmw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 redisplay = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 for (i = 0; i < oldmw->menu.windows_length; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 XSetWindowBackground (XtDisplay (oldmw),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 oldmw->menu.windows [i].window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198 newmw->core.background_pixel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199 /* clear windows and generate expose events */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200 XClearArea (XtDisplay (oldmw), oldmw->menu.windows[i].window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201 0, 0, 0, 0, True);
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 }
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 return redisplay;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 XlwMenuResize (Widget w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 mw->menu.windows [0].width = mw->core.width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 mw->menu.windows [0].height = mw->core.height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 }
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 /* Action procedures */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 handle_single_motion_event (XlwMenuWidget mw, XMotionEvent *ev,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220 Boolean select_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3221 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 widget_value *val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 Boolean stay_up;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 int level;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 if (!map_event_to_widget_value (mw, ev, &val, &level, &stay_up))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228 /* 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
3229 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
3230 a disabled menu item */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 pop_new_stack_if_no_contents (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 if (select_p && !stay_up) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 /* pop down all menus and exit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 set_new_state(mw, (val = NULL), 1);
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 /* 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
3241 (b) a menu item that is not disabled is highlighted */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 if (select_p && mw->menu.bounce_down
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 && close_to_reference_time((Widget)mw,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 mw->menu.menu_bounce_time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245 (XEvent *)ev))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 /* motion can cause more than one event. Don't bounce right back
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 up if we've just bounced down. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 val = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 else if (select_p && mw->menu.bounce_down &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 mw->menu.last_selected_val &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 (mw->menu.last_selected_val == val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 val = NULL; /* assigned to mw->last_selected_val below */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 mw->menu.menu_bounce_time = ev->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 /* 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
3258 last time and the XlwMenu.bounceDown resource is set, if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 item is on the menubar itself, then exit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 if (level == (mw->menu.popped_up ? 0 : 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 mw->menu.menu_bounce_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 set_new_state (mw, val, level);
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.last_selected_val = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 /* Sync with the display. Makes it feel better on X terms. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 XFlush (XtDisplay (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 handle_motion_event (XlwMenuWidget mw, XMotionEvent *ev,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 Boolean select_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278 int x = ev->x_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 int y = ev->y_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 unsigned int state = ev->state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 XMotionEvent *event= ev, dummy;
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 /* allow motion events to be generated again */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 dummy.window = ev->window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 if (ev->is_hint
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 && XQueryPointer (XtDisplay (mw), dummy.window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 &dummy.root, &dummy.subwindow,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 &dummy.x_root, &dummy.y_root,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 &dummy.x, &dummy.y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 &dummy.state)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 && dummy.state == state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 && (dummy.x_root != x || dummy.y_root != y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 /* don't handle the event twice or that breaks bounce_down. --Stig */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 dummy.type = ev->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 event = &dummy;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 lw_menu_accelerate = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 handle_single_motion_event (mw, event, select_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 Time x_focus_timestamp_really_sucks_fix_me_better;
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 Start (Widget w, XEvent *ev, String *params, Cardinal *num_params)
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 XlwMenuWidget mw = (XlwMenuWidget)w;
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 lw_menubar_widget = w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 lw_menu_active = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314 if (!mw->menu.pointer_grabbed)
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 mw->menu.menu_post_time = ev->xbutton.time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 mw->menu.menu_bounce_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 mw->menu.last_selected_val = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320 x_focus_timestamp_really_sucks_fix_me_better =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 ((XButtonPressedEvent*)ev)->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322 XtCallCallbackList ((Widget)mw, mw->menu.open, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 /* notes the absolute position of the menubar window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325 mw->menu.windows [0].x = ev->xmotion.x_root - ev->xmotion.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 mw->menu.windows [0].y = ev->xmotion.y_root - ev->xmotion.y;
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 XtGrabPointer ((Widget)mw, False,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 (ButtonMotionMask | ButtonReleaseMask | ButtonPressMask),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 GrabModeAsync, GrabModeAsync,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 None, mw->menu.cursor_shape,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 ((XButtonPressedEvent*)ev)->time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333 mw->menu.pointer_grabbed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 /* handles the down like a move, slots are mostly compatible */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 handle_motion_event (mw, &ev->xmotion, True);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 }
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 Drag (Widget w, XEvent *ev, String *params, Cardinal *num_params)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 handle_motion_event (mw, &ev->xmotion, False);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3348 Select (Widget w, XEvent *ev, String *params, Cardinal *num_params)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3349 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3350 XlwMenuWidget mw = (XlwMenuWidget)w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 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
3352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 lw_menu_accelerate = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 /* If user releases the button quickly, without selecting anything,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 after the initial down-click that brought the menu up,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357 do nothing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 if ((selected_item == 0 || selected_item->call_data == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359 && (!mw->menu.next_release_must_exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 || close_to_reference_time(w, mw->menu.menu_post_time, ev)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 mw->menu.next_release_must_exit = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366 /* pop down everything */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 mw->menu.new_depth = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 /* Destroy() only gets called for popup menus. Menubar widgets aren't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371 destroyed when their menu panes get nuked. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 if (mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 XtUngrabPointer ((Widget)w, ev->xmotion.time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 }
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 if (mw->menu.popped_up)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 mw->menu.popped_up = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 XtPopdown (XtParent (mw));
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384 lw_menu_active = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 x_focus_timestamp_really_sucks_fix_me_better =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 ((XButtonPressedEvent*)ev)->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 /* callback */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 XtCallCallbackList ((Widget) mw, mw->menu.select, (XtPointer) selected_item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 }
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 /* Action procedures for keyboard accelerators */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 /* set the menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397 xlw_set_menu (Widget w, widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3398 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 lw_menubar_widget = w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400 set_new_state ((XlwMenuWidget)w, val, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3401 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3403 /* prepare the menu structure via the call-backs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405 xlw_map_menu (Time t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
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 lw_menu_accelerate = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3411 if (!mw->menu.pointer_grabbed)
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 XWindowAttributes ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414 Window parent,root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415 Window *waste;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 unsigned int num_waste;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 lw_menu_active = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 mw->menu.menu_post_time = t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 mw->menu.menu_bounce_time = 0;
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 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 mw->menu.last_selected_val = NULL;
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 XtCallCallbackList ((Widget)mw, mw->menu.open, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 /* do this for keyboards too! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429 /* notes the absolute position of the menubar window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431 mw->menu.windows [0].x = ev->xmotion.x_root - ev->xmotion.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 mw->menu.windows [0].y = ev->xmotion.y_root - ev->xmotion.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 */
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 /* get the geometry of the menubar */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 /* there has to be a better way than this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 mw->menu.windows [0].x = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 mw->menu.windows [0].y = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 parent = XtWindow (lw_menubar_widget);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3443 do
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 XGetWindowAttributes (XtDisplay (lw_menubar_widget), parent, &ret);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 mw->menu.windows [0].x += ret.x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447 mw->menu.windows [0].y += ret.y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 if (parent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 XQueryTree (XtDisplay (lw_menubar_widget), parent, &root, &parent, &waste,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 &num_waste);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 if (waste)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 XFree (waste);
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 while (parent != root);
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 XtGrabPointer ((Widget)mw, False,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 (ButtonMotionMask | ButtonReleaseMask | ButtonPressMask),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 GrabModeAsync, GrabModeAsync,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 None, mw->menu.cursor_shape, t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 mw->menu.pointer_grabbed = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 /* display the stupid menu already */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 xlw_display_menu (Time t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473 lw_menu_accelerate = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 /* Sync with the display. Makes it feel better on X terms. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 XFlush (XtDisplay (mw));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 /* push a sub menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 xlw_push_menu (widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 push_new_stack ((XlwMenuWidget)lw_menubar_widget, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 /* pop a sub menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 xlw_pop_menu (void)
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 if (((XlwMenuWidget)lw_menubar_widget)->menu.new_depth > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 ((XlwMenuWidget)lw_menubar_widget)->menu.new_depth --;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 xlw_kill_menus (widget_value *val)
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 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 lw_menu_accelerate = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3506 mw->menu.new_depth = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 remap_menubar (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 if (mw->menu.pointer_grabbed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 XtUngrabPointer (lw_menubar_widget, CurrentTime);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 mw->menu.pointer_grabbed = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 lw_menu_active = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 XtCallCallbackList (lw_menubar_widget, mw->menu.select, (XtPointer)val);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 /* set the menu item */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 xlw_set_item (widget_value *val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 if (((XlwMenuWidget)lw_menubar_widget)->menu.new_depth > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 ((XlwMenuWidget) lw_menubar_widget)->menu.new_depth --;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525 push_new_stack ((XlwMenuWidget) lw_menubar_widget, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3526 }
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 /* 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
3529 widget_value *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 xlw_get_entries (int allp)
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 XlwMenuWidget mw = (XlwMenuWidget)lw_menubar_widget;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533 if (allp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 if (mw->menu.new_depth >= 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536 return mw->menu.new_stack [mw->menu.new_depth - 2]->contents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 return mw->menu.new_stack[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 if (mw->menu.new_depth >= 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 return mw->menu.new_stack [mw->menu.new_depth - 1];
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 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 xlw_menu_level (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 return ((XlwMenuWidget)lw_menubar_widget)->menu.new_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 /* Special code to pop-up a menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 xlw_pop_up_menu (XlwMenuWidget mw, XButtonPressedEvent *event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 int x = event->x_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559 int y = event->y_root;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560 int w;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3561 int h;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3562 int borderwidth = mw->menu.shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 Screen* screen = XtScreen (mw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 mw->menu.menu_post_time = event->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 mw->menu.menu_bounce_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567 mw->menu.next_release_must_exit = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 mw->menu.last_selected_val = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570 XtCallCallbackList ((Widget) mw, mw->menu.open, NULL);
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 size_menu (mw, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574 w = mw->menu.windows [0].width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 h = mw->menu.windows [0].height;
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 x -= borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 y -= borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580 if (x < borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 x = borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 if (x > WidthOfScreen (screen) - w - 2 * borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 x = WidthOfScreen (screen) - w - 2 * borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 if (y < borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587 y = borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 if (y > HeightOfScreen (screen) - h - 2 * borderwidth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 y = HeightOfScreen (screen) - h - 2 * borderwidth;
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 mw->menu.popped_up = True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 XtConfigureWidget (XtParent (mw), x, y, w, h,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 XtParent (mw)->core.border_width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595 XtPopup (XtParent (mw), XtGrabExclusive);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 display_menu (mw, 0, False, NULL, NULL, NULL, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597 if (!mw->menu.pointer_grabbed)
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 XtGrabPointer ((Widget)mw, False,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600 (ButtonMotionMask | ButtonReleaseMask | ButtonPressMask),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601 GrabModeAsync, GrabModeAsync,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 None, mw->menu.cursor_shape, event->time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 mw->menu.pointer_grabbed = True;
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 mw->menu.windows [0].x = x + borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607 mw->menu.windows [0].y = y + borderwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 handle_motion_event (mw, (XMotionEvent *) event, True);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 /* #### unused */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 #if 0
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 * This is a horrible function which should not be needed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616 * use it to put the resize method back the way the XlwMenu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 * class initializer put it. Motif screws with this when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 * the XlwMenu class gets instantiated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 xlw_unmunge_class_resize (Widget w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 if (w->core.widget_class->core_class.resize != XlwMenuResize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3624 w->core.widget_class->core_class.resize = XlwMenuResize;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3625 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627