You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

229 lines
5.0 KiB

#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();
}