forked from enlightenment/enlightenment
230 lines
5.0 KiB
C
230 lines
5.0 KiB
C
#include "e.h"
|
|
|
|
/* local subsystem functions */
|
|
static void _e_grabinput_focus_do(Ecore_Window win, E_Focus_Method method);
|
|
static void _e_grabinput_focus(Ecore_Window win, E_Focus_Method method);
|
|
|
|
/* local subsystem globals */
|
|
static Ecore_Window grab_mouse_win = 0;
|
|
static Ecore_Window grab_key_win = 0;
|
|
static Ecore_Window focus_win = 0;
|
|
static E_Focus_Method focus_method = E_FOCUS_METHOD_NO_INPUT;
|
|
static double last_focus_time = 0.0;
|
|
|
|
static Ecore_Window focus_fix_win = 0;
|
|
static E_Focus_Method focus_fix_method = E_FOCUS_METHOD_NO_INPUT;
|
|
|
|
static void (*lost_cb) (void *data) = NULL;
|
|
static void *lost_data = NULL;
|
|
|
|
/* externally accessible functions */
|
|
EINTERN int
|
|
e_grabinput_init(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
EINTERN int
|
|
e_grabinput_shutdown(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
E_API void
|
|
e_grabinput_lost_cb_set(void (*cb) (void *data), void *data)
|
|
{
|
|
lost_cb = cb;
|
|
lost_data = data;
|
|
}
|
|
|
|
E_API int
|
|
e_grabinput_get(Ecore_Window mouse_win, int confine_mouse, Ecore_Window key_win)
|
|
{
|
|
Eina_Bool ungrabbed = EINA_FALSE;
|
|
|
|
if (grab_mouse_win)
|
|
{
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
|
ecore_x_pointer_ungrab();
|
|
#endif
|
|
grab_mouse_win = 0;
|
|
ungrabbed = EINA_TRUE;
|
|
}
|
|
if (grab_key_win)
|
|
{
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
|
ecore_x_keyboard_ungrab();
|
|
#endif
|
|
|
|
grab_key_win = 0;
|
|
focus_win = 0;
|
|
ungrabbed = EINA_TRUE;
|
|
}
|
|
if (ungrabbed)
|
|
{
|
|
if (lost_cb) lost_cb(lost_data);
|
|
lost_cb = NULL;
|
|
lost_data = NULL;
|
|
}
|
|
if (mouse_win)
|
|
{
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
|
{
|
|
int ret = 0;
|
|
if (confine_mouse)
|
|
ret = ecore_x_pointer_confine_grab(mouse_win);
|
|
else
|
|
ret = ecore_x_pointer_grab(mouse_win);
|
|
if (!ret) return 0;
|
|
}
|
|
#endif
|
|
grab_mouse_win = mouse_win;
|
|
}
|
|
if (key_win)
|
|
{
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
|
{
|
|
int ret = 0;
|
|
|
|
ret = ecore_x_keyboard_grab(key_win);
|
|
if (!ret)
|
|
{
|
|
if (grab_mouse_win)
|
|
{
|
|
ecore_x_pointer_ungrab();
|
|
grab_mouse_win = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
#endif
|
|
grab_key_win = key_win;
|
|
}
|
|
#ifdef HAVE_WAYLAND_ONLY
|
|
(void)confine_mouse;
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
E_API void
|
|
e_grabinput_release(Ecore_Window mouse_win, Ecore_Window key_win)
|
|
{
|
|
if (mouse_win == grab_mouse_win)
|
|
{
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
|
ecore_x_pointer_ungrab();
|
|
#endif
|
|
|
|
grab_mouse_win = 0;
|
|
}
|
|
if (key_win == grab_key_win)
|
|
{
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
|
|
ecore_x_keyboard_ungrab();
|
|
#endif
|
|
|
|
grab_key_win = 0;
|
|
if (focus_win != 0)
|
|
{
|
|
/* fprintf(stderr, "release focus to %x\n", focus_win); */
|
|
_e_grabinput_focus(focus_win, focus_method);
|
|
focus_win = 0;
|
|
focus_method = E_FOCUS_METHOD_NO_INPUT;
|
|
}
|
|
}
|
|
}
|
|
|
|
E_API void
|
|
e_grabinput_focus(Ecore_Window win, E_Focus_Method method)
|
|
{
|
|
if (grab_key_win != 0)
|
|
{
|
|
/* fprintf(stderr, "while grabbed focus changed to %x\n", win); */
|
|
focus_win = win;
|
|
focus_method = method;
|
|
}
|
|
else
|
|
{
|
|
/* fprintf(stderr, "focus to %x\n", win); */
|
|
_e_grabinput_focus(win, method);
|
|
}
|
|
}
|
|
|
|
E_API double
|
|
e_grabinput_last_focus_time_get(void)
|
|
{
|
|
return last_focus_time;
|
|
}
|
|
|
|
E_API Ecore_Window
|
|
e_grabinput_last_focus_win_get(void)
|
|
{
|
|
return focus_fix_win;
|
|
}
|
|
|
|
E_API Ecore_Window
|
|
e_grabinput_key_win_get(void)
|
|
{
|
|
return grab_key_win;
|
|
}
|
|
|
|
E_API Ecore_Window
|
|
e_grabinput_mouse_win_get(void)
|
|
{
|
|
return grab_mouse_win;
|
|
}
|
|
|
|
static void
|
|
_e_grabinput_focus_do(Ecore_Window win, E_Focus_Method method)
|
|
{
|
|
/* fprintf(stderr, "focus to %x method %i\n", win, method); */
|
|
switch (method)
|
|
{
|
|
case E_FOCUS_METHOD_NO_INPUT:
|
|
break;
|
|
|
|
case E_FOCUS_METHOD_LOCALLY_ACTIVE:
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp_util_has_x())
|
|
{
|
|
ecore_x_window_focus(win);
|
|
ecore_x_icccm_take_focus_send(win, ecore_x_current_time_get());
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
case E_FOCUS_METHOD_GLOBALLY_ACTIVE:
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp_util_has_x())
|
|
ecore_x_icccm_take_focus_send(win, ecore_x_current_time_get());
|
|
#endif
|
|
break;
|
|
|
|
case E_FOCUS_METHOD_PASSIVE:
|
|
#ifndef HAVE_WAYLAND_ONLY
|
|
if (e_comp_util_has_x())
|
|
ecore_x_window_focus(win);
|
|
#endif
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
_e_grabinput_focus(Ecore_Window win, E_Focus_Method method)
|
|
{
|
|
focus_fix_win = win;
|
|
focus_fix_method = method;
|
|
/* fprintf(stderr, "foc do 1\n"); */
|
|
_e_grabinput_focus_do(win, method);
|
|
last_focus_time = ecore_loop_time_get();
|
|
}
|