forked from enlightenment/enlightenment
reorder or remove iconbar icons by moving them around on the iconbar or moving them off of it.
SVN revision: 5942
This commit is contained in:
parent
1f91b6d65a
commit
984f643abb
475
src/iconbar.c
475
src/iconbar.c
|
@ -11,8 +11,10 @@ static Evas_List iconbars = NULL;
|
|||
|
||||
/* internal func (iconbar use only) prototypes */
|
||||
|
||||
static void e_ib_bit_down_cb(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh);
|
||||
static void e_ib_bit_up_cb(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh);
|
||||
static void e_ib_bit_down_cb (void *data, Ebits_Object o, char *class, int bt,
|
||||
int x, int y, int ox, int oy, int ow, int oh);
|
||||
static void e_ib_bit_up_cb (void *data, Ebits_Object o, char *class, int bt,
|
||||
int x, int y, int ox, int oy, int ow, int oh);
|
||||
|
||||
static void ib_reload_timeout (int val, void *data);
|
||||
static void ib_scroll_timeout (int val, void *data);
|
||||
|
@ -27,14 +29,21 @@ static void ib_bits_raise(void *data);
|
|||
static void ib_bits_lower (void *data);
|
||||
static void ib_bits_set_layer (void *data, int l);
|
||||
static void ib_bits_set_clip (void *data, Evas_Object clip);
|
||||
static void ib_bits_set_color_class(void *data, char *cc, int r, int g, int b, int a);
|
||||
static void ib_bits_set_color_class (void *data, char *cc, int r, int g,
|
||||
int b, int a);
|
||||
static void ib_bits_get_min_size (void *data, double *w, double *h);
|
||||
static void ib_bits_get_max_size (void *data, double *w, double *h);
|
||||
|
||||
static void ib_mouse_in(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y);
|
||||
static void ib_mouse_out(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y);
|
||||
static void ib_mouse_down(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y);
|
||||
static void ib_mouse_up(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y);
|
||||
static void ib_mouse_in (void *data, Evas _e, Evas_Object _o, int _b, int _x,
|
||||
int _y);
|
||||
static void ib_mouse_out (void *data, Evas _e, Evas_Object _o, int _b, int _x,
|
||||
int _y);
|
||||
static void ib_mouse_down (void *data, Evas _e, Evas_Object _o, int _b,
|
||||
int _x, int _y);
|
||||
static void ib_mouse_up (void *data, Evas _e, Evas_Object _o, int _b, int _x,
|
||||
int _y);
|
||||
static void ib_mouse_move (void *data, Evas _e, Evas_Object _o, int _b,
|
||||
int _x, int _y);
|
||||
|
||||
static void e_iconbar_icon_cleanup (E_Iconbar_Icon * ic);
|
||||
|
||||
|
@ -49,14 +58,16 @@ static void ib_child_handle(Ecore_Event *ev);
|
|||
/* static internal - called when iconbar bit has a mouse button pressed */
|
||||
/* on it */
|
||||
static void
|
||||
e_ib_bit_down_cb(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh)
|
||||
e_ib_bit_down_cb (void *data, Ebits_Object o, char *class, int bt, int x,
|
||||
int y, int ox, int oy, int ow, int oh)
|
||||
{
|
||||
E_Iconbar *ib;
|
||||
|
||||
D_ENTER;
|
||||
|
||||
ib = (E_Iconbar *) data;
|
||||
if (!class) D_RETURN;
|
||||
if (!class)
|
||||
D_RETURN;
|
||||
if (!strcmp (class, "Scrollbar_Arrow1"))
|
||||
ib_scroll_timeout (8, ib);
|
||||
else if (!strcmp (class, "Scrollbar_Arrow2"))
|
||||
|
@ -80,14 +91,16 @@ e_ib_bit_down_cb(void *data, Ebits_Object o, char *class, int bt, int x, int y,
|
|||
/* static internal - called when iconbar bit has a mouse button released */
|
||||
/* on it */
|
||||
static void
|
||||
e_ib_bit_up_cb(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh)
|
||||
e_ib_bit_up_cb (void *data, Ebits_Object o, char *class, int bt, int x, int y,
|
||||
int ox, int oy, int ow, int oh)
|
||||
{
|
||||
E_Iconbar *ib;
|
||||
|
||||
D_ENTER;
|
||||
|
||||
ib = (E_Iconbar *) data;
|
||||
if (!class) D_RETURN;
|
||||
if (!class)
|
||||
D_RETURN;
|
||||
if (!strcmp (class, "Scrollbar_Arrow1"))
|
||||
ib_scroll_timeout (0, ib);
|
||||
else if (!strcmp (class, "Scrollbar_Arrow2"))
|
||||
|
@ -128,7 +141,8 @@ e_iconbar_cleanup(E_Iconbar *ib)
|
|||
/* the view will now it needs to redraw */
|
||||
ib->view->changed = 1;
|
||||
/* free up our ebits */
|
||||
if (ib->bit) ebits_free(ib->bit);
|
||||
if (ib->bit)
|
||||
ebits_free (ib->bit);
|
||||
/* if we have any icons... */
|
||||
if (ib->icons)
|
||||
{
|
||||
|
@ -157,6 +171,7 @@ e_iconbar_cleanup(E_Iconbar *ib)
|
|||
/* call the destructor of the base class */
|
||||
e_object_cleanup (E_OBJECT (ib));
|
||||
|
||||
|
||||
D_RETURN;
|
||||
}
|
||||
|
||||
|
@ -180,19 +195,25 @@ e_iconbar_init()
|
|||
/* to get from the db for us. the key is "exec". the type is a string */
|
||||
/* the struct memebr is exec. the default value is "". see the config.h */
|
||||
/* header for more info */
|
||||
E_CONFIG_NODE(cf_iconbar_icon, "exec", E_CFG_TYPE_STR, NULL, E_Iconbar_Icon, exec, 0, 0, "");
|
||||
E_CONFIG_NODE(cf_iconbar_icon, "wait", E_CFG_TYPE_INT, NULL, E_Iconbar_Icon, wait, 0, 0, "");
|
||||
E_CONFIG_NODE(cf_iconbar_icon, "wait_timeout", E_CFG_TYPE_FLOAT, NULL, E_Iconbar_Icon, wait_timeout, 0, 0, "");
|
||||
E_CONFIG_NODE (cf_iconbar_icon, "exec", E_CFG_TYPE_STR, NULL,
|
||||
E_Iconbar_Icon, exec, 0, 0, "");
|
||||
E_CONFIG_NODE (cf_iconbar_icon, "wait", E_CFG_TYPE_INT, NULL,
|
||||
E_Iconbar_Icon, wait, 0, 0, "");
|
||||
E_CONFIG_NODE (cf_iconbar_icon, "wait_timeout", E_CFG_TYPE_FLOAT, NULL,
|
||||
E_Iconbar_Icon, wait_timeout, 0, 0, "");
|
||||
/* this memebr will be replaced by the relative key path in the db as a */
|
||||
/* string */
|
||||
E_CONFIG_NODE(cf_iconbar_icon, "image", E_CFG_TYPE_KEY, NULL, E_Iconbar_Icon, image_path, 0, 0, "");
|
||||
E_CONFIG_NODE (cf_iconbar_icon, "image", E_CFG_TYPE_KEY, NULL,
|
||||
E_Iconbar_Icon, image_path, 0, 0, "");
|
||||
|
||||
/* a new config type - in this case the iconbar istelf. the only thing we */
|
||||
/* want the config system to do it fill it with iconbar icon members in */
|
||||
/* the list */
|
||||
cf_iconbar = e_config_type_new ();
|
||||
E_CONFIG_NODE(cf_iconbar, "icons", E_CFG_TYPE_LIST, cf_iconbar_icon, E_Iconbar, icons, 0, 0, NULL);
|
||||
E_CONFIG_NODE(cf_iconbar, "scroll", E_CFG_TYPE_FLOAT, NULL, E_Iconbar, scroll, 0, 0, NULL);
|
||||
E_CONFIG_NODE (cf_iconbar, "icons", E_CFG_TYPE_LIST, cf_iconbar_icon,
|
||||
E_Iconbar, icons, 0, 0, NULL);
|
||||
E_CONFIG_NODE (cf_iconbar, "scroll", E_CFG_TYPE_FLOAT, NULL, E_Iconbar,
|
||||
scroll, 0, 0, NULL);
|
||||
|
||||
ecore_event_filter_handler_add (ECORE_EVENT_CHILD, ib_child_handle);
|
||||
|
||||
|
@ -232,7 +253,8 @@ e_iconbar_new(E_View *v)
|
|||
/* flush edb cached handled */
|
||||
e_db_flush ();
|
||||
/* no iconbar config loaded ? return NULL */
|
||||
if (!ib) D_RETURN_(NULL);
|
||||
if (!ib)
|
||||
D_RETURN_ (NULL);
|
||||
|
||||
/* now that the config system has doe the loading. we need to init the */
|
||||
/* object and set up ref counts and free method */
|
||||
|
@ -271,10 +293,14 @@ e_iconbar_new(E_View *v)
|
|||
/* to put it */
|
||||
D_RETURN_ (NULL);
|
||||
}
|
||||
ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow1", CALLBACK_MOUSE_DOWN, e_ib_bit_down_cb, ib);
|
||||
ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow1", CALLBACK_MOUSE_UP, e_ib_bit_up_cb, ib);
|
||||
ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow2", CALLBACK_MOUSE_DOWN, e_ib_bit_down_cb, ib);
|
||||
ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow2", CALLBACK_MOUSE_UP, e_ib_bit_up_cb, ib);
|
||||
ebits_set_classed_bit_callback (ib->bit, "Scrollbar_Arrow1",
|
||||
CALLBACK_MOUSE_DOWN, e_ib_bit_down_cb, ib);
|
||||
ebits_set_classed_bit_callback (ib->bit, "Scrollbar_Arrow1",
|
||||
CALLBACK_MOUSE_UP, e_ib_bit_up_cb, ib);
|
||||
ebits_set_classed_bit_callback (ib->bit, "Scrollbar_Arrow2",
|
||||
CALLBACK_MOUSE_DOWN, e_ib_bit_down_cb, ib);
|
||||
ebits_set_classed_bit_callback (ib->bit, "Scrollbar_Arrow2",
|
||||
CALLBACK_MOUSE_UP, e_ib_bit_up_cb, ib);
|
||||
|
||||
/* add to our list of iconbars */
|
||||
iconbars = evas_list_append (iconbars, ib);
|
||||
|
@ -293,9 +319,10 @@ static void
|
|||
e_iconbar_icon_cleanup (E_Iconbar_Icon * ic)
|
||||
{
|
||||
D_ENTER;
|
||||
|
||||
D ("iconbar icon cleanup\n");
|
||||
/* if we have an imageobject. nuke it */
|
||||
if (ic->image) evas_del_object(ic->iconbar->view->evas, ic->image);
|
||||
if (ic->image)
|
||||
evas_del_object (ic->iconbar->view->evas, ic->image);
|
||||
/* free strings ... if they exist */
|
||||
IF_FREE (ic->image_path);
|
||||
IF_FREE (ic->exec);
|
||||
|
@ -305,7 +332,8 @@ e_iconbar_icon_cleanup(E_Iconbar_Icon *ic)
|
|||
ecore_del_event_timer (ic->hi.timer);
|
||||
FREE (ic->hi.timer);
|
||||
}
|
||||
if (ic->hi.image) evas_del_object(ic->iconbar->view->evas, ic->hi.image);
|
||||
if (ic->hi.image)
|
||||
evas_del_object (ic->iconbar->view->evas, ic->hi.image);
|
||||
|
||||
if (ic->launch_id_cb)
|
||||
{
|
||||
|
@ -355,19 +383,28 @@ e_iconbar_realize(E_Iconbar *ib)
|
|||
/* the path of the key to the image memebr - that is actually */
|
||||
/* a lump of image data inlined in the iconbar db - so the icons */
|
||||
/* themselves follow the iconbar wherever it goes */
|
||||
snprintf(buf, PATH_MAX, "%s/.e_iconbar.db:%s", ib->view->dir, ic->image_path);
|
||||
snprintf (buf, PATH_MAX, "%s/.e_iconbar.db:%s", ib->view->dir,
|
||||
ic->image_path);
|
||||
/* add the icon image object */
|
||||
ic->image = evas_add_image_from_file (ib->view->evas, buf);
|
||||
/* add an imlib image so we can save it later */
|
||||
ic->imlib_image = imlib_load_image(buf);
|
||||
/* clip the icon */
|
||||
evas_set_clip (ib->view->evas, ic->image, ib->clip);
|
||||
/* set it to be semi-transparent */
|
||||
evas_set_color (ib->view->evas, ic->image, 255, 255, 255, 128);
|
||||
/* set up callbacks on events - so the ib_* functions will be */
|
||||
/* called when the corresponding event happens to the icon */
|
||||
evas_callback_add(ib->view->evas, ic->image, CALLBACK_MOUSE_IN, ib_mouse_in, ic);
|
||||
evas_callback_add(ib->view->evas, ic->image, CALLBACK_MOUSE_OUT, ib_mouse_out, ic);
|
||||
evas_callback_add(ib->view->evas, ic->image, CALLBACK_MOUSE_DOWN, ib_mouse_down, ic);
|
||||
evas_callback_add(ib->view->evas, ic->image, CALLBACK_MOUSE_UP, ib_mouse_up, ic);
|
||||
evas_callback_add (ib->view->evas, ic->image, CALLBACK_MOUSE_IN,
|
||||
ib_mouse_in, ic);
|
||||
evas_callback_add (ib->view->evas, ic->image, CALLBACK_MOUSE_OUT,
|
||||
ib_mouse_out, ic);
|
||||
evas_callback_add (ib->view->evas, ic->image, CALLBACK_MOUSE_DOWN,
|
||||
ib_mouse_down, ic);
|
||||
evas_callback_add (ib->view->evas, ic->image, CALLBACK_MOUSE_UP,
|
||||
ib_mouse_up, ic);
|
||||
evas_callback_add (ib->view->evas, ic->image, CALLBACK_MOUSE_MOVE,
|
||||
ib_mouse_move, ic);
|
||||
}
|
||||
/* add the ebit we loaded to the evas the iconbar exists in - now the */
|
||||
/* ebit is more than just structures as well. */
|
||||
|
@ -389,8 +426,7 @@ e_iconbar_realize(E_Iconbar *ib)
|
|||
ib_bits_set_clip,
|
||||
ib_bits_set_color_class,
|
||||
ib_bits_get_min_size,
|
||||
ib_bits_get_max_size,
|
||||
ib);
|
||||
ib_bits_get_max_size, ib);
|
||||
/* now move this ebit to a really high layer.. so its ontop of a lot */
|
||||
ebits_set_layer (ib->bit, 10000);
|
||||
/* and now call "fix" - i called it fix cause it does a few things... */
|
||||
|
@ -482,9 +518,11 @@ e_iconbar_fix(E_Iconbar *ib)
|
|||
ah = ib->icon_area.h;
|
||||
|
||||
/* if we have icons- show the clipper that will clip them */
|
||||
if (ib->icons) evas_show(ib->view->evas, ib->clip);
|
||||
if (ib->icons)
|
||||
evas_show (ib->view->evas, ib->clip);
|
||||
/* no icons - hide the clipper as it will be a real object */
|
||||
else evas_hide(ib->view->evas, ib->clip);
|
||||
else
|
||||
evas_hide (ib->view->evas, ib->clip);
|
||||
/* move the clip object to fill the icon area */
|
||||
evas_move (ib->view->evas, ib->clip, ix, iy);
|
||||
evas_resize (ib->view->evas, ib->clip, aw, ah);
|
||||
|
@ -561,10 +599,13 @@ e_iconbar_fix(E_Iconbar *ib)
|
|||
/* center the icon vertically if its smaller */
|
||||
ox = 0;
|
||||
oy = (ah - h) / 2;
|
||||
/* now move and resize it */
|
||||
evas_move(ic->iconbar->view->evas, ic->image, ix + ox, iy + oy);
|
||||
evas_resize(ic->iconbar->view->evas, ic->image, w, h);
|
||||
evas_set_image_fill(ic->iconbar->view->evas, ic->image, 0, 0, w, h);
|
||||
|
||||
/* set the icons geometry */
|
||||
ic->current.x = ix + ox;
|
||||
ic->current.y = iy + oy;
|
||||
ic->current.w = w;
|
||||
ic->current.h = h;
|
||||
|
||||
/* advance our position counter to the next spot */
|
||||
ix += w;
|
||||
}
|
||||
|
@ -581,13 +622,24 @@ e_iconbar_fix(E_Iconbar *ib)
|
|||
/* center it horizontally */
|
||||
ox = (aw - w) / 2;
|
||||
oy = 0;
|
||||
/* now move the icona nd resize it */
|
||||
evas_move(ic->iconbar->view->evas, ic->image, ix + ox, iy + oy);
|
||||
evas_resize(ic->iconbar->view->evas, ic->image, w, h);
|
||||
evas_set_image_fill(ic->iconbar->view->evas, ic->image, 0, 0, w, h);
|
||||
|
||||
/* set the icons geometry */
|
||||
ic->current.x = ix + ox;
|
||||
ic->current.y = iy + oy;
|
||||
ic->current.w = w;
|
||||
ic->current.h = h;
|
||||
|
||||
/* advance out counter to the next spot */
|
||||
iy += h;
|
||||
}
|
||||
|
||||
/* now move the icona nd resize it */
|
||||
evas_move (ic->iconbar->view->evas, ic->image, ic->current.x,
|
||||
ic->current.y);
|
||||
evas_resize (ic->iconbar->view->evas, ic->image, ic->current.w,
|
||||
ic->current.h);
|
||||
evas_set_image_fill (ic->iconbar->view->evas, ic->image, 0, 0,
|
||||
ic->current.w, ic->current.h);
|
||||
}
|
||||
|
||||
D_RETURN;
|
||||
|
@ -616,10 +668,13 @@ e_iconbar_file_add(E_View *v, char *file)
|
|||
|
||||
/* unique timer name */
|
||||
snprintf (buf, PATH_MAX, "iconbar_reload:%s", v->dir);
|
||||
/* if we've scrolled since. save */
|
||||
if ((v->iconbar) &&
|
||||
(v->iconbar->has_been_scrolled))
|
||||
/* if we've scrolled or changed icons since. save */
|
||||
if (v->iconbar && (v->iconbar->has_been_scrolled || v->iconbar->changed))
|
||||
{
|
||||
e_iconbar_save_out_final (v->iconbar);
|
||||
v->iconbar->just_saved = 1;
|
||||
}
|
||||
|
||||
/* in 0.5 secs call our timout handler */
|
||||
ecore_add_event_timer (buf, 0.5, ib_reload_timeout, 0, v);
|
||||
}
|
||||
|
@ -676,8 +731,7 @@ e_iconbar_file_change(E_View *v, char *file)
|
|||
/* unique timer name */
|
||||
snprintf (buf, PATH_MAX, "iconbar_reload:%s", v->dir);
|
||||
/* if we've scrolled since. save */
|
||||
if ((v->iconbar) &&
|
||||
(v->iconbar->has_been_scrolled))
|
||||
if (v->iconbar && (v->iconbar->has_been_scrolled || v->iconbar->changed))
|
||||
e_iconbar_save_out_final (v->iconbar);
|
||||
/* in 0.5 secs call the realod timeout */
|
||||
ecore_add_event_timer (buf, 0.5, ib_reload_timeout, 0, v);
|
||||
|
@ -697,11 +751,71 @@ e_iconbar_save_out_final(E_Iconbar *ib)
|
|||
{
|
||||
char buf[PATH_MAX];
|
||||
|
||||
D_ENTER;
|
||||
|
||||
if (ib->view)
|
||||
{
|
||||
E_DB_File *edb;
|
||||
Imlib_Image im;
|
||||
Evas_List l;
|
||||
int i;
|
||||
|
||||
snprintf (buf, PATH_MAX, "%s/.e_iconbar.db", ib->view->dir);
|
||||
D("%s\n", buf);
|
||||
|
||||
if (ib->changed)
|
||||
{
|
||||
D("ib changed\n")
|
||||
|
||||
edb = e_db_open(buf);
|
||||
if (edb)
|
||||
{
|
||||
D("got edb\n");
|
||||
for (l = ib->icons, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
E_Iconbar_Icon *ic = l->data;
|
||||
char buf2[PATH_MAX];
|
||||
|
||||
if (ic)
|
||||
{
|
||||
/* save out exec */
|
||||
snprintf(buf2, PATH_MAX, "/icons/%i/exec", i);
|
||||
D("set exec: %i\n", i);
|
||||
e_db_str_set(edb, buf2, ic->exec);
|
||||
|
||||
/* save out image */
|
||||
if (ic->imlib_image)
|
||||
{
|
||||
imlib_context_set_image(ic->imlib_image);
|
||||
imlib_image_attach_data_value("compression", NULL, 9, NULL);
|
||||
imlib_image_set_format("db");
|
||||
|
||||
snprintf (buf2, PATH_MAX, "%s/.e_iconbar.db:/icons/%i/image", ib->view->dir, i);
|
||||
D("save image\n");
|
||||
imlib_save_image(buf2);
|
||||
}
|
||||
}
|
||||
}
|
||||
D("set count\n");
|
||||
e_db_int_set (edb, "/icons/count", i);
|
||||
D("set scroll\n");
|
||||
e_db_float_set (edb, "/scroll", ib->scroll);
|
||||
D("close db\n");
|
||||
e_db_close(edb);
|
||||
|
||||
}
|
||||
D("set just_saved\n");
|
||||
ib->just_saved = 1;
|
||||
ib->changed = 0;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
E_DB_FLOAT_SET(buf, "/scroll", ib->scroll);
|
||||
}
|
||||
|
||||
}
|
||||
D_RETURN;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -712,7 +826,8 @@ e_iconbar_handle_launch_id(Window win, void *data)
|
|||
|
||||
ic = (E_Iconbar_Icon *) data;
|
||||
b = e_border_find_by_window (win);
|
||||
if (!b) return;
|
||||
if (!b)
|
||||
return;
|
||||
if ((ic->launch_id) && (b->client.e.launch_id))
|
||||
{
|
||||
if (b->client.e.launch_id == ic->launch_id)
|
||||
|
@ -721,7 +836,8 @@ e_iconbar_handle_launch_id(Window win, void *data)
|
|||
{
|
||||
char buf[PATH_MAX];
|
||||
|
||||
snprintf(buf, PATH_MAX, "iconbar_launch_wait:%i", ic->launch_id);
|
||||
snprintf (buf, PATH_MAX, "iconbar_launch_wait:%i",
|
||||
ic->launch_id);
|
||||
ecore_del_event_timer (buf);
|
||||
}
|
||||
ic->launch_id = 0;
|
||||
|
@ -730,7 +846,8 @@ e_iconbar_handle_launch_id(Window win, void *data)
|
|||
e_exec_broadcast_cb_del (ic->launch_id_cb);
|
||||
ic->launch_id_cb = NULL;
|
||||
}
|
||||
evas_set_color(ic->iconbar->view->evas, ic->image, 255, 255, 255, 128);
|
||||
evas_set_color (ic->iconbar->view->evas, ic->image, 255, 255, 255,
|
||||
128);
|
||||
ic->iconbar->view->changed = 1;
|
||||
}
|
||||
}
|
||||
|
@ -750,16 +867,25 @@ ib_reload_timeout(int val, void *data)
|
|||
/* get our view pointer */
|
||||
v = (E_View *) data;
|
||||
|
||||
D("check if jsut saved:\n");
|
||||
if (v->iconbar->just_saved)
|
||||
{
|
||||
D("just saved\n");
|
||||
v->iconbar->just_saved = 0;
|
||||
D_RETURN;
|
||||
}
|
||||
/* if we have an iconbar.. well nuke it */
|
||||
if (e_object_unref (E_OBJECT (v->iconbar)) == 0)
|
||||
v->iconbar = NULL;
|
||||
|
||||
/* try load a new iconbar */
|
||||
if (!v->iconbar) v->iconbar = e_iconbar_new(v);
|
||||
if (!v->iconbar)
|
||||
v->iconbar = e_iconbar_new (v);
|
||||
|
||||
/* if the iconbar loaded and theres an evas - we're realized */
|
||||
/* so realize the iconbar */
|
||||
if ((v->iconbar) && (v->evas)) e_iconbar_realize(v->iconbar);
|
||||
if ((v->iconbar) && (v->evas))
|
||||
e_iconbar_realize (v->iconbar);
|
||||
|
||||
D_RETURN;
|
||||
UN (val);
|
||||
|
@ -857,7 +983,8 @@ ib_timeout(int val, void *data)
|
|||
{
|
||||
evas_set_color (ic->iconbar->view->evas, ic->image, 255, 255, 255, 50);
|
||||
if (ic->hi.image)
|
||||
evas_set_color(ic->iconbar->view->evas, ic->hi.image, 255, 255, 255, 0);
|
||||
evas_set_color (ic->iconbar->view->evas, ic->hi.image, 255, 255, 255,
|
||||
0);
|
||||
}
|
||||
/* if the icon is hilited */
|
||||
else if (ic->hilited)
|
||||
|
@ -874,9 +1001,11 @@ ib_timeout(int val, void *data)
|
|||
/* the speed to run at - the less, the faster (ie a loop is 0.5 sec) */
|
||||
speed = 0.5;
|
||||
/* if we are beyond the time loop.. reset the start time to now */
|
||||
if (tt > speed) ic->hi.start = t;
|
||||
if (tt > speed)
|
||||
ic->hi.start = t;
|
||||
/* limit time to max loop time */
|
||||
if (tt > speed) tt = speed;
|
||||
if (tt > speed)
|
||||
tt = speed;
|
||||
/* calculate alpha to be invers of time sizne loop start */
|
||||
a = (int) (255.0 * (speed - tt));
|
||||
/* size is icon size + how far in loop we are */
|
||||
|
@ -888,9 +1017,11 @@ ib_timeout(int val, void *data)
|
|||
/* resize it */
|
||||
evas_resize (ic->iconbar->view->evas, ic->hi.image, nw, nh);
|
||||
/* reset its fill so ti fills its space */
|
||||
evas_set_image_fill(ic->iconbar->view->evas, ic->hi.image, 0, 0, nw, nh);
|
||||
evas_set_image_fill (ic->iconbar->view->evas, ic->hi.image, 0, 0, nw,
|
||||
nh);
|
||||
/* set its fade */
|
||||
evas_set_color(ic->iconbar->view->evas, ic->hi.image, 255, 255, 255, a);
|
||||
evas_set_color (ic->iconbar->view->evas, ic->hi.image, 255, 255, 255,
|
||||
a);
|
||||
/* incirment our count */
|
||||
val++;
|
||||
}
|
||||
|
@ -902,7 +1033,8 @@ ib_timeout(int val, void *data)
|
|||
double speed;
|
||||
|
||||
/* delete the animation object */
|
||||
if (ic->hi.image) evas_del_object(ic->iconbar->view->evas, ic->hi.image);
|
||||
if (ic->hi.image)
|
||||
evas_del_object (ic->iconbar->view->evas, ic->hi.image);
|
||||
ic->hi.image = NULL;
|
||||
|
||||
/* if we were pulsating.. reset start timer */
|
||||
|
@ -916,7 +1048,8 @@ ib_timeout(int val, void *data)
|
|||
speed = 1.0;
|
||||
/* position on the fade out */
|
||||
tt = (t - ic->hi.start) / speed;
|
||||
if (tt > 1.0) tt = 1.0;
|
||||
if (tt > 1.0)
|
||||
tt = 1.0;
|
||||
/* alpha value caluclated on ramp position */
|
||||
a = (int) ((double) ((1.0 - tt) * 127.0) + 128.0);
|
||||
/* set alpha value */
|
||||
|
@ -1167,7 +1300,8 @@ ib_mouse_in(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
char buf[PATH_MAX];
|
||||
|
||||
/* come up with a unique name for it */
|
||||
snprintf(buf, PATH_MAX, "iconbar:%s/%s", ic->iconbar->view->dir, ic->image_path);
|
||||
snprintf (buf, PATH_MAX, "iconbar:%s/%s", ic->iconbar->view->dir,
|
||||
ic->image_path);
|
||||
e_strdup (ic->hi.timer, buf);
|
||||
/* call the timeout */
|
||||
ib_timeout (0, ic);
|
||||
|
@ -1209,9 +1343,9 @@ ib_mouse_out(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
UN (_y);
|
||||
}
|
||||
|
||||
/* called when the mouse goes down on an icon object */
|
||||
/* called when the mouse goes up on an icon object */
|
||||
static void
|
||||
ib_mouse_down(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
||||
ib_mouse_up (void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
||||
{
|
||||
E_Iconbar_Icon *ic;
|
||||
|
||||
|
@ -1219,8 +1353,151 @@ ib_mouse_down(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
|
||||
/* get he iconbaricon pointer from the data member */
|
||||
ic = (E_Iconbar_Icon *) data;
|
||||
|
||||
ic->mouse_down = 0;
|
||||
/* if we are moving the icon */
|
||||
if (ic->moving)
|
||||
{
|
||||
ic->moving = 0;
|
||||
|
||||
/* if dragged outside remove from list */
|
||||
if (ic->mouse.x > ic->iconbar->icon_area.x + ic->iconbar->icon_area.w ||
|
||||
ic->mouse.y > ic->iconbar->icon_area.y + ic->iconbar->icon_area.h)
|
||||
{
|
||||
evas_list_remove (ic->iconbar->icons, ic);
|
||||
e_object_unref(E_OBJECT(ic));
|
||||
}
|
||||
|
||||
/* otherwise move to the correct place in list */
|
||||
else
|
||||
{
|
||||
E_Iconbar_Icon *lic;
|
||||
Evas_List l;
|
||||
|
||||
double aw = ic->iconbar->icon_area.w;
|
||||
double ah = ic->iconbar->icon_area.h;
|
||||
|
||||
/* before first icon? move to start */
|
||||
lic = (E_Iconbar_Icon *) ic->iconbar->icons->data;
|
||||
/* horizontal */
|
||||
if (aw > ah && ic->mouse.x < lic->current.x)
|
||||
{
|
||||
ic->iconbar->icons = evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_prepend_relative (ic->iconbar->icons, ic, lic);
|
||||
}
|
||||
/* vertical */
|
||||
else if (aw < ah && ic->mouse.y < lic->current.y)
|
||||
{
|
||||
ic->iconbar->icons = evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_prepend_relative (ic->iconbar->icons, ic, lic);
|
||||
}
|
||||
|
||||
/* not before first icon, check place among other icons */
|
||||
else
|
||||
{
|
||||
for (l = ic->iconbar->icons; l; l = l->next)
|
||||
{
|
||||
lic = (E_Iconbar_Icon *) l->data;
|
||||
|
||||
/* if in same position, skip */
|
||||
if (ic == lic)
|
||||
{
|
||||
l = l->next;
|
||||
if (l) lic = (E_Iconbar_Icon *) l->data;
|
||||
else break;
|
||||
}
|
||||
/* horizontal */
|
||||
if (aw > ah)
|
||||
{
|
||||
/* place before icon */
|
||||
if (ic->mouse.x > lic->current.x &&
|
||||
ic->mouse.x < lic->current.x + (lic->current.w / 2))
|
||||
{
|
||||
ic->iconbar->icons =
|
||||
evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_prepend_relative (ic->iconbar->icons,
|
||||
ic, lic);
|
||||
}
|
||||
/* place after icon */
|
||||
else if (ic->mouse.x < lic->current.x + lic->current.w
|
||||
&& ic->mouse.x >
|
||||
lic->current.x + (lic->current.w / 2))
|
||||
{
|
||||
ic->iconbar->icons =
|
||||
evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_append_relative (ic->iconbar->icons, ic,
|
||||
lic);
|
||||
}
|
||||
/* after last icon */
|
||||
else if (ic->mouse.x > lic->current.x + lic->current.w
|
||||
&& l->next == NULL)
|
||||
{
|
||||
ic->iconbar->icons =
|
||||
evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_append_relative (ic->iconbar->icons, ic,
|
||||
lic);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
/* vertical */
|
||||
else
|
||||
{
|
||||
/* place before icon */
|
||||
if (ic->mouse.y > lic->current.y &&
|
||||
ic->mouse.y < lic->current.y + (lic->current.h / 2))
|
||||
{
|
||||
ic->iconbar->icons =
|
||||
evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_prepend_relative (ic->iconbar->icons,
|
||||
ic, lic);
|
||||
}
|
||||
/* place after icon */
|
||||
else if (ic->mouse.y < lic->current.y + lic->current.h
|
||||
&& ic->mouse.y >
|
||||
lic->current.y + (lic->current.h / 2))
|
||||
{
|
||||
ic->iconbar->icons =
|
||||
evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_append_relative (ic->iconbar->icons, ic,
|
||||
lic);
|
||||
}
|
||||
/* after last icon */
|
||||
else if (ic->mouse.y > lic->current.y + lic->current.h
|
||||
&& l->next == NULL)
|
||||
{
|
||||
ic->iconbar->icons =
|
||||
evas_list_remove (ic->iconbar->icons, ic);
|
||||
ic->iconbar->icons =
|
||||
evas_list_append_relative (ic->iconbar->icons, ic,
|
||||
lic);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* make the changes */
|
||||
e_iconbar_fix (ic->iconbar);
|
||||
|
||||
/* set flag and save */
|
||||
ic->iconbar->changed = 1;
|
||||
/*e_iconbar_save_out_final(ic->iconbar);*/
|
||||
}
|
||||
|
||||
/* Otherwise, not moving so execute, etc */
|
||||
else
|
||||
{
|
||||
/* if we're busy launching something.. dont run anything */
|
||||
if (ic->launch_id) D_RETURN;
|
||||
if (ic->launch_id)
|
||||
D_RETURN;
|
||||
/* run something! */
|
||||
if (ic->exec)
|
||||
{
|
||||
|
@ -1235,7 +1512,9 @@ ib_mouse_down(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
{
|
||||
int id_ret = 0;
|
||||
|
||||
ic->launch_pid = e_exec_in_dir_with_env(ic->exec, e_util_get_user_home(), &id_ret, NULL, NULL);
|
||||
ic->launch_pid =
|
||||
e_exec_in_dir_with_env (ic->exec, e_util_get_user_home (),
|
||||
&id_ret, NULL, NULL);
|
||||
if (ic->launch_pid >= 0)
|
||||
{
|
||||
ic->launch_id = id_ret;
|
||||
|
@ -1246,7 +1525,8 @@ ib_mouse_down(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
ic->launch_id_cb =
|
||||
e_exec_broadcast_cb_add (e_iconbar_handle_launch_id,
|
||||
ic);
|
||||
snprintf(buf, PATH_MAX, "iconbar_launch_wait:%i", ic->launch_id);
|
||||
snprintf (buf, PATH_MAX, "iconbar_launch_wait:%i",
|
||||
ic->launch_id);
|
||||
if (ic->wait_timeout > 0.0)
|
||||
ecore_add_event_timer (buf, ic->wait_timeout,
|
||||
ib_cancel_launch_timeout,
|
||||
|
@ -1264,6 +1544,7 @@ ib_mouse_down(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
D_RETURN;
|
||||
UN (_e);
|
||||
|
@ -1273,12 +1554,21 @@ ib_mouse_down(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
UN (_y);
|
||||
}
|
||||
|
||||
/* called when the mouse goes up on an icon object */
|
||||
/* called when the mouse goes down on an icon object */
|
||||
static void
|
||||
ib_mouse_up(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
||||
ib_mouse_down (void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
||||
{
|
||||
E_Iconbar_Icon *ic;
|
||||
|
||||
D_ENTER;
|
||||
|
||||
ic = (E_Iconbar_Icon *) data;
|
||||
|
||||
ic->down.x = _x;
|
||||
ic->down.y = _y;
|
||||
|
||||
ic->mouse_down = _b;
|
||||
|
||||
D_RETURN;
|
||||
UN (data);
|
||||
UN (_e);
|
||||
|
@ -1288,6 +1578,48 @@ ib_mouse_up(void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
|||
UN (_y);
|
||||
}
|
||||
|
||||
/* called when a mouse goes out of an icon object */
|
||||
static void
|
||||
ib_mouse_move (void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y)
|
||||
{
|
||||
E_Iconbar_Icon *ic;
|
||||
|
||||
D_ENTER;
|
||||
|
||||
/* get he iconbaricon pointer from the data member */
|
||||
ic = (E_Iconbar_Icon *) data;
|
||||
|
||||
if (ic->mouse_down)
|
||||
{
|
||||
int dx, dy;
|
||||
|
||||
|
||||
ic->mouse.x = _x;
|
||||
ic->mouse.y = _y;
|
||||
|
||||
dx = ic->down.x - ic->mouse.x;
|
||||
dy = ic->down.y - ic->mouse.y;
|
||||
|
||||
|
||||
if (dx > 3 || dx < -3 || dy > 3 || dy < -3)
|
||||
{
|
||||
ic->moving = 1;
|
||||
|
||||
evas_move(ic->iconbar->view->evas, ic->image, ic->mouse.x - (ic->down.x - ic->current.x), ic->mouse.y - (ic->down.y - ic->current.y));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
D_RETURN;
|
||||
UN (data);
|
||||
UN (_e);
|
||||
UN (_o);
|
||||
UN (_b);
|
||||
UN (_x);
|
||||
UN (_y);
|
||||
}
|
||||
|
||||
|
||||
/* called when child processes exit */
|
||||
static void
|
||||
ib_child_handle (Ecore_Event * ev)
|
||||
|
@ -1316,7 +1648,8 @@ ib_child_handle(Ecore_Event *ev)
|
|||
{
|
||||
char buf[PATH_MAX];
|
||||
|
||||
snprintf(buf, PATH_MAX, "iconbar_launch_wait:%i", ic->launch_id);
|
||||
snprintf (buf, PATH_MAX, "iconbar_launch_wait:%i",
|
||||
ic->launch_id);
|
||||
ecore_del_event_timer (buf);
|
||||
}
|
||||
ic->launch_id = 0;
|
||||
|
@ -1325,7 +1658,8 @@ ib_child_handle(Ecore_Event *ev)
|
|||
e_exec_broadcast_cb_del (ic->launch_id_cb);
|
||||
ic->launch_id_cb = NULL;
|
||||
}
|
||||
evas_set_color(ic->iconbar->view->evas, ic->image, 255, 255, 255, 128);
|
||||
evas_set_color (ic->iconbar->view->evas, ic->image, 255, 255,
|
||||
255, 128);
|
||||
ic->iconbar->view->changed = 1;
|
||||
D_RETURN;
|
||||
}
|
||||
|
@ -1384,4 +1718,3 @@ e_iconbar_set_view_window_spacing(E_Iconbar *ib)
|
|||
|
||||
D_RETURN;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,8 @@ struct _E_Iconbar
|
|||
Evas_Object clip;
|
||||
|
||||
int has_been_scrolled;
|
||||
int changed;
|
||||
int just_saved;
|
||||
float scroll;
|
||||
|
||||
Ebits_Object *bit;
|
||||
|
@ -44,6 +46,7 @@ struct _E_Iconbar_Icon
|
|||
E_Iconbar *iconbar;
|
||||
|
||||
Evas_Object image;
|
||||
Imlib_Image imlib_image;
|
||||
|
||||
char *image_path;
|
||||
char *exec;
|
||||
|
@ -55,6 +58,18 @@ struct _E_Iconbar_Icon
|
|||
double start;
|
||||
} hi;
|
||||
|
||||
struct {
|
||||
double x, y;
|
||||
} down, mouse;
|
||||
|
||||
struct {
|
||||
double x, y;
|
||||
double w, h;
|
||||
} current;
|
||||
|
||||
int mouse_down;
|
||||
int moving;
|
||||
|
||||
int wait;
|
||||
float wait_timeout;
|
||||
|
||||
|
|
Loading…
Reference in New Issue