X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_win.c;h=5460b2d070389919cf1ddaa3ba873c54fe9b82ad;hb=c414ba036271833c1098337494b02d9eb6266d48;hp=b4d1f88911469d12e2becb469e2958d443ff331b;hpb=73905ca6e8d67e28b82c960ced969ed0db9ffec8;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index b4d1f88..5460b2d 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -18,37 +18,74 @@ struct _Elm_Win Elm_Win_Type type; Elm_Win_Keyboard_Mode kbdmode; - struct { - const char *info; + Elm_Win_Indicator_Mode indmode; + 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 + { + 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; + + 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; - int repeat_count; - int shot_counter; - } shot; + Eina_List *names; + } profile; + + Evas_Object *icon; + const char *title; + const char *icon_name; + const char *role; + + double aspect; + Eina_Bool urgent : 1; + Eina_Bool modal : 1; + Eina_Bool demand_attention : 1; Eina_Bool autodel : 1; Eina_Bool constrain : 1; - int *autodel_clear, rot; - int show_count; - struct { - int x, y; - } screen; - - struct { - Evas_Object *top; - - 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; + Eina_Bool resizing : 1; + Eina_Bool iconified : 1; + Eina_Bool withdrawn : 1; + Eina_Bool sticky : 1; + Eina_Bool fullscreen : 1; + Eina_Bool maximized : 1; + Eina_Bool skip_focus : 1; + Eina_Bool floating : 1; }; static const char *widtype = NULL; @@ -75,17 +112,46 @@ static void _elm_win_focus_highlight_reconfigure_job_stop(Elm_Win *win); static void _elm_win_focus_highlight_anim_end(void *data, Evas_Object *obj, const char *emission, const char *source); static void _elm_win_focus_highlight_reconfigure(Elm_Win *win); +static void _elm_win_frame_add(Elm_Win *win, const char *style); +static void _elm_win_frame_cb_move_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__); +static void _elm_win_frame_cb_resize_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source); +static void _elm_win_frame_cb_minimize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __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 const char SIG_DELETE_REQUEST[] = "delete,request"; static const char SIG_FOCUS_OUT[] = "focus,out"; static const char SIG_FOCUS_IN[] = "focus,in"; static const char SIG_MOVED[] = "moved"; static const char SIG_THEME_CHANGED[] = "theme,changed"; +static const char SIG_WITHDRAWN[] = "withdrawn"; +static const char SIG_ICONIFIED[] = "iconified"; +static const char SIG_NORMAL[] = "normal"; +static const char SIG_STICK[] = "stick"; +static const char SIG_UNSTICK[] = "unstick"; +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, ""}, {SIG_FOCUS_OUT, ""}, {SIG_FOCUS_IN, ""}, {SIG_MOVED, ""}, + {SIG_WITHDRAWN, ""}, + {SIG_ICONIFIED, ""}, + {SIG_NORMAL, ""}, + {SIG_STICK, ""}, + {SIG_UNSTICK, ""}, + {SIG_FULLSCREEN, ""}, + {SIG_UNFULLSCREEN, ""}, + {SIG_MAXIMIZED, ""}, + {SIG_UNMAXIMIZED, ""}, + {SIG_PROFILE_CHANGED, ""}, {NULL, NULL} }; @@ -115,7 +181,7 @@ _shot_delay_get(Elm_Win *win) *pd = *p; } *pd = 0; - v = atof(d); + v = _elm_atof(d); free(d); return v; } @@ -144,9 +210,10 @@ _shot_file_get(Elm_Win *win) char *dotptr = strrchr(tmp, '.'); if (dotptr) { - repname = malloc(sizeof(char)*(strlen(tmp) + 16)); + size_t size = sizeof(char)*(strlen(tmp) + 16); + repname = malloc(size); strncpy(repname, tmp, dotptr - tmp); - sprintf(repname + (dotptr - tmp), "%03i", + snprintf(repname + (dotptr - tmp), size - (dotptr - tmp), "%03i", win->shot.shot_counter + 1); strcat(repname, dotptr); free(tmp); @@ -157,18 +224,15 @@ _shot_file_get(Elm_Win *win) } free(tmp); if (!win->shot.repeat_count) return strdup("out.png"); - else - { - repname = malloc(sizeof(char) * 24); - sprintf(repname, "out%03i.png", win->shot.shot_counter + 1); - return repname; - } + + repname = malloc(sizeof(char) * 24); + snprintf(repname, sizeof(char) * 24, "out%03i.png", win->shot.shot_counter + 1); + return repname; } static int _shot_repeat_count_get(Elm_Win *win) { - char *p, *pd; char *d = strdup(win->shot.info); @@ -302,6 +366,17 @@ _elm_win_resize(Ecore_Evas *ee) } static void +_elm_win_mouse_in(Ecore_Evas *ee) +{ + Evas_Object *obj; + Elm_Win *win; + + if (!(obj = ecore_evas_object_associate_get(ee))) return; + if (!(win = elm_widget_data_get(obj))) return; + if (win->resizing) win->resizing = EINA_FALSE; +} + +static void _elm_win_focus_in(Ecore_Evas *ee) { Evas_Object *obj = ecore_evas_object_associate_get(ee); @@ -311,9 +386,9 @@ _elm_win_focus_in(Ecore_Evas *ee) win = elm_widget_data_get(obj); if (!win) return; _elm_widget_top_win_focused_set(win->win_obj, EINA_TRUE); - if (win->show_count == 1) + if (!elm_widget_focus_order_get(obj)) { - elm_object_focus_set(win->win_obj, EINA_TRUE); + elm_widget_focus_steal(win->win_obj); win->show_count++; } else @@ -323,6 +398,7 @@ _elm_win_focus_in(Ecore_Evas *ee) _elm_win_focus_highlight_reconfigure_job_start(win); if (win->frame_obj) { + edje_object_signal_emit(win->frame_obj, "elm,action,focus", "elm"); } else if (win->img_obj) { @@ -346,6 +422,7 @@ _elm_win_focus_out(Ecore_Evas *ee) _elm_win_focus_highlight_reconfigure_job_start(win); if (win->frame_obj) { + edje_object_signal_emit(win->frame_obj, "elm,action,unfocus", "elm"); } else if (win->img_obj) { @@ -353,25 +430,171 @@ _elm_win_focus_out(Ecore_Evas *ee) } } +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; + Elm_Win *win; + Eina_Bool ch_withdrawn = EINA_FALSE; + Eina_Bool ch_sticky = EINA_FALSE; + 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)) + { + win->withdrawn = ecore_evas_withdrawn_get(win->ee); + ch_withdrawn = EINA_TRUE; + } + if (win->sticky != ecore_evas_sticky_get(win->ee)) + { + win->sticky = ecore_evas_sticky_get(win->ee); + ch_sticky = EINA_TRUE; + } + if (win->iconified != ecore_evas_iconified_get(win->ee)) + { + win->iconified = ecore_evas_iconified_get(win->ee); + ch_iconified = EINA_TRUE; + } + if (win->fullscreen != ecore_evas_fullscreen_get(win->ee)) + { + win->fullscreen = ecore_evas_fullscreen_get(win->ee); + ch_fullscreen = EINA_TRUE; + } + if (win->maximized != ecore_evas_maximized_get(win->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) + evas_object_smart_callback_call(win->win_obj, SIG_WITHDRAWN, NULL); + else if (win->iconified) + evas_object_smart_callback_call(win->win_obj, SIG_ICONIFIED, NULL); + else + evas_object_smart_callback_call(win->win_obj, SIG_NORMAL, NULL); + } + if (ch_sticky) + { + if (win->sticky) + evas_object_smart_callback_call(win->win_obj, SIG_STICK, NULL); + else + evas_object_smart_callback_call(win->win_obj, SIG_UNSTICK, NULL); + } + if (ch_fullscreen) + { + if (win->fullscreen) + evas_object_smart_callback_call(win->win_obj, SIG_FULLSCREEN, NULL); + else + evas_object_smart_callback_call(win->win_obj, SIG_UNFULLSCREEN, NULL); + } + if (ch_maximized) + { + if (win->maximized) + evas_object_smart_callback_call(win->win_obj, SIG_MAXIMIZED, NULL); + else + evas_object_smart_callback_call(win->win_obj, SIG_UNMAXIMIZED, NULL); + } + if (ch_profile) + { + _elm_win_profile_update(win->ee); + } +} + static Eina_Bool _elm_win_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next) { 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); @@ -379,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; } @@ -412,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 } @@ -444,7 +666,7 @@ _deferred_ecore_evas_free(void *data) } static void -_elm_win_obj_callback_show(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +_elm_win_obj_callback_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { Elm_Win *win = data; @@ -459,18 +681,32 @@ _elm_win_obj_callback_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN if (win->frame_obj) { + evas_object_hide(win->frame_obj); } else if (win->img_obj) { evas_object_hide(win->img_obj); } + if (win->pointer.obj) + { + evas_object_hide(win->pointer.obj); + ecore_evas_hide(win->pointer.ee); + } +} + +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) { @@ -492,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)) - { - evas_object_del(child); - } - while (((child = evas_object_top_get(win->evas))) && - (child != obj)) + child = evas_object_bottom_get(win->evas); + while (child) { - 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) @@ -516,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 @@ -530,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) && @@ -543,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__) @@ -588,14 +847,21 @@ _elm_win_obj_intercept_show(void *data, Evas_Object *obj) // sizes BEFORE we show the window to make sure it initially appears at // our desired size (ie min size is known first) evas_smart_objects_calculate(evas_object_evas_get(obj)); - evas_object_show(obj); if (win->frame_obj) { + evas_object_show(win->frame_obj); } else if (win->img_obj) { evas_object_show(win->img_obj); } + if (win->pointer.obj) + { + ecore_evas_show(win->pointer.ee); + evas_object_show(win->pointer.obj); + /* ecore_evas_wayland_pointer_set(win->pointer.ee, 10, 10); */ + } + evas_object_show(obj); } static void @@ -614,6 +880,13 @@ _elm_win_obj_callback_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi } if (win->frame_obj) { + Evas_Coord x, y; + + 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) { @@ -639,8 +912,6 @@ _elm_win_obj_callback_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, v Evas_Coord w = 1, h = 1; evas_object_geometry_get(obj, NULL, NULL, &w, &h); - if (w < 1) w = 1; - if (h < 1) h = 1; if (win->constrain) { int sw, sh; @@ -648,6 +919,8 @@ _elm_win_obj_callback_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, v w = MIN(w, sw); h = MIN(h, sh); } + if (w < 1) w = 1; + if (h < 1) h = 1; evas_object_image_size_set(win->img_obj, w, h); } } @@ -688,13 +961,14 @@ _elm_win_resize_job(void *data) w = MIN(w, sw); h = MIN(h, sh); } - evas_object_resize(win->win_obj, w, h); if (win->frame_obj) { + evas_object_resize(win->frame_obj, w, h); } else if (win->img_obj) { } + evas_object_resize(win->win_obj, w, h); EINA_LIST_FOREACH(win->subobjs, l, obj) { evas_object_move(obj, 0, 0); @@ -708,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); @@ -752,6 +1026,8 @@ _elm_win_xwindow_get(Elm_Win *win) static void _elm_win_xwin_update(Elm_Win *win) { + const char *s; + _elm_win_xwindow_get(win); if (win->parent) { @@ -767,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: @@ -816,6 +1146,12 @@ _elm_win_xwin_update(Elm_Win *win) } ecore_x_e_virtual_keyboard_state_set (win->xwin, (Ecore_X_Virtual_Keyboard_State)win->kbdmode); + if (win->indmode == ELM_WIN_INDICATOR_SHOW) + ecore_x_e_illume_indicator_state_set + (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_ON); + else if (win->indmode == ELM_WIN_INDICATOR_HIDE) + ecore_x_e_illume_indicator_state_set + (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_OFF); } #endif @@ -1287,6 +1623,132 @@ the_end: win->focus_highlight.prev = win->focus_highlight.cur; } +static void +_elm_win_frame_add(Elm_Win *win, const char *style) +{ + evas_output_framespace_set(win->evas, 0, 22, 0, 26); + + win->frame_obj = edje_object_add(win->evas); + _elm_theme_set(NULL, win->frame_obj, "border", "base", style); + evas_object_is_frame_object_set(win->frame_obj, EINA_TRUE); + 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", + "elm", _elm_win_frame_cb_move_start, win); + 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", + "elm", _elm_win_frame_cb_minimize, win); + 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", + "elm", _elm_win_frame_cb_close, win); +} + +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; + + if (!(win = data)) return; + /* FIXME: Change mouse pointer */ + + /* 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 +_elm_win_frame_cb_resize_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source) +{ + Elm_Win *win; + + if (!(win = data)) return; + if (win->resizing) return; + win->resizing = EINA_TRUE; + + /* FIXME: Change mouse pointer */ + + if (!strcmp(source, "elm.event.resize.t")) + win->resize_location = 1; + else if (!strcmp(source, "elm.event.resize.b")) + win->resize_location = 2; + else if (!strcmp(source, "elm.event.resize.l")) + win->resize_location = 4; + else if (!strcmp(source, "elm.event.resize.r")) + win->resize_location = 8; + else if (!strcmp(source, "elm.event.resize.tl")) + win->resize_location = 5; + else if (!strcmp(source, "elm.event.resize.tr")) + win->resize_location = 9; + else if (!strcmp(source, "elm.event.resize.bl")) + win->resize_location = 6; + else if (!strcmp(source, "elm.event.resize.br")) + win->resize_location = 10; + else + win->resize_location = 0; + + if (win->resize_location > 0) + ecore_evas_wayland_resize(win->ee, win->resize_location); +} + +static void +_elm_win_frame_cb_minimize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__) +{ + Elm_Win *win; + + if (!(win = data)) return; + win->iconified = EINA_TRUE; + ecore_evas_iconified_set(win->ee, EINA_TRUE); +} + +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; + if (win->maximized) win->maximized = EINA_FALSE; + else win->maximized = EINA_TRUE; + ecore_evas_maximized_set(win->ee, win->maximized); +} + +static void +_elm_win_frame_cb_close(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__) +{ + Elm_Win *win; + + if (!(win = data)) return; + evas_object_del(win->win_obj); +} + +/* +static void +_elm_win_pointer_add(Elm_Win *win, const char *style) +{ + int mw, mh; + + 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); + + 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); + 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 _debug_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) @@ -1296,7 +1758,6 @@ _debug_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, voi if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; - if ((strcmp(ev->keyname, "F12")) || (!evas_key_modifier_is_set(ev->modifiers, "Control"))) return; @@ -1367,6 +1828,26 @@ _win_inlined_image_set(Elm_Win *win) _win_img_focus_out, win); } +static void +_subobj_del(Elm_Win *win, Evas_Object *obj, Evas_Object *subobj) +{ + evas_object_event_callback_del_full(subobj, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _elm_win_subobj_callback_changed_size_hints, + obj); + evas_object_event_callback_del_full(subobj, EVAS_CALLBACK_DEL, + _elm_win_subobj_callback_del, obj); + win->subobjs = eina_list_remove(win->subobjs, 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) { @@ -1382,9 +1863,12 @@ 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) (!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) { @@ -1408,6 +1892,11 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) win->img_obj = NULL; } break; + + case ELM_WIN_SOCKET_IMAGE: + win->ee = ecore_evas_extn_socket_new(1, 1); + break; + default: if (ENGINE_COMPARE(ELM_SOFTWARE_X11)) { @@ -1522,11 +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 (!strncmp(_elm_config->engine, "shot:", 5)) + else if (ENGINE_COMPARE(ELM_WAYLAND_SHM)) + { + 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"); + } + else if (ENGINE_COMPARE(ELM_WAYLAND_EGL)) + { + 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"); + } + 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 @@ -1570,6 +2075,12 @@ 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) + { + evas_object_clip_set(win->win_obj, win->frame_obj); + evas_object_stack_below(win->frame_obj, win->win_obj); + } + if (type == ELM_WIN_INLINED_IMAGE) elm_widget_parent2_set(win->win_obj, parent); ecore_evas_object_associate(win->ee, win->win_obj, @@ -1592,12 +2103,15 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) evas_object_intercept_show_callback_add(win->win_obj, _elm_win_obj_intercept_show, win); + evas_object_smart_callback_add(win->win_obj, "sub-object-del", (Evas_Smart_Cb)_subobj_del, win); ecore_evas_name_class_set(win->ee, name, _elm_appname); ecore_evas_callback_delete_request_set(win->ee, _elm_win_delete_request); ecore_evas_callback_resize_set(win->ee, _elm_win_resize); + ecore_evas_callback_mouse_in_set(win->ee, _elm_win_mouse_in); ecore_evas_callback_focus_in_set(win->ee, _elm_win_focus_in); ecore_evas_callback_focus_out_set(win->ee, _elm_win_focus_out); ecore_evas_callback_move_set(win->ee, _elm_win_move); + ecore_evas_callback_state_change_set(win->ee, _elm_win_state_change); evas_image_cache_set(win->evas, (_elm_config->image_cache * 1024)); evas_font_cache_set(win->evas, (_elm_config->font_cache * 1024)); EINA_LIST_FOREACH(_elm_config->font_dirs, l, fontpath) @@ -1705,8 +2219,11 @@ elm_win_title_set(Evas_Object *obj, const char *title) Elm_Win *win; ELM_CHECK_WIDTYPE(obj, widtype); win = elm_widget_data_get(obj); - if (!win) return; - ecore_evas_title_set(win->ee, title); + if (!win || !title) return; + eina_stringshare_replace(&(win->title), title); + ecore_evas_title_set(win->ee, win->title); + if (win->frame_obj) + edje_object_part_text_escaped_set(win->frame_obj, "elm.text.title", win->title); } EAPI const char * @@ -1716,44 +2233,119 @@ 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_autodel_set(Evas_Object *obj, Eina_Bool autodel) +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) return; - win->autodel = autodel; + if (!win || !icon_name) return; + eina_stringshare_replace(&(win->icon_name), icon_name); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif } -EAPI Eina_Bool -elm_win_autodel_get(const Evas_Object *obj) +EAPI const char * +elm_win_icon_name_get(const Evas_Object *obj) { Elm_Win *win; - ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + ELM_CHECK_WIDTYPE(obj, widtype) NULL; win = elm_widget_data_get(obj); - if (!win) return EINA_FALSE; - return win->autodel; + if (!win) return NULL; + return win->icon_name; } EAPI void -elm_win_activate(Evas_Object *obj) +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) return; - ecore_evas_activate(win->ee); + if (!win || !role) return; + eina_stringshare_replace(&(win->role), role); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif } -EAPI void -elm_win_lower(Evas_Object *obj) +EAPI const char * +elm_win_role_get(const Evas_Object *obj) { Elm_Win *win; - ELM_CHECK_WIDTYPE(obj, widtype); + 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 +elm_win_autodel_set(Evas_Object *obj, Eina_Bool autodel) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + win->autodel = autodel; +} + +EAPI Eina_Bool +elm_win_autodel_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->autodel; +} + +EAPI void +elm_win_activate(Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + ecore_evas_activate(win->ee); +} + +EAPI void +elm_win_lower(Evas_Object *obj) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); win = elm_widget_data_get(obj); if (!win) return; ecore_evas_lower(win->ee); @@ -1891,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; @@ -1960,9 +2512,8 @@ elm_win_fullscreen_set(Evas_Object *obj, Eina_Bool fullscreen) ELM_CHECK_WIDTYPE(obj, widtype); 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)) { @@ -1971,6 +2522,7 @@ elm_win_fullscreen_set(Evas_Object *obj, Eina_Bool fullscreen) } else { + win->fullscreen = fullscreen; ecore_evas_fullscreen_set(win->ee, fullscreen); #ifdef HAVE_ELEMENTARY_X _elm_win_xwin_update(win); @@ -1986,8 +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)) { @@ -1996,7 +2547,7 @@ elm_win_fullscreen_get(const Evas_Object *obj) } else { - return ecore_evas_fullscreen_get(win->ee); + return win->fullscreen; } #undef ENGINE_COMPARE } @@ -2008,6 +2559,7 @@ elm_win_maximized_set(Evas_Object *obj, Eina_Bool maximized) ELM_CHECK_WIDTYPE(obj, widtype); win = elm_widget_data_get(obj); if (!win) return; + win->maximized = maximized; // YYY: handle if win->img_obj ecore_evas_maximized_set(win->ee, maximized); #ifdef HAVE_ELEMENTARY_X @@ -2022,7 +2574,7 @@ elm_win_maximized_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; win = elm_widget_data_get(obj); if (!win) return EINA_FALSE; - return ecore_evas_maximized_get(win->ee); + return win->maximized; } EAPI void @@ -2032,6 +2584,7 @@ elm_win_iconified_set(Evas_Object *obj, Eina_Bool iconified) ELM_CHECK_WIDTYPE(obj, widtype); win = elm_widget_data_get(obj); if (!win) return; + win->iconified = iconified; ecore_evas_iconified_set(win->ee, iconified); #ifdef HAVE_ELEMENTARY_X _elm_win_xwin_update(win); @@ -2045,7 +2598,190 @@ elm_win_iconified_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; win = elm_widget_data_get(obj); if (!win) return EINA_FALSE; - return ecore_evas_iconified_get(win->ee); + return win->iconified; +} + +EAPI void +elm_win_withdrawn_set(Evas_Object *obj, Eina_Bool withdrawn) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + win->withdrawn = withdrawn; + ecore_evas_withdrawn_set(win->ee, withdrawn); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI Eina_Bool +elm_win_withdrawn_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->withdrawn; +} + +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; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + win->urgent = urgent; + ecore_evas_urgent_set(win->ee, urgent); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI Eina_Bool +elm_win_urgent_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->urgent; +} + +EAPI void +elm_win_demand_attention_set(Evas_Object *obj, Eina_Bool demand_attention) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + win->demand_attention = demand_attention; + ecore_evas_demand_attention_set(win->ee, demand_attention); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI Eina_Bool +elm_win_demand_attention_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->demand_attention; +} + +EAPI void +elm_win_modal_set(Evas_Object *obj, Eina_Bool modal) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + win->modal = modal; + ecore_evas_modal_set(win->ee, modal); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI Eina_Bool +elm_win_modal_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->modal; +} + +EAPI void +elm_win_aspect_set(Evas_Object *obj, double aspect) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + win->aspect = aspect; + ecore_evas_aspect_set(win->ee, aspect); +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwin_update(win); +#endif +} + +EAPI double +elm_win_aspect_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->aspect; } EAPI void @@ -2124,6 +2860,7 @@ elm_win_sticky_set(Evas_Object *obj, Eina_Bool sticky) ELM_CHECK_WIDTYPE(obj, widtype); win = elm_widget_data_get(obj); if (!win) return; + win->sticky = sticky; ecore_evas_sticky_set(win->ee, sticky); #ifdef HAVE_ELEMENTARY_X _elm_win_xwin_update(win); @@ -2137,7 +2874,7 @@ elm_win_sticky_get(const Evas_Object *obj) ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; win = elm_widget_data_get(obj); if (!win) return EINA_FALSE; - return ecore_evas_sticky_get(win->ee); + return win->sticky; } EAPI void @@ -2200,6 +2937,92 @@ 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) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + if (mode == win->indmode) return; +#ifdef HAVE_ELEMENTARY_X + _elm_win_xwindow_get(win); +#endif + win->indmode = mode; +#ifdef HAVE_ELEMENTARY_X + if (win->xwin) + { + if (win->indmode == ELM_WIN_INDICATOR_SHOW) + ecore_x_e_illume_indicator_state_set + (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_ON); + else if (win->indmode == ELM_WIN_INDICATOR_HIDE) + ecore_x_e_illume_indicator_state_set + (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_OFF); + } +#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) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype) ELM_WIN_INDICATOR_UNKNOWN; + win = elm_widget_data_get(obj); + if (!win) return ELM_WIN_INDICATOR_UNKNOWN; + return win->indmode; +} + +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) { @@ -2424,23 +3247,8 @@ elm_win_prop_focus_skip_set(Evas_Object *obj, Eina_Bool skip) ELM_CHECK_WIDTYPE(obj, widtype); win = elm_widget_data_get(obj); if (!win) return; -#ifdef HAVE_ELEMENTARY_X - _elm_win_xwindow_get(win); - if (skip) - { - if (win->xwin) - { - Ecore_X_Window_State states[2]; - - ecore_x_icccm_hints_set(win->xwin, 0, 0, 0, 0, 0, 0, 0); - states[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR; - states[1] = ECORE_X_WINDOW_STATE_SKIP_PAGER; - ecore_x_netwm_window_state_set(win->xwin, states, 2); - } - } -#else - (void) skip; -#endif + win->skip_focus = skip; + ecore_evas_focus_skip_set(win->ee, skip); } EAPI void @@ -2599,6 +3407,25 @@ _elm_inwin_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas } static void +_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_escaped_set(wd->frm, item, text); + _sizing_eval(obj); +} + +static const char * +_elm_inwin_text_get_hook(const Evas_Object *obj, const char *item) +{ + Widget_Data *wd = elm_widget_data_get(obj); + + if (!item || !wd || !wd->frm) return NULL; + return edje_object_part_text_get(wd->frm, item); +} + +static void _sizing_eval(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); @@ -2653,6 +3480,8 @@ elm_win_inwin_add(Evas_Object *obj) elm_widget_del_hook_set(obj2, _del_hook); elm_widget_theme_hook_set(obj2, _theme_hook); elm_widget_focus_next_hook_set(obj2, _elm_inwin_focus_next_hook); + elm_widget_text_set_hook_set(obj2, _elm_inwin_text_set_hook); + elm_widget_text_get_hook_set(obj2, _elm_inwin_text_get_hook); elm_widget_can_focus_set(obj2, EINA_TRUE); elm_widget_highlight_ignore_set(obj2, EINA_TRUE); @@ -2723,7 +3552,24 @@ elm_win_inwin_content_unset(Evas_Object *obj) return content; } -/* windowing spcific calls - shall we do this differently? */ +EAPI Eina_Bool +elm_win_socket_listen(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys) +{ + + Elm_Win *win; + + ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE; + win = elm_widget_data_get(obj); + if (!win) return EINA_FALSE; + if (!win->ee) return EINA_FALSE; + + if (!ecore_evas_extn_socket_listen(win->ee, svcname, svcnum, svcsys)) + return EINA_FALSE; + + return EINA_TRUE; +} + +/* windowing specific calls - shall we do this differently? */ static Ecore_X_Window _elm_ee_win_get(const Evas_Object *obj) @@ -2753,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; +} +