aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Rumney <[email protected]>2000-03-01 20:49:16 +0000
committerJason Rumney <[email protected]>2000-03-01 20:49:16 +0000
commit37ad8b63556957c9ce2579096c1970f25d04f0bb (patch)
treef600c77d384de248c4627fd477875e07910d0257 /src
parentd77dae5c405ca87a46c3cb00cba3a2b3f19919eb (diff)
[HAVE_BOXES]: Remove #undef.
(single_keymap_panes): Remove code for simulating checkmarks. (single_menu_item): Remove notbuttons_ptr argument. Callers changed. Remove code for drawing simulated checkmarks. (w32_menu_show): make unibyte help string correctly. (add_menu_item): draw standard Windows checkmarks. Draw radio buttons as radio buttons if possible.
Diffstat (limited to 'src')
-rw-r--r--src/w32menu.c173
1 files changed, 39 insertions, 134 deletions
diff --git a/src/w32menu.c b/src/w32menu.c
index 3f7edcad05..73a2af6a5e 100644
--- a/src/w32menu.c
+++ b/src/w32menu.c
@@ -43,8 +43,7 @@ Boston, MA 02111-1307, USA. */
#include "dispextern.h"
#undef HAVE_MULTILINGUAL_MENU
-#undef HAVE_BOXES /* NTEMACS_TODO: Fix native checkmarks and radios. */
-#undef HAVE_DIALOGS /* NTEMACS_TODO: Fix native dialogs. */
+#undef HAVE_DIALOGS /* NTEMACS_TODO: Implement native dialogs. */
/******************************************************************/
/* Definitions copied from lwlib.h */
@@ -433,21 +432,12 @@ single_keymap_panes (keymap, pane_name, prefix, notreal, maxdepth)
Lisp_Object pending_maps = Qnil;
Lisp_Object tail, item;
struct gcpro gcpro1, gcpro2;
- int notbuttons = 0;
if (maxdepth <= 0)
return;
push_menu_pane (pane_name, prefix);
-#ifndef HAVE_BOXES
- /* Remember index for first item in this pane so we can go back and
- add a prefix when (if) we see the first button. After that, notbuttons
- is set to 0, to mark that we have seen a button and all non button
- items need a prefix. */
- notbuttons = menu_items_used;
-#endif
-
for (tail = keymap; CONSP (tail); tail = XCDR (tail))
{
GCPRO2 (keymap, pending_maps);
@@ -456,7 +446,7 @@ single_keymap_panes (keymap, pane_name, prefix, notreal, maxdepth)
item = XCAR (tail);
if (CONSP (item))
single_menu_item (XCAR (item), XCDR (item),
- &pending_maps, notreal, maxdepth, &notbuttons);
+ &pending_maps, notreal, maxdepth);
else if (VECTORP (item))
{
/* Loop over the char values represented in the vector. */
@@ -467,7 +457,7 @@ single_keymap_panes (keymap, pane_name, prefix, notreal, maxdepth)
Lisp_Object character;
XSETFASTINT (character, c);
single_menu_item (character, XVECTOR (item)->contents[c],
- &pending_maps, notreal, maxdepth, &notbuttons);
+ &pending_maps, notreal, maxdepth);
}
}
UNGCPRO;
@@ -495,18 +485,13 @@ single_keymap_panes (keymap, pane_name, prefix, notreal, maxdepth)
separate panes.
If NOTREAL is nonzero, only check for equivalent key bindings, don't
evaluate expressions in menu items and don't make any menu.
- If we encounter submenus deeper than MAXDEPTH levels, ignore them.
- NOTBUTTONS_PTR is only used when simulating toggle boxes and radio
- buttons. It points to variable notbuttons in single_keymap_panes,
- which keeps track of if we have seen a button in this menu or not. */
+ If we encounter submenus deeper than MAXDEPTH levels, ignore them. */
static void
-single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth,
- notbuttons_ptr)
+single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth)
Lisp_Object key, item;
Lisp_Object *pending_maps_ptr;
int maxdepth, notreal;
- int *notbuttons_ptr;
{
Lisp_Object map, item_string, enabled;
struct gcpro gcpro1, gcpro2;
@@ -542,75 +527,6 @@ single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth,
return;
}
-#ifndef HAVE_BOXES
- /* Simulate radio buttons and toggle boxes by putting a prefix in
- front of them. */
- {
- Lisp_Object prefix = Qnil;
- Lisp_Object type = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE];
- if (!NILP (type))
- {
- Lisp_Object selected
- = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED];
-
- if (*notbuttons_ptr)
- /* The first button. Line up previous items in this menu. */
- {
- int index = *notbuttons_ptr; /* Index for first item this menu. */
- int submenu = 0;
- Lisp_Object tem;
- while (index < menu_items_used)
- {
- tem
- = XVECTOR (menu_items)->contents[index + MENU_ITEMS_ITEM_NAME];
- if (NILP (tem))
- {
- index++;
- submenu++; /* Skip sub menu. */
- }
- else if (EQ (tem, Qlambda))
- {
- index++;
- submenu--; /* End sub menu. */
- }
- else if (EQ (tem, Qt))
- index += 3; /* Skip new pane marker. */
- else if (EQ (tem, Qquote))
- index++; /* Skip a left, right divider. */
- else
- {
- if (!submenu && XSTRING (tem)->data[0] != '\0'
- && XSTRING (tem)->data[0] != '-')
- XVECTOR (menu_items)->contents[index + MENU_ITEMS_ITEM_NAME]
- = concat2 (build_string (" "), tem);
- index += MENU_ITEMS_ITEM_LENGTH;
- }
- }
- *notbuttons_ptr = 0;
- }
-
- /* Calculate prefix, if any, for this item. */
- if (EQ (type, QCtoggle))
- prefix = build_string (NILP (selected) ? "[ ] " : "[X] ");
- else if (EQ (type, QCradio))
- prefix = build_string (NILP (selected) ? "( ) " : "(*) ");
- }
- /* Not a button. If we have earlier buttons, then we need a prefix. */
- else if (!*notbuttons_ptr && XSTRING (item_string)->data[0] != '\0'
- && XSTRING (item_string)->data[0] != '-')
- prefix = build_string (" ");
-
- if (!NILP (prefix))
- item_string = concat2 (prefix, item_string);
- }
-#endif /* HAVE_BOXES */
-
-#if 0
- if (!NILP(map))
- /* Indicate visually that this is a submenu. */
- item_string = concat2 (item_string, build_string (" >"));
-#endif
-
push_menu_item (item_string, enabled, key,
XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF],
XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ],
@@ -618,7 +534,6 @@ single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth,
XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED],
XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP]);
-#if 1
/* Display a submenu using the toolkit. */
if (! (NILP (map) || NILP (enabled)))
{
@@ -626,7 +541,6 @@ single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth,
single_keymap_panes (map, Qnil, key, 0, maxdepth - 1);
push_submenu_end ();
}
-#endif
}
/* Push all the panes and items of a menu described by the
@@ -1769,7 +1683,7 @@ w32_menu_show (f, x, y, for_click, keymaps, title, error)
if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
descrip = string_make_unibyte (descrip);
if (STRINGP (help) && STRING_MULTIBYTE (help))
- help_string = string_make_unibyte (help);
+ help = string_make_unibyte (help);
#endif
help_string = STRINGP (help) ? XSTRING (help)->data : NULL;
@@ -2126,6 +2040,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
{
UINT fuFlags;
char *out_string;
+ int return_value;
if (name_is_separator (wv->name))
fuFlags = MF_SEPARATOR;
@@ -2155,55 +2070,45 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
fuFlags = MF_OWNERDRAW | MF_DISABLED;
}
-#ifdef HAVE_BOXES
/* Draw radio buttons and tickboxes. */
{
- switch (wv->button_type)
- {
- case BUTTON_TYPE_TOGGLE:
- CheckMenuItem (menu, (UINT)item,
- wv->selected ? MF_CHECKED : MF_UNCHECKED);
- break;
-
- case BUTTON_TYPE_RADIO:
- /* CheckMenuRadioItem does not exist on NT 3.51 and
- earlier. Fallback on CheckMenuItem. */
- {
- HMODULE user32 = GetModuleHandle ("user32.dll");
- FARPROC set_menu_item_info
- = GetProcAddress (user32, "SetMenuItemInfo");
- if (set_menu_item_info)
- {
- MENUITEMINFO info;
- bzero (&info, sizeof (info));
- info.cbSize = sizeof (info);
- info.fMask = MIIM_TYPE | MIIM_STATE;
- info.fType = MFT_RADIOCHECK;
- info.fState = wv->selected ? MFS_CHECKED : MFS_UNCHECKED;
-
- set_menu_item_info (menu, item, FALSE, &info);
- }
- else
- CheckMenuItem (menu, (UINT)item, wv->selected ?
- MF_CHECKED : MF_UNCHECKED);
- }
- break;
-
- default:
- CheckMenuItem (menu, (UINT)item, MF_UNCHECKED);
- break;
- }
+ if (wv->selected && (wv->button_type == BUTTON_TYPE_TOGGLE ||
+ wv->button_type == BUTTON_TYPE_RADIO))
+ fuFlags |= MF_CHECKED;
+ else
+ fuFlags |= MF_UNCHECKED;
}
-#endif
}
-
if (item != NULL)
fuFlags = MF_POPUP;
- return AppendMenu (menu,
- fuFlags,
- item != NULL ? (UINT) item : (UINT) wv->call_data,
- (fuFlags == MF_SEPARATOR) ? NULL: out_string );
+ return_value =
+ AppendMenu (menu,
+ fuFlags,
+ item != NULL ? (UINT) item : (UINT) wv->call_data,
+ (fuFlags == MF_SEPARATOR) ? NULL: out_string );
+
+ /* This must be done after the menu item is created. */
+ if (wv->button_type == BUTTON_TYPE_RADIO)
+ {
+ /* CheckMenuRadioItem allows us to differentiate TOGGLE and
+ RADIO items, but is not available on NT 3.51 and earlier. */
+ HMODULE user32 = GetModuleHandle ("user32.dll");
+ FARPROC set_menu_item_info = GetProcAddress (user32, "SetMenuItemInfo");
+
+ if (set_menu_item_info)
+ {
+ MENUITEMINFO info;
+ bzero (&info, sizeof (info));
+ info.cbSize = sizeof (info);
+ info.fMask = MIIM_TYPE | MIIM_STATE;
+ info.fType = MFT_RADIOCHECK;
+ info.fState = wv->selected ? MFS_CHECKED : MFS_UNCHECKED;
+ set_menu_item_info (menu, item, FALSE, &info);
+ }
+ }
+
+ return return_value;
}
/* Construct native Windows menu(bar) based on widget_value tree. */