diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 8a14137a9..81e295aca 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -2628,7 +2628,7 @@ e_border_icon_add(E_Border *bd, Evas *evas) } return o; } - if (e_config->use_app_icon) + if ((e_config->use_app_icon) && (bd->icon_preference != E_ICON_PREF_USER)) { if (bd->client.netwm.icons) { @@ -2642,10 +2642,11 @@ e_border_icon_add(E_Border *bd, Evas *evas) } if (!o) { - if (bd->desktop) + if ((bd->desktop) && (bd->icon_preference != E_ICON_PREF_NETWM)) { o = e_util_desktop_icon_add(bd->desktop, "24x24", evas); - return o; + if (o) + return o; } else if (bd->client.netwm.icons) { @@ -5643,6 +5644,8 @@ _e_border_eval(E_Border *bd) } if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST) bd->user_skip_winlist = rem->prop.skip_winlist; + if (rem->apply & E_REMEMBER_APPLY_ICON_PREF) + bd->icon_preference = rem->prop.icon_preference; } } diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 58a22dd78..ee62eb8af 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -3,6 +3,13 @@ */ #ifdef E_TYPEDEFS +typedef enum _E_Icon_Preferece +{ + E_ICON_PREF_E_DEFAULT, + E_ICON_PREF_NETWM, + E_ICON_PREF_USER +} E_Icon_Preference; + typedef enum _E_Direction { E_DIRECTION_UP, @@ -390,7 +397,8 @@ struct _E_Border double ping; unsigned char changed : 1; - + + unsigned char icon_preference; unsigned char ignore_first_unmap; unsigned char resize_mode; diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 47560fa10..afbee464d 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -303,6 +303,7 @@ e_config_init(void) E_CONFIG_VAL(D, T, prop.zone, INT); E_CONFIG_VAL(D, T, prop.head, INT); E_CONFIG_VAL(D, T, prop.command, STR); + E_CONFIG_VAL(D, T, prop.icon_preference, UCHAR); _e_config_color_class_edd = E_CONFIG_DD_NEW("E_Color_Class", E_Color_Class); #undef T @@ -1060,6 +1061,10 @@ e_config_init(void) "e.event.shade", E_BINDING_MODIFIER_NONE, 1, "window_shaded_toggle", "up"); + CFG_SIGNALBIND(E_BINDING_CONTEXT_BORDER, "mouse,clicked,?", + "e.event.lower", + E_BINDING_MODIFIER_NONE, 1, + "window_lower", NULL); CFG_SIGNALBIND(E_BINDING_CONTEXT_BORDER, "mouse,down,1", "e.event.icon", E_BINDING_MODIFIER_NONE, 1, diff --git a/src/bin/e_int_border_menu.c b/src/bin/e_int_border_menu.c index 1eaaf2d27..cca560347 100644 --- a/src/bin/e_int_border_menu.c +++ b/src/bin/e_int_border_menu.c @@ -35,6 +35,10 @@ static void _e_border_menu_cb_skip(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_fav_add(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_ibar_add_pre(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_border_menu_cb_border_pre(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_border_menu_cb_iconpref_e(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_border_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item *mi); EAPI void e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_X_Time timestamp) @@ -164,16 +168,13 @@ e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_ "e/widgets/border/default/remember"); if (!bd->lock_border) { - if (e_configure_registry_exists("internal/borders_border")) - { - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Borders")); - e_menu_item_callback_set(mi, _e_border_menu_cb_border, bd); - e_menu_item_icon_edje_set(mi, - e_theme_edje_file_get("base/theme/borders", + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Border")); + e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_border_pre, bd); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/borders", "e/widgets/border/default/borderless"), - "e/widgets/border/default/borderless"); - } + "e/widgets/border/default/borderless"); } if (!bd->sticky) @@ -756,6 +757,99 @@ _e_border_menu_cb_lower(void *data, E_Menu *m, E_Menu_Item *mi) } } +static void +_e_border_menu_cb_border_pre(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Menu *subm; + E_Menu_Item *submi; + E_Border *bd; + Evas_Object *o; + Evas *evas; + + bd = data; + if (!bd) return; + + subm = e_menu_new(); + e_object_data_set(E_OBJECT(subm), bd); + e_menu_item_submenu_set(mi, subm); + + if (!bd->lock_border) + { + if (e_configure_registry_exists("internal/borders_border")) + { + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Select Border Style")); + e_menu_item_callback_set(submi, _e_border_menu_cb_border, bd); + e_menu_item_icon_edje_set(submi, + e_theme_edje_file_get("base/theme/borders", + "e/widgets/border/default/borderless"), + "e/widgets/border/default/borderless"); + } + } + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Use E17 Default Icon Preference")); + e_menu_item_radio_set(submi, 1); + e_menu_item_radio_group_set(submi, 2); + e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_E_DEFAULT ? 1 : 0)); + e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_e, bd); + + submi = e_menu_item_new(subm); + evas = submi->menu->evas; + e_menu_item_label_set(submi, _("Use Application Provided Icon ")); + e_menu_item_radio_set(submi, 1); + e_menu_item_radio_group_set(submi, 2); + e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_NETWM ? 1 : 0)); + e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_netwm, bd); + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Use User Defined Icon")); + e_menu_item_radio_set(submi, 1); + e_menu_item_radio_group_set(submi, 2); + e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_USER ? 1 : 0)); + e_util_desktop_menu_item_icon_add(bd->desktop, "16x16", submi); + e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_user, bd); +} + +static void +_e_border_menu_cb_iconpref_e(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Border *bd; + + bd = data; + if (!bd) return; + + bd->icon_preference = E_ICON_PREF_E_DEFAULT; + bd->changes.icon = 1; + bd->changed = 1; +} + +static void +_e_border_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Border *bd; + + bd = data; + if (!bd) return; + + bd->icon_preference = E_ICON_PREF_USER; + bd->changes.icon = 1; + bd->changed = 1; +} + +static void +_e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Border *bd; + + bd = data; + if (!bd) return; + + bd->icon_preference = E_ICON_PREF_NETWM; + bd->changes.icon = 1; + bd->changed = 1; +} + static void _e_border_menu_cb_state_pre(void *data, E_Menu *m, E_Menu_Item *mi) { diff --git a/src/bin/e_int_border_remember.c b/src/bin/e_int_border_remember.c index 096c65ec0..0376cd9be 100644 --- a/src/bin/e_int_border_remember.c +++ b/src/bin/e_int_border_remember.c @@ -43,6 +43,7 @@ struct _E_Config_Dialog_Data int apply_zone; int apply_skip_winlist; int apply_run; + int apply_icon_pref; } remember; }; @@ -98,6 +99,7 @@ _fill_data(E_Config_Dialog_Data *cfdata) if (cfdata->border->remember->apply & E_REMEMBER_APPLY_ZONE) cfdata->remember.apply_zone = 1; if (cfdata->border->remember->apply & E_REMEMBER_APPLY_SKIP_WINLIST) cfdata->remember.apply_skip_winlist = 1; if (cfdata->border->remember->apply & E_REMEMBER_APPLY_RUN) cfdata->remember.apply_run = 1; + if (cfdata->border->remember->apply & E_REMEMBER_APPLY_ICON_PREF) cfdata->remember.apply_icon_pref = 1; } if (!cfdata->border->remember) cfdata->mode = MODE_NOTHING; else if ((cfdata->remember.apply_pos) && (cfdata->remember.apply_size) && @@ -289,7 +291,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) (cfdata->remember.apply_border) || (cfdata->remember.apply_sticky) || (cfdata->remember.apply_desktop) || (cfdata->remember.apply_shade) || (cfdata->remember.apply_zone) || (cfdata->remember.apply_skip_winlist) || - (cfdata->remember.apply_run))) + (cfdata->remember.apply_run) || (cfdata->remember.apply_icon_pref))) { if (cfdata->border->remember) { @@ -397,6 +399,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) if (cfdata->remember.apply_zone) cfdata->border->remember->apply |= E_REMEMBER_APPLY_ZONE; if (cfdata->remember.apply_skip_winlist) cfdata->border->remember->apply |= E_REMEMBER_APPLY_SKIP_WINLIST; if (cfdata->remember.apply_run) cfdata->border->remember->apply |= E_REMEMBER_APPLY_RUN; + if (cfdata->remember.apply_icon_pref) cfdata->border->remember->apply |= E_REMEMBER_APPLY_ICON_PREF; cfdata->border->remember->apply_first_only = cfdata->remember.apply_first_only; e_remember_update(cfdata->border->remember, cfdata->border); } @@ -493,6 +496,8 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data e_widget_frametable_object_append(of, ob, 0, 3, 1, 1, 1, 1, 1, 1); ob = e_widget_check_add(evas, _("Border style"), &(cfdata->remember.apply_border)); e_widget_frametable_object_append(of, ob, 0, 4, 1, 1, 1, 1, 1, 1); + ob = e_widget_check_add(evas, _("Icon Preference"), &(cfdata->remember.apply_icon_pref)); + e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 1, 1, 1); ob = e_widget_check_add(evas, _("Stickiness"), &(cfdata->remember.apply_sticky)); e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 1, 1); ob = e_widget_check_add(evas, _("Virtual Desktop"), &(cfdata->remember.apply_desktop)); diff --git a/src/bin/e_remember.c b/src/bin/e_remember.c index ac97ebcec..1cbf7cfb1 100644 --- a/src/bin/e_remember.c +++ b/src/bin/e_remember.c @@ -288,7 +288,8 @@ e_remember_update(E_Remember *rem, E_Border *bd) rem->prop.shaded = 50 + bd->shade.dir; rem->prop.skip_winlist = bd->user_skip_winlist; - + rem->prop.icon_preference = bd->icon_preference; + e_desk_xy_get(bd->desk, &rem->prop.desk_x, &rem->prop.desk_y); rem->prop.zone = bd->zone->num; diff --git a/src/bin/e_remember.h b/src/bin/e_remember.h index 0b474ce96..672385490 100644 --- a/src/bin/e_remember.h +++ b/src/bin/e_remember.h @@ -23,6 +23,7 @@ typedef struct _E_Remember E_Remember; #define E_REMEMBER_APPLY_ZONE (1 << 8) #define E_REMEMBER_APPLY_RUN (1 << 9) #define E_REMEMBER_APPLY_SKIP_WINLIST (1 << 10) +#define E_REMEMBER_APPLY_ICON_PREF (1 << 11) #else #ifndef E_REMEMBER_H @@ -79,6 +80,7 @@ struct _E_Remember unsigned char sticky; unsigned char shaded; unsigned char skip_winlist; + unsigned char icon_preference; int desk_x, desk_y; int zone; diff --git a/src/modules/pager/e_mod_config.c b/src/modules/pager/e_mod_config.c index 3351e5421..1c27132b3 100644 --- a/src/modules/pager/e_mod_config.c +++ b/src/modules/pager/e_mod_config.c @@ -5,7 +5,8 @@ typedef enum _Pager_Grab_Button Pager_Grab_Button; enum _Pager_Grab_Button { GRAB_BUTTON_DRAG, - GRAB_BUTTON_NOPLACE + GRAB_BUTTON_NOPLACE, + GRAB_BUTTON_DESK }; struct _E_Config_Dialog_Data @@ -16,8 +17,9 @@ struct _E_Config_Dialog_Data int popup_urgent_stick; double popup_urgent_speed; int drag_resist; - unsigned char btn_drag; - unsigned char btn_noplace; + unsigned int btn_drag; + unsigned int btn_noplace; + unsigned int btn_desk; int flip_desk; struct { @@ -32,6 +34,7 @@ struct _E_Config_Dialog_Data Evas_Object *o_urgent_speed; Evas_Object *o_btn1; Evas_Object *o_btn2; + Evas_Object *o_btn3; } gui; }; @@ -85,6 +88,7 @@ _fill_data(Config_Item *ci, E_Config_Dialog_Data *cfdata) cfdata->drag_resist = pager_config->drag_resist; cfdata->btn_drag = pager_config->btn_drag; cfdata->btn_noplace = pager_config->btn_noplace; + cfdata->btn_desk = pager_config->btn_desk; cfdata->flip_desk = pager_config->flip_desk; } @@ -144,17 +148,22 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data e_widget_frametable_object_append(of, ob, 1, 2, 1, 1, 1, 1, 1, 1); ob = e_widget_label_add(evas, _("Drag and Drop button (Keeps rel. loc.)")); e_widget_frametable_object_append(of, ob, 1, 3, 1, 1, 1, 1, 1, 1); + ob = e_widget_label_add(evas, _("Drag whole desktop (Move every windowsof a desk)")); + e_widget_frametable_object_append(of, ob, 1, 4, 1, 1, 1, 1, 1, 1); ob = e_widget_button_add(evas, _("Click to set"), NULL, _grab_wnd_show, (void *)GRAB_BUTTON_DRAG, cfdata); e_widget_frametable_object_append(of, ob, 2, 2, 1, 1, 1, 1, 0, 0); cfdata->gui.o_btn1 = ob; ob = e_widget_button_add(evas, _("Click to set"), NULL, _grab_wnd_show, (void *)GRAB_BUTTON_NOPLACE, cfdata); e_widget_frametable_object_append(of, ob, 2, 3, 1, 1, 1, 1, 0, 0); cfdata->gui.o_btn2 = ob; + ob = e_widget_button_add(evas, _("Click to set"), NULL, _grab_wnd_show, (void *)GRAB_BUTTON_DESK, cfdata); + e_widget_frametable_object_append(of, ob, 2, 4, 1, 1, 1, 1, 0, 0); + cfdata->gui.o_btn3 = ob; _advanced_update_button_label(cfdata); ob = e_widget_label_add(evas, _("Resistance to dragging")); - e_widget_frametable_object_append(of, ob, 1, 4, 1, 1, 1, 1, 0, 0); + e_widget_frametable_object_append(of, ob, 1, 5, 1, 1, 1, 1, 0, 0); ob = e_widget_slider_add(evas, 1, 0, _("%.0f px"), 0.0, 10.0, 1.0, 0, NULL, &(cfdata->drag_resist), 200); - e_widget_frametable_object_append(of, ob, 1, 5, 2, 1, 1, 1, 0, 0); + e_widget_frametable_object_append(of, ob, 1, 6, 2, 1, 1, 1, 0, 0); e_widget_list_object_append(o, of, 1, 1, 0.5); of = e_widget_framelist_add(evas, _("Pager Popup Settings"), 0); @@ -196,6 +205,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) pager_config->drag_resist = cfdata->drag_resist; pager_config->btn_drag = cfdata->btn_drag; pager_config->btn_noplace = cfdata->btn_noplace; + pager_config->btn_desk = cfdata->btn_desk; pager_config->flip_desk = cfdata->flip_desk; _pager_cb_config_updated(); e_config_save_queue(); @@ -218,6 +228,12 @@ _advanced_update_button_label(E_Config_Dialog_Data *cfdata) else snprintf(label, sizeof(label), _("Click to set")); e_widget_button_label_set(cfdata->gui.o_btn2, label); + + if (cfdata->btn_desk) + snprintf(label, sizeof(label), _("Button %i"), cfdata->btn_desk); + else + snprintf(label, sizeof(label), _("Click to set")); + e_widget_button_label_set(cfdata->gui.o_btn3, label); } static void @@ -231,6 +247,8 @@ _grab_wnd_show(void *data1, void *data2) if ((Pager_Grab_Button)data1 == GRAB_BUTTON_DRAG) cfdata->grab.btn = 1; + else if ((Pager_Grab_Button)data1 == GRAB_BUTTON_NOPLACE) + cfdata->grab.btn = 2; else cfdata->grab.btn = 0; @@ -290,8 +308,10 @@ _grab_mouse_down_cb(void *data, int type, void *event) { if (cfdata->grab.btn == 1) cfdata->btn_drag = ev->button; - else + else if (cfdata->grab.btn == 2) cfdata->btn_noplace = ev->button; + else + cfdata->btn_desk = ev->button; } else { @@ -320,8 +340,10 @@ _grab_key_down_cb(void *data, int type, void *event) { if (cfdata->grab.btn == 1) cfdata->btn_drag = 0; - else + else if (cfdata->grab.btn == 2) cfdata->btn_noplace = 0; + else + cfdata->btn_desk = 0; _grab_wnd_hide(cfdata); } return 1; diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 4516dca8b..da6022ff6 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -61,26 +61,36 @@ struct _Pager struct _Pager_Desk { - Pager *pager; - E_Desk *desk; - Evas_List *wins; - Evas_Object *o_desk; - Evas_Object *o_layout; - int xpos, ypos; - int current : 1; + Pager *pager; + E_Desk *desk; + Evas_List *wins; + Evas_Object *o_desk; + Evas_Object *o_layout; + int xpos, ypos; + int current : 1; + struct { + Pager *from_pager; + unsigned char in_pager : 1; + unsigned char start : 1; + int x, y; + int dx, dy; + int button; + } drag; }; struct _Pager_Win { - E_Border *border; - Pager_Desk *desk; - Evas_Object *o_window; - Evas_Object *o_icon; + E_Border *border; + Pager_Desk *desk; + Evas_Object *o_window; + Evas_Object *o_icon; + unsigned char skip_winlist : 1; struct { Pager *from_pager; unsigned char start : 1; unsigned char in_pager : 1; unsigned char no_place : 1; + unsigned char desktop : 1; int x, y; int dx, dy; int button; @@ -135,6 +145,7 @@ static void _pager_update_drop_position(Instance *inst, Evas_Coord x, Evas_Coord static void _pager_desk_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_desk_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_desk_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _pager_desk_cb_drag_finished(E_Drag *drag, int dropped); static void _pager_desk_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info); static int _pager_popup_cb_timeout(void *data); static Pager *_pager_new(Evas *evas, E_Zone *zone); @@ -146,6 +157,7 @@ static void _pager_desk_free(Pager_Desk *pd); static Pager_Desk *_pager_desk_at_coord(Pager *p, Evas_Coord x, Evas_Coord y); static void _pager_desk_select(Pager_Desk *pd); static Pager_Desk *_pager_desk_find(Pager *p, E_Desk *desk); +static void _pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2); static Pager_Win *_pager_window_new(Pager_Desk *pd, E_Border *border); static void _pager_window_free(Pager_Win *pw); static void _pager_window_move(Pager_Win *pw); @@ -166,7 +178,7 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) E_Gadcon_Client *gcc; Instance *inst; Evas_Coord x, y, w, h; - const char *drop[] = { "enlightenment/pager_win", "enlightenment/border" }; + const char *drop[] = { "enlightenment/pager_win", "enlightenment/border", "enlightenment/vdesktop"}; inst = E_NEW(Instance, 1); @@ -185,7 +197,7 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) e_drop_handler_add(E_OBJECT(inst->gcc), inst, _pager_inst_cb_enter, _pager_inst_cb_move, _pager_inst_cb_leave, _pager_inst_cb_drop, - drop, 2, x, y, w, h); + drop, 3, x, y, w, h); evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _pager_cb_obj_moveresize, inst); evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, @@ -425,6 +437,110 @@ _pager_desk_find(Pager *p, E_Desk *desk) return NULL; } +static void +_pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2) +{ + int d1, d2; + int tmp_x, tmp_y; + int c; + E_Zone *zone1, *zone2; + E_Desk *desk1, *desk2; + Pager_Win *pw; + Evas_List *l; + + if (!pd1 || !pd2 || !pd1->desk || !pd2->desk) return; + if (pd1 == pd2) return; + + desk1 = pd1->desk; + desk2 = pd2->desk; + zone1 = pd1->desk->zone; + zone2 = pd2->desk->zone; + + /* Move opened windows from on desk to the other */ + for (l = pd1->wins; l; l = l->next) + { + pw = l->data; + if (!pw || !pw->border || pw->border->iconic) continue; + e_border_desk_set(pw->border, desk2); + } + for (l = pd2->wins; l; l = l->next) + { + pw = l->data; + if (!pw || !pw->border || pw->border->iconic) continue; + e_border_desk_set(pw->border, desk1); + } + + /* Modify desktop names in the config */ + for (l = e_config->desktop_names, c = 0; l && c < 2; l = l->next) + { + E_Config_Desktop_Name *tmp_dn; + + tmp_dn = l->data; + if (!tmp_dn) continue; + if (tmp_dn->desk_x == desk1->x && + tmp_dn->desk_y == desk1->y && + tmp_dn->zone == desk1->zone->num) + { + tmp_dn->desk_x = desk2->x; + tmp_dn->desk_y = desk2->y; + tmp_dn->zone = desk2->zone->num; + c++; + } + else if (tmp_dn->desk_x == desk2->x && + tmp_dn->desk_y == desk2->y && + tmp_dn->zone == desk2->zone->num) + { + tmp_dn->desk_x = desk1->x; + tmp_dn->desk_y = desk1->y; + tmp_dn->zone = desk1->zone->num; + c++; + } + } + if (c > 0) e_config_save(); + e_desk_name_update(); + + /* Modify desktop backgrounds in the config */ + for (l = e_config->desktop_backgrounds, c = 0; l && c < 2; l = l->next) + { + E_Config_Desktop_Background *tmp_db; + + tmp_db = l->data; + if (!tmp_db) continue; + if (tmp_db->desk_x == desk1->x && + tmp_db->desk_y == desk1->y && + tmp_db->zone == desk1->zone->num) + { + tmp_db->desk_x = desk2->x; + tmp_db->desk_y = desk2->y; + tmp_db->zone = desk2->zone->num; + c++; + } + else if (tmp_db->desk_x == desk2->x && + tmp_db->desk_y == desk2->y && + tmp_db->zone == desk2->zone->num) + { + tmp_db->desk_x = desk1->x; + tmp_db->desk_y = desk1->y; + tmp_db->zone = desk1->zone->num; + c++; + } + } + if (c > 0) e_config_save(); + + + /* If the current desktop has been switched, force to update of the screen */ + if (desk2 == e_desk_current_get(zone2)) + { + desk2->visible = 0; + e_desk_show(desk2); + } + if (desk1 == e_desk_current_get(zone1)) + { + desk1->visible = 0; + e_desk_show(desk1); + } +} + static Pager_Win * _pager_window_new(Pager_Desk *pd, E_Border *border) { @@ -432,14 +548,15 @@ _pager_window_new(Pager_Desk *pd, E_Border *border) Evas_Object *o; int visible; - if ((!border) || (border->client.netwm.state.skip_pager)) return NULL; + if (!border) return NULL; pw = E_NEW(Pager_Win, 1); if (!pw) return NULL; pw->border = border; e_object_ref(E_OBJECT(border)); - visible = !border->iconic; + visible = !border->iconic && !border->client.netwm.state.skip_pager; + pw->skip_winlist = border->client.netwm.state.skip_pager; pw->desk = pd; o = edje_object_add(evas_object_evas_get(pd->pager->o_table)); @@ -473,7 +590,7 @@ _pager_window_new(Pager_Desk *pd, E_Border *border) edje_object_signal_emit(pw->o_window, "e,state,urgent", "e"); } - + evas_object_show(o); _pager_window_move(pw); @@ -647,7 +764,7 @@ _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Virtual Desktops Configuration")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/desktops"); + e_util_menu_item_edje_icon_set(mi, "enlightenment/vdesktops"); e_menu_item_callback_set(mi, _pager_inst_cb_menu_virtual_desktops_dialog, inst); e_gadcon_client_util_menu_items_append(inst->gcc, mn, 0); @@ -863,7 +980,7 @@ _pager_cb_event_border_uniconify(void *data, int type, void *event) pd = l2->data; pw = _pager_desk_window_find(pd, ev->border); - if (pw) evas_object_show(pw->o_window); + if (pw && !pw->skip_winlist) evas_object_show(pw->o_window); } } return 1; @@ -1325,6 +1442,39 @@ _pager_cb_event_border_property(void *data, int type, void *event) return 1; } +static int +_pager_cb_event_border_skip_winlist(void *data, int type, void *event) +{ + E_Event_Border_Property *ev; + Evas_List *l, *l2; + + ev = event; + for (l = pager_config->instances; l; l = l->next) + { + Instance *inst; + + inst = l->data; + if (inst->pager->zone != ev->border->zone) continue; + for (l2 = inst->pager->desks; l2; l2 = l2->next) + { + Pager_Desk *pd; + Pager_Win *pw; + + pd = l2->data; + pw = _pager_desk_window_find(pd, ev->border); + if (pw && ev->border->client.netwm.state.skip_pager != pw->skip_winlist) + { + pw->skip_winlist = ev->border->client.netwm.state.skip_pager; + if (pw->skip_winlist) + evas_object_hide(pw->o_window); + else + evas_object_show(pw->o_window); + } + } + } + return 1; +} + static int _pager_cb_event_zone_desk_count_set(void *data, int type, void *event) { @@ -1449,9 +1599,12 @@ _pager_window_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_i ev = event_info; pw = data; + + if (!pw) return; if (pw->desk->pager->is_popup) return; if (pw->border->lock_user_location) return; + if (ev->button == pager_config->btn_desk) return; if ((ev->button == pager_config->btn_drag) || (ev->button == pager_config->btn_noplace)) { @@ -1481,6 +1634,7 @@ _pager_window_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_inf pw = data; if (!pw) return; if (pw->desk->pager->is_popup) return; + if (ev->button == pager_config->btn_desk) return; if ((ev->button == pager_config->btn_drag) || (ev->button == pager_config->btn_noplace)) { @@ -1736,6 +1890,7 @@ _pager_inst_cb_drop(void *data, const char *type, void *event_info) E_Event_Dnd_Drop *ev; Instance *inst; Pager_Desk *pd; + Pager_Desk *pd2 = NULL; E_Border *bd = NULL; Evas_List *l; int dx = 0, dy = 0; @@ -1771,6 +1926,12 @@ _pager_inst_cb_drop(void *data, const char *type, void *event_info) dx = (wx - wx2) / 2; dy = (wy - wy2) / 2; } + else if (!strcmp(type, "enlightenment/vdesktop")) + { + pd2 = ev->data; + if (!pd2) return; + _pager_desk_switch(pd, pd2); + } else return; @@ -1812,6 +1973,20 @@ _pager_desk_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf ev = event_info; pd = data; + if (!pd) return; + if (ev->button == pager_config->btn_desk) + { + Evas_Coord ox, oy; + + evas_object_geometry_get(pd->o_desk, &ox, &oy, NULL, NULL); + pd->drag.start = 1; + pd->drag.in_pager = 1; + pd->drag.dx = ox - ev->canvas.x; + pd->drag.dy = oy - ev->canvas.y; + pd->drag.x = ev->canvas.x; + pd->drag.y = ev->canvas.y; + pd->drag.button = ev->button; + } } static void @@ -1823,6 +1998,8 @@ _pager_desk_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info) ev = event_info; pd = data; + + if (!pd) return; p = pd->pager; if ( p->is_popup && @@ -1837,6 +2014,8 @@ _pager_desk_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info) (!pd->pager->just_dragged)) { e_desk_show(pd->desk); + pd->drag.start = 0; + pd->drag.in_pager = 0; } pd->pager->just_dragged = 0; } @@ -1849,6 +2028,129 @@ _pager_desk_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_inf ev = event_info; pd = data; + if (!pd) return; + /* prevent drag for a few pixels */ + if (pd->drag.start) + { + Evas_Coord dx, dy; + unsigned int resist = 0; + + dx = pd->drag.x - ev->cur.output.x; + dy = pd->drag.y - ev->cur.output.y; + if (pd->pager && pd->pager->inst) + resist = pager_config->drag_resist; + + if (((dx * dx) + (dy * dy)) <= (resist * resist)) return; + + pd->pager->dragging = 1; + pd->drag.start = 0; + } + + if (pd->drag.in_pager) + { + E_Drag *drag; + Evas_Object *o, *oo, *o_icon; + Evas_Coord x, y, w, h; + const char *file = NULL, *part = NULL; + const char *drag_types[] = { "enlightenment/vdesktop" }; + Pager_Win *pw; + Evas_List *l; + + evas_object_geometry_get(pd->o_desk, &x, &y, &w, &h); + drag = e_drag_new(pd->pager->inst->gcc->gadcon->zone->container, + x, y, drag_types, 1, pd, -1, + NULL, _pager_desk_cb_drag_finished); + + /* set a background to the drag icon */ + o = evas_object_rectangle_add(drag->evas); + evas_object_color_set(o, 255, 255, 255, 255); + evas_object_resize(o, w, h); + evas_object_show(o); + + /* redraw the desktop theme above */ + o = edje_object_add(drag->evas); + e_theme_edje_object_set(o, "base/theme/modules/pager", + "e/modules/pager/desk"); + evas_object_show(o); + e_drag_object_set(drag, o); + + /* and redraw is content */ + oo = e_layout_add(drag->evas); + e_layout_virtual_size_set(oo, pd->pager->zone->w, pd->pager->zone->h); + edje_object_part_swallow(o, "items", oo); + evas_object_show(oo); + + for (l = pd->wins; l; l = l->next) + { + pw = l->data; + if (!pw || pw->border->iconic + || pw->border->client.netwm.state.skip_pager) + continue; + + o = edje_object_add(drag->evas); + e_theme_edje_object_set(o, "base/theme/modules/pager", + "e/modules/pager/window"); + e_layout_pack(oo, o); + e_layout_child_raise(o); + e_layout_child_move(o, + pw->border->x - pw->desk->desk->zone->x, + pw->border->y - pw->desk->desk->zone->y); + e_layout_child_resize(o, pw->border->w, pw->border->h); + evas_object_show(o); + + if ((o_icon = e_border_icon_add(pw->border, drag->evas))) + { + evas_object_show(o_icon); + edje_object_part_swallow(o, "icon", o_icon); + } + } + e_drag_resize(drag, w, h); + e_drag_start(drag, x - pd->drag.dx, y - pd->drag.dy); + + pd->drag.from_pager = pd->pager; + pd->drag.from_pager->dragging = 1; + pd->drag.in_pager = 0; + e_util_evas_fake_mouse_up_later(evas_object_evas_get(pd->pager->o_table), + pd->drag.button); + } +} + +static void +_pager_desk_cb_drag_finished(E_Drag *drag, int dropped) +{ + Pager_Desk *pd; + + pd = drag->data; + if (!pd) return; + if (!dropped) + { + /* wasn't dropped on pager, switch with current desktop */ + Pager_Desk *pd2 = NULL; + Evas_List *l; + E_Desk *desk; + + if (!pd->desk) return; + desk = e_desk_current_get( + e_zone_current_get( + e_container_current_get( + e_manager_current_get()))); + for (l = pager_config->instances; l && !pd2; l = l->next) + { + Instance *inst; + Pager *pager = NULL; + + inst = l->data; + if (!(pager = inst->pager)) continue; + pd2 = _pager_desk_find(pager, desk); + } + _pager_desk_switch(pd, pd2); + } + if (pd->drag.from_pager) + { + pd->drag.from_pager->dragging = 0; + pd->drag.from_pager->just_dragged = 0; + } + pd->drag.from_pager = NULL; } static void @@ -1903,6 +2205,7 @@ e_modapi_init(E_Module *m) E_CONFIG_VAL(D, T, resize, UCHAR); 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); @@ -1920,6 +2223,7 @@ e_modapi_init(E_Module *m) pager_config->resize = PAGER_RESIZE_BOTH; pager_config->btn_drag = 1; pager_config->btn_noplace = 2; + pager_config->btn_desk = 0; pager_config->flip_desk = 0; } E_CONFIG_LIMIT(pager_config->popup, 0, 1); @@ -1933,6 +2237,7 @@ e_modapi_init(E_Module *m) E_CONFIG_LIMIT(pager_config->scale, 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); pager_config->handlers = evas_list_append (pager_config->handlers, ecore_event_handler_add diff --git a/src/modules/pager/e_mod_main.h b/src/modules/pager/e_mod_main.h index c935ded7d..064a264dc 100644 --- a/src/modules/pager/e_mod_main.h +++ b/src/modules/pager/e_mod_main.h @@ -27,7 +27,7 @@ struct _Config unsigned int popup_urgent_stick; double popup_urgent_speed; unsigned int drag_resist; - unsigned char scale; + unsigned int scale; unsigned char resize; Evas_List *items; /* FIXME: save/load this */ /* just config state */ @@ -37,8 +37,9 @@ struct _Config E_Menu *menu; Evas_List *handlers; - unsigned char btn_drag; - unsigned char btn_noplace; + unsigned int btn_drag; + unsigned int btn_noplace; + unsigned int btn_desk; unsigned int flip_desk; };