428
+ − 1 /* mswindows GUI code. (menubars, scrollbars, toolbars, dialogs)
+ − 2 Copyright (C) 1998 Andy Piper.
1204
+ − 3 Copyright (C) 2002 Ben Wing.
428
+ − 4
+ − 5 This file is part of XEmacs.
+ − 6
+ − 7 XEmacs is free software; you can redistribute it and/or modify it
+ − 8 under the terms of the GNU General Public License as published by the
+ − 9 Free Software Foundation; either version 2, or (at your option) any
+ − 10 later version.
+ − 11
+ − 12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ − 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ − 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ − 15 for more details.
+ − 16
+ − 17 You should have received a copy of the GNU General Public License
+ − 18 along with XEmacs; see the file COPYING. If not, write to
+ − 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ − 20 Boston, MA 02111-1307, USA. */
+ − 21
+ − 22 /* Synched up with: Not in FSF. */
+ − 23
771
+ − 24 /* This file essentially Mule-ized (except perhaps some Unicode splitting).
+ − 25 5-2000. */
+ − 26
428
+ − 27 #include <config.h>
+ − 28 #include "lisp.h"
872
+ − 29 #include "console-msw-impl.h"
442
+ − 30 #include "redisplay.h"
428
+ − 31 #include "gui.h"
442
+ − 32 #include "glyphs.h"
872
+ − 33 #include "frame-impl.h"
428
+ − 34 #include "elhash.h"
442
+ − 35 #include "events.h"
440
+ − 36 #include "buffer.h"
428
+ − 37
+ − 38 /*
+ − 39 * Return value is Qt if we have dispatched the command,
+ − 40 * or Qnil if id has not been mapped to a callback.
+ − 41 * Window procedure may try other targets to route the
+ − 42 * command if we return nil
+ − 43 */
+ − 44 Lisp_Object
2286
+ − 45 mswindows_handle_gui_wm_command (struct frame *f, HWND UNUSED (ctrl),
+ − 46 LPARAM id)
428
+ − 47 {
+ − 48 /* Try to map the command id through the proper hash table */
442
+ − 49 Lisp_Object callback, callback_ex, image_instance, frame, event;
+ − 50
793
+ − 51 frame = wrap_frame (f);
428
+ − 52
826
+ − 53 image_instance = Fgethash (make_int_verify (id),
442
+ − 54 FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f), Qnil);
+ − 55 /* It is possible for a widget action to cause it to get out of sync
+ − 56 with its instantiator. Thus it is necessary to signal this
+ − 57 possibility. */
+ − 58 if (IMAGE_INSTANCEP (image_instance))
+ − 59 XIMAGE_INSTANCE_WIDGET_ACTION_OCCURRED (image_instance) = 1;
+ − 60 callback = Fgethash (make_int (id),
+ − 61 FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f), Qnil);
+ − 62 callback_ex = Fgethash (make_int (id),
+ − 63 FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f), Qnil);
428
+ − 64
442
+ − 65 if (!NILP (callback_ex) && !UNBOUNDP (callback_ex))
+ − 66 {
+ − 67 event = Fmake_event (Qnil, Qnil);
440
+ − 68
964
+ − 69 XSET_EVENT_TYPE (event, misc_user_event);
+ − 70 XSET_EVENT_CHANNEL (event, frame);
+ − 71 XSET_EVENT_TIMESTAMP (event, GetTickCount());
1204
+ − 72 XSET_EVENT_MISC_USER_FUNCTION (event, Qeval);
+ − 73 XSET_EVENT_MISC_USER_OBJECT (event,
964
+ − 74 list4 (Qfuncall, callback_ex, image_instance, event));
442
+ − 75 }
+ − 76 else if (NILP (callback) || UNBOUNDP (callback))
+ − 77 return Qnil;
+ − 78 else
+ − 79 {
+ − 80 Lisp_Object fn, arg;
440
+ − 81
442
+ − 82 event = Fmake_event (Qnil, Qnil);
440
+ − 83
442
+ − 84 get_gui_callback (callback, &fn, &arg);
964
+ − 85 XSET_EVENT_TYPE (event, misc_user_event);
+ − 86 XSET_EVENT_CHANNEL (event, frame);
+ − 87 XSET_EVENT_TIMESTAMP (event, GetTickCount());
1204
+ − 88 XSET_EVENT_MISC_USER_FUNCTION (event, fn);
+ − 89 XSET_EVENT_MISC_USER_OBJECT (event, arg);
442
+ − 90 }
+ − 91
+ − 92 mswindows_enqueue_dispatch_event (event);
+ − 93 /* The result of this evaluation could cause other instances to change so
+ − 94 enqueue an update callback to check this. */
+ − 95 enqueue_magic_eval_event (update_widget_instances, frame);
+ − 96 return Qt;
440
+ − 97 }
+ − 98
1204
+ − 99 /*
+ − 100 * Translate X accelerator syntax to win32 accelerator syntax.
+ − 101 * accel = (Ichar*) to receive the accelerator character
+ − 102 * or NULL to suppress accelerators in the menu or dialog item.
+ − 103 *
+ − 104 * %% is replaced with %
+ − 105 * if accel is NULL:
+ − 106 * %_ is removed.
+ − 107 * if accel is non-NULL:
+ − 108 * %_ is replaced with &.
+ − 109 * The accelerator character is passed back in *accel.
+ − 110 * (If there is no accelerator, it will be added on the first character.)
+ − 111 *
+ − 112 */
+ − 113
+ − 114 Lisp_Object
+ − 115 mswindows_translate_menu_or_dialog_item (Lisp_Object item, Ichar *accel)
+ − 116 {
+ − 117 Bytecount len = XSTRING_LENGTH (item);
2367
+ − 118 Ibyte *it = alloca_ibytes (2 * len + 42), *ptr = it;
1204
+ − 119
+ − 120 memcpy (ptr, XSTRING_DATA (item), len + 1);
+ − 121 if (accel)
+ − 122 *accel = '\0';
+ − 123
+ − 124 /* Escape '&' as '&&' */
+ − 125
+ − 126 while ((ptr = (Ibyte *) memchr (ptr, '&', len - (ptr - it))) != NULL)
+ − 127 {
+ − 128 memmove (ptr + 1, ptr, (len - (ptr - it)) + 1);
+ − 129 len++;
+ − 130 ptr += 2;
+ − 131 }
+ − 132
+ − 133 /* Replace XEmacs accelerator '%_' with Windows accelerator '&'
+ − 134 and `%%' with `%'. */
+ − 135 ptr = it;
+ − 136 while ((ptr = (Ibyte *) memchr (ptr, '%', len - (ptr - it))) != NULL)
+ − 137 {
+ − 138 if (*(ptr + 1) == '_')
+ − 139 {
+ − 140 if (accel)
+ − 141 {
+ − 142 *ptr = '&';
+ − 143 if (!*accel)
+ − 144 *accel = DOWNCASE (0, itext_ichar (ptr + 2));
+ − 145 memmove (ptr + 1, ptr + 2, len - (ptr - it + 2) + 1);
+ − 146 len--;
+ − 147 }
+ − 148 else /* Skip accelerator */
+ − 149 {
+ − 150 memmove (ptr, ptr + 2, len - (ptr - it + 2) + 1);
+ − 151 len -= 2;
+ − 152 }
+ − 153 }
+ − 154 else if (*(ptr + 1) == '%')
+ − 155 {
+ − 156 memmove (ptr + 1, ptr + 2, len - (ptr - it + 2) + 1);
+ − 157 len--;
+ − 158 ptr++;
+ − 159 }
+ − 160 else /* % on its own - shouldn't happen */
+ − 161 ptr++;
+ − 162 }
+ − 163
+ − 164 if (accel && !*accel)
+ − 165 {
+ − 166 /* Force a default accelerator */
+ − 167 ptr = it;
+ − 168 memmove (ptr + 1, ptr, len + 1);
+ − 169 *accel = DOWNCASE (0, itext_ichar (ptr + 1));
+ − 170 *ptr = '&';
+ − 171
+ − 172 len++;
+ − 173 }
+ − 174
+ − 175 return make_string (it, len);
+ − 176 }
+ − 177
440
+ − 178 void
+ − 179 syms_of_gui_mswindows (void)
+ − 180 {
+ − 181 }