mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-30 12:21:25 -08:00
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).
This commit is contained in:
parent
0b7f397ca7
commit
e511451fd3
4 changed files with 50 additions and 1 deletions
|
|
@ -1,3 +1,12 @@
|
|||
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? */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue