From d40d6c6f01ec4d6bd76db3f62909d156e2b7e3f7 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 13 Nov 2000 03:45:32 +0000 Subject: [PATCH] adding some grab calls while i'm making my window border code work... :) SVN revision: 3871 --- legacy/ecore/src/Ecore.h | 6 +++ legacy/ecore/src/e_ev_x.c | 2 + legacy/ecore/src/e_x.c | 85 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+) diff --git a/legacy/ecore/src/Ecore.h b/legacy/ecore/src/Ecore.h index bec9bd326f..5220375229 100644 --- a/legacy/ecore/src/Ecore.h +++ b/legacy/ecore/src/Ecore.h @@ -235,6 +235,12 @@ void e_window_get_virtual_area(Window win, int *area_x, void e_get_virtual_area(int *area_x, int *area_y); void e_window_get_root_relative_location(Window win, int *x, int *y); +void e_button_grab(Window win, int button, int events, Ev_Key_Modifiers mod, int any_mod); +void e_button_ungrab(Window win, int button, Ev_Key_Modifiers mod, int any_mod); +void e_pointer_replay(Time t); +void e_pointer_grab(Window win, Time t); +void e_pointer_ungrab(Time t); + typedef struct _eev Eevent; typedef struct _ev_fd_handler Ev_Fd_Handler; typedef struct _ev_pid_handler Ev_Pid_Handler; diff --git a/legacy/ecore/src/e_ev_x.c b/legacy/ecore/src/e_ev_x.c index e2a32d1e37..3c541e765e 100644 --- a/legacy/ecore/src/e_ev_x.c +++ b/legacy/ecore/src/e_ev_x.c @@ -442,6 +442,7 @@ e_ev_x_handle_enter_notify(XEvent * xevent) { Ev_Window_Enter *e; + if ((xevent->xcrossing.mode == NotifyGrab) || (xevent->xcrossing.mode == NotifyUngrab)) return; e_pointer_xy_set(xevent->xcrossing.x_root, xevent->xcrossing.y_root); e = NEW(Ev_Window_Enter, 1); e->win = xevent->xcrossing.window; @@ -475,6 +476,7 @@ e_ev_x_handle_leave_notify(XEvent * xevent) { Ev_Window_Leave *e; + if ((xevent->xcrossing.mode == NotifyGrab) || (xevent->xcrossing.mode == NotifyUngrab)) return; e_pointer_xy_set(xevent->xcrossing.x_root, xevent->xcrossing.y_root); { Ev_Mouse_Move *e; diff --git a/legacy/ecore/src/e_x.c b/legacy/ecore/src/e_x.c index 9279fafad1..3559002ce9 100644 --- a/legacy/ecore/src/e_x.c +++ b/legacy/ecore/src/e_x.c @@ -2473,3 +2473,88 @@ e_window_get_root_relative_location(Window win, int *x, int *y) if (x) *x = dx; if (y) *y = dy; } + +void +e_button_grab(Window win, int button, int events, Ev_Key_Modifiers mod, int any_mod) +{ + unsigned int b; + unsigned int m; + unsigned int locks[8]; + int i; + + b = button; + if (b == 0) b = AnyButton; + m = 0; + if (any_mod) m = AnyModifier; + else + { + if (mod & EV_KEY_MODIFIER_SHIFT) m |= e_mod_mask_shift_get(); + if (mod & EV_KEY_MODIFIER_CTRL) m |= e_mod_mask_ctrl_get(); + if (mod & EV_KEY_MODIFIER_ALT) m |= e_mod_mask_alt_get(); + if (mod & EV_KEY_MODIFIER_WIN) m |= e_mod_mask_win_get(); + } + locks[0] = 0; + locks[1] = e_lock_mask_caps_get(); + locks[2] = e_lock_mask_num_get(); + locks[3] = e_lock_mask_scroll_get(); + locks[4] = e_lock_mask_caps_get() | e_lock_mask_num_get(); + locks[5] = e_lock_mask_caps_get() | e_lock_mask_scroll_get(); + locks[6] = e_lock_mask_num_get() | e_lock_mask_scroll_get(); + locks[7] = e_lock_mask_caps_get() | e_lock_mask_num_get() | e_lock_mask_scroll_get(); + for (i = 0; i < 8; i++) + XGrabButton(disp, b, m | locks[i], + win, False, events, + GrabModeSync, GrabModeAsync, None, None); +} + +void +e_button_ungrab(Window win, int button, Ev_Key_Modifiers mod, int any_mod) +{ + unsigned int b; + unsigned int m; + unsigned int locks[8]; + int i; + + b = button; + if (b == 0) b = AnyButton; + m = 0; + if (any_mod) m = AnyModifier; + else + { + if (mod & EV_KEY_MODIFIER_SHIFT) m |= e_mod_mask_shift_get(); + if (mod & EV_KEY_MODIFIER_CTRL) m |= e_mod_mask_ctrl_get(); + if (mod & EV_KEY_MODIFIER_ALT) m |= e_mod_mask_alt_get(); + if (mod & EV_KEY_MODIFIER_WIN) m |= e_mod_mask_win_get(); + } + locks[0] = 0; + locks[1] = e_lock_mask_caps_get(); + locks[2] = e_lock_mask_num_get(); + locks[3] = e_lock_mask_scroll_get(); + locks[4] = e_lock_mask_caps_get() | e_lock_mask_num_get(); + locks[5] = e_lock_mask_caps_get() | e_lock_mask_scroll_get(); + locks[6] = e_lock_mask_num_get() | e_lock_mask_scroll_get(); + locks[7] = e_lock_mask_caps_get() | e_lock_mask_num_get() | e_lock_mask_scroll_get(); + for (i = 0; i < 8; i++) + XUngrabButton(disp, b, m | locks[i], win); +} + +void +e_pointer_replay(Time t) +{ + XSync(disp, False); + XAllowEvents(disp, ReplayPointer, t); + XSync(disp, False); +} + +void +e_pointer_grab(Window win, Time t) +{ + XGrabPointer(disp, win, False, XEV_BUTTON | XEV_MOUSE_MOVE | XEV_IN_OUT, + GrabModeAsync, GrabModeAsync, None, None, t); +} + +void +e_pointer_ungrab(Time t) +{ + XUngrabPointer(disp, t); +}