and now it shoudl be able to change click to focs <-> mouse focus dynamically

and it all shoudl work - i hope.


SVN revision: 14870
This commit is contained in:
Carsten Haitzler 2005-05-20 10:14:51 +00:00
parent 38ab99da69
commit 3520914ccd
8 changed files with 139 additions and 90 deletions

View File

@ -4,38 +4,6 @@
#include "e.h" #include "e.h"
/* local subsystem functions */ /* local subsystem functions */
typedef struct _E_Binding_Mouse E_Binding_Mouse;
typedef struct _E_Binding_Key E_Binding_Key;
typedef struct _E_Binding_Signal E_Binding_Signal;
struct _E_Binding_Mouse
{
E_Binding_Context ctxt;
int button;
E_Binding_Modifier mod;
unsigned char any_mod : 1;
char *action;
char *params;
};
struct _E_Binding_Key
{
E_Binding_Context ctxt;
char *key;
E_Binding_Modifier mod;
unsigned char any_mod : 1;
char *action;
char *params;
};
struct _E_Binding_Signal
{
E_Binding_Context ctxt;
char *sig;
char *src;
char *action;
char *params;
};
static void _e_bindings_mouse_free(E_Binding_Mouse *bind); static void _e_bindings_mouse_free(E_Binding_Mouse *bind);
static void _e_bindings_key_free(E_Binding_Key *bind); static void _e_bindings_key_free(E_Binding_Key *bind);
@ -195,7 +163,7 @@ e_bindings_mouse_ungrab(E_Binding_Context ctxt, Ecore_X_Window win)
} }
E_Action * E_Action *
e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev) e_bindings_mouse_down_find(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev, E_Binding_Mouse **bind_ret)
{ {
E_Binding_Modifier mod = 0; E_Binding_Modifier mod = 0;
Evas_List *l; Evas_List *l;
@ -217,6 +185,21 @@ e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_
E_Action *act; E_Action *act;
act = e_action_find(bind->action); act = e_action_find(bind->action);
if (bind_ret) *bind_ret = bind;
return act;
}
}
}
return NULL;
}
E_Action *
e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev)
{
E_Action *act;
E_Binding_Mouse *bind;
act = e_bindings_mouse_down_find(ctxt, obj, ev, &bind);
if (act) if (act)
{ {
if (act->func.go_mouse) if (act->func.go_mouse)
@ -225,7 +208,34 @@ e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_
act->func.go(obj, bind->params); act->func.go(obj, bind->params);
return act; return act;
} }
return NULL; return act;
}
E_Action *
e_bindings_mouse_up_find(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev, E_Binding_Mouse **bind_ret)
{
E_Binding_Modifier mod = 0;
Evas_List *l;
if (ev->modifiers & ECORE_X_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_X_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_X_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_X_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
for (l = mouse_bindings; l; l = l->next)
{
E_Binding_Mouse *bind;
bind = l->data;
if ((bind->button == ev->button) &&
((bind->any_mod) || (bind->mod == mod)))
{
if (_e_bindings_context_match(bind->ctxt, ctxt))
{
E_Action *act;
act = e_action_find(bind->action);
if (bind_ret) *bind_ret = bind;
return act;
} }
} }
} }
@ -235,26 +245,10 @@ e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_
E_Action * E_Action *
e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev) e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev)
{ {
E_Binding_Modifier mod = 0; E_Action *act;
Evas_List *l;
if (ev->modifiers & ECORE_X_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_X_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_X_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_X_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
for (l = mouse_bindings; l; l = l->next)
{
E_Binding_Mouse *bind; E_Binding_Mouse *bind;
bind = l->data; act = e_bindings_mouse_up_find(ctxt, obj, ev, &bind);
if ((bind->button == ev->button) &&
((bind->any_mod) || (bind->mod == mod)))
{
if (_e_bindings_context_match(bind->ctxt, ctxt))
{
E_Action *act;
act = e_action_find(bind->action);
if (act) if (act)
{ {
if (act->func.end_mouse) if (act->func.end_mouse)
@ -263,11 +257,7 @@ e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_
act->func.end(obj, bind->params); act->func.end(obj, bind->params);
return act; return act;
} }
return NULL; return act;
}
}
}
return NULL;
} }
/* FIXME: finish off key bindings */ /* FIXME: finish off key bindings */

View File

@ -26,10 +26,43 @@ typedef enum _E_Binding_Modifier
E_BINDING_MODIFIER_WIN = (1 << 3) E_BINDING_MODIFIER_WIN = (1 << 3)
} E_Binding_Modifier; } E_Binding_Modifier;
typedef struct _E_Binding_Mouse E_Binding_Mouse;
typedef struct _E_Binding_Key E_Binding_Key;
typedef struct _E_Binding_Signal E_Binding_Signal;
#else #else
#ifndef E_BINDINGS_H #ifndef E_BINDINGS_H
#define E_BINDINGS_H #define E_BINDINGS_H
struct _E_Binding_Mouse
{
E_Binding_Context ctxt;
int button;
E_Binding_Modifier mod;
unsigned char any_mod : 1;
char *action;
char *params;
};
struct _E_Binding_Key
{
E_Binding_Context ctxt;
char *key;
E_Binding_Modifier mod;
unsigned char any_mod : 1;
char *action;
char *params;
};
struct _E_Binding_Signal
{
E_Binding_Context ctxt;
char *sig;
char *src;
char *action;
char *params;
};
EAPI int e_bindings_init(void); EAPI int e_bindings_init(void);
EAPI int e_bindings_shutdown(void); EAPI int e_bindings_shutdown(void);
@ -37,7 +70,9 @@ EAPI void e_bindings_mouse_add(E_Binding_Context ctxt, int button, E_Bind
EAPI void e_bindings_mouse_del(E_Binding_Context ctxt, int button, E_Binding_Modifier mod, int any_mod, char *action, char *params); EAPI void e_bindings_mouse_del(E_Binding_Context ctxt, int button, E_Binding_Modifier mod, int any_mod, char *action, char *params);
EAPI void e_bindings_mouse_grab(E_Binding_Context ctxt, Ecore_X_Window win); EAPI void e_bindings_mouse_grab(E_Binding_Context ctxt, Ecore_X_Window win);
EAPI void e_bindings_mouse_ungrab(E_Binding_Context ctxt, Ecore_X_Window win); EAPI void e_bindings_mouse_ungrab(E_Binding_Context ctxt, Ecore_X_Window win);
EAPI E_Action *e_bindings_mouse_down_find(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev, E_Binding_Mouse **bind_ret);
EAPI E_Action *e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev); EAPI E_Action *e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev);
EAPI E_Action *e_bindings_mouse_up_find(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev, E_Binding_Mouse **bind_ret);
EAPI E_Action *e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev); EAPI E_Action *e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev);
EAPI void e_bindings_key_add(E_Binding_Context ctxt, char *key, E_Binding_Modifier mod, int any_mod, char *action, char *params); EAPI void e_bindings_key_add(E_Binding_Context ctxt, char *key, E_Binding_Modifier mod, int any_mod, char *action, char *params);

