X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_win.c;h=1a52ce04fd4368b1b2d0e321c2965c57db00ce2c;hb=4ed84da20140d37c8bc43c95e24eff275fa90a41;hp=b89c50844abe90772c69e50f7b0e7e2f60d57e97;hpb=afe3b8cd136a6b9ce2f81d769e342cb503fc8aad;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index b89c508..1a52ce0 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -18,36 +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; + 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; @@ -74,17 +105,44 @@ 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 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} }; @@ -143,9 +201,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); @@ -156,18 +215,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); @@ -301,6 +357,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); @@ -310,9 +377,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 @@ -322,6 +389,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) { @@ -345,6 +413,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) { @@ -352,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); @@ -378,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; } @@ -411,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 } @@ -443,7 +582,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; @@ -458,18 +597,24 @@ _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_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) { @@ -491,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)) + 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) @@ -529,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) && @@ -587,14 +758,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 @@ -613,6 +791,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) { @@ -638,6 +823,13 @@ _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 (win->constrain) + { + int sw, sh; + ecore_evas_screen_geometry_get(win->ee, NULL, NULL, &sw, &sh); + 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); @@ -673,13 +865,21 @@ _elm_win_resize_job(void *data) win->deferred_resize_job = NULL; ecore_evas_request_geometry_get(win->ee, NULL, NULL, &w, &h); - evas_object_resize(win->win_obj, w, h); + if (win->constrain) + { + int sw, sh; + ecore_evas_screen_geometry_get(win->ee, NULL, NULL, &sw, &sh); + w = MIN(w, sw); + h = MIN(h, sh); + } 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); @@ -693,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); @@ -737,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) { @@ -752,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: @@ -801,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 @@ -1272,6 +1534,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) @@ -1281,7 +1669,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; @@ -1352,6 +1739,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) { @@ -1367,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) { @@ -1393,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)) { @@ -1507,11 +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 (!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 @@ -1555,6 +1986,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, @@ -1577,12 +2014,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) @@ -1628,7 +2068,7 @@ EAPI Evas_Object * elm_win_util_standard_add(const char *name, const char *title) { Evas_Object *win, *bg; - + win = elm_win_add(NULL, name, ELM_WIN_BASIC); if (!win) return NULL; elm_win_title_set(win, title); @@ -1660,7 +2100,7 @@ elm_win_resize_object_add(Evas_Object *obj, Evas_Object *subobj) evas_object_event_callback_add(subobj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _elm_win_subobj_callback_changed_size_hints, obj); - ecore_evas_geometry_get(win->ee, NULL, NULL, &w, &h); + evas_object_geometry_get(obj, NULL, NULL, &w, &h); evas_object_move(subobj, 0, 0); evas_object_resize(subobj, w, h); _elm_win_eval_subobjs(obj); @@ -1690,8 +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_escaped_set(win->frame_obj, "elm.text.title", win->title); } EAPI const char * @@ -1701,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 @@ -1755,6 +2273,27 @@ elm_win_raise(Evas_Object *obj) } EAPI void +elm_win_center(Evas_Object *obj, Eina_Bool h, Eina_Bool v) +{ + Elm_Win *win; + int win_w, win_h, screen_w, screen_h, nx, ny; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + ecore_evas_screen_geometry_get(win->ee, NULL, NULL, &screen_w, &screen_h); + if ((!screen_w) || (!screen_h)) return; + evas_object_geometry_get(obj, NULL, NULL, &win_w, &win_h); + if ((!win_w) || (!win_h)) return; + if (h) nx = win_w >= screen_w ? 0 : (screen_w / 2) - (win_w / 2); + else nx = win->screen.x; + if (v) ny = win_h >= screen_h ? 0 : (screen_h / 2) - (win_h / 2); + else ny = win->screen.y; + if (nx < 0) nx = 0; + if (ny < 0) ny = 0; + evas_object_move(obj, nx, ny); +} + +EAPI void elm_win_borderless_set(Evas_Object *obj, Eina_Bool borderless) { Elm_Win *win; @@ -1855,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; @@ -1924,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)) { @@ -1935,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); @@ -1950,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)) { @@ -1960,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 } @@ -1972,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 @@ -1986,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 @@ -1996,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); @@ -2009,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 @@ -2088,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); @@ -2101,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 @@ -2144,6 +2765,8 @@ elm_win_keyboard_win_set(Evas_Object *obj, Eina_Bool is_keyboard) _elm_win_xwindow_get(win); if (win->xwin) ecore_x_e_virtual_keyboard_set(win->xwin, is_keyboard); +#else + (void) is_keyboard; #endif } @@ -2163,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; @@ -2173,6 +2868,46 @@ elm_win_screen_position_get(const Evas_Object *obj, int *x, int *y) if (y) *y = win->screen.y; } +EAPI Eina_Bool +elm_win_focus_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_focus_get(win->ee); +} + +EAPI void +elm_win_screen_constrain_set(Evas_Object *obj, Eina_Bool constrain) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + win->constrain = !!constrain; +} + +EAPI Eina_Bool +elm_win_screen_constrain_get(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->constrain; +} + +EAPI void +elm_win_screen_size_get(const Evas_Object *obj, int *x, int *y, int *w, int *h) +{ + Elm_Win *win; + ELM_CHECK_WIDTYPE(obj, widtype); + win = elm_widget_data_get(obj); + if (!win) return; + ecore_evas_screen_geometry_get(win->ee, x, y, w, h); +} + EAPI void elm_win_conformant_set(Evas_Object *obj, Eina_Bool conformant) { @@ -2184,6 +2919,8 @@ elm_win_conformant_set(Evas_Object *obj, Eina_Bool conformant) _elm_win_xwindow_get(win); if (win->xwin) ecore_x_e_illume_conformant_set(win->xwin, conformant); +#else + (void) conformant; #endif } @@ -2224,6 +2961,8 @@ elm_win_quickpanel_set(Evas_Object *obj, Eina_Bool quickpanel) ecore_x_icccm_hints_set(win->xwin, 0, 0, 0, 0, 0, 0, 0); } } +#else + (void) quickpanel; #endif } @@ -2253,6 +2992,8 @@ elm_win_quickpanel_priority_major_set(Evas_Object *obj, int priority) _elm_win_xwindow_get(win); if (win->xwin) ecore_x_e_illume_quickpanel_priority_major_set(win->xwin, priority); +#else + (void) priority; #endif } @@ -2282,6 +3023,8 @@ elm_win_quickpanel_priority_minor_set(Evas_Object *obj, int priority) _elm_win_xwindow_get(win); if (win->xwin) ecore_x_e_illume_quickpanel_priority_minor_set(win->xwin, priority); +#else + (void) priority; #endif } @@ -2311,6 +3054,8 @@ elm_win_quickpanel_zone_set(Evas_Object *obj, int zone) _elm_win_xwindow_get(win); if (win->xwin) ecore_x_e_illume_quickpanel_zone_set(win->xwin, zone); +#else + (void) zone; #endif } @@ -2336,21 +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); - } - } -#endif + win->skip_focus = skip; + ecore_evas_focus_skip_set(win->ee, skip); } EAPI void @@ -2382,6 +3114,8 @@ elm_win_illume_command_send(Evas_Object *obj, Elm_Illume_Command command, void * break; } } +#else + (void) command; #endif } @@ -2507,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); @@ -2561,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); @@ -2631,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) @@ -2653,9 +3425,9 @@ elm_win_xwindow_get(const Evas_Object *obj) if (!obj) return 0; type = elm_widget_type_get(obj); if ((!type) || (type != widtype)) return _elm_ee_win_get(obj); -#ifdef HAVE_ELEMENTARY_X win = elm_widget_data_get(obj); if (!win) return 0; +#ifdef HAVE_ELEMENTARY_X if (win->xwin) return win->xwin; if (win->parent) return elm_win_xwindow_get(win->parent); #endif