X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_win.c;h=5460b2d070389919cf1ddaa3ba873c54fe9b82ad;hb=c414ba036271833c1098337494b02d9eb6266d48;hp=c08a4ad8d5161552c4b1aef8daffe7362dfccaa2;hpb=bb8352ca0d8f8ba92a112a194acc2391ee2b671e;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index c08a4ad..5460b2d 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -19,42 +19,58 @@ struct _Elm_Win Elm_Win_Type type; Elm_Win_Keyboard_Mode kbdmode; Elm_Win_Indicator_Mode indmode; - struct { - const char *info; - Ecore_Timer *timer; - int repeat_count; - int shot_counter; - } shot; + Elm_Win_Indicator_Opacity_Mode ind_o_mode; + struct + { + const char *info; + Ecore_Timer *timer; + int repeat_count; + int shot_counter; + } shot; int resize_location; int *autodel_clear, rot; int show_count; - struct { - int x, y; - } screen; - struct + struct + { + int x, y; + } screen; + struct { Ecore_Evas *ee; Evas *evas; Evas_Object *obj, *hot_obj; int hot_x, hot_y; } pointer; - struct { - Evas_Object *top; - - struct { - Evas_Object *target; - Eina_Bool visible : 1; - Eina_Bool handled : 1; - } cur, prev; + struct + { + Evas_Object *top; - const char *style; - Ecore_Job *reconf_job; + struct + { + Evas_Object *target; + Eina_Bool visible : 1; + Eina_Bool handled : 1; + } cur, prev; + + const char *style; + Ecore_Job *reconf_job; + + Eina_Bool enabled : 1; + Eina_Bool changed_theme : 1; + Eina_Bool top_animate : 1; + Eina_Bool geometry_changed : 1; + } focus_highlight; + struct + { + const char *name; + Ecore_Timer *timer; + Eina_List *names; + } profile; - Eina_Bool enabled : 1; - Eina_Bool changed_theme : 1; - Eina_Bool top_animate : 1; - 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; @@ -69,6 +85,7 @@ struct _Elm_Win Eina_Bool fullscreen : 1; Eina_Bool maximized : 1; Eina_Bool skip_focus : 1; + Eina_Bool floating : 1; }; static const char *widtype = NULL; @@ -102,7 +119,7 @@ static void _elm_win_frame_cb_minimize(void *data, Evas_Object *obj __UNUSED__, static void _elm_win_frame_cb_maximize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__); static void _elm_win_frame_cb_close(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__); -static void _elm_win_pointer_add(Elm_Win *win, const char *style); +//static void _elm_win_pointer_add(Elm_Win *win, const char *style); static const char SIG_DELETE_REQUEST[] = "delete,request"; static const char SIG_FOCUS_OUT[] = "focus,out"; @@ -118,6 +135,7 @@ static const char SIG_FULLSCREEN[] = "fullscreen"; static const char SIG_UNFULLSCREEN[] = "unfullscreen"; static const char SIG_MAXIMIZED[] = "maximized"; static const char SIG_UNMAXIMIZED[] = "unmaximized"; +static const char SIG_PROFILE_CHANGED[] = "profile,changed"; static const Evas_Smart_Cb_Description _signals[] = { {SIG_DELETE_REQUEST, ""}, @@ -133,6 +151,7 @@ static const Evas_Smart_Cb_Description _signals[] = { {SIG_UNFULLSCREEN, ""}, {SIG_MAXIMIZED, ""}, {SIG_UNMAXIMIZED, ""}, + {SIG_PROFILE_CHANGED, ""}, {NULL, NULL} }; @@ -162,7 +181,7 @@ _shot_delay_get(Elm_Win *win) *pd = *p; } *pd = 0; - v = atof(d); + v = _elm_atof(d); free(d); return v; } @@ -346,7 +365,7 @@ _elm_win_resize(Ecore_Evas *ee) win->deferred_resize_job = ecore_job_add(_elm_win_resize_job, win); } -static void +static void _elm_win_mouse_in(Ecore_Evas *ee) { Evas_Object *obj; @@ -411,7 +430,58 @@ _elm_win_focus_out(Ecore_Evas *ee) } } -static void +static void +_elm_win_profile_update(Ecore_Evas *ee) +{ + Evas_Object *obj = ecore_evas_object_associate_get(ee); + Elm_Win *win; + + if (!obj) return; + win = elm_widget_data_get(obj); + if (!win) return; + + if (win->profile.timer) + ecore_timer_del(win->profile.timer); + win->profile.timer = NULL; + + /* TODO: We need the ability to bind a profile to a specific window. + * Elementary's configuration still has a single global profile for the app. + */ + _elm_config_profile_set(win->profile.name); + + evas_object_smart_callback_call(win->win_obj, SIG_PROFILE_CHANGED, NULL); +} + +static Eina_Bool +_elm_win_profile_change_delay(void *data) +{ + Elm_Win *win = data; + const char *profile; + Eina_Bool changed = EINA_FALSE; + + profile = eina_list_nth(win->profile.names, 0); + if (profile) + { + if (win->profile.name) + { + if (strcmp(win->profile.name, profile)) + { + eina_stringshare_replace(&(win->profile.name), profile); + changed = EINA_TRUE; + } + } + else + { + win->profile.name = eina_stringshare_add(profile); + changed = EINA_TRUE; + } + } + win->profile.timer = NULL; + if (changed) _elm_win_profile_update(win->ee); + return EINA_FALSE; +} + +static void _elm_win_state_change(Ecore_Evas *ee) { Evas_Object *obj; @@ -421,9 +491,11 @@ _elm_win_state_change(Ecore_Evas *ee) Eina_Bool ch_iconified = EINA_FALSE; Eina_Bool ch_fullscreen = EINA_FALSE; Eina_Bool ch_maximized = EINA_FALSE; + Eina_Bool ch_profile = EINA_FALSE; + const char *profile; if (!(obj = ecore_evas_object_associate_get(ee))) return; - + if (!(win = elm_widget_data_get(obj))) return; if (win->withdrawn != ecore_evas_withdrawn_get(win->ee)) @@ -451,6 +523,24 @@ _elm_win_state_change(Ecore_Evas *ee) win->maximized = ecore_evas_maximized_get(win->ee); ch_maximized = EINA_TRUE; } + profile = ecore_evas_profile_get(win->ee); + if ((profile) && + _elm_config_profile_exists(profile)) + { + if (win->profile.name) + { + if (strcmp(win->profile.name, profile)) + { + eina_stringshare_replace(&(win->profile.name), profile); + ch_profile = EINA_TRUE; + } + } + else + { + win->profile.name = eina_stringshare_add(profile); + ch_profile = EINA_TRUE; + } + } if ((ch_withdrawn) || (ch_iconified)) { if (win->withdrawn) @@ -481,6 +571,10 @@ _elm_win_state_change(Ecore_Evas *ee) else evas_object_smart_callback_call(win->win_obj, SIG_UNMAXIMIZED, NULL); } + if (ch_profile) + { + _elm_win_profile_update(win->ee); + } } static Eina_Bool @@ -488,20 +582,19 @@ _elm_win_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_O { Elm_Win *wd = elm_widget_data_get(obj); const Eina_List *items; + const Eina_List *list; void *(*list_data_get) (const Eina_List *list); if (!wd) return EINA_FALSE; + list = elm_widget_sub_object_list_get(obj); /* Focus chain */ - if (wd->subobjs) + if (list) { if (!(items = elm_widget_focus_custom_chain_get(obj))) - { - items = wd->subobjs; - if (!items) - return EINA_FALSE; - } + items = list; + list_data_get = eina_list_data_get; elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next); @@ -509,7 +602,6 @@ _elm_win_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_O if (*next) return EINA_TRUE; } - *next = (Evas_Object *)obj; return EINA_FALSE; } @@ -542,22 +634,22 @@ _elm_win_event_cb(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_T return EINA_TRUE; } else if ((!strcmp(ev->keyname, "Left")) || - (!strcmp(ev->keyname, "KP_Left"))) + ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string))) { //TODO : woohyun jung } else if ((!strcmp(ev->keyname, "Right")) || - (!strcmp(ev->keyname, "KP_Right"))) + ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string))) { //TODO : woohyun jung } else if ((!strcmp(ev->keyname, "Up")) || - (!strcmp(ev->keyname, "KP_Up"))) + ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string))) { //TODO : woohyun jung } else if ((!strcmp(ev->keyname, "Down")) || - (!strcmp(ev->keyname, "KP_Down"))) + ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string))) { //TODO : woohyun jung } @@ -603,10 +695,18 @@ _elm_win_obj_callback_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN } static void +_elm_win_obj_callback_img_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Elm_Win *win = data; + win->img_obj = NULL; +} + +static void _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_info __UNUSED__) { Elm_Win *win = data; - Evas_Object *child; + Evas_Object *child, *child2 = NULL; + const char *str; if (win->parent) { @@ -628,15 +728,36 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf if (win->shot.timer) ecore_timer_del(win->shot.timer); evas_object_event_callback_del_full(win->win_obj, EVAS_CALLBACK_DEL, _elm_win_obj_callback_del, win); - while (((child = evas_object_bottom_get(win->evas))) && - (child != obj)) + child = evas_object_bottom_get(win->evas); + while (child) { - evas_object_del(child); - } - while (((child = evas_object_top_get(win->evas))) && - (child != obj)) - { - evas_object_del(child); + /* if the object we see *IS* the window object (because we are + * faking a parent object inside the canvas), then skip it and + * go to the next one */ + if (child == obj) + { + child = evas_object_above_get(child); + if (!child) break; + } + /* if we are using the next object above from the previous loop */ + if (child == child2) + { + /* this object has refcounts from the previous loop */ + child2 = evas_object_above_get(child); + if (child2) evas_object_ref(child2); + evas_object_del(child); + /* so unref from previous loop */ + evas_object_unref(child); + child = child2; + } + else + { + /* just delete as normal (probably only first object */ + child2 = evas_object_above_get(child); + if (child2) evas_object_ref(child2); + evas_object_del(child); + child = child2; + } } #ifdef HAVE_ELEMENTARY_X if (win->client_message_handler) @@ -652,6 +773,8 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf if (win->img_obj) { + evas_object_event_callback_del_full + (win->img_obj, EVAS_CALLBACK_DEL, _elm_win_obj_callback_img_obj_del, win); win->img_obj = NULL; } else @@ -666,6 +789,15 @@ _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); + + EINA_LIST_FREE(win->profile.names, str) eina_stringshare_del(str); + if (win->profile.name) eina_stringshare_del(win->profile.name); + if (win->profile.timer) ecore_timer_del(win->profile.timer); + free(win); if ((!_elm_win_list) && @@ -679,15 +811,6 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf } } -static void -_elm_win_obj_callback_img_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - Elm_Win *win = data; - if (!win->img_obj) return; - evas_object_event_callback_del_full - (win->img_obj, EVAS_CALLBACK_DEL, _elm_win_obj_callback_img_obj_del, win); - evas_object_del(win->img_obj); -} static void _elm_win_obj_callback_parent_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) @@ -736,7 +859,7 @@ _elm_win_obj_intercept_show(void *data, Evas_Object *obj) { ecore_evas_show(win->pointer.ee); evas_object_show(win->pointer.obj); - ecore_evas_wayland_pointer_set(win->pointer.ee, 10, 10); + /* ecore_evas_wayland_pointer_set(win->pointer.ee, 10, 10); */ } evas_object_show(obj); } @@ -762,6 +885,8 @@ _elm_win_obj_callback_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi evas_object_geometry_get(obj, &x, &y, NULL, NULL); win->screen.x = x; win->screen.y = y; + + /* FIXME: We should update ecore_wl_window_location here !! */ } else if (win->img_obj) { @@ -857,7 +982,7 @@ _elm_win_xwindow_get(Elm_Win *win) { win->xwin = 0; -#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name)) +#define ENGINE_COMPARE(name) (!strcmp(_elm_preferred_engine, name)) if (ENGINE_COMPARE(ELM_SOFTWARE_X11)) { if (win->ee) win->xwin = ecore_evas_software_x11_window_get(win->ee); @@ -901,12 +1026,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 +1043,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: @@ -1448,7 +1623,7 @@ the_end: win->focus_highlight.prev = win->focus_highlight.cur; } -static void +static void _elm_win_frame_add(Elm_Win *win, const char *style) { evas_output_framespace_set(win->evas, 0, 22, 0, 26); @@ -1459,19 +1634,19 @@ _elm_win_frame_add(Elm_Win *win, const char *style) evas_object_move(win->frame_obj, 0, 0); evas_object_resize(win->frame_obj, 1, 1); - edje_object_signal_callback_add(win->frame_obj, "elm,action,move,start", + edje_object_signal_callback_add(win->frame_obj, "elm,action,move,start", "elm", _elm_win_frame_cb_move_start, win); - edje_object_signal_callback_add(win->frame_obj, "elm,action,resize,start", + edje_object_signal_callback_add(win->frame_obj, "elm,action,resize,start", "*", _elm_win_frame_cb_resize_start, win); - edje_object_signal_callback_add(win->frame_obj, "elm,action,minimize", + edje_object_signal_callback_add(win->frame_obj, "elm,action,minimize", "elm", _elm_win_frame_cb_minimize, win); - edje_object_signal_callback_add(win->frame_obj, "elm,action,maximize", + edje_object_signal_callback_add(win->frame_obj, "elm,action,maximize", "elm", _elm_win_frame_cb_maximize, win); - edje_object_signal_callback_add(win->frame_obj, "elm,action,close", + edje_object_signal_callback_add(win->frame_obj, "elm,action,close", "elm", _elm_win_frame_cb_close, win); } -static void +static void _elm_win_frame_cb_move_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__) { Elm_Win *win; @@ -1479,11 +1654,16 @@ _elm_win_frame_cb_move_start(void *data, Evas_Object *obj __UNUSED__, const char if (!(win = data)) return; /* FIXME: Change mouse pointer */ - /* NB: 0,0 are dummy values. Wayland handles the move by itself */ - ecore_evas_move(win->ee, 0, 0); + /* NB: Wayland handles moving surfaces by itself so we cannot + * specify a specific x/y we want. Instead, we will pass in the + * existing x/y values so they can be recorded as 'previous' position. + * The new position will get updated automatically when the move is + * finished */ + + ecore_evas_wayland_move(win->ee, win->screen.x, win->screen.y); } -static void +static void _elm_win_frame_cb_resize_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source) { Elm_Win *win; @@ -1517,7 +1697,7 @@ _elm_win_frame_cb_resize_start(void *data, Evas_Object *obj __UNUSED__, const ch ecore_evas_wayland_resize(win->ee, win->resize_location); } -static void +static void _elm_win_frame_cb_minimize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__) { Elm_Win *win; @@ -1527,17 +1707,18 @@ _elm_win_frame_cb_minimize(void *data, Evas_Object *obj __UNUSED__, const char * ecore_evas_iconified_set(win->ee, EINA_TRUE); } -static void +static void _elm_win_frame_cb_maximize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__) { Elm_Win *win; if (!(win = data)) return; - win->maximized = EINA_TRUE; - ecore_evas_maximized_set(win->ee, EINA_TRUE); + if (win->maximized) win->maximized = EINA_FALSE; + else win->maximized = EINA_TRUE; + ecore_evas_maximized_set(win->ee, win->maximized); } -static void +static void _elm_win_frame_cb_close(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__) { Elm_Win *win; @@ -1546,12 +1727,15 @@ _elm_win_frame_cb_close(void *data, Evas_Object *obj __UNUSED__, const char *sig evas_object_del(win->win_obj); } -static void +/* +static void _elm_win_pointer_add(Elm_Win *win, const char *style) { int mw, mh; - win->pointer.ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 32, 32, 0); + return; + + win->pointer.ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 0, 32, 32, 0); ecore_evas_resize(win->pointer.ee, 32, 32); win->pointer.evas = ecore_evas_get(win->ee); @@ -1559,11 +1743,11 @@ _elm_win_pointer_add(Elm_Win *win, const char *style) win->pointer.obj = edje_object_add(win->pointer.evas); _elm_theme_set(NULL, win->pointer.obj, "pointer", "base", style); edje_object_size_min_calc(win->pointer.obj, &mw, &mh); - printf("ELM Win Pointer Size: %d %d\n", mw, mh); evas_object_move(win->pointer.obj, 0, 0); evas_object_resize(win->pointer.obj, 32, 32); evas_object_show(win->pointer.obj); } +*/ #ifdef ELM_DEBUG static void @@ -1657,6 +1841,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) { @@ -1672,13 +1863,13 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) CRITICAL(engine " engine creation failed. Trying default."); \ win->ee = ecore_evas_new(NULL, 0, 0, 1, 1, NULL); \ if (win->ee) \ - elm_engine_set(ecore_evas_engine_name_get(win->ee)); \ + elm_config_preferred_engine_set(ecore_evas_engine_name_get(win->ee)); \ } while (0) -#define ENGINE_COMPARE(name) (_elm_config->engine && !strcmp(_elm_config->engine, name)) +#define ENGINE_COMPARE(name) (_elm_preferred_engine && !strcmp(_elm_preferred_engine, name)) win->kbdmode = ELM_WIN_KEYBOARD_UNKNOWN; win->indmode = ELM_WIN_INDICATOR_UNKNOWN; - + switch (type) { case ELM_WIN_INLINED_IMAGE: @@ -1820,27 +2011,27 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) { win->ee = ecore_evas_ews_new(0, 0, 1, 1); } - else if (ENGINE_COMPARE(ELM_WAYLAND_SHM)) + else if (ENGINE_COMPARE(ELM_WAYLAND_SHM)) { - win->ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 1, 1, 0); + win->ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 0, 1, 1, 0); win->evas = ecore_evas_get(win->ee); _elm_win_frame_add(win, "default"); - _elm_win_pointer_add(win, "default"); +// _elm_win_pointer_add(win, "default"); } - else if (ENGINE_COMPARE(ELM_WAYLAND_EGL)) + else if (ENGINE_COMPARE(ELM_WAYLAND_EGL)) { - win->ee = ecore_evas_wayland_egl_new(NULL, 0, 0, 1, 1, 0); + win->ee = ecore_evas_wayland_egl_new(NULL, 0, 0, 0, 1, 1, 0); win->evas = ecore_evas_get(win->ee); _elm_win_frame_add(win, "default"); - _elm_win_pointer_add(win, "default"); +// _elm_win_pointer_add(win, "default"); } - else if (!strncmp(_elm_config->engine, "shot:", 5)) + else if (!strncmp(_elm_preferred_engine, "shot:", 5)) { win->ee = ecore_evas_buffer_new(1, 1); ecore_evas_manual_render_set(win->ee, EINA_TRUE); - win->shot.info = eina_stringshare_add(_elm_config->engine + 5); + win->shot.info = eina_stringshare_add(_elm_preferred_engine + 5); _shot_init(win); } #undef FALLBACK_TRY @@ -1884,9 +2075,9 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) evas_object_layer_set(win->win_obj, 50); evas_object_pass_events_set(win->win_obj, EINA_TRUE); - if (win->frame_obj) + if (win->frame_obj) { -// evas_object_clip_set(win->win_obj, win->frame_obj); + evas_object_clip_set(win->win_obj, win->frame_obj); evas_object_stack_below(win->frame_obj, win->win_obj); } @@ -2029,9 +2220,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_escaped_set(win->frame_obj, "elm.text.title", win->title); } EAPI const char * @@ -2041,7 +2233,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 @@ -2216,46 +2483,6 @@ elm_win_alpha_get(const Evas_Object *obj) } EAPI void -elm_win_transparent_set(Evas_Object *obj, Eina_Bool transparent) -{ - Elm_Win *win; - ELM_CHECK_WIDTYPE(obj, widtype); - win = elm_widget_data_get(obj); - if (!win) return; - - if (win->frame_obj) - { - } - else if (win->img_obj) - { - evas_object_image_alpha_set(win->img_obj, transparent); - } - else - { -#ifdef HAVE_ELEMENTARY_X - if (win->xwin) - { - ecore_evas_transparent_set(win->ee, transparent); - _elm_win_xwin_update(win); - } - else -#endif - ecore_evas_transparent_set(win->ee, transparent); - } -} - -EAPI Eina_Bool -elm_win_transparent_get(const Evas_Object *obj) -{ - Elm_Win *win; - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; - win = elm_widget_data_get(obj); - if (!win) return EINA_FALSE; - - return ecore_evas_transparent_get(win->ee); -} - -EAPI void elm_win_override_set(Evas_Object *obj, Eina_Bool override) { Elm_Win *win; @@ -2286,7 +2513,7 @@ elm_win_fullscreen_set(Evas_Object *obj, Eina_Bool fullscreen) win = elm_widget_data_get(obj); if (!win) return; // YYY: handle if win->img_obj -#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name)) +#define ENGINE_COMPARE(name) (!strcmp(_elm_preferred_engine, name)) if (ENGINE_COMPARE(ELM_SOFTWARE_FB) || ENGINE_COMPARE(ELM_SOFTWARE_16_WINCE)) { @@ -2311,7 +2538,7 @@ elm_win_fullscreen_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; win = elm_widget_data_get(obj); if (!win) return EINA_FALSE; -#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name)) +#define ENGINE_COMPARE(name) (!strcmp(_elm_preferred_engine, name)) if (ENGINE_COMPARE(ELM_SOFTWARE_FB) || ENGINE_COMPARE(ELM_SOFTWARE_16_WINCE)) { @@ -2389,7 +2616,7 @@ elm_win_withdrawn_set(Evas_Object *obj, Eina_Bool withdrawn) } EAPI Eina_Bool -elm_win_widthdrawn_get(const Evas_Object *obj) +elm_win_withdrawn_get(const Evas_Object *obj) { Elm_Win *win; ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; @@ -2399,6 +2626,69 @@ elm_win_widthdrawn_get(const Evas_Object *obj) } EAPI void +elm_win_profiles_set(Evas_Object *obj, const char **profiles, unsigned int num_profiles) +{ + Elm_Win *win; + char **profiles_int; + const char *str; + unsigned int i, num; + Eina_List *l; + + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + if (!profiles) return; + + if (win->profile.timer) ecore_timer_del(win->profile.timer); + win->profile.timer = ecore_timer_add(0.1, _elm_win_profile_change_delay, win); + EINA_LIST_FREE(win->profile.names, str) eina_stringshare_del(str); + + for (i = 0; i < num_profiles; i++) + { + if ((profiles[i]) && + _elm_config_profile_exists(profiles[i])) + { + str = eina_stringshare_add(profiles[i]); + win->profile.names = eina_list_append(win->profile.names, str); + } + } + + num = eina_list_count(win->profile.names); + profiles_int = alloca(num * sizeof(char *)); + + if (profiles_int) + { + i = 0; + EINA_LIST_FOREACH(win->profile.names, l, str) + { + if (str) + profiles_int[i] = strdup(str); + else + profiles_int[i] = NULL; + i++; + } + ecore_evas_profiles_set(win->ee, (const char **)profiles_int, i); + for (i = 0; i < num; i++) + { + if (profiles_int[i]) free(profiles_int[i]); + } + } + else + ecore_evas_profiles_set(win->ee, profiles, num_profiles); +} + +EAPI const char * +elm_win_profile_get(const Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return NULL; + + return win->profile.name; +} + +EAPI void elm_win_urgent_set(Evas_Object *obj, Eina_Bool urgent) { Elm_Win *win; @@ -2647,6 +2937,13 @@ elm_win_keyboard_win_get(const Evas_Object *obj) return EINA_FALSE; } +// WRAPPER: Temperary added. +EAPI void +elm_win_indicator_state_set(Evas_Object *obj, Elm_Win_Indicator_Mode mode) +{ + elm_win_indicator_mode_set(obj, mode); +} + EAPI void elm_win_indicator_mode_set(Evas_Object *obj, Elm_Win_Indicator_Mode mode) { @@ -2672,6 +2969,13 @@ elm_win_indicator_mode_set(Evas_Object *obj, Elm_Win_Indicator_Mode mode) #endif } +// WRAPPER: Temperary added. +EAPI Elm_Win_Indicator_Mode +elm_win_indicator_state_get(const Evas_Object *obj) +{ + return elm_win_indicator_mode_get(obj); +} + EAPI Elm_Win_Indicator_Mode elm_win_indicator_mode_get(const Evas_Object *obj) { @@ -2683,6 +2987,43 @@ elm_win_indicator_mode_get(const Evas_Object *obj) } EAPI void +elm_win_indicator_opacity_set(Evas_Object *obj, Elm_Win_Indicator_Opacity_Mode mode) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + if (mode == win->ind_o_mode) return; + win->ind_o_mode = mode; +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwindow_get(win); + if (win->xwin) + { + if (win->ind_o_mode == ELM_WIN_INDICATOR_OPAQUE) + ecore_x_e_illume_indicator_opacity_set + (win->xwin, ECORE_X_ILLUME_INDICATOR_OPAQUE); + else if (win->ind_o_mode == ELM_WIN_INDICATOR_TRANSLUCENT) + ecore_x_e_illume_indicator_opacity_set + (win->xwin, ECORE_X_ILLUME_INDICATOR_TRANSLUCENT); + else if (win->ind_o_mode == ELM_WIN_INDICATOR_TRANSPARENT) + ecore_x_e_illume_indicator_opacity_set + (win->xwin, ECORE_X_ILLUME_INDICATOR_TRANSPARENT); + + } +#endif +} + +EAPI Elm_Win_Indicator_Opacity_Mode +elm_win_indicator_opacity_get(const Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype) ELM_WIN_INDICATOR_OPACITY_UNKNOWN; + win = elm_widget_data_get(obj); + if (!win) return ELM_WIN_INDICATOR_OPACITY_UNKNOWN; + return win->ind_o_mode; +} + +EAPI void elm_win_screen_position_get(const Evas_Object *obj, int *x, int *y) { Elm_Win *win; @@ -3071,7 +3412,7 @@ _elm_inwin_text_set_hook(Evas_Object *obj, const char *item, const char *text) Widget_Data *wd = elm_widget_data_get(obj); if (!wd || !item) return; - edje_object_part_text_set(wd->frm, item, text); + edje_object_part_text_escaped_set(wd->frm, item, text); _sizing_eval(obj); } @@ -3222,13 +3563,13 @@ elm_win_socket_listen(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bo if (!win) return EINA_FALSE; if (!win->ee) return EINA_FALSE; - if(!ecore_evas_extn_socket_listen(win->ee, svcname, svcnum, svcsys)) + if (!ecore_evas_extn_socket_listen(win->ee, svcname, svcnum, svcsys)) return EINA_FALSE; return EINA_TRUE; } -/* windowing spcific calls - shall we do this differently? */ +/* windowing specific calls - shall we do this differently? */ static Ecore_X_Window _elm_ee_win_get(const Evas_Object *obj) @@ -3258,3 +3599,40 @@ elm_win_xwindow_get(const Evas_Object *obj) #endif return 0; } + +EAPI void +elm_win_floating_mode_set(Evas_Object *obj, Eina_Bool floating) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + if (floating == win->floating) return; +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwindow_get(win); +#endif + win->floating = floating; +#ifdef HAVE_ELEMENTARY_X + if (win->xwin) + { + if (win->floating) + ecore_x_e_illume_window_state_set + (win->xwin, ECORE_X_ILLUME_WINDOW_STATE_FLOATING); + else + ecore_x_e_illume_window_state_set + (win->xwin, ECORE_X_ILLUME_WINDOW_STATE_NORMAL); + } +#endif +} + +EAPI Eina_Bool +elm_win_floating_mode_get(const Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + win = elm_widget_data_get(obj); + if (!win) return EINA_FALSE; + + return win->floating; +} +