Recreate new home windows on initial load (this handles dual mode also).

Rework/Re-implement busycover windows per home window so we can show
launching status.



SVN revision: 45097
This commit is contained in:
Christopher Michael 2010-01-13 23:40:23 +00:00
parent 2ddcbfc526
commit 09db1a4b46
5 changed files with 87 additions and 181 deletions

View File

@ -20,10 +20,10 @@ pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH
pkg_LTLIBRARIES = module.la
module_la_SOURCES = e_mod_main.c \
e_mod_main.h \
e_busycover.c \
e_busycover.h \
e_mod_config.c \
e_mod_config.h
e_mod_config.h \
e_busycover.c \
e_busycover.h
module_la_LIBADD = @e_libs@ @dlopen_libs@
module_la_LDFLAGS = -module -avoid-version

View File

@ -1,172 +1,82 @@
#include "e.h"
#include "e_busycover.h"
#include "e_mod_config.h"
/* local function prototypes */
static void _e_busycover_cb_free(E_Busycover *esw);
static void _e_busycover_win_cb_resize(E_Win *win);
static int _e_busycover_zone_cb_move_resize(void *data, int type, void *event);
static Evas_Object *_theme_obj_new(Evas *evas, const char *custom_dir, const char *group);
/* local variables */
static Eina_List *busycovers = NULL;
/* public functions */
EAPI int
e_busycover_init(void)
{
return 1;
}
EAPI int
e_busycover_shutdown(void)
{
return 1;
}
static void _e_busycover_cb_free(E_Busycover *cover);
EAPI E_Busycover *
e_busycover_new(E_Zone *zone, const char *themedir)
e_busycover_new(E_Win *win)
{
E_Busycover *esw;
Ecore_X_Window_State states[2];
E_Busycover *cover;
char buff[PATH_MAX];
esw = E_OBJECT_ALLOC(E_Busycover, E_BUSYCOVER_TYPE, _e_busycover_cb_free);
if (!esw) return NULL;
cover = E_OBJECT_ALLOC(E_Busycover, E_BUSYCOVER_TYPE, _e_busycover_cb_free);
if (!cover) return NULL;
snprintf(buff, sizeof(buff), "%s/e-module-illume-home.edj",
il_home_cfg->mod_dir);
esw->zone = zone;
if (themedir) esw->themedir = eina_stringshare_add(themedir);
esw->win = e_win_new(zone->container);
esw->win->data = esw;
states[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
states[1] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
e_win_title_set(esw->win, _("Illume Busycover"));
e_win_name_class_set(esw->win, "Illume-Busycover", "Illume-Busycover");
e_win_resize_callback_set(esw->win, _e_busycover_win_cb_resize);
ecore_x_icccm_hints_set(esw->win->evas_win, 0, 0, 0, 0, 0, 0, 0);
ecore_x_netwm_window_state_set(esw->win->evas_win, states, 2);
ecore_x_netwm_window_type_set(esw->win->evas_win, ECORE_X_WINDOW_TYPE_SPLASH);
esw->o_base = _theme_obj_new(e_win_evas_get(esw->win), esw->themedir,
"modules/illume-home/busycover/default");
evas_object_move(esw->o_base, 0, 0);
evas_object_show(esw->o_base);
edje_object_part_text_set(esw->o_base, "e.text.title", "LOADING");
ecore_evas_alpha_set(esw->win->ecore_evas, 1);
busycovers = eina_list_append(busycovers, esw);
esw->handlers =
eina_list_append(esw->handlers,
ecore_event_handler_add(E_EVENT_ZONE_MOVE_RESIZE,
_e_busycover_zone_cb_move_resize,
esw));
return esw;
cover->o_base = edje_object_add(e_win_evas_get(win));
if (!e_theme_edje_object_set(cover->o_base,
"base/theme/modules/illume-home",
"modules/illume-home/busycover"))
edje_object_file_set(cover->o_base, buff, "modules/illume-home/busycover");
edje_object_part_text_set(cover->o_base, "e.text.title", _("LOADING"));
evas_object_move(cover->o_base, win->x, win->y);
evas_object_resize(cover->o_base, win->w, win->h);
evas_object_layer_set(cover->o_base, 999);
return cover;
}
EAPI E_Busycover_Handle *
e_busycover_push(E_Busycover *esw, const char *msg, const char *icon)
e_busycover_push(E_Busycover *cover, const char *msg, const char *icon)
{
E_Busycover_Handle *h;
E_Busycover_Handle *handle;
E_OBJECT_CHECK(esw);
E_OBJECT_TYPE_CHECK_RETURN(esw, E_BUSYCOVER_TYPE, NULL);
h = E_NEW(E_Busycover_Handle, 1);
h->busycover = esw;
if (msg) h->msg = eina_stringshare_add(msg);
if (icon) h->icon = eina_stringshare_add(icon);
esw->handles = eina_list_prepend(esw->handles, h);
edje_object_part_text_set(esw->o_base, "e.text.label", h->msg);
/* FIXME: handle icon */
E_OBJECT_CHECK(cover);
E_OBJECT_TYPE_CHECK_RETURN(cover, E_BUSYCOVER_TYPE, NULL);
e_win_layer_set(esw->win, 9999);
e_win_show(esw->win);
e_border_zone_set(esw->win->border, esw->zone);
// evas_object_show(esw->o_base);
// evas_object_raise(esw->o_base);
return h;
handle = E_NEW(E_Busycover_Handle, 1);
handle->cover = cover;
if (msg) handle->msg = eina_stringshare_add(msg);
if (icon) handle->icon = eina_stringshare_add(icon);
cover->handles = eina_list_append(cover->handles, handle);
edje_object_part_text_set(cover->o_base, "e.text.title", msg);
evas_object_show(cover->o_base);
return handle;
}
EAPI void
e_busycover_pop(E_Busycover *esw, E_Busycover_Handle *handle)
e_busycover_pop(E_Busycover *cover, E_Busycover_Handle *handle)
{
E_OBJECT_CHECK(esw);
E_OBJECT_TYPE_CHECK(esw, E_BUSYCOVER_TYPE);
if (!eina_list_data_find(esw->handles, handle)) return;
esw->handles = eina_list_remove(esw->handles, handle);
E_OBJECT_CHECK(cover);
E_OBJECT_TYPE_CHECK(cover, E_BUSYCOVER_TYPE);
if (!eina_list_data_find(cover->handles, handle)) return;
cover->handles = eina_list_remove(cover->handles, handle);
if (handle->msg) eina_stringshare_del(handle->msg);
if (handle->icon) eina_stringshare_del(handle->icon);
E_FREE(handle);
if (esw->handles)
if (cover->handles)
{
handle = esw->handles->data;
edje_object_part_text_set(esw->o_base, "e.text.label", handle->msg);
handle = cover->handles->data;
edje_object_part_text_set(cover->o_base, "e.text.title", handle->msg);
}
else
e_object_del(E_OBJECT(esw));
evas_object_hide(cover->o_base);
}
/* local functions */
EAPI void
e_busycover_resize(E_Busycover *cover, int w, int h)
{
E_OBJECT_CHECK(cover);
E_OBJECT_TYPE_CHECK(cover, E_BUSYCOVER_TYPE);
evas_object_resize(cover->o_base, w, h);
}
/* local function prototypes */
static void
_e_busycover_cb_free(E_Busycover *esw)
_e_busycover_cb_free(E_Busycover *cover)
{
Ecore_Event_Handler *handle;
if (esw->o_base) evas_object_del(esw->o_base);
e_object_del(E_OBJECT(esw->win));
esw->win = NULL;
busycovers = eina_list_remove(busycovers, esw);
EINA_LIST_FREE(esw->handlers, handle)
ecore_event_handler_del(handle);
if (esw->themedir) eina_stringshare_del(esw->themedir);
E_FREE(esw);
if (cover->o_base) evas_object_del(cover->o_base);
E_FREE(cover);
}
static void
_e_busycover_win_cb_resize(E_Win *win)
{
E_Busycover *esw;
if (!(esw = win->data)) return;
evas_object_resize(esw->o_base, win->w, win->h);
}
static int
_e_busycover_zone_cb_move_resize(void *data, int type, void *event)
{
E_Event_Zone_Move_Resize *ev;
E_Busycover *esw;
ev = event;
esw = data;
if (esw->zone == ev->zone)
{
int x, y, w, h;
e_zone_useful_geometry_get(esw->zone, &x, &y, &w, &h);
e_win_move_resize(esw->win, x, y, w, h);
}
return 1;
}
static Evas_Object *
_theme_obj_new(Evas *evas, const char *custom_dir, const char *group)
{
Evas_Object *o;
o = edje_object_add(evas);
if (!e_theme_edje_object_set(o, "base/theme/modules/illume-home", group))
{
if (custom_dir)
{
char buff[PATH_MAX];
snprintf(buff, sizeof(buff), "%s/e-module-illume-home.edj",
custom_dir);
edje_object_file_set(o, buff, group);
}
}
return o;
}

View File

@ -1,7 +1,7 @@
#ifndef E_BUSYCOVER_H
#define E_BUSYCOVER_H
# define E_BUSYCOVER_H
#define E_BUSYCOVER_TYPE 0xE1b0782
# define E_BUSYCOVER_TYPE 0xE1b0782
typedef struct _E_Busycover E_Busycover;
typedef struct _E_Busycover_Handle E_Busycover_Handle;
@ -9,23 +9,18 @@ typedef struct _E_Busycover_Handle E_Busycover_Handle;
struct _E_Busycover
{
E_Object e_obj_inherit;
E_Zone *zone;
E_Win *win;
Evas_Object *o_base;
Eina_List *handlers, *handles;
const char *themedir;
Eina_List *handles;
};
struct _E_Busycover_Handle
{
E_Busycover *busycover;
E_Busycover *cover;
const char *msg, *icon;
};
EAPI int e_busycover_init(void);
EAPI int e_busycover_shutdown(void);
EAPI E_Busycover *e_busycover_new(E_Zone *zone, const char *themedir);
EAPI E_Busycover_Handle *e_busycover_push(E_Busycover *esw, const char *msg, const char *icon);
EAPI void e_busycover_pop(E_Busycover *esw, E_Busycover_Handle *handle);
EAPI E_Busycover *e_busycover_new(E_Win *win);
EAPI E_Busycover_Handle *e_busycover_push(E_Busycover *cover, const char *msg, const char *icon);
EAPI void e_busycover_pop(E_Busycover *cover, E_Busycover_Handle *handle);
EAPI void e_busycover_resize(E_Busycover *cover, int w, int h);
#endif

View File

@ -22,16 +22,16 @@ struct _Il_Home_Win
E_Object e_obj_inherit;
E_Win *win;
Evas_Object *o_bg, *o_sf, *o_fm;
Evas_Object *o_bg, *o_sf, *o_fm, *o_cover;
E_Busycover *cover;
};
struct _Il_Home_Exec
{
E_Busycover *cover;
Efreet_Desktop *desktop;
Ecore_Exe *exec;
E_Border *border;
Ecore_Timer *timeout;
E_Busycover *cover;
int startup_id;
pid_t pid;
void *handle;
@ -95,8 +95,6 @@ e_modapi_init(E_Module *m)
_il_home_apps_unpopulate();
_il_home_apps_populate();
e_busycover_init();
handlers =
eina_list_append(handlers,
ecore_event_handler_add(EFREET_EVENT_DESKTOP_LIST_CHANGE,
@ -145,14 +143,11 @@ e_modapi_shutdown(E_Module *m)
exe->handle = NULL;
}
if (exe->timeout) ecore_timer_del(exe->timeout);
exe->cover = NULL;
E_FREE(exe);
}
_il_home_apps_unpopulate();
e_busycover_shutdown();
EINA_LIST_FREE(handlers, handle)
ecore_event_handler_del(handle);
@ -192,18 +187,18 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
inst->o_btn = e_widget_button_add(gc->evas, NULL, NULL,
_il_home_btn_cb_click, inst, NULL);
icon = e_icon_add(evas_object_evas_get(inst->o_btn));
e_icon_file_edje_set(icon, buff, "btn_icon");
e_icon_file_edje_set(icon, buff, "icon");
e_widget_button_icon_set(inst->o_btn, icon);
inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->o_btn);
inst->gcc->data = inst;
// _il_home_win_new(inst);
_il_home_win_new(inst);
xwin = inst->gcc->gadcon->zone->black_win;
mode = ecore_x_e_illume_mode_get(xwin);
// if (mode > ECORE_X_ILLUME_MODE_SINGLE)
// _il_home_win_new(inst);
if (mode > ECORE_X_ILLUME_MODE_SINGLE)
_il_home_win_new(inst);
inst->hdl = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
_il_home_cb_client_message, inst);
@ -305,12 +300,6 @@ _il_home_win_new(Instance *inst)
e_win_name_class_set(hwin->win, "Illume-Home", "Illume-Home");
e_win_resize_callback_set(hwin->win, _il_home_win_cb_resize);
if (!hwin->cover)
{
hwin->cover =
e_busycover_new(inst->gcc->gadcon->zone, il_home_cfg->mod_dir);
}
snprintf(buff, sizeof(buff), "%s/e-module-illume-home.edj",
il_home_cfg->mod_dir);
@ -347,6 +336,8 @@ _il_home_win_new(Instance *inst)
evas_object_smart_callback_add(hwin->o_fm, "selected",
_il_home_cb_selected, hwin);
hwin->cover = e_busycover_new(hwin->win);
e_win_move_resize(hwin->win, zone->x, zone->y, zone->w, 100);
e_win_show(hwin->win);
e_border_zone_set(hwin->win->border, zone);
@ -362,6 +353,10 @@ _il_home_win_cb_free(Il_Home_Win *hwin)
{
if (hwin->win->evas_win)
e_drop_xdnd_register_set(hwin->win->evas_win, 0);
if (hwin->cover) e_object_del(E_OBJECT(hwin->cover));
hwin->cover = NULL;
if (hwin->o_bg) evas_object_del(hwin->o_bg);
hwin->o_bg = NULL;
if (hwin->o_sf) evas_object_del(hwin->o_sf);
@ -401,6 +396,11 @@ _il_home_win_cb_resize(E_Win *win)
if (hwin->win)
evas_object_resize(hwin->o_sf, hwin->win->w, hwin->win->h);
}
if (hwin->cover)
{
if (hwin->win)
e_busycover_resize(hwin->cover, hwin->win->w, hwin->win->h);
}
}
static void
@ -492,6 +492,7 @@ _il_home_desktop_run(Il_Home_Win *hwin, Efreet_Desktop *desktop)
exe = E_NEW(Il_Home_Exec, 1);
if (!exe) return;
exe->cover = hwin->cover;
eins = e_exec(hwin->win->border->zone, desktop, NULL, NULL, "illume-home");
exe->desktop = desktop;
@ -504,10 +505,8 @@ _il_home_desktop_run(Il_Home_Win *hwin, Efreet_Desktop *desktop)
}
exe->timeout = ecore_timer_add(20.0, _il_home_win_cb_timeout, exe);
exe->cover = hwin->cover;
snprintf(buff, sizeof(buff), "Starting %s", desktop->name);
exe->handle = e_busycover_push(exe->cover, buff, NULL);
exe->handle = e_busycover_push(hwin->cover, buff, NULL);
exes = eina_list_append(exes, exe);
}
@ -679,7 +678,6 @@ _il_home_win_cb_exe_del(void *data, int type, void *event)
}
exes = eina_list_remove_list(exes, l);
if (exe->timeout) ecore_timer_del(exe->timeout);
exe->cover = NULL;
E_FREE(exe);
return 1;
}
@ -751,8 +749,11 @@ _il_home_win_cb_timeout(void *data)
Il_Home_Exec *exe;
if (!(exe = data)) return 1;
if (exe->handle) e_busycover_pop(exe->cover, exe->handle);
exe->handle = NULL;
if (exe->handle)
{
e_busycover_pop(exe->cover, exe->handle);
exe->handle = NULL;
}
if (!exe->border)
{
exes = eina_list_remove(exes, exe);