diff --git a/src/modules/pager/e_mod_config.c b/src/modules/pager/e_mod_config.c index 20fd336e0..5a78db9fb 100644 --- a/src/modules/pager/e_mod_config.c +++ b/src/modules/pager/e_mod_config.c @@ -153,7 +153,7 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) pager_config->show_desk_names = cfdata->show_desk_names; pager_config->popup_urgent = cfdata->popup.urgent_show; _pager_cb_config_updated(); - _pager_cb_config_gadget_updated(); + _pager_cb_config_gadget_updated(EINA_FALSE); e_config_save_queue(); return 1; } @@ -307,7 +307,7 @@ _adv_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) pager_config->btn_noplace = cfdata->btn.noplace; pager_config->btn_desk = cfdata->btn.desk; _pager_cb_config_updated(); - _pager_cb_config_gadget_updated(); + _pager_cb_config_gadget_updated(EINA_FALSE); e_config_save_queue(); return 1; } diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 2306e2ed7..5d8850f5f 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -164,7 +164,6 @@ static Pager_Popup *act_popup = NULL; /* active popup */ static int hold_count = 0; static int hold_mod = 0; static E_Desk *current_desk = NULL; -static E_Config_DD *conf_edd = NULL; static Eina_List *pagers = NULL; EINTERN E_Module *module; @@ -2052,57 +2051,6 @@ e_modapi_init(E_Module *m) e_util_dialog_show(_("Error"), _("Pager module cannot be loaded at the same time as Pager Plain!")); return NULL; } - conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config); -#undef T -#undef D -#define T Config -#define D conf_edd - E_CONFIG_VAL(D, T, popup, UINT); - E_CONFIG_VAL(D, T, popup_speed, DOUBLE); - E_CONFIG_VAL(D, T, popup_urgent, UINT); - E_CONFIG_VAL(D, T, popup_urgent_stick, UINT); - E_CONFIG_VAL(D, T, popup_urgent_speed, DOUBLE); - E_CONFIG_VAL(D, T, show_desk_names, UINT); - E_CONFIG_VAL(D, T, popup_height, INT); - E_CONFIG_VAL(D, T, popup_act_height, INT); - E_CONFIG_VAL(D, T, drag_resist, UINT); - E_CONFIG_VAL(D, T, btn_drag, UCHAR); - E_CONFIG_VAL(D, T, btn_noplace, UCHAR); - E_CONFIG_VAL(D, T, btn_desk, UCHAR); - E_CONFIG_VAL(D, T, flip_desk, UCHAR); - - pager_config = e_config_domain_load("module.pager", conf_edd); - - if (!pager_config) - { - pager_config = E_NEW(Config, 1); - pager_config->popup = 1; - pager_config->popup_speed = 1.0; - pager_config->popup_urgent = 0; - pager_config->popup_urgent_stick = 0; - pager_config->popup_urgent_speed = 1.5; - pager_config->show_desk_names = 0; - pager_config->popup_height = 60; - pager_config->popup_act_height = 60; - pager_config->drag_resist = 3; - pager_config->btn_drag = 1; - pager_config->btn_noplace = 2; - pager_config->btn_desk = 2; - pager_config->flip_desk = 0; - } - E_CONFIG_LIMIT(pager_config->popup, 0, 1); - E_CONFIG_LIMIT(pager_config->popup_speed, 0.1, 10.0); - E_CONFIG_LIMIT(pager_config->popup_urgent, 0, 1); - E_CONFIG_LIMIT(pager_config->popup_urgent_stick, 0, 1); - E_CONFIG_LIMIT(pager_config->popup_urgent_speed, 0.1, 10.0); - E_CONFIG_LIMIT(pager_config->show_desk_names, 0, 1); - E_CONFIG_LIMIT(pager_config->popup_height, 20, 200); - E_CONFIG_LIMIT(pager_config->popup_act_height, 20, 200); - E_CONFIG_LIMIT(pager_config->drag_resist, 0, 50); - E_CONFIG_LIMIT(pager_config->flip_desk, 0, 1); - E_CONFIG_LIMIT(pager_config->btn_drag, 0, 32); - E_CONFIG_LIMIT(pager_config->btn_noplace, 0, 32); - E_CONFIG_LIMIT(pager_config->btn_desk, 0, 32); E_LIST_HANDLER_APPEND(shandlers, E_EVENT_ZONE_DESK_COUNT_SET, _pager_cb_event_zone_desk_count_set, NULL); E_LIST_HANDLER_APPEND(shandlers, E_EVENT_DESK_SHOW, _pager_cb_event_desk_show, NULL); @@ -2155,8 +2103,6 @@ e_modapi_shutdown(E_Module *m) e_object_del(E_OBJECT(config_dialog)); E_FREE_LIST(shandlers, ecore_event_handler_del); - e_configure_registry_item_del("extensions/pager"); - e_action_del("pager_show"); e_action_del("pager_switch"); @@ -2167,8 +2113,6 @@ e_modapi_shutdown(E_Module *m) e_action_predef_name_del("Pager", "Popup Desk Next"); e_action_predef_name_del("Pager", "Popup Desk Previous"); - E_FREE(pager_config); - E_CONFIG_DD_FREE(conf_edd); return 1; } @@ -2176,7 +2120,6 @@ E_API int e_modapi_save(E_Module *m) { e_modapi_gadget_save(m); - e_config_domain_save("module.pager", conf_edd, pager_config); return 1; } diff --git a/src/modules/pager/gadget/config.c b/src/modules/pager/gadget/config.c index 97f0c2939..2d507b8e2 100644 --- a/src/modules/pager/gadget/config.c +++ b/src/modules/pager/gadget/config.c @@ -10,6 +10,7 @@ struct _Config_Objects Evas_Object *general_page; Evas_Object *popup_page; Evas_Object *urgent_page; + Evas_Object *style_page; Evas_Object *o_popup; Evas_Object *o_popup_speed; Evas_Object *o_popup_urgent; @@ -25,6 +26,8 @@ struct _Config_Objects Evas_Object *o_btn_desk; Evas_Object *o_btn_virtual; Evas_Object *o_flip_desk; + Evas_Object *o_permanent; + Evas_Object *o_plain; E_Grab_Dialog *grab_dia; int grab_btn; int w, h; @@ -43,6 +46,7 @@ _config_show_general(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void { evas_object_hide(pager_gadget_config_objects->popup_page); evas_object_hide(pager_gadget_config_objects->urgent_page); + evas_object_hide(pager_gadget_config_objects->style_page); evas_object_show(pager_gadget_config_objects->general_page); } @@ -51,6 +55,7 @@ _config_show_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e { evas_object_hide(pager_gadget_config_objects->general_page); evas_object_hide(pager_gadget_config_objects->urgent_page); + evas_object_hide(pager_gadget_config_objects->style_page); evas_object_show(pager_gadget_config_objects->popup_page); } @@ -59,12 +64,23 @@ _config_show_urgent(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void * { evas_object_hide(pager_gadget_config_objects->general_page); evas_object_hide(pager_gadget_config_objects->popup_page); + evas_object_hide(pager_gadget_config_objects->style_page); evas_object_show(pager_gadget_config_objects->urgent_page); } +static void +_config_show_style(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_hide(pager_gadget_config_objects->general_page); + evas_object_hide(pager_gadget_config_objects->popup_page); + evas_object_hide(pager_gadget_config_objects->urgent_page); + evas_object_show(pager_gadget_config_objects->style_page); +} + static void _config_value_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) { + Eina_Bool val, changed = EINA_FALSE; pager_config->popup = elm_check_state_get(pager_gadget_config_objects->o_popup); pager_config->popup_speed = @@ -87,7 +103,15 @@ _config_value_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void elm_slider_value_get(pager_gadget_config_objects->o_popup_act_height); pager_config->drag_resist = elm_slider_value_get(pager_gadget_config_objects->o_drag_resist); - _pager_cb_config_gadget_updated(); + val = elm_check_state_get(pager_gadget_config_objects->o_permanent); + if (val != pager_config->permanent_plain) + changed = EINA_TRUE; + pager_config->permanent_plain = val; + val = elm_check_state_get(pager_gadget_config_objects->o_plain); + if (val != pager_config->plain) + changed = EINA_TRUE; + pager_config->plain = val; + _pager_cb_config_gadget_updated(changed); _pager_cb_config_updated(); e_config_save_queue(); @@ -322,7 +346,7 @@ _config_create_pages(Evas_Object *parent) evas_object_show(ow); pager_gadget_config_objects->o_show_desk_names = ow; - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Resistance to dragging")); elm_table_pack(tb, ow, 0, 3, 1, 1); E_ALIGN(ow, 0.0, 0.0); @@ -343,7 +367,7 @@ _config_create_pages(Evas_Object *parent) pager_gadget_config_objects->o_drag_resist = ow; #if 0 - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Select and Slide button")); elm_table_pack(tb, ow, 0, row, 1, 1); E_ALIGN(ow, 0.0, 0.0); @@ -363,7 +387,7 @@ _config_create_pages(Evas_Object *parent) row++; #endif - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Drag and Drop button")); elm_table_pack(tb, ow, 0, row, 1, 1); E_ALIGN(ow, 0.0, 0.0); @@ -382,7 +406,7 @@ _config_create_pages(Evas_Object *parent) pager_gadget_config_objects->o_btn_noplace = ow; row++; - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Drag whole desktop")); elm_table_pack(tb, ow, 0, row, 1, 1); E_ALIGN(ow, 0.0, 0.0); @@ -429,7 +453,7 @@ _config_create_pages(Evas_Object *parent) evas_object_show(ow); pager_gadget_config_objects->o_popup = ow; - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Popup pager height")); elm_object_disabled_set(ow, !pager_config->popup); elm_table_pack(tb, ow, 0, 1, 1, 1); @@ -451,7 +475,7 @@ _config_create_pages(Evas_Object *parent) evas_object_show(ow); pager_gadget_config_objects->o_popup_height = ow; - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Popup duration")); elm_object_disabled_set(ow, !pager_config->popup); elm_table_pack(tb, ow, 0, 3, 1, 1); @@ -473,7 +497,7 @@ _config_create_pages(Evas_Object *parent) evas_object_show(ow); pager_gadget_config_objects->o_popup_speed = ow; - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Pager action popup height")); elm_object_disabled_set(ow, !pager_config->popup); elm_table_pack(tb, ow, 0, 5, 1, 1); @@ -548,7 +572,7 @@ _config_create_pages(Evas_Object *parent) evas_object_show(ow); pager_gadget_config_objects->o_popup_urgent_focus = ow; - ow = elm_label_add(tb); + ow = elm_label_add(m); elm_object_text_set(ow, _("Urgent Popup Duration")); elm_object_disabled_set(ow, !pager_config->popup_urgent); elm_table_pack(tb, ow, 0, 3, 1, 1); @@ -573,6 +597,45 @@ _config_create_pages(Evas_Object *parent) elm_table_pack(m, fr, 0, 0, 1, 1); pager_gadget_config_objects->urgent_page = fr; + /* Style Page */ + fr = elm_frame_add(m); + elm_object_text_set(fr, _("Style")); + E_EXPAND(fr); + E_FILL(fr); + evas_object_show(fr); + + tb = elm_table_add(m); + E_EXPAND(tb); + elm_object_content_set(fr, tb); + evas_object_show(tb); + + ow = elm_check_add(tb); + elm_object_text_set(ow, _("Always Use Plain Style")); + evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL); + elm_check_state_set(ow, pager_config->permanent_plain); + elm_table_pack(tb, ow, 0, 0, 1, 1); + E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL); + E_WEIGHT(ow, EVAS_HINT_EXPAND, 0); + evas_object_smart_callback_add(ow, "changed", + _config_value_changed, NULL); + evas_object_show(ow); + pager_gadget_config_objects->o_permanent = ow; + + ow = elm_check_add(tb); + elm_object_text_set(ow, _("Switch to Plain Style When Saving Power")); + evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL); + elm_check_state_set(ow, pager_config->plain); + elm_table_pack(tb, ow, 0, 1, 1, 1); + E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL); + E_WEIGHT(ow, EVAS_HINT_EXPAND, 0); + evas_object_smart_callback_add(ow, "changed", + _config_value_changed, NULL); + evas_object_show(ow); + pager_gadget_config_objects->o_plain = ow; + + elm_table_pack(m, fr, 0, 0, 1, 1); + pager_gadget_config_objects->style_page = fr; + return m; } @@ -615,6 +678,8 @@ config_pager(E_Zone *zone) _config_show_popup, NULL); it = elm_list_item_append(list, _("Urgent"), NULL, NULL, _config_show_urgent, NULL); + it = elm_list_item_append(list, _("Style"), NULL, NULL, + _config_show_style, NULL); elm_list_go(list); evas_object_show(list); diff --git a/src/modules/pager/gadget/mod.c b/src/modules/pager/gadget/mod.c index cb7687d6d..331543e22 100644 --- a/src/modules/pager/gadget/mod.c +++ b/src/modules/pager/gadget/mod.c @@ -2,7 +2,7 @@ static E_Config_DD *conf_edd = NULL; Config *pager_config; Evas_Object *cfg_dialog; -Eina_List *ginstances, *ghandlers; +Eina_List *ginstances, *ghandlers, *phandlers; EINTERN void * e_modapi_gadget_init(E_Module *m) @@ -25,6 +25,8 @@ e_modapi_gadget_init(E_Module *m) E_CONFIG_VAL(D, T, btn_noplace, UCHAR); E_CONFIG_VAL(D, T, btn_desk, UCHAR); E_CONFIG_VAL(D, T, flip_desk, UCHAR); + E_CONFIG_VAL(D, T, plain, UCHAR); + E_CONFIG_VAL(D, T, permanent_plain, UCHAR); pager_config = e_config_domain_load("module.pager", conf_edd); @@ -44,6 +46,8 @@ e_modapi_gadget_init(E_Module *m) pager_config->btn_noplace = 2; pager_config->btn_desk = 2; pager_config->flip_desk = 0; + pager_config->plain = 0; + pager_config->permanent_plain = 0; } E_CONFIG_LIMIT(pager_config->popup, 0, 1); E_CONFIG_LIMIT(pager_config->popup_speed, 0.1, 10.0); @@ -58,6 +62,8 @@ e_modapi_gadget_init(E_Module *m) E_CONFIG_LIMIT(pager_config->btn_drag, 0, 32); E_CONFIG_LIMIT(pager_config->btn_noplace, 0, 32); E_CONFIG_LIMIT(pager_config->btn_desk, 0, 32); + E_CONFIG_LIMIT(pager_config->plain, 0, 1); + E_CONFIG_LIMIT(pager_config->permanent_plain, 0, 1); pager_init(); diff --git a/src/modules/pager/gadget/pager.c b/src/modules/pager/gadget/pager.c index 215230c38..64ee65b47 100644 --- a/src/modules/pager/gadget/pager.c +++ b/src/modules/pager/gadget/pager.c @@ -28,6 +28,7 @@ struct _Pager E_Client *active_drag_client; Ecore_Job *recalc; Eina_Bool invert : 1; + Eina_Bool plain : 1; }; struct _Pager_Desk @@ -55,6 +56,7 @@ struct _Pager_Win Pager_Desk *desk; Evas_Object *o_window; Evas_Object *o_mirror; + Evas_Object *o_icon; unsigned char skip_winlist : 1; struct { @@ -81,9 +83,26 @@ static void _pager_cb_obj_show(void *data, Evas *e EINA_UNUSED, Evas static void _pager_cb_obj_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _button_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info); static Evas_Object *_pager_gadget_configure(Evas_Object *g); +static Eina_Bool _pager_cb_event_powersave_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); static Eina_Bool _pager_cb_event_desk_show(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); static Eina_Bool _pager_cb_event_desk_name_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); static Eina_Bool _pager_cb_event_compositor_resize(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_resize(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_move(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_remove(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_iconify(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_uniconify(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_stick(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_unstick(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_desk_set(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_stack(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_icon_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_focus_in(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_focus_out(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_property(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); +static Eina_Bool _pager_cb_event_client_urgent_change(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client_Property *ev); +static void _pager_window_move(Pager_Win *pw); static void _pager_window_cb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _pager_window_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info); static void _pager_window_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info); @@ -304,7 +323,6 @@ _pager_gadget_created_cb(void *data, Evas_Object *obj, void *event_info EINA_UNU Instance *inst = data; Eina_List *l; Pager_Desk *pd; - if (inst->pager && inst->o_pager) { e_gadget_configure_cb_set(inst->o_pager, _pager_gadget_configure); @@ -420,6 +438,23 @@ _pager_new(Evas *evas, Eina_Bool popup) p = E_NEW(Pager, 1); p->inst = NULL; p->popup = NULL; + if (pager_config->plain) + { + switch (e_powersave_mode_get()) + { + case E_POWERSAVE_MODE_HIGH: + p->plain = EINA_TRUE; + break; + case E_POWERSAVE_MODE_EXTREME: + p->plain = EINA_TRUE; + break; + case E_POWERSAVE_MODE_FREEZE: + p->plain = EINA_TRUE; + break; + default: + p->plain = EINA_FALSE; + } + } p->o_table = elm_table_add(e_win_evas_win_get(evas)); evas_object_event_callback_add(p->o_table, EVAS_CALLBACK_RESIZE, _pager_resize, p); elm_table_homogeneous_set(p->o_table, 1); @@ -468,6 +503,26 @@ _pager_fill(Pager *p) if (p->ynum != 1) p->invert = EINA_FALSE; for (x = 0; x < p->xnum; x++) { + if ((p->plain) || (pager_config->permanent_plain)) + { + if (!eina_list_count(phandlers)) + { + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_RESIZE, _pager_cb_event_client_resize, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_MOVE, _pager_cb_event_client_move, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_ADD, _pager_cb_event_client_add, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_REMOVE, _pager_cb_event_client_remove, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_ICONIFY, _pager_cb_event_client_iconify, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_UNICONIFY, _pager_cb_event_client_uniconify, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_PROPERTY, _pager_cb_event_client_stick, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_PROPERTY, _pager_cb_event_client_unstick, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_DESK_SET, _pager_cb_event_client_desk_set, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_STACK, _pager_cb_event_client_stack, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_PROPERTY, _pager_cb_event_client_icon_change, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_FOCUS_IN, _pager_cb_event_client_focus_in, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_FOCUS_OUT, _pager_cb_event_client_focus_out, NULL); + E_LIST_HANDLER_APPEND(phandlers, E_EVENT_CLIENT_PROPERTY, _pager_cb_event_client_property, NULL); + } + } for (y = 0; y < p->ynum; y++) { Pager_Desk *pd; @@ -492,6 +547,15 @@ static void _pager_empty(Pager *p) { p->active_pd = NULL; + if (!(p->plain) && !(pager_config->permanent_plain)) + { + if (eina_list_count(phandlers)) + { + Ecore_Event_Handler *handler; + EINA_LIST_FREE(phandlers, handler) + ecore_event_handler_del(handler); + } + } E_FREE_LIST(p->desks, _pager_desk_free); } @@ -525,8 +589,12 @@ _pager_desk_new(Pager *p, E_Desk *desk, int xpos, int ypos, Eina_Bool invert) e = evas_object_evas_get(p->o_table); o = edje_object_add(e); pd->o_desk = o; - e_theme_edje_object_set(o, "base/theme/gadget/pager", - "e/gadget/pager16/desk"); + if (p->plain || pager_config->permanent_plain) + e_theme_edje_object_set(o, "base/theme/gadgets/pager", + "e/gadget/pager/plain/desk"); + else + e_theme_edje_object_set(o, "base/theme/gadgets/pager", + "e/gadget/pager/default/desk"); edje_object_part_text_set(o, "e.text.label", desk->name); if (pager_config->show_desk_names) edje_object_signal_emit(o, "e,name,show", "e"); @@ -553,24 +621,44 @@ _pager_desk_new(Pager *p, E_Desk *desk, int xpos, int ypos, Eina_Bool invert) _pager_desk_cb_mouse_wheel, pd); evas_object_show(o); - pd->o_layout = e_deskmirror_add(desk, 1, 0); - evas_object_smart_callback_add(pd->o_layout, "mirror_add", (Evas_Smart_Cb)_pager_cb_mirror_add, pd); - - l = e_deskmirror_mirror_list(pd->o_layout); - EINA_LIST_FREE(l, o) + if (p->plain || pager_config->permanent_plain) { - ec = evas_object_data_get(o, "E_Client"); - if (ec) + pd->o_layout = e_layout_add(e); + e_layout_virtual_size_set(pd->o_layout, desk->zone->w, desk->zone->h); + edje_object_part_swallow(pd->o_desk, "e.swallow.content", pd->o_layout); + evas_object_show(pd->o_layout); + E_CLIENT_FOREACH(ec) { Pager_Win *pw; - pw = _pager_window_new(pd, o, ec); + if (e_client_util_ignored_get(ec)) continue; + if ((ec->new_client) || (ec->zone != desk->zone) || + ((ec->desk != desk) && (!ec->sticky))) + continue; + pw = _pager_window_new(pd, NULL, ec); if (pw) pd->wins = eina_list_append(pd->wins, pw); } } - edje_object_part_swallow(pd->o_desk, "e.swallow.content", pd->o_layout); - evas_object_show(pd->o_layout); + else + { + pd->o_layout = e_deskmirror_add(desk, 1, 0); + evas_object_smart_callback_add(pd->o_layout, "mirror_add", (Evas_Smart_Cb)_pager_cb_mirror_add, pd); + l = e_deskmirror_mirror_list(pd->o_layout); + EINA_LIST_FREE(l, o) + { + ec = evas_object_data_get(o, "E_Client"); + if (ec) + { + Pager_Win *pw; + + pw = _pager_window_new(pd, o, ec); + if (pw) pd->wins = eina_list_append(pd->wins, pw); + } + } + edje_object_part_swallow(pd->o_desk, "e.swallow.content", pd->o_layout); + evas_object_show(pd->o_layout); + } if (pd->pager->inst) { pd->drop_handler = @@ -739,55 +827,83 @@ static Pager_Win * _pager_window_new(Pager_Desk *pd, Evas_Object *mirror, E_Client *client) { Pager_Win *pw; - //Evas_Object *o; - //int visible; + Evas_Object *o; + int visible; if (!client) return NULL; pw = E_NEW(Pager_Win, 1); if (!pw) return NULL; pw->client = client; - pw->o_mirror = mirror; - - //visible = evas_object_visible_get(mirror); - //pw->skip_winlist = client->netwm.state.skip_pager; pw->desk = pd; + if ((pd->pager->plain) || (pager_config->permanent_plain)) + { + visible = ((!client->iconic) && (!client->netwm.state.skip_pager)); + pw->skip_winlist = client->netwm.state.skip_pager; - //o = edje_object_add(evas_object_evas_get(pd->pager->o_table)); - //pw->o_window = o; - //e_theme_edje_object_set(o, "base/theme/gadget/pager", - //"e/gadget/pager16/window"); - //if (visible) evas_object_show(o); - - - evas_object_event_callback_add(mirror, EVAS_CALLBACK_MOUSE_DOWN, + o = edje_object_add(evas_object_evas_get(pd->pager->o_table)); + pw->o_window = o; + e_theme_edje_object_set(o, "base/theme/gadgets/pager", + "e/gadget/pager/plain/window"); + if (visible) evas_object_show(o); + e_layout_pack(pd->o_layout, pw->o_window); + e_layout_child_raise(pw->o_window); + o = e_client_icon_add(client, evas_object_evas_get(pd->pager->o_table)); + if (o) + { + pw->o_icon = o; + evas_object_show(o); + edje_object_part_swallow(pw->o_window, "e.swallow.icon", o); + } + e_layout_child_move(pw->o_window, + pw->client->x - pw->client->zone->x, + pw->client->y - pw->client->zone->y); + e_layout_child_resize(pw->o_window, pw->client->w, pw->client->h); + evas_object_show(o); + o = pw->o_window; + } + else + { + pw->o_mirror = mirror; + o = mirror; + } + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _pager_window_cb_mouse_down, pw); - evas_object_event_callback_add(mirror, EVAS_CALLBACK_MOUSE_UP, + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _pager_window_cb_mouse_up, pw); - evas_object_event_callback_add(mirror, EVAS_CALLBACK_MOUSE_MOVE, + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _pager_window_cb_mouse_move, pw); - evas_object_event_callback_add(mirror, EVAS_CALLBACK_DEL, + evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _pager_window_cb_del, pw); if (client->urgent) { if (!(client->iconic)) - edje_object_signal_emit(pd->o_desk, "e,state,urgent", "e"); - //edje_object_signal_emit(pw->o_window, "e,state,urgent", "e"); + { + if ((pd->pager->plain) || (pager_config->permanent_plain)) + edje_object_signal_emit(pw->o_window, "e,state,urgent", "e"); + else + edje_object_signal_emit(pd->o_desk, "e,state,urgent", "e"); + } } - //evas_object_show(o); return pw; } static void _pager_window_free(Pager_Win *pw) { + Evas_Object *o; if ((pw->drag.from_pager) && (pw->desk->pager->dragging)) pw->desk->pager->dragging = 0; if (pw->o_mirror) - evas_object_event_callback_del_full(pw->o_mirror, EVAS_CALLBACK_DEL, + o = pw->o_mirror; + else + o = pw->o_window; + if (o) + evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _pager_window_cb_del, pw); + if (pw->o_icon) evas_object_del(pw->o_icon); if (pw->o_window) evas_object_del(pw->o_window); free(pw); } @@ -852,8 +968,8 @@ pager_popup_new(int keyaction) pp->o_bg = edje_object_add(e_comp->evas); evas_object_name_set(pp->o_bg, "pager_gadget_popup"); - e_theme_edje_object_set(pp->o_bg, "base/theme/gadget/pager", - "e/gadget/pager16/popup"); + e_theme_edje_object_set(pp->o_bg, "base/theme/gadgets/pager", + "e/gadget/pager/popup"); desk = e_desk_current_get(zone); if (desk) edje_object_part_text_set(pp->o_bg, "e.text.label", desk->name); @@ -957,32 +1073,56 @@ _button_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNU } EINTERN void -_pager_cb_config_gadget_updated(void) +_pager_cb_config_gadget_updated(Eina_Bool style_changed) { Pager *p; Pager_Desk *pd; Eina_List *l, *ll; if (!pager_config) return; EINA_LIST_FOREACH(pagers, l, p) - EINA_LIST_FOREACH(p->desks, ll, pd) - { - if (pd->current) - { - char ori[32]; - const char *s = _pager_location_get(pd->pager->inst); - if (s) - snprintf(ori, sizeof(ori), "e,state,selected,%s", s); - else - snprintf(ori, sizeof(ori), "e,state,selected,bottom"); - edje_object_signal_emit(pd->o_desk, ori, "e"); - } - else - edje_object_signal_emit(pd->o_desk, "e,state,unselected", "e"); - if (pager_config->show_desk_names) - edje_object_signal_emit(pd->o_desk, "e,name,show", "e"); - else - edje_object_signal_emit(pd->o_desk, "e,name,hide", "e"); - } + { + if (style_changed) + { + if (pager_config->plain) + { + switch (e_powersave_mode_get()) + { + case E_POWERSAVE_MODE_HIGH: + p->plain = EINA_TRUE; + break; + case E_POWERSAVE_MODE_EXTREME: + p->plain = EINA_TRUE; + break; + case E_POWERSAVE_MODE_FREEZE: + p->plain = EINA_TRUE; + break; + default: + p->plain = EINA_FALSE; + } + } + _pager_empty(p); + _pager_fill(p); + } + EINA_LIST_FOREACH(p->desks, ll, pd) + { + if (pd->current) + { + char ori[32]; + const char *s = _pager_location_get(pd->pager->inst); + if (s) + snprintf(ori, sizeof(ori), "e,state,selected,%s", s); + else + snprintf(ori, sizeof(ori), "e,state,selected,bottom"); + edje_object_signal_emit(pd->o_desk, ori, "e"); + } + else + edje_object_signal_emit(pd->o_desk, "e,state,unselected", "e"); + if (pager_config->show_desk_names) + edje_object_signal_emit(pd->o_desk, "e,name,show", "e"); + else + edje_object_signal_emit(pd->o_desk, "e,name,hide", "e"); + } + } } static void @@ -994,6 +1134,607 @@ _pager_cb_mirror_add(Pager_Desk *pd, Evas_Object *obj EINA_UNUSED, Evas_Object * if (pw) pd->wins = eina_list_append(pd->wins, pw); } +static Eina_Bool +_pager_cb_event_client_resize(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Eina_List *l, *l2; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + { + Pager_Desk *pd; + + if (p->zone != ev->ec->zone) continue; + EINA_LIST_FOREACH(p->desks, l2, pd) + { + Pager_Win *pw; + + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) _pager_window_move(pw); + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_move(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Eina_List *l; + Pager_Win *pw; + Pager_Desk *pd; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + { + Eina_List *l2; + + if (p->zone != ev->ec->zone) continue; + EINA_LIST_FOREACH(p->desks, l2, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) _pager_window_move(pw); + } + } + + if ((act_popup) && (act_popup->pager->zone == ev->ec->zone)) + { + EINA_LIST_FOREACH(act_popup->pager->desks, l, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) _pager_window_move(pw); + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Eina_List *l; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + { + Pager_Desk *pd; + Pager_Win *pw; + + if ((p->zone != ev->ec->zone) || + (_pager_window_find(p, ev->ec))) + continue; + pd = _pager_desk_find(p, ev->ec->desk); + if (!pd) continue; + pw = _pager_window_new(pd, NULL, ev->ec); + if (pw) pd->wins = eina_list_append(pd->wins, pw); + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_remove(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Eina_List *l; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + { + Eina_List *l2; + Pager_Desk *pd; + + if (p->zone != ev->ec->zone) continue; + + EINA_LIST_FOREACH(p->desks, l2, pd) + { + Pager_Win *pw; + + pw = _pager_desk_window_find(pd, ev->ec); + if (!pw) continue; + pd->wins = eina_list_remove(pd->wins, pw); + _pager_window_free(pw); + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_iconify(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Eina_List *l; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + { + Eina_List *l2; + Pager_Desk *pd; + + if (p->zone != ev->ec->zone) continue; + + EINA_LIST_FOREACH(p->desks, l2, pd) + { + Pager_Win *pw; + + pw = _pager_desk_window_find(pd, ev->ec); + if (!pw) continue; + if ((pw->drag.from_pager) && (pw->desk->pager->dragging)) + pw->desk->pager->dragging = 0; + evas_object_hide(pw->o_window); + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_uniconify(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Eina_List *l; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + { + Eina_List *l2; + Pager_Desk *pd; + + if (p->zone != ev->ec->zone) continue; + + EINA_LIST_FOREACH(p->desks, l2, pd) + { + Pager_Win *pw; + + pw = _pager_desk_window_find(pd, ev->ec); + if ((pw) && (!pw->skip_winlist)) evas_object_show(pw->o_window); + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_stick(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client_Property *ev = event; + Eina_List *l; + Pager *p; + + if ((!(ev->property & E_CLIENT_PROPERTY_STICKY)) || (!ev->ec->sticky)) return ECORE_CALLBACK_RENEW; + EINA_LIST_FOREACH(pagers, l, p) + { + Eina_List *l2; + Pager_Desk *pd; + Pager_Win *pw; + + if (p->zone != ev->ec->zone) continue; + pw = _pager_window_find(p, ev->ec); + if (!pw) continue; + + EINA_LIST_FOREACH(p->desks, l2, pd) + if ((ev->ec->desk != pd->desk) && (!_pager_desk_window_find(pd, ev->ec))) + { + pw = _pager_window_new(pd, NULL, ev->ec); + if (pw) pd->wins = eina_list_append(pd->wins, pw); + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_unstick(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client_Property *ev = event; + Eina_List *l; + Pager *p; + + if ((!(ev->property & E_CLIENT_PROPERTY_STICKY)) || (ev->ec->sticky)) return ECORE_CALLBACK_RENEW; + EINA_LIST_FOREACH(pagers, l, p) + { + Pager_Desk *pd; + Eina_List *l2; + + if (p->zone != ev->ec->zone) continue; + + EINA_LIST_FOREACH(p->desks, l2, pd) + if (ev->ec->desk != pd->desk) + { + Pager_Win *pw; + + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + pd->wins = eina_list_remove(pd->wins, pw); + _pager_window_free(pw); + } + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static void +_pager_window_desk_change(Pager *pager, E_Client *ec) +{ + Eina_List *l; + Pager_Win *pw; + Pager_Desk *pd; + + /* if this pager is not for the zone of the client */ + if (pager->zone != ec->zone) + { + /* look at all desks in the pager */ + EINA_LIST_FOREACH(pager->desks, l, pd) + { + /* find this client in this desk */ + pw = _pager_desk_window_find(pd, ec); + if (!pw) continue; + /* if it is found - remove it. it does not belong in this + * pager as it probably moves zones */ + pd->wins = eina_list_remove(pd->wins, pw); + _pager_window_free(pw); + } + return; + } + /* and this pager zone is for this client */ + /* see if the window is in this pager at all */ + pw = _pager_window_find(pager, ec); + if (pw) + { /* is it sticky */ + if (ec->sticky) + { + /* if its sticky and in this pager - its already everywhere, so abort + * doing anything else */ + return; + } + /* move it to the right desk */ + /* find the pager desk of the target desk */ + pd = _pager_desk_find(pager, ec->desk); + if (pd) + { + Pager_Win *pw2 = NULL; + E_Client *ec_above; + + /* remove it from whatever desk it was on */ + pw->desk->wins = eina_list_remove(pw->desk->wins, pw); + e_layout_unpack(pw->o_window); + + /* add it to the one its MEANT to be on */ + pw->desk = pd; + pd->wins = eina_list_append(pd->wins, pw); + e_layout_pack(pd->o_layout, pw->o_window); + + ec_above = e_util_desk_client_above(pw->client); + if (ec_above) + pw2 = _pager_desk_window_find(pd, ec_above); + if (pw2) + e_layout_child_lower_below(pw->o_window, pw2->o_window); + else + e_layout_child_raise(pw->o_window); + + _pager_window_move(pw); + } + } + /* the client isn't in this pager at all - it must have moved zones */ + else + { + if (!ec->sticky) + { + /* find the pager desk it needs to go to */ + pd = _pager_desk_find(pager, ec->desk); + if ((pd) && (!_pager_desk_window_find(pd, ec))) + { + /* create it and add it */ + pw = _pager_window_new(pd, NULL, ec); + if (pw) + { + Pager_Win *pw2 = NULL; + E_Client *ec_above; + + pd->wins = eina_list_append(pd->wins, pw); + ec_above = e_util_desk_client_above(pw->client); + if (ec_above) + pw2 = _pager_desk_window_find(pd, ec_above); + if (pw2) + e_layout_child_lower_below(pw->o_window, pw2->o_window); + else + e_layout_child_raise(pw->o_window); + _pager_window_move(pw); + } + } + } + else + { + /* go through all desks */ + EINA_LIST_FOREACH(pager->desks, l, pd) + { + /* create it and add it */ + if (_pager_desk_window_find(pd, ec)) continue; + pw = _pager_window_new(pd, NULL, ec); + if (pw) + { + Pager_Win *pw2 = NULL; + E_Client *ec_above; + + pd->wins = eina_list_append(pd->wins, pw); + ec_above = e_util_desk_client_above(pw->client); + if (ec_above) + pw2 = _pager_desk_window_find(pd, ec_above); + if (pw2) + e_layout_child_lower_below(pw->o_window, pw2->o_window); + else + e_layout_child_raise(pw->o_window); + _pager_window_move(pw); + } + } + } + } +} + +static Eina_Bool +_pager_cb_event_client_desk_set(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client_Desk_Set *ev = event; + Eina_List *l; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + _pager_window_desk_change(p, ev->ec); + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_stack(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Eina_List *l; + Pager *p; + + EINA_LIST_FOREACH(pagers, l, p) + { + Eina_List *l2; + Pager_Desk *pd; + + if (p->zone != ev->ec->zone) continue; + EINA_LIST_FOREACH(p->desks, l2, pd) + { + Pager_Win *pw, *pw2 = NULL; + + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + E_Client *ec; + + ec = e_util_desk_client_below(ev->ec); + if (ec) pw2 = _pager_desk_window_find(pd, ec); + if (pw2) + { + e_layout_child_raise_above(pw->o_window, pw2->o_window); + continue; + } + ec = e_util_desk_client_above(ev->ec); + if (ec) pw2 = _pager_desk_window_find(pd, ec); + if (pw2) + { + e_layout_child_lower_below(pw->o_window, pw2->o_window); + continue; + } + } + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_icon_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client_Property *ev = event; + Eina_List *l; + Pager *p; + + if (!(ev->property & E_CLIENT_PROPERTY_ICON)) return ECORE_CALLBACK_RENEW; + EINA_LIST_FOREACH(pagers, l, p) + { + Eina_List *l2; + Pager_Desk *pd; + + if (p->zone != ev->ec->zone) continue; + EINA_LIST_FOREACH(p->desks, l2, pd) + { + Pager_Win *pw; + + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + Evas_Object *o; + + if (pw->o_icon) + { + evas_object_del(pw->o_icon); + pw->o_icon = NULL; + } + o = e_client_icon_add(ev->ec, + evas_object_evas_get(p->o_table)); + if (o) + { + pw->o_icon = o; + evas_object_show(o); + edje_object_part_swallow(pw->o_window, + "e.swallow.icon", o); + } + } + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_focus_in(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Pager *pager; + Eina_List *l, *l2; + Pager_Popup *pp; + Pager_Desk *pd; + Pager_Win *pw; + E_Zone *zone; + + zone = ev->ec->zone; + + EINA_LIST_FOREACH(pagers, l, pager) + { + if (pager->zone != zone) continue; + + EINA_LIST_FOREACH(pager->desks, l2, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + edje_object_signal_emit(pw->o_window, + "e,state,focused", "e"); + break; + } + } + } + + pp = _pager_popup_find(zone); + if (!pp) return ECORE_CALLBACK_PASS_ON; + + EINA_LIST_FOREACH(pp->pager->desks, l, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + edje_object_signal_emit(pw->o_window, + "e,state,focused", "e"); + break; + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_focus_out(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client *ev = event; + Pager *pager; + Pager_Popup *pp; + Pager_Desk *pd; + Pager_Win *pw; + E_Zone *zone; + Eina_List *l; + + zone = ev->ec->zone; + + EINA_LIST_FOREACH(pagers, l, pager) + { + Eina_List *l2; + + if (pager->zone != zone) continue; + + EINA_LIST_FOREACH(pager->desks, l2, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + edje_object_signal_emit(pw->o_window, + "e,state,unfocused", "e"); + break; + } + } + } + + pp = _pager_popup_find(zone); + if (!pp) return ECORE_CALLBACK_PASS_ON; + + EINA_LIST_FOREACH(pp->pager->desks, l, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + edje_object_signal_emit(pw->o_window, + "e,state,unfocused", "e"); + break; + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_pager_cb_event_client_property(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + E_Event_Client_Property *ev = event; + Eina_List *l, *l2; + int found = 0; + Pager *p; + Pager_Win *pw; + Pager_Desk *pd; + + if (!(ev->property & E_CLIENT_PROPERTY_NETWM_STATE)) return ECORE_CALLBACK_RENEW; + EINA_LIST_FOREACH(pagers, l, p) + { + if (p->zone != ev->ec->zone) continue; + + EINA_LIST_FOREACH(p->desks, l2, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + found = 1; + if (ev->ec->netwm.state.skip_pager) + { + pd->wins = eina_list_remove(pd->wins, pw); + _pager_window_free(pw); + } + } + } + } + if (found) return ECORE_CALLBACK_PASS_ON; + + /* If we did not find this window in the pager, then add it because + * the skip_pager state may have changed to 1 */ + EINA_LIST_FOREACH(pagers, l, p) + { + if ((p->zone != ev->ec->zone) || + (_pager_window_find(p, ev->ec))) + continue; + if (!ev->ec->sticky) + { + pd = _pager_desk_find(p, ev->ec->desk); + if ((pd) && (!_pager_desk_window_find(pd, ev->ec))) + { + pw = _pager_window_new(pd, NULL, ev->ec); + if (pw) + { + Pager_Win *pw2 = NULL; + E_Client *ec; + + pd->wins = eina_list_append(pd->wins, pw); + ec = e_util_desk_client_above(pw->client); + if (ec) + pw2 = _pager_desk_window_find(pd, ec); + if (pw2) + e_layout_child_lower_below(pw->o_window, pw2->o_window); + else + e_layout_child_raise(pw->o_window); + _pager_window_move(pw); + } + } + } + } + + return ECORE_CALLBACK_PASS_ON; +} + + static Eina_Bool _pager_cb_event_zone_desk_count_set(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Zone_Desk_Count_Set *ev) { @@ -1082,6 +1823,11 @@ _pager_cb_event_desk_name_change(void *data EINA_UNUSED, int type EINA_UNUSED, v static Eina_Bool _pager_cb_event_client_urgent_change(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client_Property *ev) { + Eina_List *l, *l2; + Pager *p; + Pager_Desk *pd; + Pager_Win *pw; + if (!(ev->property & E_CLIENT_PROPERTY_URGENCY)) return ECORE_CALLBACK_RENEW; if (!eina_list_count(pagers)) return ECORE_CALLBACK_RENEW; @@ -1104,6 +1850,38 @@ _pager_cb_event_client_urgent_change(void *data EINA_UNUSED, int type EINA_UNUSE pp->urgent = 1; } } + EINA_LIST_FOREACH(pagers, l, p) + { + if (p->zone != ev->ec->zone) continue; + + EINA_LIST_FOREACH(p->desks, l2, pd) + { + pw = _pager_desk_window_find(pd, ev->ec); + if (pw) + { + if (ev->ec->urgent) + { + if (!(ev->ec->iconic)) + { + if ((pd->pager) && (pd->pager->inst) && + (!pager_config->popup_urgent)) + edje_object_signal_emit(pd->o_desk, + "e,state,urgent", "e"); + } + edje_object_signal_emit(pw->o_window, + "e,state,urgent", "e"); + } + else + { + if (!(ev->ec->iconic)) + edje_object_signal_emit(pd->o_desk, + "e,state,not_urgent", "e"); + edje_object_signal_emit(pw->o_window, + "e,state,not_urgent", "e"); + } + } + } + } return ECORE_CALLBACK_RENEW; } @@ -1129,6 +1907,26 @@ _pager_cb_event_compositor_resize(void *data EINA_UNUSED, int type EINA_UNUSED, return ECORE_CALLBACK_PASS_ON; } +static Eina_Bool +_pager_cb_event_powersave_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) +{ + if (!pager_config->plain) + return ECORE_CALLBACK_PASS_ON; + + _pager_cb_config_gadget_updated(EINA_TRUE); + + return ECORE_CALLBACK_PASS_ON; +} + +static void +_pager_window_move(Pager_Win *pw) +{ + e_layout_child_move(pw->o_window, + pw->client->x - pw->client->zone->x, + pw->client->y - pw->client->zone->y); + e_layout_child_resize(pw->o_window, pw->client->w, pw->client->h); +} + static void _pager_window_cb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -1157,7 +1955,6 @@ _pager_window_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI { Evas_Event_Mouse_Down *ev = event_info; Pager_Win *pw; - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; if (_pager_check_modifiers(ev->modifiers)) return; @@ -1173,8 +1970,10 @@ _pager_window_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI (ev->button == (int)pager_config->btn_noplace)) { Evas_Coord ox, oy; - - evas_object_geometry_get(pw->o_mirror, &ox, &oy, NULL, NULL); + if ((pw->desk->pager->plain) || (pager_config->permanent_plain)) + evas_object_geometry_get(pw->o_window, &ox, &oy, NULL, NULL); + else + evas_object_geometry_get(pw->o_mirror, &ox, &oy, NULL, NULL); pw->drag.in_pager = 1; pw->drag.x = ev->canvas.x; pw->drag.y = ev->canvas.y; @@ -1193,13 +1992,12 @@ _pager_window_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI Evas_Event_Mouse_Move *ev = event_info; Pager_Win *pw; E_Drag *drag; - Evas_Object *o; + Evas_Object *o, *oo; Evas_Coord x, y, w, h; const char *drag_types[] = { "enlightenment/pager_win", "enlightenment/border" }; Evas_Coord dx, dy; unsigned int resist = 0; - pw = data; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; @@ -1225,22 +2023,46 @@ _pager_window_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EI e_comp_object_effect_clip(pw->client->frame); edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,in", "e"); - evas_object_geometry_get(pw->o_mirror, &x, &y, &w, &h); - evas_object_hide(pw->o_mirror); - + if ((pw->desk->pager->plain) || (pager_config->permanent_plain)) + { + evas_object_geometry_get(pw->o_window, &x, &y, &w, &h); + evas_object_hide(pw->o_window); + } + else + { + evas_object_geometry_get(pw->o_mirror, &x, &y, &w, &h); + evas_object_hide(pw->o_mirror); + } drag = e_drag_new(x, y, drag_types, 2, pw->desk->pager, -1, _pager_window_cb_drag_convert, _pager_window_cb_drag_finished); drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas); + if ((pw->desk->pager->plain) || (pager_config->permanent_plain)) + { + o = edje_object_add(drag->evas); + e_theme_edje_object_set(o, "base/theme/gadgets/pager/plain", + "e/gadget/pager/plain/window"); + evas_object_show(o); - /* this is independent of the original mirror */ - o = e_deskmirror_mirror_copy(pw->o_mirror); - evas_object_show(o); - + oo = e_client_icon_add(pw->client, drag->evas); + if (oo) + { + evas_object_show(oo); + edje_object_part_swallow(o, "e.swallow.icon", oo); + } + } + else + { + /* this is independent of the original mirror */ + o = e_deskmirror_mirror_copy(pw->o_mirror); + evas_object_show(o); + } e_drag_object_set(drag, o); e_drag_resize(drag, w, h); e_drag_show(drag); e_drag_start(drag, x - pw->drag.dx, y - pw->drag.dy); + if (oo) + e_comp_object_util_del_list_append(drag->comp_object, oo); } static void * @@ -1259,13 +2081,15 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) { Pager_Win *pw; Pager *p; - p = drag->data; if (!p) return; pw = _pager_window_find(p, p->active_drag_client); if (!pw) return; p->active_drag_client = NULL; - evas_object_show(pw->o_mirror); + if ((p->plain) || (pager_config->permanent_plain)) + evas_object_show(pw->o_window); + else + evas_object_show(pw->o_mirror); evas_object_smart_callback_call(e_gadget_site_get(pw->desk->pager->inst->o_pager), "gadget_site_unlocked", NULL); if (dropped) { @@ -1336,6 +2160,12 @@ _pager_update_drop_position(Pager *p, Pager_Desk *pd, Evas_Coord x, Evas_Coord y { Pager_Win *pw = NULL; + if ((p->plain) || (pager_config->permanent_plain)) + { + if (pd) + edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e"); + return; + } if (pd) pw = _pager_desk_window_find(pd, p->active_drag_client); else @@ -1351,8 +2181,8 @@ _pager_update_drop_position(Pager *p, Pager_Desk *pd, Evas_Coord x, Evas_Coord y zx = pd->desk->zone->x, zy = pd->desk->zone->y; zw = pd->desk->zone->w, zh = pd->desk->zone->h; e_deskmirror_coord_canvas_to_virtual(pd->o_layout, - x + pw->drag.dx, - y + pw->drag.dy, &vx, &vy); + x + pw->drag.dx, + y + pw->drag.dy, &vx, &vy); pw->client->hidden = !pd->desk->visible; e_client_desk_set(pw->client, pd->desk); x = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w); @@ -1436,10 +2266,20 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) else if (!strcmp(type, "enlightenment/border")) { ec = ev->data; - e_deskmirror_coord_virtual_to_canvas(pd->o_layout, ec->x, ec->y, - &wx, &wy); - e_deskmirror_coord_virtual_to_canvas(pd->o_layout, ec->x + ec->w, - ec->y + ec->h, &wx2, &wy2); + if ((pd->pager->plain) || (pager_config->permanent_plain)) + { + e_layout_coord_virtual_to_canvas(pd->o_layout, ec->x, ec->y, + &wx, &wy); + e_layout_coord_virtual_to_canvas(pd->o_layout, ec->x + ec->w, + ec->y + ec->h, &wx2, &wy2); + } + else + { + e_deskmirror_coord_virtual_to_canvas(pd->o_layout, ec->x, ec->y, + &wx, &wy); + e_deskmirror_coord_virtual_to_canvas(pd->o_layout, ec->x + ec->w, + ec->y + ec->h, &wx2, &wy2); + } dx = (wx - wx2) / 2; dy = (wy - wy2) / 2; } @@ -1469,11 +2309,18 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) if ((!max) && (!fullscreen)) { int zx, zy, zw, zh, mx, my; - - e_deskmirror_coord_canvas_to_virtual(pd->o_layout, - ev->x + dx, - ev->y + dy, + if ((pd->pager->plain) || (pager_config->permanent_plain)) + { + e_layout_coord_canvas_to_virtual(pd->o_layout, ev->x + dx, ev->y + dy, &nx, &ny); + } + else + { + e_deskmirror_coord_canvas_to_virtual(pd->o_layout, + ev->x + dx, + ev->y + dy, + &nx, &ny); + } e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, &zw, &zh); @@ -1596,9 +2443,18 @@ _pager_desk_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA drag = e_drag_new(x, y, drag_types, 1, pd, -1, NULL, _pager_desk_cb_drag_finished); drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas); - /* redraw the desktop theme above */ - o = e_comp_object_util_mirror_add(pd->o_layout); + if ((pd->pager->plain) || (pager_config->permanent_plain)) + { + o = edje_object_add(drag->evas); + e_theme_edje_object_set(o, "base/theme/gadgets/pager", + "e/gadget/pager/plain/desk"); + evas_object_show(o); + } + else + { + o = e_comp_object_util_mirror_add(pd->o_layout); + } e_drag_object_set(drag, o); e_drag_resize(drag, w, h); @@ -2038,7 +2894,6 @@ pager_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient orie Evas_Object *o; Instance *inst; - if (e_gadget_site_is_desklock(parent)) return NULL; inst = E_NEW(Instance, 1); p = _pager_new(evas_object_evas_get(parent), EINA_FALSE); p->inst = inst; @@ -2069,6 +2924,7 @@ pager_init(void) E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_DESK_NAME_CHANGE, _pager_cb_event_desk_name_change, NULL); E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_COMPOSITOR_RESIZE, _pager_cb_event_compositor_resize, NULL); E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_CLIENT_PROPERTY, _pager_cb_event_client_urgent_change, NULL); + E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_POWERSAVE_UPDATE, _pager_cb_event_powersave_change, NULL); act_popup_show = e_action_add("pager_gadget_show"); if (act_popup_show) diff --git a/src/modules/pager/gadget/pager.h b/src/modules/pager/gadget/pager.h index c24dfd662..c0f7c283b 100644 --- a/src/modules/pager/gadget/pager.h +++ b/src/modules/pager/gadget/pager.h @@ -24,17 +24,19 @@ struct _Config unsigned int btn_noplace; unsigned int btn_desk; unsigned int flip_desk; + unsigned int plain; + unsigned int permanent_plain; }; EINTERN Evas_Object *pager_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient); EINTERN Evas_Object *config_pager(E_Zone *zone); EINTERN void pager_init(void); -EINTERN void _pager_cb_config_gadget_updated(void); +EINTERN void _pager_cb_config_gadget_updated(Eina_Bool style_changed); EINTERN void _pager_cb_config_updated(void); EINTERN extern Config *pager_config; EINTERN extern Evas_Object *cfg_dialog; -EINTERN extern Eina_List *ginstances, *ghandlers; +EINTERN extern Eina_List *ginstances, *ghandlers, *phandlers; /** * @addtogroup Optional_Gadgets * @{