From e49961b5af46422d123440fa5d36d4df4a0916c3 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 29 Feb 2012 12:06:12 +0000 Subject: [PATCH] and now add/implement window icon too. awesome++!!!!!!! that set of missing stuff that u needed ecore_x for is now done. ugh. more stuff to do. SVN revision: 68551 --- src/lib/elm_win.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++--- src/lib/elm_win.h | 66 ++++++++++++++++++++++ 2 files changed, 218 insertions(+), 9 deletions(-) diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index ea73c88..dfbb5fe 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -56,6 +56,11 @@ struct _Elm_Win Eina_Bool geometry_changed : 1; } focus_highlight; + Evas_Object *icon; + const char *title; + const char *icon_name; + const char *role; + double aspect; Eina_Bool urgent : 1; Eina_Bool modal : 1; @@ -666,6 +671,11 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf _elm_win_focus_highlight_shutdown(win); eina_stringshare_del(win->focus_highlight.style); + if (win->title) eina_stringshare_del(win->title); + if (win->icon_name) eina_stringshare_del(win->icon_name); + if (win->role) eina_stringshare_del(win->role); + if (win->icon) evas_object_del(win->icon); + free(win); if ((!_elm_win_list) && @@ -901,12 +911,8 @@ _elm_win_xwindow_get(Elm_Win *win) static void _elm_win_xwin_update(Elm_Win *win) { - // ecore_x_icccm_icon_name_set - // ecore_x_icccm_window_role_set - // ecore_x_netwm_visible_name_set - // ecore_x_netwm_icon_name_set - // ecore_x_netwm_visible_icon_name_set - // ecore_x_netwm_icons_set + const char *s; + _elm_win_xwindow_get(win); if (win->parent) { @@ -922,6 +928,60 @@ _elm_win_xwin_update(Elm_Win *win) if (!win->xwin) return; /* nothing more to do */ + s = win->title; + if (!s) s = _elm_appname; + if (!s) s = ""; + if (win->icon_name) s = win->icon_name; + ecore_x_icccm_icon_name_set(win->xwin, s); + ecore_x_netwm_icon_name_set(win->xwin, s); + + s = win->role; + if (s) ecore_x_icccm_window_role_set(win->xwin, s); + + // set window icon + if (win->icon) + { + void *data; + + data = evas_object_image_data_get(win->icon, EINA_FALSE); + if (data) + { + Ecore_X_Icon ic; + int w = 0, h = 0, stride, x, y; + unsigned char *p; + unsigned int *p2; + + evas_object_image_size_get(win->icon, &w, &h); + stride = evas_object_image_stride_get(win->icon); + if ((w > 0) && (h > 0) && + (stride >= (int)(w * sizeof(unsigned int)))) + { + ic.width = w; + ic.height = h; + ic.data = malloc(w * h * sizeof(unsigned int)); + + if (ic.data) + { + p = (unsigned char *)data; + p2 = (unsigned int *)ic.data; + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + *p2 = *((unsigned int *)p); + p += sizeof(unsigned int); + p2++; + } + p += (stride - (w * sizeof(unsigned int))); + } + ecore_x_netwm_icons_set(win->xwin, &ic, 1); + free(ic.data); + } + } + evas_object_image_data_set(win->icon, data); + } + } + switch (win->type) { case ELM_WIN_BASIC: @@ -1661,6 +1721,13 @@ _subobj_del(Elm_Win *win, Evas_Object *obj, Evas_Object *subobj) _elm_win_eval_subobjs(obj); } +static void +_elm_win_obj_icon_callback_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Win *win = data; + if (win->icon == obj) win->icon = NULL; +} + EAPI Evas_Object * elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) { @@ -2033,9 +2100,10 @@ elm_win_title_set(Evas_Object *obj, const char *title) ELM_CHECK_WIDTYPE(obj, widtype); win = elm_widget_data_get(obj); if (!win || !title) return; - ecore_evas_title_set(win->ee, title); + eina_stringshare_replace(&(win->title), title); + ecore_evas_title_set(win->ee, win->title); if (win->frame_obj) - edje_object_part_text_set(win->frame_obj, "elm.text.title", title); + edje_object_part_text_set(win->frame_obj, "elm.text.title", win->title); } EAPI const char * @@ -2045,7 +2113,82 @@ elm_win_title_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) NULL; win = elm_widget_data_get(obj); if (!win) return NULL; - return ecore_evas_title_get(win->ee); + return win->title; +} + +EAPI void +elm_win_icon_name_set(Evas_Object *obj, const char *icon_name) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win || !icon_name) return; + eina_stringshare_replace(&(win->icon_name), icon_name); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI const char * +elm_win_icon_name_get(const Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + win = elm_widget_data_get(obj); + if (!win) return NULL; + return win->icon_name; +} + +EAPI void +elm_win_role_set(Evas_Object *obj, const char *role) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win || !role) return; + eina_stringshare_replace(&(win->role), role); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI const char * +elm_win_role_get(const Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + win = elm_widget_data_get(obj); + if (!win) return NULL; + return win->role; +} + +EAPI void +elm_win_icon_object_set(Evas_Object *obj, Evas_Object *icon) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + if (win->icon) + evas_object_event_callback_del_full(win->icon, EVAS_CALLBACK_DEL, + _elm_win_obj_icon_callback_del, win); + win->icon = icon; + if (win->icon) + evas_object_event_callback_add(win->icon, EVAS_CALLBACK_DEL, + _elm_win_obj_icon_callback_del, win); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI const Evas_Object * +elm_win_icon_object_get(const Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + win = elm_widget_data_get(obj); + if (!win) return NULL; + return win->icon; } EAPI void diff --git a/src/lib/elm_win.h b/src/lib/elm_win.h index 1574435..40a02f1 100644 --- a/src/lib/elm_win.h +++ b/src/lib/elm_win.h @@ -303,6 +303,72 @@ EAPI void elm_win_title_set(Evas_Object *obj, const char *title EAPI const char *elm_win_title_get(const Evas_Object *obj); /** + * Set the icon name of the window + * + * @param obj The window object + * @param icon_name The icon name to set + */ +EAPI void elm_win_icon_name_set(Evas_Object *obj, const char *icon_name); + +/** + * Get the icon name of the window + * + * The returned string is an internal one and should not be freed or + * modified. It will also be rendered invalid if a new icon name is set or if + * the window is destroyed. + * + * @param obj The window object + * @return The icon name + */ +EAPI const char *elm_win_icon_name_get(const Evas_Object *obj); + +/** + * Set the role of the window + * + * @param obj The window object + * @param role The role to set + */ +EAPI void elm_win_role_set(Evas_Object *obj, const char *role); + +/** + * Get the role of the window + * + * The returned string is an internal one and should not be freed or + * modified. It will also be rendered invalid if a new role is set or if + * the window is destroyed. + * + * @param obj The window object + * @return The role + */ +EAPI const char *elm_win_role_get(const Evas_Object *obj); + +/** + * Set the object to represent the window icon + * + * This sets an object that will be used as the icon for the window. The exact + * pixel dimensions of the object (not object size) will be used, and the + * image pixels will be used as-is when this function is called. If the + * image object has been updated, then call this function again to source + * the image pixels and put them on the window's icon. This has limitations + * as only image objects allowed at this stage. This may be lifted in future. + * + * @param obj The window object + * @param icon The object to use for an icon + */ +EAPI void elm_win_icon_object_set(Evas_Object *obj, Evas_Object *icon); + +/** + * Get the icon object used for the window + * + * The object returns is the one marked by elm_win_icon_object_set() as the + * object to use for the window icon. + * + * @param obj The window object + * @return The icon object set + */ +EAPI const Evas_Object *elm_win_icon_object_get(const Evas_Object *obj); + +/** * Set the window's autodel state. * * When closing the window in any way outside of the program control, like -- 2.7.4