Commit e511451f authored by Jan Djärv's avatar Jan Djärv

Fix bug #4870, issues 3 and 4.

* gtkutil.c (xg_event_is_for_scrollbar): New function (bug#4870).

* gtkutil.h: Declare xg_event_is_for_scrollbar (bug#4870).

* xterm.c (handle_one_xevent): Call xg_event_is_for_scrollbar for
ButtonPressRelease and MotionNotify (bug#4870).
parent 0b7f397c
2009-11-06 Jan Djärv <jan.h.d@swipnet.se>
* gtkutil.c (xg_event_is_for_scrollbar): New function (bug#4870).
* gtkutil.h: Declare xg_event_is_for_scrollbar (bug#4870).
* xterm.c (handle_one_xevent): Call xg_event_is_for_scrollbar for
ButtonPressRelease and MotionNotify (bug#4870).
2009-11-06 Dan Nicolaescu <dann@ics.uci.edu>
* keymap.c (syms_of_keymap): Construct exclude_keys in pure memory.
......
......@@ -3371,6 +3371,38 @@ xg_set_toolkit_scroll_bar_thumb (bar, portion, position, whole)
}
}
/* Return non-zero if EVENT is for a scroll bar in frame F.
When the same X window is used for several Gtk+ widgets, we cannot
say for sure based on the X window alone if an event is for the
frame. This function does additional checks.
Return non-zero if the event is for a scroll bar, zero otherwise. */
int
xg_event_is_for_scrollbar (f, event)
FRAME_PTR f;
XEvent *event;
{
int retval = 0;
if (f && event->type == ButtonPress)
{
/* Check if press occurred outside the edit widget. */
GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
retval = gdk_display_get_window_at_pointer (gdpy, NULL, NULL)
!= f->output_data.x->edit_widget->window;
}
else if (f && (event->type != ButtonRelease || event->type != MotionNotify))
{
/* If we are releasing or moving the scroll bar, it has the grab. */
retval = gtk_grab_get_current () != 0
&& gtk_grab_get_current () != f->output_data.x->edit_widget;
}
return retval;
}
/***********************************************************************
Tool bar functions
......
......@@ -179,7 +179,7 @@ extern void xg_set_toolkit_scroll_bar_thumb P_ ((struct scroll_bar *bar,
int portion,
int position,
int whole));
extern int xg_event_is_for_scrollbar P_ ((FRAME_PTR f, XEvent *event));
extern void update_frame_tool_bar P_ ((FRAME_PTR f));
extern void free_frame_tool_bar P_ ((FRAME_PTR f));
......
......@@ -6688,6 +6688,10 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)
clear_mouse_face (dpyinfo);
}
#ifdef USE_GTK
if (f && xg_event_is_for_scrollbar (f, &event))
f = 0;
#endif
if (f)
{
......@@ -6824,6 +6828,10 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)
else
f = x_window_to_frame (dpyinfo, event.xbutton.window);
#ifdef USE_GTK
if (f && xg_event_is_for_scrollbar (f, &event))
f = 0;
#endif
if (f)
{
/* Is this in the tool-bar? */
......
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