diff --git a/data/themes/default/default.edc b/data/themes/default/default.edc index b86583b..46d3848 100644 --- a/data/themes/default/default.edc +++ b/data/themes/default/default.edc @@ -120,14 +120,40 @@ collections type: SWALLOW; description { state: "default" 0.0; - visible: 1; - rel1 { relative: 0.0 0.0; + visible: 0; + + + rel1 { relative: 0.0 1.0; } - rel2 { relative: 1.0 1.0; + rel2 { relative: 1.0 2.0; } } + description { + state: "show" 0.0; + visible: 1; + + } } } + programs { + program { + name: "desktop,show"; + signal: "elfe,desktop,show"; + source: "elfe"; + action: STATE_SET "show" 0.0; + target: "elfe.swallow.desktop"; + transition: "DECELERATE" 0.5; + } + program { + name: "desktop,hide"; + signal: "elfe,desktop,hide"; + source: "elfe"; + action: STATE_SET "default" 0.0; + target: "elfe.swallow.desktop"; + transition: "ACCELERATE" 0.5; + } + + } } group { name: "elfe/desktop/gadget/frame"; @@ -827,6 +853,207 @@ collections } } + group { + name: "elfe/winlist/layout"; + parts { + part { + name: "clip"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { + state: "visible" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "bg"; + clip_to: "clip"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "elfe.swallow.windows"; + type: SWALLOW; + clip_to: "clip"; + description { + state: "default" 0.0; + } + } + part { + name: "event"; + type: RECT; + clip_to: "clip"; + description { + state: "default" 0.0; + color: 255 255 255 0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 0.3; + } + } + part { + name: "event2"; + type: RECT; + clip_to: "clip"; + description { + state: "default" 0.0; + color: 255 255 255 0; + rel1.relative: 0.0 0.7; + rel2.relative: 1.0 1.0; + } + } + } + programs { + program { + name: "winlist,show"; + signal: "elfe,winlist,show"; + source: "*"; + action: STATE_SET "visible" 0.0; + transition: ACCELERATE 0.5; + target: "clip"; + } + program { + name: "winlist,hide"; + signal: "elfe,winlist,hide"; + source: "*"; + action: STATE_SET "default" 0.0; + transition: ACCELERATE 0.5; + target: "clip"; + } + program { + name: "event_click"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elfe,action,click" ""; + } + program { + name: "event2_click"; + signal: "mouse,clicked,1"; + source: "event2"; + action: SIGNAL_EMIT "elfe,action,click" ""; + } + } + } + + group { + name: "elfe/winlist/window"; + parts { + images { + image: "app_text_bg.png" COMP; + image: "thumbnail_bg.png" COMP; + } + + part { + name: "clip"; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "active" 0.0; + color: 255 255 255 100; + } + } + + part { + name: "text.bg"; + clip_to: "clip"; + description { + rel1.to: "elfe.text.label"; + rel1.offset: -2 -1; + rel2.to: "elfe.text.label"; + rel2.offset: 1 -1; + image.normal: "app_text_bg.png"; + image.border: 4 4 4 4; + } + } + part { + name: "elfe.text.label"; + type: TEXT; + effect: SHADOW; + //type: RECT; + clip_to: "clip"; + scale: 1; + description { + min: 10 10; + state: "default" 0.0; + rel1.relative: 0 1; + rel1.offset: 0 16; + rel1.to_y: "content.bg"; + rel2.relative: 1 1; + rel2.to_y: "content.bg"; + rel2.offset: 0 16; + fixed: 1 1; + color3: 0 0 0 200; + color: 220 220 220 200; + align: 0.5 1; + text { + font: "Sans"; + size: 10; + min: 0 1; + max: 1 1; + text: "Mozilla Firefox"; + } + } + } + part { + name: "content.bg"; + type: IMAGE; + clip_to: "clip"; + description { + state: "default" 0.0; + rel1.to: "elfe.swallow.content"; + rel1.offset: -5 -7; + rel2.to: "elfe.swallow.content"; + rel2.offset: 4 6; + image.normal: "thumbnail_bg.png"; + image.border: 10 10 10 10; + + } + } + part { + name: "elfe.swallow.content"; + type: SWALLOW; + clip_to: "clip"; + description { + state: "default" 0.0; + } + program { + name: "bt_click"; + signal: "mouse,clicked,1"; + source: "elfe.swallow.content"; + action: SIGNAL_EMIT "elfe,action,click" ""; + } + program { + name: "bt_down"; + signal: "mouse,down,1"; + source: "elfe.swallow.content"; + action: STATE_SET "active" 0.0; + transition: ACCELERATE 0.5; + target: "clip"; + } + program { + name: "bt_up"; + signal: "mouse,up,1"; + source: "elfe.swallow.content"; + action: STATE_SET "default" 0.0; + transition: ACCELERATE 0.5; + target: "clip"; + } + } + + } + } + + ICON_SET("application-default-icon", "icon/application-default"); ICON("icon_application.png", "icon/applications"); ICON("icon_widgets.png", "icon/widgets"); diff --git a/data/themes/default/images/shadow.png b/data/themes/default/images/shadow.png new file mode 100644 index 0000000..8e66670 Binary files /dev/null and b/data/themes/default/images/shadow.png differ diff --git a/data/themes/default/images/thumbnail_bg.png b/data/themes/default/images/thumbnail_bg.png new file mode 100644 index 0000000..1b08da3 Binary files /dev/null and b/data/themes/default/images/thumbnail_bg.png differ diff --git a/src/desktop.c b/src/desktop.c index 321bcd7..3f44b47 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -7,10 +7,7 @@ #include "utils.h" #include "dock.h" #include "allapps.h" - -#define ELFE_DESKTOP_NUM 5 -#define ELFE_DESKTOP_PADDING_W 10 -#define ELFE_DESKTOP_PADDING_H 10 +#include "main.h" typedef struct _Elfe_Desktop Elfe_Desktop; diff --git a/src/main.c b/src/main.c index e1cc4a9..d5fe4c9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,6 @@ #include +#include + #include "main.h" #include "elfe_config.h" #include "allapps.h" @@ -10,23 +12,10 @@ #define ELFE_HOME_WIN_TYPE 0xE0b0102f /* local structures */ -typedef struct _Elfe_Home_Win Elfe_Home_Win; typedef struct _Elfe_Home_Exec Elfe_Home_Exec; -struct _Elfe_Home_Win -{ - E_Object e_obj_inherit; - - E_Win *win; - Evas_Object *o_bg; - Evas_Object *layout; - Evas_Object *desktop; - - E_Zone *zone; - -}; - -static Elfe_Home_Win *hwin; +Elfe_Home_Win *hwin; +Elm_Theme *elfe_theme; /* local function prototypes */ static void _elfe_home_win_new(E_Zone *zone); @@ -53,7 +42,7 @@ e_modapi_init(E_Module *m) if (!elfe_home_config_init(m)) return NULL; - e_winilist_init(); + elfe_winlist_init(); hdls = eina_list_append(hdls, @@ -91,7 +80,7 @@ e_modapi_shutdown(E_Module *m __UNUSED__) Ecore_Event_Handler *hdl; Elfe_Home_Win *hwin; - e_winilist_shutdown(); + elfe_winlist_shutdown(); EINA_LIST_FREE(hwins, hwin) e_object_del(E_OBJECT(hwin)); @@ -123,7 +112,7 @@ _elfe_home_win_new(E_Zone *zone) E_Desk *desk; char buf[PATH_MAX]; const char *bgfile; - Elm_Theme *theme; + Evas_Object *o_edje; const char *file; @@ -184,10 +173,10 @@ _elfe_home_win_new(E_Zone *zone) } o_edje = elm_layout_edje_get(hwin->layout); - theme = elm_theme_new(); + elfe_theme = elm_theme_new(); /* Use specific module theme as elm theme overlay */ - elm_theme_overlay_add(theme, buf); - elm_object_theme_set(hwin->layout, theme); + elm_theme_overlay_add(elfe_theme, buf); + elm_object_theme_set(hwin->layout, elfe_theme); hwin->desktop = elfe_desktop_add(hwin->layout, hwin->zone); elm_layout_content_set(hwin->layout, "elfe.swallow.desktop", hwin->desktop); @@ -201,6 +190,8 @@ _elfe_home_win_new(E_Zone *zone) if (hwin->win->evas_win) e_drop_xdnd_register_set(hwin->win->evas_win, EINA_TRUE); + elfe_home_winlist_show(EINA_TRUE); + hwins = eina_list_append(hwins, hwin); } @@ -249,3 +240,15 @@ _elfe_home_cb_bg_change(void *data __UNUSED__, int type, void *event __UNUSED__) return ECORE_CALLBACK_PASS_ON; } + +void +elfe_home_winlist_show(Eina_Bool show) +{ + Evas_Object *o_edje; + + o_edje = elm_layout_edje_get(hwin->layout); + if (show) + edje_object_signal_emit(o_edje, "elfe,desktop,show", "elfe"); + else + edje_object_signal_emit(o_edje, "elfe,desktop,hide", "elfe"); +} diff --git a/src/main.h b/src/main.h index ab5c848..43e1d98 100644 --- a/src/main.h +++ b/src/main.h @@ -1,12 +1,35 @@ #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H +#define ELFE_DESKTOP_NUM 5 +#define ELFE_DESKTOP_PADDING_W 10 +#define ELFE_DESKTOP_PADDING_H 10 + +typedef struct _Elfe_Home_Win Elfe_Home_Win; + +struct _Elfe_Home_Win +{ + E_Object e_obj_inherit; + + E_Win *win; + Evas_Object *o_bg; + Evas_Object *layout; + Evas_Object *desktop; + + E_Zone *zone; + +}; + + EAPI extern E_Module_Api e_modapi; +EAPI extern Elfe_Home_Win *hwin; +EAPI extern Elm_Theme *elfe_theme; EAPI void *e_modapi_init(E_Module *m); EAPI int e_modapi_shutdown(E_Module *m); EAPI int e_modapi_save(E_Module *m); void elfe_home_win_cfg_update(void); +void elfe_home_winlist_show(Eina_Bool show); #endif diff --git a/src/winlist.c b/src/winlist.c index b503a6a..4323030 100644 --- a/src/winlist.c +++ b/src/winlist.c @@ -1,465 +1,685 @@ #include #include #include "winlist.h" +#include "main.h" +#include "elfe_config.h" -/* internal calls */ -typedef struct _Data Data; -typedef struct _Special Special; +#define GO_EDGE 0 +#define GO_ACTION 1 +#define GO_KEY 2 +#define GO_MOUSE 3 +#define SWIPE_MOVES 12 -struct _Data +static E_Action *act = NULL; + +typedef struct _E_Comp_Win E_Comp_Win; +typedef struct _Elfe_Winlist_Item Elfe_Winlist_Item; +typedef struct _Elfe_Winlist Elfe_Winlist; +static Eina_Bool show = EINA_FALSE; + +struct _E_Comp_Win { - Evas_Object *o_list; - struct - { - void (*func) (void *data, E_Border *bd); - void *data; - } select; - struct - { - Eina_List *prepend; - Eina_List *append; - unsigned char changed : 1; - } special; - struct - { - Evas_Coord w, h; - } optimal_size; - Eina_List *borders; - Eina_List *labels; + EINA_INLIST; + + void *c; + Ecore_X_Window win; + E_Border *bd; + E_Popup *pop; + E_Menu *menu; + int x, y, w, h; + struct { + int x, y, w, h; + } hidden; + int pw, ph; + int border; + Ecore_X_Pixmap pixmap; + Ecore_X_Damage damage; + Ecore_X_Visual vis; + int depth; + Evas_Object *obj; + Evas_Object *shobj; + Eina_List *obj_mirror; + Ecore_X_Image *xim; + void *up; + E_Object_Delfn *dfn; + Ecore_X_Sync_Counter counter; + Ecore_Timer *update_timeout; + Ecore_Timer *ready_timeout; + int dmg_updates; + Ecore_X_Rectangle *rects; + int rects_num; + + Ecore_X_Pixmap cache_pixmap; + int cache_w, cache_h; + int update_count; + double last_visible_time; + double last_draw_time; + + int pending_count; + + unsigned int opacity; + + char *title, *name, *clas, *role; + Ecore_X_Window_Type primary_type; + + Eina_Bool delete_pending : 1; + Eina_Bool hidden_override : 1; + + Eina_Bool animating : 1; + Eina_Bool force : 1; + Eina_Bool defer_hide : 1; + Eina_Bool delete_me : 1; + + Eina_Bool visible : 1; + Eina_Bool input_only : 1; + Eina_Bool override : 1; + Eina_Bool argb : 1; + Eina_Bool shaped : 1; + Eina_Bool update : 1; + Eina_Bool redirected : 1; + Eina_Bool shape_changed : 1; + Eina_Bool native : 1; + Eina_Bool drawme : 1; + Eina_Bool invalid : 1; + Eina_Bool nocomp : 1; + Eina_Bool needpix : 1; + Eina_Bool needxim : 1; + Eina_Bool real_hid : 1; + Eina_Bool inhash : 1; + Eina_Bool show_ready : 1; }; -struct _Special +struct _Elfe_Winlist_Item { - Evas_Object *icon; - const char *label; - void (*func) (void *data1, void *data2); - void *data1; - void *data2; + Elfe_Winlist *winlist; + Eina_List *pads; + Evas_Object *layout; + Evas_Object *tb; + Evas_Object *placeholder; + Evas_Object *win; + E_Border *bd; + int movements; + struct { + Evas_Coord x, y; + } history[SWIPE_MOVES]; + Ecore_Timer *swipe_timer; + E_Manager_Comp_Source *src; + E_Manager *man; }; -static void _cb_item_sel(void *data, Evas_Object *obj, void *event_info); -static void _cb_special_sel(void *data, Evas_Object *obj, void *event_info); +struct _Elfe_Winlist +{ + Evas_Object *rect; + Evas_Object *layout; + Ecore_X_Window input_win; + Eina_List *windows; + Eina_List *handlers; + E_Zone *zone; +}; -static void _cb_object_del(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _cb_object_resize(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _winlist_del(Elfe_Winlist *winlist); -static void _refill(Data *d); +static Eina_Bool +_scale_cb_key_down(void *data, int type, void *event) +{ -static Eina_Bool _cb_border_add(void *data, int ev_type, void *ev); -static Eina_Bool _cb_border_remove(void *data, int ev_type, void *ev); -static Eina_Bool _cb_border_show(void *data, int ev_type, void *ev); -static Eina_Bool _cb_border_hide(void *data, int ev_type, void *ev); -static Eina_Bool _cb_border_property(void *data, int ev_type, void *ev); -static Eina_Bool _cb_desk_show(void *data, int ev_type, void *event); + return ECORE_CALLBACK_DONE; +} -/* state */ -static Eina_List *handlers = NULL; -static Eina_List *winilists = NULL; +static Eina_Bool +_scale_cb_key_up(void *data, int type, void *event) +{ + return ECORE_CALLBACK_DONE; +} + +static Eina_Bool +_scale_cb_mouse_down(void *data, int type, void *event) +{ + Ecore_Event_Mouse_Button *ev = event; + Evas_Button_Flags flags = EVAS_BUTTON_NONE; + Eina_List *l; + + evas_event_feed_mouse_down((Evas *)data, ev->buttons, flags, ev->timestamp, NULL); + + return ECORE_CALLBACK_DONE; +} + +static Eina_Bool +_scale_cb_mouse_up(void *data, int type, void *event) +{ + Ecore_Event_Mouse_Button *ev = event; + Evas_Button_Flags flags = EVAS_BUTTON_NONE; + + evas_event_feed_mouse_up((Evas *)data, ev->buttons, flags, ev->timestamp, NULL); + + return ECORE_CALLBACK_DONE; +} + +static Eina_Bool +_scale_cb_mouse_move(void *data, int type, void *event) +{ + Ecore_Event_Mouse_Move *ev = event; + + evas_event_feed_mouse_move((Evas *) data, ev->x, ev->y, ev->timestamp, NULL); + + return ECORE_CALLBACK_DONE; +} + + +static Eina_Bool +_scale_cb_window_focus_in(void *data, int type __UNUSED__, void *event) +{ + Ecore_X_Event_Window_Focus_In *ev; + Evas *e = data; + + ev = event; + evas_focus_in(e); + evas_event_feed_mouse_in(e, ev->time, NULL); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_swipe_cancel(void *data) +{ + Elfe_Winlist_Item *it = data; + + it->movements = 0; + it->swipe_timer = NULL; + return ECORE_CALLBACK_RENEW; +} + +static void +_window_mouse_up_cb(void *data,Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elfe_Winlist_Item *it = data; + + if (it->swipe_timer) + { + ecore_timer_del(it->swipe_timer); + it->swipe_timer = NULL; + } +} + + +static void +_window_mouse_down_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elfe_Winlist_Item *it = data; + Evas_Event_Mouse_Move *ev = event_info; + + if( it->swipe_timer) + { + ecore_timer_del(it->swipe_timer); + } + + it->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it); +} + + +static void +_transit_swipe_del_cb(void *data, Elm_Transit *transit) +{ + Elfe_Winlist_Item *it = data; + + if (!it->bd->lock_close) + { + Elfe_Winlist *winlist = it->winlist; + e_border_act_close_begin(it->bd); + it->winlist->windows = eina_list_remove(it->winlist->windows, + it); + evas_object_del(it->layout); + evas_object_del(it->tb); + e_object_unref(E_OBJECT(it->bd)); + it->bd = NULL; + if (it->swipe_timer) + ecore_timer_del(it->swipe_timer); + free(it); + if (!eina_list_count(winlist->windows)) + _winlist_del(winlist); + + } +} + +static void +_window_mouse_move_cb(void *data,Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elfe_Winlist_Item *it = data; + Evas_Event_Mouse_Move *ev = event_info; + + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + if (it->movements == SWIPE_MOVES) + { + it->movements = 0; + if( it->swipe_timer) + { + ecore_timer_del(it->swipe_timer); + it->swipe_timer = NULL; + } + return; + } + it->history[it->movements].x = ev->cur.canvas.x; + it->history[it->movements].y = ev->cur.canvas.y; + if ((it->history[0].y - it->history[it->movements].y) <= 80) + it->movements++; + else + { + Elm_Transit *transit; + + it->movements = 0; + if( it->swipe_timer) + { + ecore_timer_del(it->swipe_timer); + it->swipe_timer = NULL; + } + + transit = elm_transit_add(); + elm_transit_object_add(transit, it->layout); + elm_transit_effect_translation_add(transit, 0, 0, 0, -1000); + elm_transit_effect_zoom_add(transit, 1.0, 0.5); + elm_transit_objects_final_state_keep_set(transit, EINA_TRUE); + elm_transit_duration_set(transit, 0.3); + elm_transit_del_cb_set(transit, _transit_swipe_del_cb, it); + elm_transit_go(transit); + + transit = elm_transit_add(); + elm_transit_object_add(transit, it->tb); + + elm_transit_objects_final_state_keep_set(transit, EINA_TRUE); + elm_transit_duration_set(transit, 0.29); + elm_transit_go(transit); + + } + } +} + +static void +_transit_win_anim_del_cb(void *data, Elm_Transit *transit) +{ + Elfe_Winlist_Item *it = data; + + elm_layout_content_set(it->layout, "elfe.swallow.content", it->win); + if (it->bd->client.netwm.name) + elm_layout_text_set(it->layout, "elfe.text.label", + it->bd->client.netwm.name); + else if (it->bd->client.icccm.title) + elm_layout_text_set(it->layout, "elfe.text.label", + it->bd->client.icccm.title); +} + +static void +_item_layout_resize_cb(void *data,Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elfe_Winlist_Item *it = data; + Elm_Transit *transit; + Evas_Coord dx, dy, dw, dh; + Evas_Coord x, y, w, h; + + evas_object_show(it->win); + + evas_object_geometry_get(it->placeholder, &x, &y, &w, &h); + + transit = elm_transit_add(); + elm_transit_object_add(transit, it->win); + + if (it->bd->focused) + { + evas_object_resize(it->win, it->bd->w, it->bd->h); + evas_object_move(it->win, it->bd->x, it->bd->y); + elm_transit_effect_resizing_add(transit, it->bd->w, it->bd->h, w, h); + elm_transit_effect_translation_add(transit, it->bd->x, it->bd->y, x, y); + } + else + { + evas_object_resize(it->win, w, h); + evas_object_move(it->win, x, y); + elm_transit_effect_zoom_add(transit, 0.1, 1.0); + } + + elm_transit_del_cb_set(transit, _transit_win_anim_del_cb, it); + elm_transit_objects_final_state_keep_set(transit, EINA_TRUE); + elm_transit_duration_set(transit, 0.5); + elm_transit_go(transit); +} + +static void +_winlist_del(Elfe_Winlist *winlist) +{ + Elfe_Winlist_Item *it; + Ecore_Event_Handler *h; + + + EINA_LIST_FREE(winlist->windows, it) + { + e_manager_comp_src_hidden_set(it->man, it->src, EINA_FALSE); + e_object_unref(E_OBJECT(it->bd)); + if (it->swipe_timer) + ecore_timer_del(it->swipe_timer); + free(it); + } + + EINA_LIST_FREE(winlist->handlers, h) + { + ecore_event_handler_del(h); + } + + ecore_x_window_free(winlist->input_win); + winlist->input_win = 0; + evas_object_del(winlist->layout); + evas_object_del(winlist->rect); + elfe_home_winlist_show(EINA_TRUE); + e_grabinput_release(winlist->input_win, winlist->input_win); + ecore_x_window_free(winlist->input_win); + + + free(winlist); +} + +static void +_winlist_layout_mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + _winlist_del(data); +} + +static void +_window_mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Elfe_Winlist_Item *it = data; + e_border_show(it->bd); + e_border_uniconify(it->bd); + e_border_focus_set_with_pointer(it->bd); + e_manager_comp_src_hidden_set(it->man, it->src, EINA_FALSE); + _winlist_del(it->winlist); +} + +static void +_elfe_action(const char *params, int modifiers, int method) +{ + E_Manager_Comp_Source *src; + Eina_List *l; + Eina_List *handlers; + + if (!params) return; + + if (strcmp(params, "go_elfe_winlist")) + return; + + elfe_home_winlist_show(show); + show = ~show; + + if (show) + { + E_Manager *man; + Evas *e; + Evas_Object *sc, *bx, *win; + int i; + Ecore_Event_Handler *h; + char buf[4096]; + Elfe_Winlist *winlist; + + winlist = calloc(1, sizeof(Elfe_Winlist)); + + snprintf(buf, sizeof(buf), "%s/default.edj", + elfe_home_cfg->mod_dir); + + man = eina_list_data_get(e_manager_list()); + + if (!man) return; + + winlist->zone = e_util_zone_current_get(e_manager_current_get()); + winlist->input_win = ecore_x_window_input_new(winlist->zone->container->win, + 0, 0, winlist->zone->w, winlist->zone->h); + ecore_x_window_show(winlist->input_win); + if (!e_grabinput_get(winlist->input_win, 0, winlist->input_win)) + { + ecore_x_window_free(winlist->input_win); + winlist->input_win = 0; + return; + } + + e = e_manager_comp_evas_get(man); + evas_focus_in(e); + h = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, + _scale_cb_mouse_down, e); + handlers = eina_list_append(handlers, h); + + h = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, + _scale_cb_mouse_up, e); + handlers = eina_list_append(handlers, h); + + h = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, + _scale_cb_mouse_move, e); + handlers = eina_list_append(handlers, h); + + h = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, + _scale_cb_key_down, e); + handlers = eina_list_append(handlers, h); + + h = ecore_event_handler_add(ECORE_EVENT_KEY_UP, + _scale_cb_key_up, e); + handlers = eina_list_append(handlers, h); + + h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _scale_cb_window_focus_in, e); + handlers = eina_list_append(handlers, h); + + winlist->handlers = handlers; + + e_grabinput_focus(winlist->zone->container->win, E_FOCUS_METHOD_GLOBALLY_ACTIVE); + + winlist->rect = evas_object_rectangle_add(e); + evas_object_color_set(winlist->rect, 0, 0, 0, 20); + evas_object_resize(winlist->rect, winlist->zone->w, winlist->zone->h); + evas_object_move(winlist->rect, 0, 0); + evas_object_show(winlist->rect); + + winlist->layout = elm_layout_add(winlist->rect); + elm_object_theme_set(winlist->layout, elfe_theme); + elm_layout_file_set(winlist->layout, buf, "elfe/winlist/layout"); + evas_object_show(winlist->layout); + evas_object_move(winlist->layout, winlist->zone->x, winlist->zone->y); + evas_object_resize(winlist->layout, winlist->zone->w, winlist->zone->h); + edje_object_signal_callback_add(elm_layout_edje_get(winlist->layout), + "elfe,action,click", "*", + _winlist_layout_mouse_clicked_cb, winlist); + + + edje_object_signal_emit(elm_layout_edje_get(winlist->layout), + "elfe,winlist,show", "elfe"); + + sc = elm_scroller_add(winlist->layout); + elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_relative_set(sc, 1.0, 1.0); + evas_object_show(sc); + elm_layout_content_set(winlist->layout, "elfe.swallow.windows", sc); + + bx = elm_box_add(sc); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_homogenous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + EINA_LIST_FOREACH((Eina_List *)e_manager_comp_src_list(man), l, src) + { + E_Comp_Win *cw = (void*)src; + Evas_Object *o, *tb, *pad; + Evas_Object *layout; + Evas_Object *sel; + Elfe_Winlist_Item *item; + + if (!cw->bd) + { + if (cw->win == winlist->zone->container->bg_win) + { + Evas_Object *bg; + + bg = e_manager_comp_src_shadow_get(man, src); + evas_object_color_set(bg, 128, 128, 128, 255); + e_manager_comp_evas_update(e_manager_current_get()); + } + continue; + } + + if (cw->pop) + continue; + + + if (e_util_glob_match(cw->bd->client.icccm.class, "Illume*") || + e_util_glob_match(cw->bd->client.icccm.class, "Virtual-Keyboard") ) + continue; + + item = calloc(1, sizeof(Elfe_Winlist_Item)); + + winlist->windows = eina_list_append(winlist->windows, + item); + + item->winlist = winlist; + + + e_manager_comp_src_hidden_set(man, src, EINA_TRUE); + + item->man = man; + item->src = src; + + tb = elm_table_add(bx); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(tb); + + pad = evas_object_rectangle_add(evas_object_evas_get(bx)); + evas_object_size_hint_min_set(pad, winlist->zone->w/2 - 2 * ELFE_DESKTOP_PADDING_W , ELFE_DESKTOP_PADDING_H); + elm_table_pack(tb, pad, 1, 0, 1, 1); + //evas_object_show(pad); + item->pads = eina_list_append(item->pads, pad); + + pad = evas_object_rectangle_add(evas_object_evas_get(bx)); + evas_object_size_hint_min_set(pad, winlist->zone->w/2 - 2 * ELFE_DESKTOP_PADDING_W, ELFE_DESKTOP_PADDING_H); + elm_table_pack(tb, pad, 1, 2, 1, 1); + //evas_object_show(pad); + item->pads = eina_list_append(item->pads, pad); + + pad = evas_object_rectangle_add(evas_object_evas_get(bx)); + evas_object_size_hint_min_set(pad, ELFE_DESKTOP_PADDING_W, winlist->zone->h - 2 * ELFE_DESKTOP_PADDING_H); + elm_table_pack(tb, pad, 0, 1, 1, 1); + //evas_object_show(pad); + item->pads = eina_list_append(item->pads, pad); + + pad = evas_object_rectangle_add(evas_object_evas_get(bx)); + evas_object_size_hint_min_set(pad, ELFE_DESKTOP_PADDING_W, winlist->zone->h - 2 * ELFE_DESKTOP_PADDING_H); + elm_table_pack(tb, pad, 2, 1, 1, 1); + //evas_object_show(pad); + item->pads = eina_list_append(item->pads, pad); + + evas_object_show(tb); + item->tb = tb; + + elm_box_pack_end(bx, tb); + + + layout = elm_layout_add(tb); + elm_layout_file_set(layout, buf, "elfe/winlist/window"); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, _window_mouse_up_cb, item); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, _window_mouse_down_cb, item); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_MOVE, _window_mouse_move_cb, item); + edje_object_signal_callback_add(elm_layout_edje_get(layout), + "elfe,action,click", "*", + _window_mouse_clicked_cb, item); + + evas_object_size_hint_align_set(layout, -1, -1); + evas_object_show(layout); + + win = evas_object_image_filled_add(e); + o = e_manager_comp_src_image_get(man, src); + evas_object_image_source_set(win, o); + evas_object_image_smooth_scale_set(win, evas_object_image_smooth_scale_get(o)); + evas_object_size_hint_max_set(win, + cw->bd->w/2.5, + cw->bd->h/2.5); + evas_object_size_hint_aspect_set(win, + EVAS_ASPECT_CONTROL_BOTH, + cw->bd->w/2, cw->bd->h/2); + + item->layout = layout; + item->bd = cw->bd; + e_object_ref(E_OBJECT(item->bd)); + item->win = win; + + item->placeholder = evas_object_rectangle_add(e); + evas_object_color_set(item->placeholder, 0, 0, 0, 255); + evas_object_size_hint_max_set(item->placeholder, + cw->bd->w/2.5, + cw->bd->h/2.5); + evas_object_size_hint_aspect_set(item->placeholder, + EVAS_ASPECT_CONTROL_BOTH, + cw->bd->w/2, cw->bd->h/2); + elm_layout_content_set(layout, "elfe.swallow.content", item->placeholder); + elm_table_pack(tb, item->layout, 1, 1, 1, 1); + evas_object_show(item->placeholder); + evas_object_event_callback_add(item->placeholder, EVAS_CALLBACK_RESIZE, _item_layout_resize_cb, item); + evas_object_show(tb); + } + + evas_object_show(bx); + elm_scroller_content_set(sc, bx); + } +} + +static void +_elfe_winlist_edge_cb(E_Object *obj, const char *params, E_Event_Zone_Edge *ev) +{ + _elfe_action(params, 0, GO_EDGE); +} + +static void +_elfe_winlist_action_cb(E_Object *obj, const char *params) +{ + _elfe_action(params, 0, GO_ACTION); +} + +static void +_elfe_winlist_key_cb(E_Object *obj, const char *params, Ecore_Event_Key *ev) +{ + _elfe_action(params, ev->modifiers, GO_KEY); +} + +static void +_elfe_winlist_mouse_cb(E_Object *obj, const char *params, Ecore_Event_Mouse_Button *ev) +{ + _elfe_action(params, 0, GO_MOUSE); +} /* called from the module core */ EAPI int -e_winilist_init(void) +elfe_winlist_init(void) { - handlers = - eina_list_append(handlers, - ecore_event_handler_add(E_EVENT_BORDER_ADD, - _cb_border_add, NULL)); - handlers = - eina_list_append(handlers, - ecore_event_handler_add(E_EVENT_BORDER_REMOVE, - _cb_border_remove, NULL)); - handlers = - eina_list_append(handlers, - ecore_event_handler_add(E_EVENT_BORDER_SHOW, - _cb_border_show, NULL)); - handlers = - eina_list_append(handlers, - ecore_event_handler_add(E_EVENT_BORDER_HIDE, - _cb_border_hide, NULL)); - handlers = - eina_list_append(handlers, - ecore_event_handler_add(E_EVENT_BORDER_PROPERTY, - _cb_border_property, NULL)); - handlers = - eina_list_append(handlers, - ecore_event_handler_add(E_EVENT_DESK_SHOW, - _cb_desk_show, NULL)); + act = e_action_add("elfe-winlist"); + if (act) + { + act->func.go = _elfe_winlist_action_cb; + act->func.go_key = _elfe_winlist_key_cb; + act->func.go_mouse = _elfe_winlist_mouse_cb; + act->func.go_edge = _elfe_winlist_edge_cb; + + e_action_predef_name_set("Elfe windows list", "Elfe windows list","elfe-winlist", "go_elfe_winlist", NULL, 0); + } + return 1; } EAPI int -e_winilist_shutdown(void) +elfe_winlist_shutdown(void) { - Ecore_Event_Handler *handle; - - EINA_LIST_FREE(handlers, handle) - ecore_event_handler_del(handle); - return 1; + if (act) + { + e_action_predef_name_del("Elfe windows list", "Elfe windows list"); + e_action_del("elfe-winlist"); + } } EAPI Evas_Object * -e_winilist_add(Evas_Object *parent) +elfe_winlist_add(Evas_Object *parent) { - Data *d; - - d = E_NEW(Data, 1); - - d->o_list = elm_list_add(parent); - evas_object_data_set(d->o_list, "..[winilist]", d); - evas_object_show(d->o_list); - - winilists = eina_list_append(winilists, d); - evas_object_event_callback_add(d->o_list, EVAS_CALLBACK_DEL, - _cb_object_del, NULL); - evas_object_event_callback_add(d->o_list, EVAS_CALLBACK_RESIZE, - _cb_object_resize, NULL); - - _refill(d); - return d->o_list; -} - -EAPI void -e_winilist_border_select_callback_set(Evas_Object *obj, void (*func) (void *data, E_Border *bd), void *data) -{ - Data *d; - - d = evas_object_data_get(obj, "..[winilist]"); - if (!d) return; - d->select.func = func; - d->select.data = data; -} - -EAPI void -e_winilist_special_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data1, void *data2), void *data1, void *data2) -{ - Data *d; - - d = evas_object_data_get(obj, "..[winilist]"); - if (!d) return; - { - Special *s; - - s = E_NEW(Special, 1); - d->special.prepend = eina_list_prepend(d->special.prepend, s); - s->icon = icon; - if (label) s->label = eina_stringshare_add(label); - s->func = func; - s->data1 = data1; - s->data2 = data2; - d->special.changed = 1; - } - _refill(d); -} - -EAPI void -e_winilist_special_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data1, void *data2), void *data1, void *data2) -{ - Data *d; - - d = evas_object_data_get(obj, "..[winilist]"); - if (!d) return; - { - Special *s; - - s = E_NEW(Special, 1); - d->special.append = eina_list_append(d->special.append, s); - s->icon = icon; - if (label) s->label = eina_stringshare_add(label); - s->func = func; - s->data1 = data1; - s->data2 = data2; - d->special.changed = 1; - } - _refill(d); -} - -EAPI void -e_winilist_optimial_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) -{ - Data *d; - - if (w) *w = 0; - if (h) *h = 0; - d = evas_object_data_get(obj, "..[winilist]"); - if (!d) return; - if (w) *w = d->optimal_size.w; - if (h) *h = d->optimal_size.h; -} - -/////////////////////////////////////////////////////////////////////////////// - -/* internal calls */ -static void -_cb_item_sel(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - Data *d; - - d = data; - if (d->select.func) - { -// d->select.func(d->select.data, data2); - } -} - -static void -_cb_special_sel(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - Special *s; - - s = data; - if (s->func) - { - s->func(s->data1, s->data2); - } -} - -static void -_cb_object_del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) -{ - Data *d; - - d = evas_object_data_get(obj, "..[winilist]"); - if (!d) return; - evas_object_del(d->o_list); - winilists = eina_list_remove(winilists, d); - - while (d->borders) - { - e_object_unref(E_OBJECT(d->borders->data)); - d->borders = eina_list_remove_list(d->borders, d->borders); - } - while (d->labels) - { - eina_stringshare_del(d->labels->data); - d->labels = eina_list_remove_list(d->labels, d->labels); - } - - while (d->special.prepend) - { - Special *s; - - s = d->special.prepend->data; - if (s->icon) - { - evas_object_del(s->icon); - s->icon = NULL; - } - if (s->label) - { - eina_stringshare_del(s->label); - s->label = NULL; - } - free(s); - d->special.prepend = eina_list_remove_list(d->special.prepend, d->special.prepend); - } - while (d->special.append) - { - Special *s; - - s = d->special.append->data; - if (s->icon) - { - evas_object_del(s->icon); - s->icon = NULL; - } - if (s->label) - { - eina_stringshare_del(s->label); - s->label = NULL; - } - free(s); - d->special.append = eina_list_remove_list(d->special.append, d->special.append); - } - - free(d); -} - -static void -_cb_object_resize(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) -{ - Data *d; - - d = evas_object_data_get(obj, "..[winilist]"); - if (!d) return; - -} - -static void -_refill(Data *d) -{ - Eina_List *borders, *l, *l2, *l3; - - borders = e_border_client_list(); - if (!d->special.changed) - { - int changed = 0; - - if ((borders) && (d->borders)) - { - Eina_List *tmp = NULL; - - changed = 0; - for (l = borders; l; l = l->next) - { - E_Border *bd; - - bd = l->data; - if (e_object_is_del(E_OBJECT(bd))) continue; - if ((!bd->client.icccm.accepts_focus) && - (!bd->client.icccm.take_focus)) continue; - if (bd->client.netwm.state.skip_taskbar) continue; - if (bd->user_skip_winlist) continue; - if ((!bd->sticky) && - (bd->desk != e_desk_current_get(bd->zone))) continue; - tmp = eina_list_append(tmp, bd); - } - if (!(tmp && d->borders)) - { - changed = 1; - } - else - { - if (eina_list_count(tmp) != - eina_list_count(d->borders)) - { - changed = 1; - } - else - { - for (l = tmp, l2 = d->borders, l3 = d->labels; - l && l2 && l3; - l = l->next, l2 = l2->next, l3 = l3->next) - { - E_Border *bd, *bd2; - const char *title; - - bd = l->data; - bd2 = l2->data; - if (bd != bd2) - { - changed = 1; - break; - } - - title = "???"; - if (bd->client.netwm.name) title = bd->client.netwm.name; - else if (bd->client.icccm.title) title = bd->client.icccm.title; - if (strcmp(title, l3->data)) - { - changed = 1; - break; - } - } - } - } - if (tmp) eina_list_free(tmp); - } - else - changed = 1; - if (!changed) return; - } - d->special.changed = 0; - while (d->borders) - { - e_object_unref(E_OBJECT(d->borders->data)); - d->borders = eina_list_remove_list(d->borders, d->borders); - } - while (d->labels) - { - eina_stringshare_del(d->labels->data); - d->labels = eina_list_remove_list(d->labels, d->labels); - } - - for (l = d->special.prepend; l; l = l->next) - { - Special *s; - - s = l->data; - elm_list_item_append(d->o_list, s->label, s->icon, NULL, _cb_special_sel, s); - } - for (l = borders; l; l = l->next) - { - E_Border *bd; - const char *title; - - bd = l->data; - if (e_object_is_del(E_OBJECT(bd))) continue; - if ((!bd->client.icccm.accepts_focus) && - (!bd->client.icccm.take_focus)) continue; - if (bd->client.netwm.state.skip_taskbar) continue; - if (bd->user_skip_winlist) continue; - if ((!bd->sticky) && - (bd->desk != e_desk_current_get(bd->zone))) continue; - - title = "???"; - if (bd->client.netwm.name) title = bd->client.netwm.name; - else if (bd->client.icccm.title) title = bd->client.icccm.title; - e_object_ref(E_OBJECT(bd)); - d->borders = eina_list_append(d->borders, bd); - d->labels = eina_list_append(d->labels, eina_stringshare_add(title)); - elm_list_item_append(d->o_list, title, NULL, NULL, - _cb_item_sel, d); - } - for (l = d->special.append; l; l = l->next) - { - Special *s; - - s = l->data; - elm_list_item_append(d->o_list, s->label, s->icon, NULL, _cb_special_sel, s); - } -} - -static Eina_Bool -_cb_border_add(void *data __UNUSED__, int ev_type __UNUSED__, void *event __UNUSED__) -{ - Eina_List *l; - - for (l = winilists; l; l = l->next) _refill(l->data); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_cb_border_remove(void *data __UNUSED__, int ev_type __UNUSED__, void *event __UNUSED__) -{ - Eina_List *l; - - for (l = winilists; l; l = l->next) _refill(l->data); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_cb_border_show(void *data __UNUSED__, int ev_type __UNUSED__, void *event __UNUSED__) -{ - Eina_List *l; - - for (l = winilists; l; l = l->next) _refill(l->data); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_cb_border_hide(void *data __UNUSED__, int ev_type __UNUSED__, void *event __UNUSED__) -{ - Eina_List *l; - - for (l = winilists; l; l = l->next) _refill(l->data); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_cb_border_property(void *data __UNUSED__, int ev_type __UNUSED__, void *event __UNUSED__) -{ - Eina_List *l; - - for (l = winilists; l; l = l->next) _refill(l->data); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_cb_desk_show(void *data __UNUSED__, int ev_type __UNUSED__, void *event __UNUSED__) -{ - Eina_List *l; - - for (l = winilists; l; l = l->next) _refill(l->data); - return ECORE_CALLBACK_PASS_ON; + return NULL; } diff --git a/src/winlist.h b/src/winlist.h index b6d10d0..1c8b220 100644 --- a/src/winlist.h +++ b/src/winlist.h @@ -1,13 +1,9 @@ -#ifndef E_WINILIST_H -#define E_WINILIST_H +#ifndef _ELFE_WINLIST_H_ +#define _ELFE_WINLIST_H_ -EAPI int e_winilist_init(void); -EAPI int e_winilist_shutdown(void); +int elfe_winlist_init(void); +int elfe_winlist_shutdown(void); -EAPI Evas_Object *e_winilist_add(Evas_Object *parent); -EAPI void e_winilist_border_select_callback_set(Evas_Object *obj, void (*func) (void *data, E_Border *bd), void *data); -EAPI void e_winilist_special_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data1, void *data2), void *data1, void *data2); -EAPI void e_winilist_special_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data1, void *data2), void *data1, void *data2); -EAPI void e_winilist_optimial_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); - -#endif +Evas_Object *e_winilist_add(Evas_Object *parent); + +#endif /* _ELFE_WINLIST_H_ */