summaryrefslogtreecommitdiff
path: root/src/modules/winlist/e_winlist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/winlist/e_winlist.c')
-rw-r--r--src/modules/winlist/e_winlist.c208
1 files changed, 112 insertions, 96 deletions
diff --git a/src/modules/winlist/e_winlist.c b/src/modules/winlist/e_winlist.c
index 4dfaf0b9dc..827186d15d 100644
--- a/src/modules/winlist/e_winlist.c
+++ b/src/modules/winlist/e_winlist.c
@@ -115,12 +115,18 @@ e_winlist_show(E_Zone *zone)
y = (double)(zone->h - h) * e_config->winlist_pos_align_y;
winlist = e_popup_new(zone, x, y, w, h);
- if (!winlist) return 0;
+ if (!winlist)
+ {
+ ecore_x_window_free(input_window);
+ e_grabinput_release(input_window, input_window);
+ input_window = 0;
+ return 0;
+ }
e_border_focus_track_freeze();
-
+
evas_event_feed_mouse_in(winlist->evas, ecore_x_current_time_get(), NULL);
evas_event_feed_mouse_move(winlist->evas, -1000000, -1000000, ecore_x_current_time_get(), NULL);
-
+
e_popup_layer_set(winlist, 255);
evas_event_freeze(winlist->evas);
o = edje_object_add(winlist->evas);
@@ -146,13 +152,12 @@ e_winlist_show(E_Zone *zone)
for (l = e_border_focus_stack_get(); l; l = l->next)
{
E_Border *bd;
-
+
bd = l->data;
-
_e_winlist_border_add(bd, winlist->zone, desk);
}
e_box_thaw(list_object);
-
+
if (!wins)
{
e_winlist_hide();
@@ -169,7 +174,7 @@ e_winlist_show(E_Zone *zone)
if (last_border)
{
if (!last_border->lock_focus_out)
- e_border_focus_set(last_border, 0, 0);
+ e_border_focus_set(last_border, 0, 0);
else
last_border = NULL;
}
@@ -201,7 +206,7 @@ e_winlist_show(E_Zone *zone)
handlers = eina_list_append
(handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_MOVE, _e_winlist_cb_mouse_move, NULL));
-
+
e_popup_show(winlist);
return 1;
}
@@ -211,9 +216,9 @@ e_winlist_hide(void)
{
E_Border *bd = NULL;
E_Winlist_Win *ww;
-
+ Ecore_Event_Handler *handler;
+
if (!winlist) return;
-
if (win_selected)
{
ww = win_selected->data;
@@ -249,11 +254,17 @@ e_winlist_hide(void)
winlist = NULL;
hold_count = 0;
hold_mod = 0;
+
+ EINA_LIST_FREE(handlers, handler)
+ ecore_event_handler_del(handler);
+/*
while (handlers)
{
ecore_event_handler_del(handlers->data);
handlers = eina_list_remove_list(handlers, handlers);
}
+*/
+
ecore_x_window_free(input_window);
e_grabinput_release(input_window, input_window);
input_window = 0;
@@ -298,9 +309,7 @@ e_winlist_hide(void)
if ((e_config->focus_policy != E_FOCUS_CLICK) ||
(e_config->winlist_warp_at_end) ||
(e_config->winlist_warp_while_selecting))
- ecore_x_pointer_warp(bd->zone->container->win,
- warp_to_x,
- warp_to_y);
+ ecore_x_pointer_warp(bd->zone->container->win, warp_to_x, warp_to_y);
e_object_unref(E_OBJECT(bd));
}
}
@@ -381,7 +390,7 @@ _e_winlist_size_adjust(void)
edje_extern_object_min_size_set(list_object, -1, -1);
edje_object_part_swallow(bg_object, "e.swallow.list", list_object);
e_box_thaw(list_object);
-
+
zone = winlist->zone;
w = (double)zone->w * e_config->winlist_pos_size_w;
if (w < mw) w = mw;
@@ -389,13 +398,13 @@ _e_winlist_size_adjust(void)
else if (w < e_config->winlist_pos_min_w) w = e_config->winlist_pos_min_w;
if (w > zone->w) w = zone->w;
x = (double)(zone->w - w) * e_config->winlist_pos_align_x;
-
+
h = mh;
if (h > e_config->winlist_pos_max_h) h = e_config->winlist_pos_max_h;
else if (h < e_config->winlist_pos_min_h) h = e_config->winlist_pos_min_h;
if (h > zone->h) h = zone->h;
y = (double)(zone->h - h) * e_config->winlist_pos_align_y;
-
+
evas_object_resize(bg_object, w, h);
e_popup_move_resize(winlist, x, y, w, h);
}
@@ -406,7 +415,7 @@ _e_winlist_border_add(E_Border *bd, E_Zone *zone, E_Desk *desk)
E_Winlist_Win *ww;
Evas_Coord mw, mh;
Evas_Object *o;
-
+
if ((!bd->client.icccm.accepts_focus) &&
(!bd->client.icccm.take_focus)) return;
if (bd->client.netwm.state.skip_taskbar) return;
@@ -432,14 +441,16 @@ _e_winlist_border_add(E_Border *bd, E_Zone *zone, E_Desk *desk)
{
if ((bd->zone) && (bd->zone != zone))
{
- if (!e_config->winlist_list_show_other_screen_windows) return;
+ if (!e_config->winlist_list_show_other_screen_windows)
+ return;
}
- else if (!e_config->winlist_list_show_other_desk_windows) return;
+ else if (!e_config->winlist_list_show_other_desk_windows)
+ return;
}
}
}
- ww = calloc(1, sizeof(E_Winlist_Win));
+ ww = E_NEW(E_Winlist_Win, 1);
if (!ww) return;
ww->border = bd;
wins = eina_list_append(wins, ww);
@@ -457,13 +468,9 @@ _e_winlist_border_add(E_Border *bd, E_Zone *zone, E_Desk *desk)
evas_object_show(o);
}
if (bd->shaded)
- {
- edje_object_signal_emit(ww->bg_object, "e,state,shaded", "e");
- }
+ edje_object_signal_emit(ww->bg_object, "e,state,shaded", "e");
else if (bd->iconic)
- {
- edje_object_signal_emit(ww->bg_object, "e,state,iconified", "e");
- }
+ edje_object_signal_emit(ww->bg_object, "e,state,iconified", "e");
else if (bd->desk != desk)
{
if (!((bd->sticky) && (bd->zone == zone)))
@@ -486,12 +493,12 @@ static void
_e_winlist_border_del(E_Border *bd)
{
Eina_List *l;
-
+
if (bd == last_border) last_border = NULL;
for (l = wins; l; l = l->next)
{
E_Winlist_Win *ww;
-
+
ww = l->data;
if (ww->border == bd)
{
@@ -505,7 +512,7 @@ _e_winlist_border_del(E_Border *bd)
}
evas_object_del(ww->bg_object);
if (ww->icon_object) evas_object_del(ww->icon_object);
- free(ww);
+ E_FREE(ww);
wins = eina_list_remove_list(wins, l);
return;
}
@@ -517,7 +524,7 @@ _e_winlist_activate_nth(int n)
{
Eina_List *l;
int cnt;
-
+
_e_winlist_deactivate();
cnt = eina_list_count(wins);
if (n >= cnt) n = cnt - 1;
@@ -535,13 +542,12 @@ _e_winlist_activate(void)
{
E_Winlist_Win *ww;
Evas_Object *o;
- int ok;
-
+ int ok = 0;
+
if (!win_selected) return;
ww = win_selected->data;
edje_object_signal_emit(ww->bg_object, "e,state,selected", "e");
if (ww->icon_object) edje_object_signal_emit(ww->icon_object, "e,state,selected", "e");
- ok = 0;
if ((ww->border->iconic) &&
(e_config->winlist_list_uncover_while_selecting))
@@ -585,7 +591,7 @@ _e_winlist_activate(void)
warp_to_x = ww->border->zone->x + ((ww->border->x + ww->border->w - ww->border->zone->x) / 2);
else if (warp_to_x >= (ww->border->zone->x + ww->border->zone->w - 1))
warp_to_x = (ww->border->zone->x + ww->border->zone->w + ww->border->x) / 2;
-
+
warp_to_y = ww->border->y + (ww->border->h / 2);
if (warp_to_y < (ww->border->zone->y + 1))
warp_to_y = ww->border->zone->y + ((ww->border->y + ww->border->h - ww->border->zone->y) / 2);
@@ -635,7 +641,7 @@ _e_winlist_activate(void)
edje_object_part_swallow(bg_object, "e.swallow.icon", o);
evas_object_show(o);
}
-
+
edje_object_signal_emit(bg_object, "e,state,selected", "e");
}
@@ -675,12 +681,12 @@ _e_winlist_show_active(void)
{
Eina_List *l;
int i, n;
-
+
if (!wins) return;
+
for (i = 0, l = wins; l; l = l->next, i++)
- {
- if (l == win_selected) break;
- }
+ if (l == win_selected) break;
+
n = eina_list_count(wins);
if (n <= 1) return;
scroll_align_to = (double)i / (double)(n - 1);
@@ -746,10 +752,10 @@ static int
_e_winlist_cb_key_down(void *data, int type, void *event)
{
Ecore_Event_Key *ev;
-
+
ev = event;
if (ev->window != input_window) return 1;
- if (!strcmp(ev->key, "Up"))
+ if (!strcmp(ev->key, "Up"))
e_winlist_prev();
else if (!strcmp(ev->key, "Down"))
e_winlist_next();
@@ -798,23 +804,23 @@ _e_winlist_cb_key_down(void *data, int type, void *event)
mod = 0;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
+ mod |= E_BINDING_MODIFIER_SHIFT;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
+ mod |= E_BINDING_MODIFIER_CTRL;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
+ mod |= E_BINDING_MODIFIER_ALT;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
+ mod |= E_BINDING_MODIFIER_WIN;
if (bind->key && (!strcmp(bind->key, ev->keyname)) &&
((bind->modifiers == mod) || (bind->any_mod)))
- {
- act = e_action_find(bind->action);
-
- if(!act) continue;
-
+ {
+ if (!(act = e_action_find(bind->action)));
if (act->func.go_key)
- act->func.go_key(E_OBJECT(winlist->zone), bind->params, ev);
+ act->func.go_key(E_OBJECT(winlist->zone), bind->params, ev);
else if (act->func.go)
- act->func.go(E_OBJECT(winlist->zone), bind->params);
-
+ act->func.go(E_OBJECT(winlist->zone), bind->params);
}
}
}
@@ -829,26 +835,41 @@ _e_winlist_cb_key_up(void *data, int type, void *event)
Eina_List *l;
E_Config_Binding_Key *bind;
E_Binding_Modifier mod;
-
+
ev = event;
if (!winlist) return 1;
if (hold_mod)
{
- if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && (!strcmp(ev->key, "Shift_L"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && (!strcmp(ev->key, "Shift_R"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) && (!strcmp(ev->key, "Control_L"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) && (!strcmp(ev->key, "Control_R"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Alt_L"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Alt_R"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Meta_L"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Meta_R"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Super_L"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Super_R"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Super_L"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Super_R"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Mode_switch"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Meta_L"))) hold_count--;
- else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Meta_R"))) hold_count--;
+ if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && (!strcmp(ev->key, "Shift_L")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && (!strcmp(ev->key, "Shift_R")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) && (!strcmp(ev->key, "Control_L")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) && (!strcmp(ev->key, "Control_R")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Alt_L")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Alt_R")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Meta_L")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Meta_R")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Super_L")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && (!strcmp(ev->key, "Super_R")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Super_L")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Super_R")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Mode_switch")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Meta_L")))
+ hold_count--;
+ else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && (!strcmp(ev->key, "Meta_R")))
+ hold_count--;
if (hold_count <= 0)
{
e_winlist_hide();
@@ -859,23 +880,22 @@ _e_winlist_cb_key_up(void *data, int type, void *event)
for (l = e_config->key_bindings; l; l = l->next)
{
bind = l->data;
-
if (bind->action && strcmp(bind->action,"winlist")) continue;
-
mod = 0;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
- if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
+ mod |= E_BINDING_MODIFIER_SHIFT;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
+ mod |= E_BINDING_MODIFIER_CTRL;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
+ mod |= E_BINDING_MODIFIER_ALT;
+ if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
+ mod |= E_BINDING_MODIFIER_WIN;
if (bind->key && (!strcmp(bind->key, ev->keyname)) &&
((bind->modifiers == mod) || (bind->any_mod)))
{
- act = e_action_find(bind->action);
-
- if(!act) continue;
-
+ if (!(act = e_action_find(bind->action))) continue;
if (act->func.end_key)
act->func.end_key(E_OBJECT(winlist->zone), bind->params, ev);
else if (act->func.end)
@@ -890,7 +910,7 @@ static int
_e_winlist_cb_mouse_down(void *data, int type, void *event)
{
Ecore_Event_Mouse_Button *ev;
-
+
ev = event;
if (ev->window != input_window) return 1;
e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_WINLIST,
@@ -902,7 +922,7 @@ static int
_e_winlist_cb_mouse_up(void *data, int type, void *event)
{
Ecore_Event_Mouse_Button *ev;
-
+
ev = event;
if (ev->window != input_window) return 1;
e_bindings_mouse_up_event_handle(E_BINDING_CONTEXT_WINLIST,
@@ -914,22 +934,21 @@ static int
_e_winlist_cb_mouse_wheel(void *data, int type, void *event)
{
Ecore_Event_Mouse_Wheel *ev;
-
+ int i;
+
ev = event;
if (ev->window != input_window) return 1;
e_bindings_wheel_event_handle(E_BINDING_CONTEXT_WINLIST,
E_OBJECT(winlist->zone), ev);
if (ev->z < 0) /* up */
{
- int i;
-
- for (i = ev->z; i < 0; i++) e_winlist_prev();
+ for (i = ev->z; i < 0; i++)
+ e_winlist_prev();
}
else if (ev->z > 0) /* down */
{
- int i;
-
- for (i = ev->z; i > 0; i--) e_winlist_next();
+ for (i = ev->z; i > 0; i--)
+ e_winlist_next();
}
return 1;
}
@@ -970,7 +989,7 @@ _e_winlist_warp_timer(void *data)
{
int x, y;
double spd;
-
+
spd = e_config->winlist_warp_speed;
x = warp_x;
y = warp_y;
@@ -988,7 +1007,7 @@ _e_winlist_animator(void *data)
if (warp_to)
{
int dx, dy;
-
+
dx = warp_x - warp_to_x;
dy = warp_y - warp_to_y;
dx = dx * dx;
@@ -1005,7 +1024,7 @@ _e_winlist_animator(void *data)
if (scroll_to)
{
double da;
-
+
da = scroll_align - scroll_align_to;
if (da < 0.0) da = -da;
if (da < 0.01)
@@ -1022,8 +1041,7 @@ _e_winlist_animator(void *data)
#if 0
static void
-_e_winlist_cb_item_mouse_in(void *data, Evas *evas, Evas_Object *obj,
- void *event_info)
+_e_winlist_cb_item_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info)
{
E_Winlist_Win *ww;
Eina_List *l;
@@ -1031,9 +1049,7 @@ _e_winlist_cb_item_mouse_in(void *data, Evas *evas, Evas_Object *obj,
if (!(ww = data)) return;
if (!wins) return;
for (l = wins; l; l = l->next)
- {
- if (l->data == ww) break;
- }
+ if (l->data == ww) break;
_e_winlist_deactivate();
win_selected = l;
_e_winlist_show_active();