X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_win.c;h=1a52ce04fd4368b1b2d0e321c2965c57db00ce2c;hb=4ed84da20140d37c8bc43c95e24eff275fa90a41;hp=588c1af64f6554c0988e1fddb9feca1263374e34;hpb=aa98648fb93dc3fa5ecaa381da4ac898e1c45adf;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index 588c1af..1a52ce0 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -18,39 +18,67 @@ struct _Elm_Win Elm_Win_Type type; Elm_Win_Keyboard_Mode kbdmode; - struct { - const char *info; - Ecore_Timer *timer; - int repeat_count; - int shot_counter; - } shot; - Eina_Bool autodel : 1; - Eina_Bool constrain : 1; - Eina_Bool resizing : 1; + 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 { - 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 + { + 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; + + 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; + 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; }; static const char *widtype = NULL; @@ -84,17 +112,37 @@ 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 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 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, ""}, {NULL, NULL} }; @@ -308,7 +356,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; @@ -329,7 +377,7 @@ _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_widget_focus_steal(win->win_obj); win->show_count++; @@ -373,25 +421,96 @@ _elm_win_focus_out(Ecore_Evas *ee) } } +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; + + 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; + } + 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); + } +} + 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); @@ -399,7 +518,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; } @@ -432,22 +550,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 } @@ -485,13 +603,18 @@ _elm_win_obj_callback_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN { 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_del(void *data, Evas *e, Evas_Object *obj, void *event_info __UNUSED__) { Elm_Win *win = data; - Evas_Object *child; + Evas_Object *child, *child2 = NULL; if (win->parent) { @@ -513,15 +636,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) @@ -551,6 +695,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) && @@ -617,6 +766,12 @@ _elm_win_obj_intercept_show(void *data, Evas_Object *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); } @@ -641,6 +796,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) { @@ -736,7 +893,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); @@ -780,6 +937,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) { @@ -795,6 +954,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: @@ -844,6 +1057,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 @@ -1315,7 +1534,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); @@ -1326,19 +1545,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; @@ -1346,11 +1565,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; @@ -1380,30 +1604,32 @@ _elm_win_frame_cb_resize_start(void *data, Evas_Object *obj __UNUSED__, const ch else win->resize_location = 0; - /* FIXME: Change to more generic wayland resize function */ if (win->resize_location > 0) 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; if (!(win = data)) return; + win->iconified = EINA_TRUE; 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; - 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; @@ -1412,6 +1638,28 @@ _elm_win_frame_cb_close(void *data, Evas_Object *obj __UNUSED__, const char *sig 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) @@ -1504,6 +1752,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) { @@ -1519,9 +1774,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) { @@ -1545,6 +1803,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)) { @@ -1659,25 +1922,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->evas = ecore_evas_get(win->ee); + 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)) + else if (ENGINE_COMPARE(ELM_WAYLAND_EGL)) { - win->ee = ecore_evas_wayland_egl_new(NULL, 0, 0, 1, 1, 0); - win->evas = ecore_evas_get(win->ee); + 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_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 @@ -1721,9 +1986,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); } @@ -1757,6 +2022,7 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) 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) @@ -1864,10 +2130,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_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 * @@ -1877,7 +2144,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 @@ -2052,46 +2394,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; @@ -2121,9 +2423,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)) { @@ -2132,6 +2433,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); @@ -2147,8 +2449,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)) { @@ -2157,7 +2458,7 @@ elm_win_fullscreen_get(const Evas_Object *obj) } else { - return ecore_evas_fullscreen_get(win->ee); + return win->fullscreen; } #undef ENGINE_COMPARE } @@ -2169,6 +2470,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 @@ -2183,7 +2485,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 @@ -2193,6 +2495,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); @@ -2206,7 +2509,127 @@ 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_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 @@ -2285,6 +2708,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); @@ -2298,7 +2722,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 @@ -2362,6 +2786,78 @@ elm_win_keyboard_win_get(const Evas_Object *obj) } 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 +} + +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) { Elm_Win *win; @@ -2585,23 +3081,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 @@ -2760,6 +3241,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); @@ -2814,6 +3314,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); @@ -2884,7 +3386,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)