View File

@ -1379,6 +1379,7 @@ e_border_button_bindings_ungrab_all(void)
E_Border *bd; E_Border *bd;
bd = l->data; bd = l->data;
e_focus_setdown(bd);
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win); e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win);
} }
} }
@ -1394,6 +1395,7 @@ e_border_button_bindings_grab_all(void)
bd = l->data; bd = l->data;
e_bindings_mouse_grab(E_BINDING_CONTEXT_BORDER, bd->win); e_bindings_mouse_grab(E_BINDING_CONTEXT_BORDER, bd->win);
e_focus_setup(bd);
} }
} }
@ -2448,7 +2450,6 @@ _e_border_cb_mouse_down(void *data, int type, void *event)
e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_BORDER, e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_BORDER,
E_OBJECT(bd), ev); E_OBJECT(bd), ev);
} }
if (!bd->cur_mouse_action)
e_focus_event_mouse_down(bd); e_focus_event_mouse_down(bd);
} }
if (ev->win != bd->event_win) return 1; if (ev->win != bd->event_win) return 1;
@ -2504,6 +2505,7 @@ _e_border_cb_mouse_up(void *data, int type, void *event)
/* ... VERY unlikely though... VERY */ /* ... VERY unlikely though... VERY */
/* also we dont pass the same params that went in - then again that */ /* also we dont pass the same params that went in - then again that */
/* should be ok as we are just ending the action if it has an end */ /* should be ok as we are just ending the action if it has an end */
printf("mouse up after grab!\n");
if (bd->cur_mouse_action) if (bd->cur_mouse_action)
{ {
if (bd->cur_mouse_action->func.end_mouse) if (bd->cur_mouse_action->func.end_mouse)
@ -2656,18 +2658,26 @@ _e_border_cb_mouse_wheel(void *data, int type, void *event)
static int static int
_e_border_cb_grab_replay(void *data, int type, void *event) _e_border_cb_grab_replay(void *data, int type, void *event)
{ {
if (type == ECORE_X_EVENT_MOUSE_BUTTON_DOWN) Ecore_X_Event_Mouse_Button_Down *ev;
{ if (type != ECORE_X_EVENT_MOUSE_BUTTON_DOWN) return 0;
Ecore_X_Event_Mouse_Button_Down *e;
e = event; ev = event;
if ((e_config->pass_click_on) || if ((e_config->pass_click_on) || (e_config->always_click_to_raise))
(e_config->always_click_to_raise))
{ {
printf("ALLOW PRESS\n"); E_Border *bd;
bd = e_border_find_by_window(ev->event_win);
if (bd)
{
if (bd->cur_mouse_action) return 0;
if (ev->event_win == bd->win)
{
if (!e_bindings_mouse_down_find(E_BINDING_CONTEXT_BORDER,
E_OBJECT(bd), ev, NULL))
return 1; return 1;
} }
} }
}
return 0; return 0;
} }

View File

@ -207,7 +207,7 @@ e_config_init(void)
e_config->language = strdup(""); e_config->language = strdup("");
e_config->focus_policy = E_FOCUS_MOUSE; e_config->focus_policy = E_FOCUS_MOUSE;
e_config->pass_click_on = 1; e_config->pass_click_on = 1;
e_config->always_click_to_raise = 1; e_config->always_click_to_raise = 0;
e_config->use_auto_raise = 0; e_config->use_auto_raise = 0;
e_config->auto_raise_delay = 0.5; e_config->auto_raise_delay = 0.5;
{ {
@ -670,7 +670,6 @@ e_config_init(void)
e_config_save_queue(); e_config_save_queue();
} }
// e_config->evas_engine_container = E_EVAS_ENGINE_GL_X11; // e_config->evas_engine_container = E_EVAS_ENGINE_GL_X11;
e_config->focus_policy = E_FOCUS_MOUSE;
E_CONFIG_LIMIT(e_config->menus_scroll_speed, 1.0, 20000.0); E_CONFIG_LIMIT(e_config->menus_scroll_speed, 1.0, 20000.0);
E_CONFIG_LIMIT(e_config->menus_fast_mouse_move_threshhold, 1.0, 2000.0); E_CONFIG_LIMIT(e_config->menus_fast_mouse_move_threshhold, 1.0, 2000.0);

View File

@ -100,6 +100,7 @@ struct _E_Config
double auto_raise_delay; double auto_raise_delay;
}; };
/* FIXME: all of thsie needs to become eet lumps for enmcode/decode */
struct _E_Config_Module struct _E_Config_Module
{ {
char *name; char *name;

View File

@ -30,7 +30,6 @@ e_focus_idler_before(void)
void void
e_focus_event_mouse_in(E_Border* bd) e_focus_event_mouse_in(E_Border* bd)
{ {
/* If focus follows mouse */
if (e_config->focus_policy == E_FOCUS_MOUSE) if (e_config->focus_policy == E_FOCUS_MOUSE)
e_border_focus_set(bd, 1, 1); e_border_focus_set(bd, 1, 1);
@ -47,7 +46,6 @@ e_focus_event_mouse_in(E_Border* bd)
void void
e_focus_event_mouse_out(E_Border* bd) e_focus_event_mouse_out(E_Border* bd)
{ {
/* If focus follows mouse */
if (e_config->focus_policy == E_FOCUS_MOUSE) if (e_config->focus_policy == E_FOCUS_MOUSE)
e_border_focus_set(bd, 0, 1); e_border_focus_set(bd, 0, 1);
@ -66,6 +64,10 @@ e_focus_event_mouse_down(E_Border* bd)
e_border_focus_set(bd, 1, 1); e_border_focus_set(bd, 1, 1);
e_border_raise(bd); e_border_raise(bd);
} }
else if (e_config->always_click_to_raise)
{
e_border_raise(bd);
}
} }
void void
@ -80,7 +82,9 @@ e_focus_event_focus_in(E_Border *bd)
(!e_config->always_click_to_raise)) (!e_config->always_click_to_raise))
{ {
if (!bd->button_grabbed) return; if (!bd->button_grabbed) return;
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win);
ecore_x_window_button_ungrab(bd->win, 1, 0, 1); ecore_x_window_button_ungrab(bd->win, 1, 0, 1);
e_bindings_mouse_grab(E_BINDING_CONTEXT_BORDER, bd->win);
bd->button_grabbed = 0; bd->button_grabbed = 0;
} }
} }
@ -92,7 +96,10 @@ e_focus_event_focus_out(E_Border *bd)
(!e_config->always_click_to_raise)) (!e_config->always_click_to_raise))
{ {
if (bd->button_grabbed) return; if (bd->button_grabbed) return;
ecore_x_window_button_grab(bd->win, 1, ECORE_X_EVENT_MASK_MOUSE_DOWN, 0, 1); ecore_x_window_button_grab(bd->win, 0,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
bd->button_grabbed = 1; bd->button_grabbed = 1;
} }
} }
@ -104,7 +111,10 @@ e_focus_setup(E_Border *bd)
(e_config->always_click_to_raise)) (e_config->always_click_to_raise))
{ {
if (bd->button_grabbed) return; if (bd->button_grabbed) return;
ecore_x_window_button_grab(bd->win, 1, ECORE_X_EVENT_MASK_MOUSE_DOWN, 0, 1); ecore_x_window_button_grab(bd->win, 0,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1);
bd->button_grabbed = 1; bd->button_grabbed = 1;
} }
} }
@ -113,7 +123,9 @@ void
e_focus_setdown(E_Border *bd) e_focus_setdown(E_Border *bd)
{ {
if (!bd->button_grabbed) return; if (!bd->button_grabbed) return;
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win);
ecore_x_window_button_ungrab(bd->win, 1, 0, 1); ecore_x_window_button_ungrab(bd->win, 1, 0, 1);
e_bindings_mouse_grab(E_BINDING_CONTEXT_BORDER, bd->win);
bd->button_grabbed = 0; bd->button_grabbed = 0;
} }

