2 #include "e_mod_main.h"
4 /* gadcon requirements */
5 static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style);
6 static void _gc_shutdown(E_Gadcon_Client *gcc);
7 static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__);
8 static const char *_gc_label(E_Gadcon_Client_Class *client_class __UNUSED__);
9 static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas);
10 static const char *_gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__);
12 /* and actually define the gadcon class that this module provides (just 1) */
13 static const E_Gadcon_Client_Class _gadcon_class =
15 GADCON_CLIENT_CLASS_VERSION,
18 _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL,
19 e_gadcon_site_is_not_toolbar
21 E_GADCON_CLIENT_STYLE_INSET
24 /* actual module specifics */
25 typedef struct _Instance Instance;
26 typedef struct _Pager Pager;
27 typedef struct _Pager_Desk Pager_Desk;
28 typedef struct _Pager_Win Pager_Win;
29 typedef struct _Pager_Popup Pager_Popup;
34 Evas_Object *o_pager; /* table */
41 E_Drop_Handler *drop_handler;
47 unsigned char dragging : 1;
48 unsigned char just_dragged : 1;
49 Evas_Coord dnd_x, dnd_y;
50 Pager_Desk *active_drop_pd;
59 Evas_Object *o_layout;
60 int xpos, ypos, urgent;
65 unsigned char in_pager : 1;
66 unsigned char start : 1;
67 int x, y, dx, dy, button;
75 Evas_Object *o_window;
77 unsigned char skip_winlist : 1;
81 unsigned char start : 1;
82 unsigned char in_pager : 1;
83 unsigned char no_place : 1;
84 unsigned char desktop : 1;
85 int x, y, dx, dy, button;
95 unsigned char urgent : 1;
98 static void _pager_cb_obj_moveresize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
99 static void _button_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
100 static void _menu_cb_post(void *data __UNUSED__, E_Menu *m __UNUSED__);
101 static void _pager_inst_cb_menu_configure(void *data __UNUSED__, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__);
102 static void _pager_inst_cb_menu_virtual_desktops_dialog(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__);
103 static void _pager_instance_drop_zone_recalc(Instance *inst);
104 static Eina_Bool _pager_cb_event_border_resize(void *data __UNUSED__, int type __UNUSED__, void *event);
105 static Eina_Bool _pager_cb_event_border_move(void *data __UNUSED__, int type __UNUSED__, void *event);
106 static Eina_Bool _pager_cb_event_border_add(void *data __UNUSED__, int type __UNUSED__, void *event);
107 static Eina_Bool _pager_cb_event_border_remove(void *data __UNUSED__, int type __UNUSED__, void *event);
108 static Eina_Bool _pager_cb_event_border_iconify(void *data __UNUSED__, int type __UNUSED__, void *event);
109 static Eina_Bool _pager_cb_event_border_uniconify(void *data __UNUSED__, int type __UNUSED__, void *event);
110 static Eina_Bool _pager_cb_event_border_stick(void *data __UNUSED__, int type __UNUSED__, void *event);
111 static Eina_Bool _pager_cb_event_border_unstick(void *data __UNUSED__, int type __UNUSED__, void *event);
112 static Eina_Bool _pager_cb_event_border_desk_set(void *data __UNUSED__, int type __UNUSED__, void *event);
113 static Eina_Bool _pager_cb_event_border_stack(void *data __UNUSED__, int type __UNUSED__, void *event);
114 static Eina_Bool _pager_cb_event_border_icon_change(void *data __UNUSED__, int type __UNUSED__, void *event);
115 static Eina_Bool _pager_cb_event_border_urgent_change(void *data __UNUSED__, int type __UNUSED__, void *event);
116 static Eina_Bool _pager_cb_event_border_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
117 static Eina_Bool _pager_cb_event_border_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
118 static Eina_Bool _pager_cb_event_border_property(void *data __UNUSED__, int type __UNUSED__, void *event);
119 static Eina_Bool _pager_cb_event_zone_desk_count_set(void *data __UNUSED__, int type __UNUSED__, void *event);
120 static Eina_Bool _pager_cb_event_desk_show(void *data __UNUSED__, int type __UNUSED__, void *event);
121 static Eina_Bool _pager_cb_event_desk_name_change(void *data __UNUSED__, int type __UNUSED__, void *event);
122 static Eina_Bool _pager_cb_event_container_resize(void *data __UNUSED__, int type __UNUSED__, void *event);
123 static void _pager_window_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
124 static void _pager_window_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
125 static void _pager_window_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
126 static void *_pager_window_cb_drag_convert(E_Drag *drag, const char *type);
127 static void _pager_window_cb_drag_finished(E_Drag *drag, int dropped);
128 static void _pager_drop_cb_enter(void *data, const char *type __UNUSED__, void *event_info);
129 static void _pager_drop_cb_move(void *data, const char *type __UNUSED__, void *event_info);
130 static void _pager_drop_cb_leave(void *data, const char *type __UNUSED__, void *event_info __UNUSED__);
131 static void _pager_drop_cb_drop(void *data, const char *type, void *event_info);
132 static void _pager_inst_cb_scroll(void *data);
133 static void _pager_update_drop_position(Pager *p, Evas_Coord x, Evas_Coord y);
134 static void _pager_desk_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
135 static void _pager_desk_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
136 static void _pager_desk_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
137 static void _pager_desk_cb_drag_finished(E_Drag *drag, int dropped);
138 static void _pager_desk_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
139 static Eina_Bool _pager_popup_cb_timeout(void *data);
140 static Pager *_pager_new(Evas *evas, E_Zone *zone);
141 static void _pager_free(Pager *p);
142 static void _pager_fill(Pager *p);
143 static void _pager_empty(Pager *p);
144 static Pager_Desk *_pager_desk_new(Pager *p, E_Desk *desk, int xpos, int ypos);
145 static void _pager_desk_free(Pager_Desk *pd);
146 static Pager_Desk *_pager_desk_at_coord(Pager *p, Evas_Coord x, Evas_Coord y);
147 static void _pager_desk_select(Pager_Desk *pd);
148 static Pager_Desk *_pager_desk_find(Pager *p, E_Desk *desk);
149 static void _pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2);
150 static Pager_Win *_pager_window_new(Pager_Desk *pd, E_Border *border);
151 static void _pager_window_free(Pager_Win *pw);
152 static void _pager_window_move(Pager_Win *pw);
153 static Pager_Win *_pager_window_find(Pager *p, E_Border *border);
154 static Pager_Win *_pager_desk_window_find(Pager_Desk *pd, E_Border *border);
155 static Pager_Popup *_pager_popup_new(E_Zone *zone, int keyaction);
156 static void _pager_popup_free(Pager_Popup *pp);
157 static Pager_Popup *_pager_popup_find(E_Zone *zone);
158 static E_Config_Dialog *_pager_config_dialog(E_Container *con, const char *params);
160 /* functions for pager popup on key actions */
161 static int _pager_popup_show();
162 static void _pager_popup_hide(int switch_desk);
163 static Eina_Bool _pager_popup_cb_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event);
164 static Eina_Bool _pager_popup_cb_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event);
165 static Eina_Bool _pager_popup_cb_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event);
166 static Eina_Bool _pager_popup_cb_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event);
167 static void _pager_popup_desk_switch(int x, int y);
168 static void _pager_popup_modifiers_set(int mod);
169 static Eina_Bool _pager_popup_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event);
170 static Eina_Bool _pager_popup_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event);
171 static void _pager_popup_cb_action_show(E_Object *obj __UNUSED__, const char *params __UNUSED__, Ecore_Event_Key *ev __UNUSED__);
172 static void _pager_popup_cb_action_switch(E_Object *obj __UNUSED__, const char *params, Ecore_Event_Key *ev);
174 /* variables for pager popup on key actions */
175 static E_Action *act_popup_show = NULL;
176 static E_Action *act_popup_switch = NULL;
177 static Ecore_X_Window input_window = 0;
178 static Eina_List *handlers = NULL;
179 static Pager_Popup *act_popup = NULL; /* active popup */
180 static int hold_count = 0;
181 static int hold_mod = 0;
182 static E_Desk *current_desk = NULL;
183 static E_Config_DD *conf_edd = NULL;
184 static Eina_List *pagers = NULL;
186 Config *pager_config = NULL;
188 static E_Gadcon_Client *
189 _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
193 E_Gadcon_Client *gcc;
195 Evas_Coord x, y, w, h;
198 "enlightenment/pager_win", "enlightenment/border",
199 "enlightenment/vdesktop"
202 inst = E_NEW(Instance, 1);
204 p = _pager_new(gc->evas, gc->zone);
208 gcc = e_gadcon_client_new(gc, name, id, style, o);
214 evas_object_geometry_get(o, &x, &y, &w, &h);
216 e_drop_handler_add(E_OBJECT(inst->gcc), p,
217 _pager_drop_cb_enter, _pager_drop_cb_move,
218 _pager_drop_cb_leave, _pager_drop_cb_drop,
219 drop, 3, x, y, w, h);
220 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE,
221 _pager_cb_obj_moveresize, inst);
222 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE,
223 _pager_cb_obj_moveresize, inst);
224 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
225 _button_cb_mouse_down, inst);
226 pager_config->instances = eina_list_append(pager_config->instances, inst);
231 _gc_shutdown(E_Gadcon_Client *gcc)
236 pager_config->instances = eina_list_remove(pager_config->instances, inst);
237 e_drop_handler_del(inst->pager->drop_handler);
238 _pager_free(inst->pager);
243 _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__)
248 e_gadcon_client_aspect_set(gcc,
249 inst->pager->xnum * inst->pager->zone->w,
250 inst->pager->ynum * inst->pager->zone->h);
251 e_gadcon_client_min_size_set(gcc, 16, 16);
255 _gc_label(E_Gadcon_Client_Class *client_class __UNUSED__)
261 _gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas)
266 o = edje_object_add(evas);
267 snprintf(buf, sizeof(buf), "%s/e-module-pager.edj",
268 e_module_dir_get(pager_config->module));
269 edje_object_file_set(o, buf, "icon");
274 _gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__)
276 return _gadcon_class.name;
280 _pager_new(Evas *evas, E_Zone *zone)
287 p->o_table = e_table_add(evas);
288 e_table_homogenous_set(p->o_table, 1);
291 pagers = eina_list_append(pagers, p);
296 _pager_free(Pager *p)
299 evas_object_del(p->o_table);
300 pagers = eina_list_remove(pagers, p);
305 _pager_fill(Pager *p)
309 e_zone_desk_count_get(p->zone, &(p->xnum), &(p->ynum));
310 for (x = 0; x < p->xnum; x++)
312 for (y = 0; y < p->ynum; y++)
317 desk = e_desk_at_xy_get(p->zone, x, y);
318 pd = _pager_desk_new(p, desk, x, y);
321 p->desks = eina_list_append(p->desks, pd);
322 if (desk == e_desk_current_get(desk->zone))
323 _pager_desk_select(pd);
330 _pager_empty(Pager *p)
334 _pager_desk_free(p->desks->data);
335 p->desks = eina_list_remove_list(p->desks, p->desks);
340 _pager_desk_new(Pager *p, E_Desk *desk, int xpos, int ypos)
343 Evas_Object *o, *evo;
347 pd = E_NEW(Pager_Desk, 1);
348 if (!pd) return NULL;
354 e_object_ref(E_OBJECT(desk));
357 o = edje_object_add(evas_object_evas_get(p->o_table));
359 e_theme_edje_object_set(o, "base/theme/modules/pager",
360 "e/modules/pager/desk");
361 if (pager_config->show_desk_names)
362 edje_object_part_text_set(o, "e.text.label", desk->name);
364 edje_object_part_text_set(o, "e.text.label", "");
366 e_table_pack(p->o_table, o, xpos, ypos, 1, 1);
367 e_table_pack_options_set(o, 1, 1, 1, 1, 0.5, 0.5, 0, 0, -1, -1);
369 evo = (Evas_Object *)edje_object_part_object_get(o, "e.eventarea");
372 evas_object_event_callback_add(evo, EVAS_CALLBACK_MOUSE_DOWN,
373 _pager_desk_cb_mouse_down, pd);
374 evas_object_event_callback_add(evo, EVAS_CALLBACK_MOUSE_UP,
375 _pager_desk_cb_mouse_up, pd);
376 evas_object_event_callback_add(evo, EVAS_CALLBACK_MOUSE_MOVE,
377 _pager_desk_cb_mouse_move, pd);
378 evas_object_event_callback_add(evo, EVAS_CALLBACK_MOUSE_WHEEL,
379 _pager_desk_cb_mouse_wheel, pd);
382 o = e_layout_add(evas_object_evas_get(p->o_table));
385 e_layout_virtual_size_set(o, desk->zone->w, desk->zone->h);
386 edje_object_part_swallow(pd->o_desk, "e.swallow.content", pd->o_layout);
389 bl = e_container_border_list_first(desk->zone->container);
390 while ((bd = e_container_border_list_next(bl)))
394 if ((bd->new_client) || ((bd->desk != desk) && (!bd->sticky)))
396 pw = _pager_window_new(pd, bd);
397 if (pw) pd->wins = eina_list_append(pd->wins, pw);
399 e_container_border_list_free(bl);
404 _pager_desk_free(Pager_Desk *pd)
408 evas_object_del(pd->o_desk);
409 evas_object_del(pd->o_layout);
410 EINA_LIST_FREE(pd->wins, w)
411 _pager_window_free(w);
412 e_object_unref(E_OBJECT(pd->desk));
417 _pager_desk_at_coord(Pager *p, Evas_Coord x, Evas_Coord y)
422 EINA_LIST_FOREACH(p->desks, l, pd)
424 Evas_Coord dx, dy, dw, dh;
426 evas_object_geometry_get(pd->o_desk, &dx, &dy, &dw, &dh);
427 if (E_INSIDE(x, y, dx, dy, dw, dh)) return pd;
433 _pager_desk_select(Pager_Desk *pd)
438 if (pd->current) return;
440 EINA_LIST_FOREACH(pd->pager->desks, l, pd2)
445 evas_object_raise(pd2->o_desk);
446 edje_object_signal_emit(pd2->o_desk, "e,state,selected", "e");
453 edje_object_signal_emit(pd2->o_desk, "e,state,unselected", "e");
460 _pager_desk_find(Pager *p, E_Desk *desk)
465 EINA_LIST_FOREACH(p->desks, l, pd)
466 if (pd->desk == desk) return pd;
472 _pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2)
475 E_Zone *zone1, *zone2;
476 E_Desk *desk1, *desk2;
480 if ((!pd1) || (!pd2) || (!pd1->desk) || (!pd2->desk)) return;
481 if (pd1 == pd2) return;
485 zone1 = pd1->desk->zone;
486 zone2 = pd2->desk->zone;
488 /* Move opened windows from on desk to the other */
489 EINA_LIST_FOREACH(pd1->wins, l, pw)
491 if ((!pw) || (!pw->border) || (pw->border->iconic)) continue;
492 e_border_desk_set(pw->border, desk2);
494 EINA_LIST_FOREACH(pd2->wins, l, pw)
496 if ((!pw) || (!pw->border) || (pw->border->iconic)) continue;
497 e_border_desk_set(pw->border, desk1);
500 /* Modify desktop names in the config */
501 for (l = e_config->desktop_names, c = 0; l && c < 2; l = l->next)
503 E_Config_Desktop_Name *tmp_dn;
506 if (!tmp_dn) continue;
507 if ((tmp_dn->desk_x == desk1->x) &&
508 (tmp_dn->desk_y == desk1->y) &&
509 (tmp_dn->zone == (int) desk1->zone->num))
511 tmp_dn->desk_x = desk2->x;
512 tmp_dn->desk_y = desk2->y;
513 tmp_dn->zone = desk2->zone->num;
516 else if ((tmp_dn->desk_x == desk2->x) &&
517 (tmp_dn->desk_y == desk2->y) &&
518 (tmp_dn->zone == (int) desk2->zone->num))
520 tmp_dn->desk_x = desk1->x;
521 tmp_dn->desk_y = desk1->y;
522 tmp_dn->zone = desk1->zone->num;
526 if (c > 0) e_config_save();
527 e_desk_name_update();
529 /* Modify desktop backgrounds in the config */
530 for (l = e_config->desktop_backgrounds, c = 0; l && c < 2; l = l->next)
532 E_Config_Desktop_Background *tmp_db;
535 if (!tmp_db) continue;
536 if ((tmp_db->desk_x == desk1->x) &&
537 (tmp_db->desk_y == desk1->y) &&
538 (tmp_db->zone == (int) desk1->zone->num))
540 tmp_db->desk_x = desk2->x;
541 tmp_db->desk_y = desk2->y;
542 tmp_db->zone = desk2->zone->num;
545 else if ((tmp_db->desk_x == desk2->x) &&
546 (tmp_db->desk_y == desk2->y) &&
547 (tmp_db->zone == (int) desk2->zone->num))
549 tmp_db->desk_x = desk1->x;
550 tmp_db->desk_y = desk1->y;
551 tmp_db->zone = desk1->zone->num;
555 if (c > 0) e_config_save();
557 /* If the current desktop has been switched, force to update of the screen */
558 if (desk2 == e_desk_current_get(zone2))
563 if (desk1 == e_desk_current_get(zone1))
571 _pager_window_new(Pager_Desk *pd, E_Border *border)
577 if (!border) return NULL;
578 pw = E_NEW(Pager_Win, 1);
579 if (!pw) return NULL;
582 e_object_ref(E_OBJECT(border));
584 visible = ((!border->iconic) && (!border->client.netwm.state.skip_pager));
585 pw->skip_winlist = border->client.netwm.state.skip_pager;
588 o = edje_object_add(evas_object_evas_get(pd->pager->o_table));
590 e_theme_edje_object_set(o, "base/theme/modules/pager",
591 "e/modules/pager/window");
592 if (visible) evas_object_show(o);
594 e_layout_pack(pd->o_layout, pw->o_window);
595 e_layout_child_raise(pw->o_window);
597 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
598 _pager_window_cb_mouse_down, pw);
599 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
600 _pager_window_cb_mouse_up, pw);
601 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE,
602 _pager_window_cb_mouse_move, pw);
604 o = e_border_icon_add(border, evas_object_evas_get(pd->pager->o_table));
609 edje_object_part_swallow(pw->o_window, "e.swallow.icon", o);
612 if (border->client.icccm.urgent && !border->focused)
614 if (!(border->iconic))
615 edje_object_signal_emit(pd->o_desk, "e,state,urgent", "e");
616 edje_object_signal_emit(pw->o_window, "e,state,urgent", "e");
621 _pager_window_move(pw);
626 _pager_window_free(Pager_Win *pw)
628 if ((pw->drag.from_pager) && (pw->desk->pager->dragging))
629 pw->desk->pager->dragging = 0;
630 if (pw->o_window) evas_object_del(pw->o_window);
631 if (pw->o_icon) evas_object_del(pw->o_icon);
632 e_object_unref(E_OBJECT(pw->border));
637 _pager_window_move(Pager_Win *pw)
639 e_layout_child_move(pw->o_window,
640 pw->border->x - pw->border->zone->x,
641 pw->border->y - pw->border->zone->y);
642 e_layout_child_resize(pw->o_window, pw->border->w, pw->border->h);
646 _pager_window_find(Pager *p, E_Border *border)
651 EINA_LIST_FOREACH(p->desks, l, pd)
655 pw = _pager_desk_window_find(pd, border);
662 _pager_desk_window_find(Pager_Desk *pd, E_Border *border)
667 EINA_LIST_FOREACH(pd->wins, l, pw)
668 if (pw->border == border) return pw;
674 _pager_popup_new(E_Zone *zone, int keyaction)
677 Evas_Coord w, h, zx, zy, zw, zh;
678 int x, y, height, width;
681 pp = E_NEW(Pager_Popup, 1);
682 if (!pp) return NULL;
685 pp->popup = e_popup_new(zone, 0, 0, 1, 1);
691 e_popup_layer_set(pp->popup, 255);
693 pp->pager = _pager_new(pp->popup->evas, zone);
694 pp->pager->popup = pp;
697 e_zone_desk_count_get(zone, &x, &y);
700 height = pager_config->popup_act_height * y;
702 height = pager_config->popup_height * y;
704 width = height * (zone->w * x) / (zone->h * y);
706 evas_object_move(pp->pager->o_table, 0, 0);
707 evas_object_resize(pp->pager->o_table, width, height);
709 pp->o_bg = edje_object_add(pp->popup->evas);
710 e_theme_edje_object_set(pp->o_bg, "base/theme/modules/pager",
711 "e/modules/pager/popup");
712 desk = e_desk_current_get(zone);
714 edje_object_part_text_set(pp->o_bg, "e.text.label", desk->name);
715 evas_object_show(pp->o_bg);
717 edje_extern_object_min_size_set(pp->pager->o_table, width, height);
718 edje_object_part_swallow(pp->o_bg, "e.swallow.content", pp->pager->o_table);
719 edje_object_size_min_calc(pp->o_bg, &w, &h);
721 evas_object_move(pp->o_bg, 0, 0);
722 evas_object_resize(pp->o_bg, w, h);
723 e_popup_edje_bg_object_set(pp->popup, pp->o_bg);
724 //e_popup_ignore_events_set(pp->popup, 1);
725 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
728 e_popup_move_resize(pp->popup,
729 zx + ((zw - w) / 2), zy + ((zh - h) / 2), w, h);
730 e_bindings_mouse_grab(E_BINDING_CONTEXT_POPUP, pp->popup->evas_win);
731 e_bindings_wheel_grab(E_BINDING_CONTEXT_POPUP, pp->popup->evas_win);
733 e_popup_show(pp->popup);
741 _pager_popup_free(Pager_Popup *pp)
743 if (pp->timer) ecore_timer_del(pp->timer);
744 evas_object_del(pp->o_bg);
745 _pager_free(pp->pager);
746 e_bindings_mouse_ungrab(E_BINDING_CONTEXT_POPUP, pp->popup->evas_win);
747 e_bindings_wheel_ungrab(E_BINDING_CONTEXT_POPUP, pp->popup->evas_win);
748 e_object_del(E_OBJECT(pp->popup));
753 _pager_popup_find(E_Zone *zone)
758 EINA_LIST_FOREACH(pagers, l, p)
759 if ((p->popup) && (p->zone == zone))
766 _pager_cb_obj_moveresize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
771 _pager_instance_drop_zone_recalc(inst);
775 _button_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
778 Evas_Event_Mouse_Down *ev;
782 if ((ev->button == 3) && (!pager_config->menu))
789 mi = e_menu_item_new(m);
790 e_menu_item_label_set(mi, _("Settings"));
791 e_util_menu_item_theme_icon_set(mi, "configure");
792 e_menu_item_callback_set(mi, _pager_inst_cb_menu_configure, NULL);
794 m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0);
795 e_menu_post_deactivate_callback_set(m, _menu_cb_post, inst);
796 pager_config->menu = m;
798 if (e_configure_registry_exists("screen/virtual_desktops"))
800 mi = e_menu_item_new_relative(m, NULL);
801 e_menu_item_label_set(mi, _("Virtual Desktops Settings"));
802 e_util_menu_item_theme_icon_set(mi, "preferences-desktop");
803 e_menu_item_callback_set(mi, _pager_inst_cb_menu_virtual_desktops_dialog, inst);
806 e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy,
808 e_menu_activate_mouse(m,
809 e_util_zone_current_get(e_manager_current_get()),
810 cx + ev->output.x, cy + ev->output.y, 1, 1,
811 E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
816 _menu_cb_post(void *data __UNUSED__, E_Menu *m __UNUSED__)
818 if (!pager_config->menu) return;
819 e_object_del(E_OBJECT(pager_config->menu));
820 pager_config->menu = NULL;
824 _pager_inst_cb_menu_configure(void *data __UNUSED__, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
826 if (!pager_config) return;
827 if (pager_config->config_dialog) return;
828 /* FIXME: pass zone config item */
829 _config_pager_module(NULL);
832 static E_Config_Dialog *
833 _pager_config_dialog(E_Container *con __UNUSED__, const char *params __UNUSED__)
835 if (!pager_config) return NULL;
836 if (pager_config->config_dialog) return NULL;
837 /* FIXME: pass zone config item */
838 _config_pager_module(NULL);
839 return pager_config->config_dialog;
843 _pager_inst_cb_menu_virtual_desktops_dialog(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
848 e_configure_registry_call("screen/virtual_desktops",
849 inst->gcc->gadcon->zone->container, NULL);
853 _pager_instance_drop_zone_recalc(Instance *inst)
855 Evas_Coord x, y, w, h;
857 e_gadcon_client_viewport_geometry_get(inst->gcc, &x, &y, &w, &h);
858 e_drop_handler_geometry_set(inst->pager->drop_handler, x, y, w, h);
862 _pager_cb_config_updated(void)
864 if (!pager_config) return;
868 _pager_cb_event_border_resize(void *data __UNUSED__, int type __UNUSED__, void *event)
870 E_Event_Border_Resize *ev = event;
874 EINA_LIST_FOREACH(pagers, l, p)
878 if (p->zone != ev->border->zone) continue;
879 EINA_LIST_FOREACH(p->desks, l2, pd)
883 pw = _pager_desk_window_find(pd, ev->border);
884 if (pw) _pager_window_move(pw);
887 return ECORE_CALLBACK_PASS_ON;
891 _pager_cb_event_border_move(void *data __UNUSED__, int type __UNUSED__, void *event)
893 E_Event_Border_Move *ev = event;
899 EINA_LIST_FOREACH(pagers, l, p)
903 if (p->zone != ev->border->zone) continue;
904 EINA_LIST_FOREACH(p->desks, l2, pd)
906 pw = _pager_desk_window_find(pd, ev->border);
907 if (pw) _pager_window_move(pw);
911 if ((act_popup) && (act_popup->pager->zone == ev->border->zone))
913 EINA_LIST_FOREACH(act_popup->pager->desks, l, pd)
915 pw = _pager_desk_window_find(pd, ev->border);
916 if (pw) _pager_window_move(pw);
920 return ECORE_CALLBACK_PASS_ON;
924 _pager_cb_event_border_add(void *data __UNUSED__, int type __UNUSED__, void *event)
926 E_Event_Border_Add *ev = event;
930 EINA_LIST_FOREACH(pagers, l, p)
935 if ((p->zone != ev->border->zone) ||
936 (_pager_window_find(p, ev->border)))
938 pd = _pager_desk_find(p, ev->border->desk);
940 pw = _pager_window_new(pd, ev->border);
941 if (pw) pd->wins = eina_list_append(pd->wins, pw);
944 return ECORE_CALLBACK_PASS_ON;
948 _pager_cb_event_border_remove(void *data __UNUSED__, int type __UNUSED__, void *event)
950 E_Event_Border_Remove *ev = event;
954 EINA_LIST_FOREACH(pagers, l, p)
959 if (p->zone != ev->border->zone) continue;
961 EINA_LIST_FOREACH(p->desks, l2, pd)
965 pw = _pager_desk_window_find(pd, ev->border);
967 pd->wins = eina_list_remove(pd->wins, pw);
968 _pager_window_free(pw);
971 return ECORE_CALLBACK_PASS_ON;
975 _pager_cb_event_border_iconify(void *data __UNUSED__, int type __UNUSED__, void *event)
977 E_Event_Border_Iconify *ev = event;
981 EINA_LIST_FOREACH(pagers, l, p)
986 if (p->zone != ev->border->zone) continue;
988 EINA_LIST_FOREACH(p->desks, l2, pd)
992 pw = _pager_desk_window_find(pd, ev->border);
994 if ((pw->drag.from_pager) && (pw->desk->pager->dragging))
995 pw->desk->pager->dragging = 0;
996 evas_object_hide(pw->o_window);
1000 return ECORE_CALLBACK_PASS_ON;
1004 _pager_cb_event_border_uniconify(void *data __UNUSED__, int type __UNUSED__, void *event)
1006 E_Event_Border_Uniconify *ev = event;
1010 EINA_LIST_FOREACH(pagers, l, p)
1015 if (p->zone != ev->border->zone) continue;
1017 EINA_LIST_FOREACH(p->desks, l2, pd)
1021 pw = _pager_desk_window_find(pd, ev->border);
1022 if ((pw) && (!pw->skip_winlist)) evas_object_show(pw->o_window);
1026 return ECORE_CALLBACK_PASS_ON;
1030 _pager_cb_event_border_stick(void *data __UNUSED__, int type __UNUSED__, void *event)
1032 E_Event_Border_Stick *ev = event;
1036 EINA_LIST_FOREACH(pagers, l, p)
1042 if (p->zone != ev->border->zone) continue;
1043 pw = _pager_window_find(p, ev->border);
1046 EINA_LIST_FOREACH(p->desks, l2, pd)
1047 if (ev->border->desk != pd->desk)
1049 pw = _pager_window_new(pd, ev->border);
1050 if (pw) pd->wins = eina_list_append(pd->wins, pw);
1054 return ECORE_CALLBACK_PASS_ON;
1058 _pager_cb_event_border_unstick(void *data __UNUSED__, int type __UNUSED__, void *event)
1060 E_Event_Border_Unstick *ev = event;
1064 EINA_LIST_FOREACH(pagers, l, p)
1069 if (p->zone != ev->border->zone) continue;
1071 EINA_LIST_FOREACH(p->desks, l2, pd)
1072 if (ev->border->desk != pd->desk)
1076 pw = _pager_desk_window_find(pd, ev->border);
1079 pd->wins = eina_list_remove(pd->wins, pw);
1080 _pager_window_free(pw);
1084 return ECORE_CALLBACK_PASS_ON;
1088 _pager_window_desk_change(Pager *pager, E_Border *bd)
1094 /* if this pager is not for the zone of the border */
1095 if (pager->zone != bd->zone)
1097 /* look at all desks in the pager */
1098 EINA_LIST_FOREACH(pager->desks, l, pd)
1100 /* find this border in this desk */
1101 pw = _pager_desk_window_find(pd, bd);
1103 /* if it is found - remove it. it does not belong in this
1104 * pager as it probably moves zones */
1105 pd->wins = eina_list_remove(pd->wins, pw);
1106 _pager_window_free(pw);
1110 /* and this pager zone is for this border */
1111 /* see if the window is in this pager at all */
1112 pw = _pager_window_find(pager, bd);
1118 /* if its sticky and in this pager - its already everywhere, so abort
1119 * doing anything else */
1122 /* move it to the right desk */
1123 /* find the pager desk of the target desk */
1124 pd = _pager_desk_find(pager, bd->desk);
1127 Pager_Win *pw2 = NULL;
1130 /* remove it from whatever desk it was on */
1131 pw->desk->wins = eina_list_remove(pw->desk->wins, pw);
1132 e_layout_unpack(pw->o_window);
1134 /* add it to the one its MEANT to be on */
1136 pd->wins = eina_list_append(pd->wins, pw);
1137 e_layout_pack(pd->o_layout, pw->o_window);
1139 bd = e_util_desk_border_above(pw->border);
1141 pw2 = _pager_desk_window_find(pd, bd);
1143 e_layout_child_lower_below(pw->o_window, pw2->o_window);
1145 e_layout_child_raise(pw->o_window);
1147 _pager_window_move(pw);
1150 /* the border isn't in this pager at all - it must have moved zones */
1155 /* find the pager desk it needs to go to */
1156 pd = _pager_desk_find(pager, bd->desk);
1159 /* create it and add it */
1160 pw = _pager_window_new(pd, bd);
1163 Pager_Win *pw2 = NULL;
1166 pd->wins = eina_list_append(pd->wins, pw);
1167 bd = e_util_desk_border_above(pw->border);
1169 pw2 = _pager_desk_window_find(pd, bd);
1171 e_layout_child_lower_below(pw->o_window, pw2->o_window);
1173 e_layout_child_raise(pw->o_window);
1174 _pager_window_move(pw);
1180 /* go through all desks */
1181 EINA_LIST_FOREACH(pager->desks, l, pd)
1183 /* create it and add it */
1184 pw = _pager_window_new(pd, bd);
1187 Pager_Win *pw2 = NULL;
1190 pd->wins = eina_list_append(pd->wins, pw);
1191 bd = e_util_desk_border_above(pw->border);
1193 pw2 = _pager_desk_window_find(pd, bd);
1195 e_layout_child_lower_below(pw->o_window, pw2->o_window);
1197 e_layout_child_raise(pw->o_window);
1198 _pager_window_move(pw);
1206 _pager_cb_event_border_desk_set(void *data __UNUSED__, int type __UNUSED__, void *event)
1208 E_Event_Border_Desk_Set *ev = event;
1212 EINA_LIST_FOREACH(pagers, l, p)
1213 _pager_window_desk_change(p, ev->border);
1215 return ECORE_CALLBACK_PASS_ON;
1219 _pager_cb_event_border_stack(void *data __UNUSED__, int type __UNUSED__, void *event)
1221 E_Event_Border_Stack *ev = event;
1225 EINA_LIST_FOREACH(pagers, l, p)
1230 if (p->zone != ev->border->zone) continue;
1231 EINA_LIST_FOREACH(p->desks, l2, pd)
1233 Pager_Win *pw, *pw2 = NULL;
1235 pw = _pager_desk_window_find(pd, ev->border);
1240 pw2 = _pager_desk_window_find(pd, ev->stack);
1243 /* This border is on another desk... */
1244 E_Border *bd = NULL;
1246 if (ev->type == E_STACKING_ABOVE)
1247 bd = e_util_desk_border_below(ev->border);
1248 else if (ev->type == E_STACKING_BELOW)
1249 bd = e_util_desk_border_above(ev->border);
1250 if (bd) pw2 = _pager_desk_window_find(pd, bd);
1253 if (ev->type == E_STACKING_ABOVE)
1256 e_layout_child_raise_above(pw->o_window, pw2->o_window);
1258 /* If we aren't above any window, we are at the bottom */
1259 e_layout_child_lower(pw->o_window);
1261 else if (ev->type == E_STACKING_BELOW)
1264 e_layout_child_lower_below(pw->o_window, pw2->o_window);
1266 /* If we aren't below any window, we are at the top */
1267 e_layout_child_raise(pw->o_window);
1273 return ECORE_CALLBACK_PASS_ON;
1277 _pager_cb_event_border_icon_change(void *data __UNUSED__, int type __UNUSED__, void *event)
1279 E_Event_Border_Icon_Change *ev = event;
1283 EINA_LIST_FOREACH(pagers, l, p)
1288 if (p->zone != ev->border->zone) continue;
1289 EINA_LIST_FOREACH(p->desks, l2, pd)
1293 pw = _pager_desk_window_find(pd, ev->border);
1300 evas_object_del(pw->o_icon);
1303 o = e_border_icon_add(ev->border,
1304 evas_object_evas_get(p->o_table));
1308 evas_object_show(o);
1309 edje_object_part_swallow(pw->o_window,
1310 "e.swallow.icon", o);
1316 return ECORE_CALLBACK_PASS_ON;
1320 _pager_cb_event_border_urgent_change(void *data __UNUSED__, int type __UNUSED__, void *event)
1322 E_Event_Border_Urgent_Change *ev;
1332 zone = ev->border->zone;
1333 urgent = ev->border->client.icccm.urgent;
1335 if (pager_config->popup_urgent && (pager_config->popup_urgent_focus ||
1336 (!pager_config->popup_urgent_focus && !ev->border->focused)))
1338 pp = _pager_popup_find(zone);
1340 if ((!pp) && (urgent) && !(ev->border->iconic))
1342 pp = _pager_popup_new(zone, 0);
1344 if ((pp) && (!pager_config->popup_urgent_stick))
1345 pp->timer = ecore_timer_add(pager_config->popup_urgent_speed,
1346 _pager_popup_cb_timeout, pp);
1347 if (pp) pp->urgent = 1;
1351 EINA_LIST_FOREACH(pagers, l, p)
1353 if (p->zone != zone) continue;
1355 EINA_LIST_FOREACH(p->desks, l2, pd)
1357 pw = _pager_desk_window_find(pd, ev->border);
1360 if (urgent && !ev->border->focused)
1362 if (!(ev->border->iconic))
1364 if ((pd->pager) && (pd->pager->inst) &&
1365 (!pager_config->popup_urgent))
1366 e_gadcon_urgent_show(pd->pager->inst->gcc->gadcon);
1367 edje_object_signal_emit(pd->o_desk,
1368 "e,state,urgent", "e");
1370 edje_object_signal_emit(pw->o_window,
1371 "e,state,urgent", "e");
1375 if (!(ev->border->iconic))
1376 edje_object_signal_emit(pd->o_desk,
1377 "e,state,not_urgent", "e");
1378 edje_object_signal_emit(pw->o_window,
1379 "e,state,not_urgent", "e");
1385 return ECORE_CALLBACK_PASS_ON;
1389 _pager_cb_event_border_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
1391 E_Event_Border_Focus_In *ev;
1400 zone = ev->border->zone;
1402 EINA_LIST_FOREACH(pager_config->instances, l, inst)
1404 if (inst->pager->zone != zone) continue;
1406 EINA_LIST_FOREACH(inst->pager->desks, l2, pd)
1408 pw = _pager_desk_window_find(pd, ev->border);
1411 edje_object_signal_emit(pw->o_window,
1412 "e,state,focused", "e");
1418 pp = _pager_popup_find(zone);
1419 if (!pp) return ECORE_CALLBACK_PASS_ON;
1421 EINA_LIST_FOREACH(pp->pager->desks, l, pd)
1423 pw = _pager_desk_window_find(pd, ev->border);
1426 edje_object_signal_emit(pw->o_window,
1427 "e,state,focused", "e");
1432 return ECORE_CALLBACK_PASS_ON;
1436 _pager_cb_event_border_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
1438 E_Event_Border_Focus_Out *ev;
1447 zone = ev->border->zone;
1449 EINA_LIST_FOREACH(pager_config->instances, l, inst)
1453 if (inst->pager->zone != zone) continue;
1455 EINA_LIST_FOREACH(inst->pager->desks, l2, pd)
1457 pw = _pager_desk_window_find(pd, ev->border);
1460 edje_object_signal_emit(pw->o_window,
1461 "e,state,unfocused", "e");
1467 pp = _pager_popup_find(zone);
1468 if (!pp) return ECORE_CALLBACK_PASS_ON;
1470 EINA_LIST_FOREACH(pp->pager->desks, l, pd)
1472 pw = _pager_desk_window_find(pd, ev->border);
1475 edje_object_signal_emit(pw->o_window,
1476 "e,state,unfocused", "e");
1481 return ECORE_CALLBACK_PASS_ON;
1485 _pager_cb_event_border_property(void *data __UNUSED__, int type __UNUSED__, void *event)
1487 E_Event_Border_Property *ev = event;
1494 EINA_LIST_FOREACH(pagers, l, p)
1496 if (p->zone != ev->border->zone) continue;
1498 EINA_LIST_FOREACH(p->desks, l2, pd)
1500 pw = _pager_desk_window_find(pd, ev->border);
1504 if (ev->border->client.netwm.state.skip_pager)
1506 pd->wins = eina_list_remove(pd->wins, pw);
1507 _pager_window_free(pw);
1512 if (found) return ECORE_CALLBACK_PASS_ON;
1514 /* If we did not find this window in the pager, then add it because
1515 * the skip_pager state may have changed to 1 */
1516 EINA_LIST_FOREACH(pagers, l, p)
1518 if ((p->zone != ev->border->zone) ||
1519 (_pager_window_find(p, ev->border)))
1521 if (!ev->border->sticky)
1523 pd = _pager_desk_find(p, ev->border->desk);
1528 pw = _pager_window_new(pd, ev->border);
1531 Pager_Win *pw2 = NULL;
1534 pd->wins = eina_list_append(pd->wins, pw);
1535 bd = e_util_desk_border_above(pw->border);
1537 pw2 = _pager_desk_window_find(pd, bd);
1539 e_layout_child_lower_below(pw->o_window, pw2->o_window);
1541 e_layout_child_raise(pw->o_window);
1542 _pager_window_move(pw);
1548 EINA_LIST_FOREACH(p->desks, l2, pd)
1550 pw = _pager_window_new(pd, ev->border);
1553 Pager_Win *pw2 = NULL;
1556 pd->wins = eina_list_append(pd->wins, pw);
1557 bd = e_util_desk_border_above(pw->border);
1559 pw2 = _pager_desk_window_find(pd, bd);
1561 e_layout_child_lower_below(pw->o_window, pw2->o_window);
1563 e_layout_child_raise(pw->o_window);
1564 _pager_window_move(pw);
1570 return ECORE_CALLBACK_PASS_ON;
1574 _pager_cb_event_zone_desk_count_set(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
1579 EINA_LIST_FOREACH(pagers, l, p)
1583 if (p->inst) _gc_orient(p->inst->gcc, p->inst->gcc->gadcon->orient);
1586 return ECORE_CALLBACK_PASS_ON;
1590 _pager_cb_event_desk_show(void *data __UNUSED__, int type __UNUSED__, void *event)
1592 E_Event_Desk_Show *ev = event;
1598 EINA_LIST_FOREACH(pagers, l, p)
1600 if (p->zone != ev->desk->zone) continue;
1601 pd = _pager_desk_find(p, ev->desk);
1602 if (pd) _pager_desk_select(pd);
1605 edje_object_part_text_set(p->popup->o_bg, "text", ev->desk->name);
1608 if ((pager_config->popup) && (!act_popup))
1610 if ((pp = _pager_popup_find(ev->desk->zone)))
1611 ecore_timer_del(pp->timer);
1613 pp = _pager_popup_new(ev->desk->zone, 0);
1617 pp->timer = ecore_timer_add(pager_config->popup_speed,
1618 _pager_popup_cb_timeout, pp);
1620 pd = _pager_desk_find(pp->pager, ev->desk);
1623 _pager_desk_select(pd);
1624 edje_object_part_text_set(pp->o_bg, "e.text.label",
1627 ecore_timer_del(pp->timer);
1628 pp->timer = ecore_timer_add(pager_config->popup_speed,
1629 _pager_popup_cb_timeout, pp);
1633 return ECORE_CALLBACK_PASS_ON;
1637 _pager_cb_event_desk_name_change(void *data __UNUSED__, int type __UNUSED__, void *event)
1639 E_Event_Desk_Name_Change *ev = event;
1643 EINA_LIST_FOREACH(pagers, l, p)
1647 if (p->zone != ev->desk->zone) continue;
1648 pd = _pager_desk_find(p, ev->desk);
1649 if (pager_config->show_desk_names)
1652 edje_object_part_text_set(pd->o_desk, "e.text.label",
1658 edje_object_part_text_set(pd->o_desk, "e.text.label", "");
1662 return ECORE_CALLBACK_PASS_ON;
1666 _pager_cb_event_container_resize(void *data __UNUSED__, int type __UNUSED__, void *event)
1668 E_Event_Container_Resize *ev = event;
1672 EINA_LIST_FOREACH(pagers, l, p)
1677 if (p->zone->container != ev->container) continue;
1679 EINA_LIST_FOREACH(p->desks, l2, pd)
1680 e_layout_virtual_size_set(pd->o_layout, pd->desk->zone->w,
1683 if (p->inst) _gc_orient(p->inst->gcc, p->inst->gcc->gadcon->orient);
1684 /* TODO if (p->popup) */
1687 return ECORE_CALLBACK_PASS_ON;
1691 _pager_window_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1693 Evas_Event_Mouse_Down *ev;
1700 if (pw->desk->pager->popup && !act_popup) return;
1701 if (!pw->desk->pager->popup && ev->button == 3) return;
1702 if (ev->button == (int) pager_config->btn_desk) return;
1703 if ((ev->button == (int) pager_config->btn_drag) ||
1704 (ev->button == (int) pager_config->btn_noplace))
1708 evas_object_geometry_get(pw->o_window, &ox, &oy, NULL, NULL);
1709 pw->drag.in_pager = 1;
1710 pw->drag.x = ev->canvas.x;
1711 pw->drag.y = ev->canvas.y;
1712 pw->drag.dx = ox - ev->canvas.x;
1713 pw->drag.dy = oy - ev->canvas.y;
1715 pw->drag.button = ev->button;
1717 /* FIXME: disable move in pager for now, as dropping in between
1718 desks causes lost window */
1719 pw->drag.no_place = 0;
1720 if (ev->button == pager_config->btn_noplace) pw->drag.no_place = 1;
1722 pw->drag.no_place = 1;
1728 _pager_window_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1730 Evas_Event_Mouse_Up *ev;
1738 p = pw->desk->pager;
1740 if (pw->desk->pager->popup && !act_popup) return;
1741 if (ev->button == (int) pager_config->btn_desk) return;
1742 if ((ev->button == (int) pager_config->btn_drag) ||
1743 (ev->button == (int) pager_config->btn_noplace))
1745 if (!pw->drag.from_pager)
1747 if (!pw->drag.start) p->just_dragged = 1;
1748 pw->drag.in_pager = 0;
1756 _pager_window_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1758 Evas_Event_Mouse_Move *ev;
1761 Evas_Object *o, *oo;
1762 Evas_Coord x, y, w, h;
1763 const char *drag_types[] =
1764 { "enlightenment/pager_win", "enlightenment/border" };
1766 unsigned int resist = 0;
1767 Evas_Coord mx, my, vx, vy;
1774 if (pw->border->lock_user_location) return;
1775 if ((pw->desk->pager->popup) && (!act_popup)) return;
1776 /* prevent drag for a few pixels */
1779 dx = pw->drag.x - ev->cur.output.x;
1780 dy = pw->drag.y - ev->cur.output.y;
1781 if ((pw->desk) && (pw->desk->pager))
1782 resist = pager_config->drag_resist;
1784 if (((unsigned int) (dx * dx) + (unsigned int) (dy * dy)) <=
1785 (resist * resist)) return;
1787 pw->desk->pager->dragging = 1;
1791 /* dragging this win around inside the pager */
1792 if (pw->drag.in_pager)
1795 mx = ev->cur.canvas.x;
1796 my = ev->cur.canvas.y;
1798 /* find desk at pointer */
1799 pd = _pager_desk_at_coord(pw->desk->pager, mx, my);
1800 if ((pd) && (!pw->drag.no_place))
1804 e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, NULL, NULL);
1805 e_layout_coord_canvas_to_virtual(pd->o_layout,
1807 my + pw->drag.dy, &vx, &vy);
1809 e_border_desk_set(pw->border, pd->desk);
1810 e_border_move(pw->border, vx + zx, vy + zy);
1814 evas_object_geometry_get(pw->o_window, &x, &y, &w, &h);
1815 evas_object_hide(pw->o_window);
1817 drag = e_drag_new(pw->desk->pager->zone->container,
1818 x, y, drag_types, 2, pw, -1,
1819 _pager_window_cb_drag_convert,
1820 _pager_window_cb_drag_finished);
1822 o = edje_object_add(drag->evas);
1823 e_theme_edje_object_set(o, "base/theme/modules/pager",
1824 "e/modules/pager/window");
1825 evas_object_show(o);
1827 oo = e_border_icon_add(pw->border, drag->evas);
1830 evas_object_show(oo);
1831 edje_object_part_swallow(o, "e.swallow.icon", oo);
1834 e_drag_object_set(drag, o);
1835 e_drag_resize(drag, w, h);
1836 e_drag_start(drag, x - pw->drag.dx, y - pw->drag.dy);
1838 /* this prevents the desk from switching on drags */
1839 pw->drag.from_pager = pw->desk->pager;
1840 pw->drag.from_pager->dragging = 1;
1841 pw->drag.in_pager = 0;
1847 _pager_window_cb_drag_convert(E_Drag *drag, const char *type)
1852 if (!strcmp(type, "enlightenment/pager_win")) return pw;
1853 if (!strcmp(type, "enlightenment/border")) return pw->border;
1858 _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
1868 evas_object_show(pw->o_window);
1873 /* wasn't dropped (on pager). move it to position of mouse on screen */
1874 cont = e_container_current_get(e_manager_current_get());
1875 zone = e_zone_current_get(cont);
1876 desk = e_desk_current_get(zone);
1878 e_border_zone_set(pw->border, zone);
1879 e_border_desk_set(pw->border, desk);
1881 ecore_x_pointer_last_xy_get(&x, &y);
1883 dx = (pw->border->w / 2);
1884 dy = (pw->border->h / 2);
1886 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
1888 /* offset so that center of window is on mouse, but keep within desk bounds */
1892 if ((pw->border->w < zw) &&
1893 (x + pw->border->w > zx + zw))
1894 x -= x + pw->border->w - (zx + zw);
1901 if ((pw->border->h < zh) &&
1902 (y + pw->border->h > zy + zh))
1903 y -= y + pw->border->h - (zy + zh);
1906 e_border_move(pw->border, x, y);
1908 if (!(pw->border->lock_user_stacking)) e_border_raise(pw->border);
1910 if (pw->drag.from_pager) pw->drag.from_pager->dragging = 0;
1911 pw->drag.from_pager = NULL;
1915 e_grabinput_get(input_window, 0, input_window);
1916 if (!hold_count) _pager_popup_hide(1);
1921 _pager_inst_cb_scroll(void *data)
1926 _pager_update_drop_position(p, p->dnd_x, p->dnd_y);
1930 _pager_update_drop_position(Pager *p, Evas_Coord x, Evas_Coord y)
1932 Pager_Desk *pd, *pd2;
1937 pd = _pager_desk_at_coord(p, x, y);
1938 if (pd == p->active_drop_pd) return;
1939 for (l = p->desks; l; l = l->next)
1943 edje_object_signal_emit(pd2->o_desk, "e,action,drag,in", "e");
1944 else if (pd2 == p->active_drop_pd)
1945 edje_object_signal_emit(pd2->o_desk, "e,action,drag,out", "e");
1947 p->active_drop_pd = pd;
1951 _pager_drop_cb_enter(void *data, const char *type __UNUSED__, void *event_info)
1953 E_Event_Dnd_Enter *ev;
1959 /* FIXME this fixes a segv, but the case is not easy
1960 * reproduceable. this makes no sense either since
1961 * the same 'pager' is passed to e_drop_handler_add
1962 * and it works without this almost all the time.
1963 * so this must be an issue with e_dnd code... i guess */
1964 if (act_popup) p = act_popup->pager;
1966 _pager_update_drop_position(p, ev->x, ev->y);
1970 e_gadcon_client_autoscroll_cb_set(p->inst->gcc, _pager_inst_cb_scroll, p);
1971 e_gadcon_client_autoscroll_update(p->inst->gcc, ev->x, ev->y);
1976 _pager_drop_cb_move(void *data, const char *type __UNUSED__, void *event_info)
1978 E_Event_Dnd_Move *ev;
1984 if (act_popup) p = act_popup->pager;
1986 _pager_update_drop_position(p, ev->x, ev->y);
1989 e_gadcon_client_autoscroll_update(p->inst->gcc, ev->x, ev->y);
1993 _pager_drop_cb_leave(void *data, const char *type __UNUSED__, void *event_info __UNUSED__)
2000 if (act_popup) p = act_popup->pager;
2002 for (l = p->desks; l && p->active_drop_pd; l = l->next)
2007 if (pd == p->active_drop_pd)
2009 edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
2010 p->active_drop_pd = NULL;
2014 if (p->inst) e_gadcon_client_autoscroll_cb_set(p->inst->gcc, NULL, NULL);
2018 _pager_drop_cb_drop(void *data, const char *type, void *event_info)
2020 E_Event_Dnd_Drop *ev;
2022 Pager_Desk *pd2 = NULL;
2023 E_Border *bd = NULL;
2026 Pager_Win *pw = NULL;
2027 Evas_Coord wx, wy, wx2, wy2;
2034 if (act_popup) p = act_popup->pager;
2036 pd = _pager_desk_at_coord(p, ev->x, ev->y);
2039 if (!strcmp(type, "enlightenment/pager_win"))
2041 pw = (Pager_Win *)(ev->data);
2049 else if (!strcmp(type, "enlightenment/border"))
2052 e_layout_coord_virtual_to_canvas(pd->o_layout, bd->x, bd->y,
2054 e_layout_coord_virtual_to_canvas(pd->o_layout, bd->x + bd->w,
2055 bd->y + bd->h, &wx2, &wy2);
2056 dx = (wx - wx2) / 2;
2057 dy = (wy - wy2) / 2;
2059 else if (!strcmp(type, "enlightenment/vdesktop"))
2063 _pager_desk_switch(pd, pd2);
2070 if (bd->iconic) e_border_uniconify(bd);
2071 e_border_desk_set(bd, pd->desk);
2072 if ((!pw) || ((pw) && (!pw->drag.no_place)))
2076 e_layout_coord_canvas_to_virtual(pd->o_layout,
2080 e_zone_useful_geometry_get(pd->desk->zone,
2081 &zx, &zy, NULL, NULL);
2083 e_border_move(bd, nx + zx, ny + zy);
2088 for (l = p->desks; l && p->active_drop_pd; l = l->next)
2091 if (pd == p->active_drop_pd)
2093 edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
2094 p->active_drop_pd = NULL;
2098 if (p->inst) e_gadcon_client_autoscroll_cb_set(p->inst->gcc, NULL, NULL);
2102 _pager_desk_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2104 Evas_Event_Mouse_Down *ev;
2111 if ((!pd->pager->popup) && (ev->button == 3)) return;
2112 if (ev->button == (int) pager_config->btn_desk)
2114 evas_object_geometry_get(pd->o_desk, &ox, &oy, NULL, NULL);
2116 pd->drag.in_pager = 1;
2117 pd->drag.dx = ox - ev->canvas.x;
2118 pd->drag.dy = oy - ev->canvas.y;
2119 pd->drag.x = ev->canvas.x;
2120 pd->drag.y = ev->canvas.y;
2121 pd->drag.button = ev->button;
2126 _pager_desk_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2128 Evas_Event_Mouse_Up *ev;
2138 /* FIXME: pd->pager->dragging is 0 when finishing a drag from desk to desk */
2139 if ((ev->button == 1) && (!pd->pager->dragging) &&
2140 (!pd->pager->just_dragged))
2142 current_desk = pd->desk;
2143 e_desk_show(pd->desk);
2145 pd->drag.in_pager = 0;
2147 pd->pager->just_dragged = 0;
2149 if ((p->popup) && (p->popup->urgent)) _pager_popup_free(p->popup);
2153 _pager_desk_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2155 Evas_Event_Mouse_Move *ev;
2158 unsigned int resist = 0;
2160 Evas_Object *o, *oo, *o_icon;
2161 Evas_Coord x, y, w, h;
2162 const char *drag_types[] = { "enlightenment/vdesktop" };
2170 /* prevent drag for a few pixels */
2173 dx = pd->drag.x - ev->cur.output.x;
2174 dy = pd->drag.y - ev->cur.output.y;
2175 if ((pd->pager) && (pd->pager->inst))
2176 resist = pager_config->drag_resist;
2178 if (((unsigned int) (dx * dx) + (unsigned int) (dy * dy)) <=
2179 (resist * resist)) return;
2181 if (pd->pager) pd->pager->dragging = 1;
2185 if (pd->drag.in_pager && pd->pager)
2187 evas_object_geometry_get(pd->o_desk, &x, &y, &w, &h);
2188 drag = e_drag_new(pd->pager->zone->container,
2189 x, y, drag_types, 1, pd, -1,
2190 NULL, _pager_desk_cb_drag_finished);
2192 /* set a background to the drag icon */
2193 o = evas_object_rectangle_add(drag->evas);
2194 evas_object_color_set(o, 255, 255, 255, 255);
2195 evas_object_resize(o, w, h);
2196 evas_object_show(o);
2198 /* redraw the desktop theme above */
2199 o = edje_object_add(drag->evas);
2200 e_theme_edje_object_set(o, "base/theme/modules/pager",
2201 "e/modules/pager/desk");
2202 evas_object_show(o);
2203 e_drag_object_set(drag, o);
2205 /* and redraw is content */
2206 oo = e_layout_add(drag->evas);
2207 e_layout_virtual_size_set(oo, pd->pager->zone->w, pd->pager->zone->h);
2208 edje_object_part_swallow(o, "e.swallow.content", oo);
2209 evas_object_show(oo);
2211 EINA_LIST_FOREACH(pd->wins, l, pw)
2215 if ((!pw) || (pw->border->iconic)
2216 || (pw->border->client.netwm.state.skip_pager))
2219 o = edje_object_add(drag->evas);
2220 e_theme_edje_object_set(o, "base/theme/modules/pager",
2221 "e/modules/pager/window");
2222 e_layout_pack(oo, o);
2223 e_layout_child_raise(o);
2224 e_zone_useful_geometry_get(pw->desk->desk->zone,
2225 &zx, &zy, NULL, NULL);
2226 e_layout_child_move(o, pw->border->x - zx, pw->border->y - zy);
2227 e_layout_child_resize(o, pw->border->w, pw->border->h);
2228 evas_object_show(o);
2230 if ((o_icon = e_border_icon_add(pw->border, drag->evas)))
2232 evas_object_show(o_icon);
2233 edje_object_part_swallow(o, "e.swallow.icon", o_icon);
2236 e_drag_resize(drag, w, h);
2237 e_drag_start(drag, x - pd->drag.dx, y - pd->drag.dy);
2239 pd->drag.from_pager = pd->pager;
2240 pd->drag.from_pager->dragging = 1;
2241 pd->drag.in_pager = 0;
2246 _pager_desk_cb_drag_finished(E_Drag *drag, int dropped)
2249 Pager_Desk *pd2 = NULL;
2259 /* wasn't dropped on pager, switch with current desktop */
2260 if (!pd->desk) return;
2261 zone = e_util_zone_current_get(e_manager_current_get());
2262 desk = e_desk_current_get(zone);
2263 for (l = pagers; l && !pd2; l = l->next)
2266 pd2 = _pager_desk_find(p, desk);
2268 _pager_desk_switch(pd, pd2);
2270 if (pd->drag.from_pager)
2272 pd->drag.from_pager->dragging = 0;
2273 pd->drag.from_pager->just_dragged = 0;
2275 pd->drag.from_pager = NULL;
2279 e_grabinput_get(input_window, 0, input_window);
2280 if (!hold_count) _pager_popup_hide(1);
2285 _pager_desk_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2287 Evas_Event_Mouse_Wheel *ev;
2293 if (pd->pager->popup) return;
2295 if (pager_config->flip_desk)
2296 e_zone_desk_linear_flip_by(pd->desk->zone, ev->z);
2300 _pager_popup_cb_timeout(void *data)
2306 _pager_popup_free(pp);
2310 ecore_x_window_free(input_window);
2311 e_grabinput_release(input_window, input_window);
2315 return ECORE_CALLBACK_CANCEL;
2318 /************************************************************************/
2319 /* popup-on-keyaction functions */
2326 const char *drop[] =
2328 "enlightenment/pager_win", "enlightenment/border",
2329 "enlightenment/vdesktop"
2332 if ((act_popup) || (input_window)) return 0;
2334 zone = e_util_zone_current_get(e_manager_current_get());
2336 pp = _pager_popup_find(zone);
2337 if (pp) _pager_popup_free(pp);
2339 input_window = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1);
2340 ecore_x_window_show(input_window);
2341 if (!e_grabinput_get(input_window, 0, input_window))
2343 ecore_x_window_free(input_window);
2348 handlers = eina_list_append
2349 (handlers, ecore_event_handler_add
2350 (ECORE_EVENT_KEY_DOWN, _pager_popup_cb_key_down, NULL));
2351 handlers = eina_list_append
2352 (handlers, ecore_event_handler_add
2353 (ECORE_EVENT_KEY_UP, _pager_popup_cb_key_up, NULL));
2354 handlers = eina_list_append
2355 (handlers, ecore_event_handler_add
2356 (ECORE_EVENT_MOUSE_BUTTON_DOWN, _pager_popup_cb_mouse_down, NULL));
2357 handlers = eina_list_append
2358 (handlers, ecore_event_handler_add
2359 (ECORE_EVENT_MOUSE_BUTTON_UP, _pager_popup_cb_mouse_up, NULL));
2360 handlers = eina_list_append
2361 (handlers, ecore_event_handler_add
2362 (ECORE_EVENT_MOUSE_WHEEL, _pager_popup_cb_mouse_wheel, NULL));
2363 handlers = eina_list_append
2364 (handlers, ecore_event_handler_add
2365 (ECORE_EVENT_MOUSE_MOVE, _pager_popup_cb_mouse_move, NULL));
2367 act_popup = _pager_popup_new(zone, 1);
2369 e_popup_ignore_events_set(act_popup->popup, 1);
2371 evas_object_geometry_get(act_popup->pager->o_table, &x, &y, &w, &h);
2373 e_drop_handler_add(E_OBJECT(act_popup->popup), act_popup->pager,
2374 _pager_drop_cb_enter, _pager_drop_cb_move,
2375 _pager_drop_cb_leave, _pager_drop_cb_drop,
2376 drop, 3, x, y, w, h);
2378 e_bindings_key_grab(E_BINDING_CONTEXT_POPUP, act_popup->popup->evas_win);
2380 evas_event_freeze(act_popup->popup->evas);
2381 evas_event_feed_mouse_in(act_popup->popup->evas,
2382 ecore_x_current_time_get(), NULL);
2383 evas_event_feed_mouse_move(act_popup->popup->evas, -1000000, -1000000,
2384 ecore_x_current_time_get(), NULL);
2385 evas_event_thaw(act_popup->popup->evas);
2387 current_desk = e_desk_current_get(zone);
2393 _pager_popup_hide(int switch_desk)
2395 e_bindings_key_ungrab(E_BINDING_CONTEXT_POPUP, act_popup->popup->evas_win);
2400 ecore_event_handler_del(handlers->data);
2401 handlers = eina_list_remove_list(handlers, handlers);
2404 act_popup->timer = ecore_timer_add(0.1, _pager_popup_cb_timeout, act_popup);
2406 if ((switch_desk) && (current_desk)) e_desk_show(current_desk);
2412 _pager_popup_modifiers_set(int mod)
2414 if (!act_popup) return;
2417 if (hold_mod & ECORE_EVENT_MODIFIER_SHIFT) hold_count++;
2418 if (hold_mod & ECORE_EVENT_MODIFIER_CTRL) hold_count++;
2419 if (hold_mod & ECORE_EVENT_MODIFIER_ALT) hold_count++;
2420 if (hold_mod & ECORE_EVENT_MODIFIER_WIN) hold_count++;
2424 _pager_popup_desk_switch(int x, int y)
2426 int max_x,max_y, desk_x, desk_y;
2428 Pager_Popup *pp = act_popup;
2430 e_zone_desk_count_get(pp->pager->zone, &max_x, &max_y);
2432 desk_x = current_desk->x + x;
2433 desk_y = current_desk->y + y;
2437 else if (desk_x >= max_x)
2442 else if (desk_y >= max_y)
2445 current_desk = e_desk_at_xy_get(pp->pager->zone, desk_x, desk_y);
2447 pd = _pager_desk_find(pp->pager, current_desk);
2448 if (pd) _pager_desk_select(pd);
2450 edje_object_part_text_set(pp->o_bg, "e.text.label", current_desk->name);
2454 _pager_popup_cb_action_show(E_Object *obj __UNUSED__, const char *params __UNUSED__, Ecore_Event_Key *ev __UNUSED__)
2456 if (_pager_popup_show())
2457 _pager_popup_modifiers_set(ev->modifiers);
2461 _pager_popup_cb_action_switch(E_Object *obj __UNUSED__, const char *params, Ecore_Event_Key *ev)
2463 int max_x,max_y, desk_x;
2468 if (_pager_popup_show())
2469 _pager_popup_modifiers_set(ev->modifiers);
2474 e_zone_desk_count_get(act_popup->pager->zone, &max_x, &max_y);
2475 desk_x = current_desk->x /* + x <=this is always 0 */;
2477 if (!strcmp(params, "left"))
2479 else if (!strcmp(params, "right"))
2481 else if (!strcmp(params, "up"))
2483 else if (!strcmp(params, "down"))
2485 else if (!strcmp(params, "next"))
2488 if (desk_x == max_x - 1)
2491 else if (!strcmp(params, "prev"))
2498 _pager_popup_desk_switch(x, y);
2502 _pager_popup_cb_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event)
2504 Ecore_Event_Mouse_Button *ev;
2505 Pager_Popup *pp = act_popup;
2508 if (ev->window != input_window) return ECORE_CALLBACK_PASS_ON;
2510 evas_event_feed_mouse_down(pp->popup->evas, ev->buttons,
2511 0, ev->timestamp, NULL);
2512 return ECORE_CALLBACK_PASS_ON;
2516 _pager_popup_cb_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event)
2518 Ecore_Event_Mouse_Button *ev;
2519 Pager_Popup *pp = act_popup;
2522 if (ev->window != input_window) return ECORE_CALLBACK_PASS_ON;
2524 evas_event_feed_mouse_up(pp->popup->evas, ev->buttons,
2525 0, ev->timestamp, NULL);
2526 return ECORE_CALLBACK_PASS_ON;
2530 _pager_popup_cb_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
2532 Ecore_Event_Mouse_Move *ev;
2533 Pager_Popup *pp = act_popup;
2536 if (ev->window != input_window) return 1;
2538 evas_event_feed_mouse_move(pp->popup->evas,
2539 ev->x - pp->popup->x + pp->pager->zone->x,
2540 ev->y - pp->popup->y + pp->pager->zone->y,
2541 ev->timestamp, NULL);
2542 return ECORE_CALLBACK_PASS_ON;
2546 _pager_popup_cb_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
2548 Ecore_Event_Mouse_Wheel *ev = event;
2549 Pager_Popup *pp = act_popup;
2552 e_zone_desk_count_get(pp->pager->zone, &max_x, NULL);
2554 if (current_desk->x + ev->z >= max_x)
2555 _pager_popup_desk_switch(1, 1);
2556 else if (current_desk->x + ev->z < 0)
2557 _pager_popup_desk_switch(-1, -1);
2559 _pager_popup_desk_switch(ev->z, 0);
2561 return ECORE_CALLBACK_PASS_ON;
2565 _pager_popup_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
2567 Ecore_Event_Key *ev;
2570 if (ev->window != input_window) return ECORE_CALLBACK_PASS_ON;
2571 if (!strcmp(ev->key, "Up"))
2572 _pager_popup_desk_switch(0, -1);
2573 else if (!strcmp(ev->key, "Down"))
2574 _pager_popup_desk_switch(0, 1);
2575 else if (!strcmp(ev->key, "Left"))
2576 _pager_popup_desk_switch(-1, 0);
2577 else if (!strcmp(ev->key, "Right"))
2578 _pager_popup_desk_switch(1, 0);
2579 else if (!strcmp(ev->key, "Escape"))
2580 _pager_popup_hide(0);
2583 E_Config_Binding_Key *bind;
2586 EINA_LIST_FOREACH(e_config->key_bindings, l, bind)
2588 E_Binding_Modifier mod = 0;
2590 if ((bind->action) && (strcmp(bind->action,"pager_switch")))
2593 if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
2594 mod |= E_BINDING_MODIFIER_SHIFT;
2595 if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
2596 mod |= E_BINDING_MODIFIER_CTRL;
2597 if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
2598 mod |= E_BINDING_MODIFIER_ALT;
2599 if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
2600 mod |= E_BINDING_MODIFIER_WIN;
2602 if (bind->key && (!strcmp(bind->key, ev->keyname)) &&
2603 ((bind->modifiers == (int) mod)))
2607 act = e_action_find(bind->action);
2611 if (act->func.go_key)
2612 act->func.go_key(NULL, bind->params, ev);
2617 return ECORE_CALLBACK_PASS_ON;
2621 _pager_popup_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
2623 Ecore_Event_Key *ev;
2626 if (!(act_popup)) return ECORE_CALLBACK_PASS_ON;
2630 if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) &&
2631 (!strcmp(ev->key, "Shift_L"))) hold_count--;
2632 else if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) &&
2633 (!strcmp(ev->key, "Shift_R"))) hold_count--;
2634 else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) &&
2635 (!strcmp(ev->key, "Control_L"))) hold_count--;
2636 else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) &&
2637 (!strcmp(ev->key, "Control_R"))) hold_count--;
2638 else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) &&
2639 (!strcmp(ev->key, "Alt_L"))) hold_count--;
2640 else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) &&
2641 (!strcmp(ev->key, "Alt_R"))) hold_count--;
2642 else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) &&
2643 (!strcmp(ev->key, "Meta_L"))) hold_count--;
2644 else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) &&
2645 (!strcmp(ev->key, "Meta_R"))) hold_count--;
2646 else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) &&
2647 (!strcmp(ev->key, "Super_L"))) hold_count--;
2648 else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) &&
2649 (!strcmp(ev->key, "Super_R"))) hold_count--;
2650 else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) &&
2651 (!strcmp(ev->key, "Super_L"))) hold_count--;
2652 else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) &&
2653 (!strcmp(ev->key, "Super_R"))) hold_count--;
2654 else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) &&
2655 (!strcmp(ev->key, "Mode_switch"))) hold_count--;
2656 else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) &&
2657 (!strcmp(ev->key, "Meta_L"))) hold_count--;
2658 else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) &&
2659 (!strcmp(ev->key, "Meta_R"))) hold_count--;
2660 if ((hold_count <= 0) && (!act_popup->pager->dragging))
2662 _pager_popup_hide(1);
2663 return ECORE_CALLBACK_PASS_ON;
2667 return ECORE_CALLBACK_PASS_ON;
2670 /***************************************************************************/
2672 EAPI E_Module_Api e_modapi =
2674 E_MODULE_API_VERSION, "Pager"
2678 e_modapi_init(E_Module *m)
2680 conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config);
2685 E_CONFIG_VAL(D, T, popup, UINT);
2686 E_CONFIG_VAL(D, T, popup_speed, DOUBLE);
2687 E_CONFIG_VAL(D, T, popup_urgent, UINT);
2688 E_CONFIG_VAL(D, T, popup_urgent_stick, UINT);
2689 E_CONFIG_VAL(D, T, popup_urgent_speed, DOUBLE);
2690 E_CONFIG_VAL(D, T, show_desk_names, UINT);
2691 E_CONFIG_VAL(D, T, popup_height, INT);
2692 E_CONFIG_VAL(D, T, popup_act_height, INT);
2693 E_CONFIG_VAL(D, T, drag_resist, UINT);
2694 E_CONFIG_VAL(D, T, btn_drag, UCHAR);
2695 E_CONFIG_VAL(D, T, btn_noplace, UCHAR);
2696 E_CONFIG_VAL(D, T, btn_desk, UCHAR);
2697 E_CONFIG_VAL(D, T, flip_desk, UCHAR);
2699 pager_config = e_config_domain_load("module.pager", conf_edd);
2703 pager_config = E_NEW(Config, 1);
2704 pager_config->popup = 1;
2705 pager_config->popup_speed = 1.0;
2706 pager_config->popup_urgent = 0;
2707 pager_config->popup_urgent_stick = 0;
2708 pager_config->popup_urgent_speed = 1.5;
2709 pager_config->show_desk_names = 1;
2710 pager_config->popup_height = 60;
2711 pager_config->popup_act_height = 60;
2712 pager_config->drag_resist = 3;
2713 pager_config->btn_drag = 1;
2714 pager_config->btn_noplace = 2;
2715 pager_config->btn_desk = 0;
2716 pager_config->flip_desk = 0;
2718 E_CONFIG_LIMIT(pager_config->popup, 0, 1);
2719 E_CONFIG_LIMIT(pager_config->popup_speed, 0.1, 10.0);
2720 E_CONFIG_LIMIT(pager_config->popup_urgent, 0, 1);
2721 E_CONFIG_LIMIT(pager_config->popup_urgent_stick, 0, 1);
2722 E_CONFIG_LIMIT(pager_config->popup_urgent_speed, 0.1, 10.0);
2723 E_CONFIG_LIMIT(pager_config->show_desk_names, 0, 1);
2724 E_CONFIG_LIMIT(pager_config->popup_height, 20, 200);
2725 E_CONFIG_LIMIT(pager_config->popup_act_height, 20, 200);
2726 E_CONFIG_LIMIT(pager_config->drag_resist, 0, 50);
2727 E_CONFIG_LIMIT(pager_config->flip_desk, 0, 1);
2728 E_CONFIG_LIMIT(pager_config->btn_drag, 0, 32);
2729 E_CONFIG_LIMIT(pager_config->btn_noplace, 0, 32);
2730 E_CONFIG_LIMIT(pager_config->btn_desk, 0, 32);
2732 pager_config->handlers = eina_list_append
2733 (pager_config->handlers, ecore_event_handler_add
2734 (E_EVENT_BORDER_RESIZE, _pager_cb_event_border_resize, NULL));
2735 pager_config->handlers = eina_list_append
2736 (pager_config->handlers, ecore_event_handler_add
2737 (E_EVENT_BORDER_MOVE, _pager_cb_event_border_move, NULL));
2738 pager_config->handlers = eina_list_append
2739 (pager_config->handlers, ecore_event_handler_add
2740 (E_EVENT_BORDER_ADD, _pager_cb_event_border_add, NULL));
2741 pager_config->handlers = eina_list_append
2742 (pager_config->handlers, ecore_event_handler_add
2743 (E_EVENT_BORDER_REMOVE, _pager_cb_event_border_remove, NULL));
2744 pager_config->handlers = eina_list_append
2745 (pager_config->handlers, ecore_event_handler_add
2746 (E_EVENT_BORDER_ICONIFY, _pager_cb_event_border_iconify, NULL));
2747 pager_config->handlers = eina_list_append
2748 (pager_config->handlers, ecore_event_handler_add
2749 (E_EVENT_BORDER_UNICONIFY, _pager_cb_event_border_uniconify, NULL));
2750 pager_config->handlers = eina_list_append
2751 (pager_config->handlers, ecore_event_handler_add
2752 (E_EVENT_BORDER_STICK, _pager_cb_event_border_stick, NULL));
2753 pager_config->handlers = eina_list_append
2754 (pager_config->handlers, ecore_event_handler_add
2755 (E_EVENT_BORDER_UNSTICK, _pager_cb_event_border_unstick, NULL));
2756 pager_config->handlers = eina_list_append
2757 (pager_config->handlers, ecore_event_handler_add
2758 (E_EVENT_BORDER_DESK_SET, _pager_cb_event_border_desk_set, NULL));
2759 pager_config->handlers = eina_list_append
2760 (pager_config->handlers, ecore_event_handler_add
2761 (E_EVENT_BORDER_STACK, _pager_cb_event_border_stack, NULL));
2762 pager_config->handlers = eina_list_append
2763 (pager_config->handlers, ecore_event_handler_add
2764 (E_EVENT_BORDER_ICON_CHANGE, _pager_cb_event_border_icon_change, NULL));
2765 pager_config->handlers = eina_list_append
2766 (pager_config->handlers, ecore_event_handler_add
2767 (E_EVENT_BORDER_URGENT_CHANGE, _pager_cb_event_border_urgent_change, NULL));
2768 pager_config->handlers = eina_list_append
2769 (pager_config->handlers, ecore_event_handler_add
2770 (E_EVENT_BORDER_FOCUS_IN,
2771 _pager_cb_event_border_focus_in, NULL));
2772 pager_config->handlers = eina_list_append
2773 (pager_config->handlers, ecore_event_handler_add
2774 (E_EVENT_BORDER_FOCUS_OUT,
2775 _pager_cb_event_border_focus_out, NULL));
2776 pager_config->handlers = eina_list_append
2777 (pager_config->handlers, ecore_event_handler_add
2778 (E_EVENT_BORDER_PROPERTY, _pager_cb_event_border_property, NULL));
2779 pager_config->handlers = eina_list_append
2780 (pager_config->handlers, ecore_event_handler_add
2781 (E_EVENT_ZONE_DESK_COUNT_SET, _pager_cb_event_zone_desk_count_set, NULL));
2782 pager_config->handlers = eina_list_append
2783 (pager_config->handlers, ecore_event_handler_add
2784 (E_EVENT_DESK_SHOW, _pager_cb_event_desk_show, NULL));
2785 pager_config->handlers = eina_list_append
2786 (pager_config->handlers, ecore_event_handler_add
2787 (E_EVENT_DESK_NAME_CHANGE, _pager_cb_event_desk_name_change, NULL));
2788 pager_config->handlers = eina_list_append
2789 (pager_config->handlers, ecore_event_handler_add
2790 (E_EVENT_CONTAINER_RESIZE, _pager_cb_event_container_resize, NULL));
2792 pager_config->module = m;
2794 e_gadcon_provider_register(&_gadcon_class);
2796 e_configure_registry_item_add("extensions/pager", 40, N_("Pager"), NULL,
2797 "preferences-pager", _pager_config_dialog);
2799 act_popup_show = e_action_add("pager_show");
2802 act_popup_show->func.go_key = _pager_popup_cb_action_show;
2803 e_action_predef_name_set(N_("Pager"), N_("Show Pager Popup"),
2804 "pager_show", "<none>", NULL, 0);
2806 act_popup_switch = e_action_add("pager_switch");
2807 if (act_popup_switch)
2809 act_popup_switch->func.go_key = _pager_popup_cb_action_switch;
2810 e_action_predef_name_set(N_("Pager"), N_("Popup Desk Right"),
2811 "pager_switch", "right", NULL, 0);
2812 e_action_predef_name_set(N_("Pager"), N_("Popup Desk Left"),
2813 "pager_switch", "left", NULL, 0);
2814 e_action_predef_name_set(N_("Pager"), N_("Popup Desk Up"),
2815 "pager_switch", "up", NULL, 0);
2816 e_action_predef_name_set(N_("Pager"), N_("Popup Desk Down"),
2817 "pager_switch", "down", NULL, 0);
2818 e_action_predef_name_set(N_("Pager"), N_("Popup Desk Next"),
2819 "pager_switch", "next", NULL, 0);
2820 e_action_predef_name_set(N_("Pager"), N_("Popup Desk Previous"),
2821 "pager_switch", "prev", NULL, 0);
2828 e_modapi_shutdown(E_Module *m __UNUSED__)
2830 e_gadcon_provider_unregister(&_gadcon_class);
2832 if (pager_config->config_dialog)
2833 e_object_del(E_OBJECT(pager_config->config_dialog));
2834 while (pager_config->handlers)
2836 ecore_event_handler_del(pager_config->handlers->data);
2837 pager_config->handlers =
2838 eina_list_remove_list(pager_config->handlers, pager_config->handlers);
2841 if (pager_config->menu)
2843 e_menu_post_deactivate_callback_set(pager_config->menu, NULL, NULL);
2844 e_object_del(E_OBJECT(pager_config->menu));
2845 pager_config->menu = NULL;
2848 e_configure_registry_item_del("extensions/pager");
2850 e_action_del("pager_show");
2851 e_action_del("pager_switch");
2853 e_action_predef_name_del(N_("Pager"), N_("Popup Desk Right"));
2854 e_action_predef_name_del(N_("Pager"), N_("Popup Desk Left"));
2855 e_action_predef_name_del(N_("Pager"), N_("Popup Desk Up"));
2856 e_action_predef_name_del(N_("Pager"), N_("Popup Desk Down"));
2857 e_action_predef_name_del(N_("Pager"), N_("Popup Desk Next"));
2858 e_action_predef_name_del(N_("Pager"), N_("Popup Desk Previous"));
2860 E_FREE(pager_config);
2861 E_CONFIG_DD_FREE(conf_edd);
2866 e_modapi_save(E_Module *m __UNUSED__)
2868 e_config_domain_save("module.pager", conf_edd, pager_config);