various patches from the devel mailing list in - and fixed where needed.

SVN revision: 30818
This commit is contained in:
Carsten Haitzler 2007-07-15 08:28:11 +00:00
parent 0a1b9cb6e9
commit 2e875d3805
10 changed files with 489 additions and 43 deletions

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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,

View File

@ -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)
{

View File

@ -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));

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;
};