View File

@ -736,12 +736,13 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
E_IPC_OP_DESKS_GET_REPLY); E_IPC_OP_DESKS_GET_REPLY);
break; break;
case E_IPC_OP_FOCUS_POLICY_SET: case E_IPC_OP_FOCUS_POLICY_SET:
e_border_button_bindings_ungrab_all();
if (e_ipc_codec_int_dec(e->data, e->size, if (e_ipc_codec_int_dec(e->data, e->size,
&(e_config->focus_policy))) &(e_config->focus_policy)))
{ {
/* FIXME: if going to/from click to focus grab/ungrab */
e_config_save_queue(); e_config_save_queue();
} }
e_border_button_bindings_grab_all();
break; break;
case E_IPC_OP_FOCUS_POLICY_GET: case E_IPC_OP_FOCUS_POLICY_GET:
_e_ipc_reply_int_send(e->client, _e_ipc_reply_int_send(e->client,

View File

@ -88,6 +88,7 @@ e_zone_new(E_Container *con, int num, int x, int y, int w, int h)
evas_object_move(o, x, y); evas_object_move(o, x, y);
evas_object_resize(o, w, h); evas_object_resize(o, w, h);
evas_object_color_set(o, 255, 255, 255, 255); evas_object_color_set(o, 255, 255, 255, 255);
evas_object_repeat_events_set(o, 1);
evas_object_show(o); evas_object_show(o);
o = edje_object_add(con->bg_evas); o = edje_object_add(con->bg_evas);