2004-11-24 19:37:45 -08:00
|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
2012-08-03 07:02:14 -07:00
|
|
|
static Eina_Bool _e_focus_raise_timer(void *data);
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
/* local subsystem globals */
|
|
|
|
|
|
|
|
/* externally accessible functions */
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_focus_init(void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_focus_shutdown(void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_focus_idler_before(void)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-03 07:02:14 -07:00
|
|
|
e_focus_event_mouse_in(E_Border *bd)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2005-05-22 23:09:52 -07:00
|
|
|
if ((e_config->focus_policy == E_FOCUS_MOUSE) ||
|
|
|
|
(e_config->focus_policy == E_FOCUS_SLOPPY))
|
2005-07-04 03:24:22 -07:00
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
e_border_focus_set(bd, 1, 1);
|
2005-07-04 03:24:22 -07:00
|
|
|
}
|
2005-09-28 12:44:58 -07:00
|
|
|
if (bd->raise_timer) ecore_timer_del(bd->raise_timer);
|
2005-05-20 00:32:42 -07:00
|
|
|
bd->raise_timer = NULL;
|
2005-05-20 02:27:06 -07:00
|
|
|
if (e_config->use_auto_raise)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
if (e_config->auto_raise_delay == 0.0)
|
|
|
|
{
|
|
|
|
if (!bd->lock_user_stacking)
|
|
|
|
{
|
|
|
|
if (e_config->border_raise_on_focus)
|
|
|
|
e_border_raise(bd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
bd->raise_timer = ecore_timer_add(e_config->auto_raise_delay, _e_focus_raise_timer, bd);
|
2005-05-20 00:32:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-03 07:02:14 -07:00
|
|
|
e_focus_event_mouse_out(E_Border *bd)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2005-05-20 02:27:06 -07:00
|
|
|
if (e_config->focus_policy == E_FOCUS_MOUSE)
|
2005-07-04 03:24:22 -07:00
|
|
|
{
|
2005-09-24 02:04:39 -07:00
|
|
|
/* FIXME: this is such a hack. its a big hack around x's async events
|
2012-08-03 07:02:14 -07:00
|
|
|
* as we dont know always exactly what action causes what event
|
|
|
|
* so by waiting more than 0.2 secs before reverting focus to nothing
|
|
|
|
* since we entered root, we are ignoring mouse in's on the root
|
|
|
|
* container for a bit after the mosue may have entered it
|
|
|
|
*/
|
|
|
|
if ((ecore_loop_time_get() - e_grabinput_last_focus_time_get()) > 0.2)
|
|
|
|
{
|
|
|
|
if (!bd->lock_focus_in)
|
2010-02-25 04:26:10 -08:00
|
|
|
{
|
|
|
|
if (bd->focused)
|
|
|
|
e_border_focus_set(bd, 0, 1);
|
|
|
|
}
|
2012-08-03 07:02:14 -07:00
|
|
|
}
|
2005-07-04 03:24:22 -07:00
|
|
|
}
|
2005-05-20 02:27:06 -07:00
|
|
|
if (bd->raise_timer)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
ecore_timer_del(bd->raise_timer);
|
|
|
|
bd->raise_timer = NULL;
|
2005-05-20 00:32:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-03 07:02:14 -07:00
|
|
|
e_focus_event_mouse_down(E_Border *bd)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2005-05-20 02:27:06 -07:00
|
|
|
if (e_config->focus_policy == E_FOCUS_CLICK)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
e_border_focus_set(bd, 1, 1);
|
2011-03-09 18:44:02 -08:00
|
|
|
|
2012-08-03 07:02:14 -07:00
|
|
|
if (!bd->lock_user_stacking)
|
|
|
|
{
|
|
|
|
if (e_config->border_raise_on_focus)
|
|
|
|
e_border_raise(bd);
|
|
|
|
}
|
2005-05-20 00:32:42 -07:00
|
|
|
}
|
2005-05-20 03:14:51 -07:00
|
|
|
else if (e_config->always_click_to_raise)
|
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
if (!bd->lock_user_stacking)
|
|
|
|
{
|
|
|
|
if (e_config->border_raise_on_focus)
|
|
|
|
e_border_raise(bd);
|
|
|
|
}
|
2005-05-20 03:14:51 -07:00
|
|
|
}
|
2005-09-27 09:36:14 -07:00
|
|
|
else if (e_config->always_click_to_focus)
|
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
e_border_focus_set(bd, 1, 1);
|
2005-09-27 09:36:14 -07:00
|
|
|
}
|
2005-05-20 00:32:42 -07:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-03 07:02:14 -07:00
|
|
|
e_focus_event_mouse_up(E_Border *bd __UNUSED__)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-05-20 02:27:06 -07:00
|
|
|
e_focus_event_focus_in(E_Border *bd)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2005-05-20 02:27:06 -07:00
|
|
|
if ((e_config->focus_policy == E_FOCUS_CLICK) &&
|
2005-09-27 09:36:14 -07:00
|
|
|
(!e_config->always_click_to_raise) &&
|
|
|
|
(!e_config->always_click_to_focus))
|
2004-12-23 23:45:21 -08:00
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
if (!bd->button_grabbed) return;
|
|
|
|
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
|
|
|
e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
|
|
|
ecore_x_window_button_ungrab(bd->win, 1, 0, 1);
|
|
|
|
ecore_x_window_button_ungrab(bd->win, 2, 0, 1);
|
|
|
|
ecore_x_window_button_ungrab(bd->win, 3, 0, 1);
|
|
|
|
e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
|
|
|
e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
|
|
|
bd->button_grabbed = 0;
|
2004-12-23 23:45:21 -08:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-05-20 02:27:06 -07:00
|
|
|
e_focus_event_focus_out(E_Border *bd)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2005-05-20 02:27:06 -07:00
|
|
|
if ((e_config->focus_policy == E_FOCUS_CLICK) &&
|
2005-09-27 09:36:14 -07:00
|
|
|
(!e_config->always_click_to_raise) &&
|
|
|
|
(!e_config->always_click_to_focus))
|
2004-12-23 23:45:21 -08:00
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
if (bd->button_grabbed) return;
|
|
|
|
ecore_x_window_button_grab(bd->win, 1,
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_DOWN |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_UP |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
|
|
|
|
ecore_x_window_button_grab(bd->win, 2,
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_DOWN |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_UP |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
|
|
|
|
ecore_x_window_button_grab(bd->win, 3,
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_DOWN |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_UP |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
|
|
|
|
bd->button_grabbed = 1;
|
2004-12-23 23:45:21 -08:00
|
|
|
}
|
2005-05-20 02:27:06 -07:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-05-20 02:27:06 -07:00
|
|
|
e_focus_setup(E_Border *bd)
|
|
|
|
{
|
|
|
|
if ((e_config->focus_policy == E_FOCUS_CLICK) ||
|
2005-09-27 09:36:14 -07:00
|
|
|
(e_config->always_click_to_raise) ||
|
|
|
|
(e_config->always_click_to_focus))
|
2004-12-23 23:45:21 -08:00
|
|
|
{
|
2012-08-03 07:02:14 -07:00
|
|
|
if (bd->button_grabbed) return;
|
|
|
|
ecore_x_window_button_grab(bd->win, 1,
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_DOWN |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_UP |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
|
|
|
|
ecore_x_window_button_grab(bd->win, 2,
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_DOWN |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_UP |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
|
|
|
|
ecore_x_window_button_grab(bd->win, 3,
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_DOWN |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_UP |
|
|
|
|
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
|
|
|
|
bd->button_grabbed = 1;
|
2004-12-23 23:45:21 -08:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2005-05-20 00:32:42 -07:00
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-05-20 02:27:06 -07:00
|
|
|
e_focus_setdown(E_Border *bd)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2005-05-20 02:27:06 -07:00
|
|
|
if (!bd->button_grabbed) return;
|
2012-06-08 03:10:16 -07:00
|
|
|
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
|
|
|
e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
2005-05-20 02:27:06 -07:00
|
|
|
ecore_x_window_button_ungrab(bd->win, 1, 0, 1);
|
2005-05-22 23:09:52 -07:00
|
|
|
ecore_x_window_button_ungrab(bd->win, 2, 0, 1);
|
|
|
|
ecore_x_window_button_ungrab(bd->win, 3, 0, 1);
|
2012-06-08 03:10:16 -07:00
|
|
|
e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
|
|
|
e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
|
2005-05-20 02:27:06 -07:00
|
|
|
bd->button_grabbed = 0;
|
|
|
|
}
|
2005-05-20 00:32:42 -07:00
|
|
|
|
2005-05-20 02:27:06 -07:00
|
|
|
/* local subsystem functions */
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2012-08-03 07:02:14 -07:00
|
|
|
_e_focus_raise_timer(void *data)
|
2005-05-20 00:32:42 -07:00
|
|
|
{
|
2005-07-04 03:24:22 -07:00
|
|
|
E_Border *bd;
|
2010-06-24 09:19:12 -07:00
|
|
|
|
2005-07-04 03:24:22 -07:00
|
|
|
bd = data;
|
2006-06-07 16:30:15 -07:00
|
|
|
if (!bd->lock_user_stacking) e_border_raise(bd);
|
2005-07-04 03:24:22 -07:00
|
|
|
bd->raise_timer = NULL;
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2005-05-20 00:32:42 -07:00
|
|
|
}
|
2012-08-03 07:02:14 -07:00
|
|
|
|