Commit cf28cebc authored by Jan D's avatar Jan D

Fix menu bar activation with click for Motif/Lesstif.

* src/xdisp.c (pending_menu_activation): Remove extern declaration.
(prepare_menu_bars): Remove setting of pending_menu_activation.

* src/xmenu.c (pending_menu_activation): Remove.
(x_activate_menubar): Set popup_activated_flag for Xt also. Remove
setting of pending_menu_activation.
(set_frame_menubar): Remove check of pending_menu_activation.
Declare menubar_size before code.  Correct spelling in comment.

* src/xterm.c (xm_scroll_callback, x_process_timeouts): K&R => prototype.
(SET_SAVED_KEY_EVENT): Remove (not used).
(SET_SAVED_MENU_EVENT): Rename to SET_SAVED_BUTTON_EVENT and
remove size parameter.
(handle_one_xevent): Check popup_activated () for menu for Xt also.
Remove #ifdef USE_GTK around finish = X_EVENT_DROP.
Remove #ifdef USE_MOTIF code that did SET_SAVED_BUTTON_EVENT for
ButtonRelease.
parent ebd3d6af
2010-07-14 Jan Djärv <jan.h.d@swipnet.se>
* xterm.c (xm_scroll_callback, x_process_timeouts): K&R => prototype.
(SET_SAVED_KEY_EVENT): Remove (not used).
(SET_SAVED_MENU_EVENT): Rename to SET_SAVED_BUTTON_EVENT and
remove size parameter.
(handle_one_xevent): Check popup_activated () for menu for Xt also.
Remove #ifdef USE_GTK around finish = X_EVENT_DROP.
Remove #ifdef USE_MOTIF code that did SET_SAVED_BUTTON_EVENT for
ButtonRelease.
* xdisp.c (pending_menu_activation): Remove extern declaration.
(prepare_menu_bars): Remove setting of pending_menu_activation.
* xmenu.c (pending_menu_activation): Remove.
(x_activate_menubar): Set popup_activated_flag for Xt also. Remove
setting of pending_menu_activation.
(set_frame_menubar): Remove check of pending_menu_activation.
Declare menubar_size before code. Correct spelling in comment.
2010-07-14 Kenichi Handa <handa@m17n.org>
* font.c (font_open_entity): Cancel previous change.
......
......@@ -271,7 +271,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
|| defined(HAVE_NS) || defined (USE_GTK)
extern void set_frame_menubar (struct frame *f, int, int);
extern int pending_menu_activation;
#endif
extern int interrupt_input;
......@@ -9866,12 +9865,6 @@ prepare_menu_bars (void)
update_tool_bar (sf, 1);
#endif
}
/* Motif needs this. See comment in xmenu.c. Turn it off when
pending_menu_activation is not defined. */
#ifdef USE_X_TOOLKIT
pending_menu_activation = 0;
#endif
}
......
......@@ -151,14 +151,6 @@ extern widget_value *xmalloc_widget_value (void);
extern widget_value *digest_single_submenu (int, int, int);
#endif
/* This is set nonzero after the user activates the menu bar, and set
to zero again after the menu bars are redisplayed by prepare_menu_bar.
While it is nonzero, all calls to set_frame_menubar go deep.
I don't understand why this is needed, but it does seem to be
needed on Motif, according to Marcus Daniels <marcus@sysc.pdx.edu>. */
int pending_menu_activation;
#ifdef USE_X_TOOLKIT
......@@ -670,6 +662,7 @@ x_activate_menubar (FRAME_PTR f)
set_frame_menubar (f, 0, 1);
BLOCK_INPUT;
popup_activated_flag = 1;
#ifdef USE_GTK
/* If we click outside any menu item, the menu bar still grabs.
So we send Press and the Release. If outside, grab is released.
......@@ -681,15 +674,10 @@ x_activate_menubar (FRAME_PTR f)
f->output_data.x->saved_menu_event->type = ButtonPress;
XPutBackEvent (f->output_data.x->display_info->display,
f->output_data.x->saved_menu_event);
popup_activated_flag = 1;
#else
XtDispatchEvent (f->output_data.x->saved_menu_event);
#endif
UNBLOCK_INPUT;
#ifdef USE_MOTIF
if (f->output_data.x->saved_menu_event->type == ButtonRelease)
pending_menu_activation = 1;
#endif
/* Ignore this if we get it a second time. */
f->output_data.x->saved_menu_event->type = 0;
......@@ -991,8 +979,6 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p)
if (! menubar_widget)
deep_p = 1;
else if (pending_menu_activation && !deep_p)
deep_p = 1;
/* Make the first call for any given frame always go deep. */
else if (!f->output_data.x->saved_menu_event && !deep_p)
{
......@@ -1274,10 +1260,11 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p)
}
{
int menubar_size;
if (f->output_data.x->menubar_widget)
XtRealizeWidget (f->output_data.x->menubar_widget);
int menubar_size
menubar_size
= (f->output_data.x->menubar_widget
? (f->output_data.x->menubar_widget->core.height
+ f->output_data.x->menubar_widget->core.border_width)
......@@ -1286,7 +1273,7 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p)
#if 1 /* Experimentally, we now get the right results
for -geometry -0-0 without this. 24 Aug 96, rms.
Maybe so, but the menu bar size is missing the pixels so the
WM size hints are off by theses pixel. Jan D, oct 2009. */
WM size hints are off by these pixels. Jan D, oct 2009. */
#ifdef USE_LUCID
if (FRAME_EXTERNAL_MENU_BAR (f))
{
......
......@@ -4159,9 +4159,7 @@ x_scroll_bar_to_input_event (XEvent *event, struct input_event *ievent)
CALL_DATA is a pointer to a XmScrollBarCallbackStruct. */
static void
xm_scroll_callback (widget, client_data, call_data)
Widget widget;
XtPointer client_data, call_data;
xm_scroll_callback (Widget widget, XtPointer client_data, XtPointer call_data)
{
struct scroll_bar *bar = (struct scroll_bar *) client_data;
XmScrollBarCallbackStruct *cs = (XmScrollBarCallbackStruct *) call_data;
......@@ -5546,22 +5544,18 @@ struct x_display_info *XTread_socket_fake_io_error;
static struct x_display_info *next_noop_dpyinfo;
#define SET_SAVED_MENU_EVENT(size) \
#define SET_SAVED_BUTTON_EVENT \
do \
{ \
if (f->output_data.x->saved_menu_event == 0) \
f->output_data.x->saved_menu_event \
= (XEvent *) xmalloc (sizeof (XEvent)); \
memcpy (f->output_data.x->saved_menu_event, &event, size); \
*f->output_data.x->saved_menu_event = event; \
inev.ie.kind = MENU_BAR_ACTIVATE_EVENT; \
XSETFRAME (inev.ie.frame_or_window, f); \
} \
while (0)
#define SET_SAVED_BUTTON_EVENT SET_SAVED_MENU_EVENT (sizeof (XButtonEvent))
#define SET_SAVED_KEY_EVENT SET_SAVED_MENU_EVENT (sizeof (XKeyEvent))
enum
{
X_EVENT_NORMAL,
......@@ -6755,14 +6749,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventp, int *finish,
Instead, save it away
and we will pass it to Xt from kbd_buffer_get_event.
That way, we can run some Lisp code first. */
if (
if (! popup_activated ()
#ifdef USE_GTK
! popup_activated ()
/* Gtk+ menus only react to the first three buttons. */
&& event.xbutton.button < 3
&&
#endif
f && event.type == ButtonPress
&& f && event.type == ButtonPress
/* Verify the event is really within the menu bar
and not just sent to it due to grabbing. */
&& event.xbutton.x >= 0
......@@ -6773,30 +6765,13 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventp, int *finish,
{
SET_SAVED_BUTTON_EVENT;
XSETFRAME (last_mouse_press_frame, f);
#ifdef USE_GTK
*finish = X_EVENT_DROP;
#endif
}
else if (event.type == ButtonPress)
{
last_mouse_press_frame = Qnil;
goto OTHER;
}
#ifdef USE_MOTIF /* This should do not harm for Lucid,
but I am trying to be cautious. */
else if (event.type == ButtonRelease)
{
if (!NILP (last_mouse_press_frame))
{
f = XFRAME (last_mouse_press_frame);
if (f->output_data.x)
SET_SAVED_BUTTON_EVENT;
}
else
goto OTHER;
}
#endif /* USE_MOTIF */
else
goto OTHER;
#endif /* USE_X_TOOLKIT || USE_GTK */
......@@ -10336,8 +10311,7 @@ x_delete_display (struct x_display_info *dpyinfo)
that slows us down. */
static void
x_process_timeouts (timer)
struct atimer *timer;
x_process_timeouts (struct atimer *timer)
{
BLOCK_INPUT;
x_timeout_atimer_activated_flag = 0;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment