aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2016-11-30 13:55:54 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2016-11-30 15:15:02 +0900
commit8a40c063cebb68e53ca32a0470a17f180821afb2 (patch)
tree938e876d85e9f9201942dbe780a46c0ff6afc0db
parentwin: Add a little hack to fix E's logout/shutdown dialogs (diff)
downloadefl-8a40c063cebb68e53ca32a0470a17f180821afb2.tar.gz
win: Implement max size hint support
evas_object_size_hint_max() would not work on a window, unless it somehow managed to not size itself (which would be another issue). This patch allows apps to call size_hint_max_set() on a window. A test case is provided in elm_test (Dialog). @feature
-rw-r--r--src/bin/elementary/test_win_dialog.c57
-rw-r--r--src/lib/elementary/efl_ui_win.c59
-rw-r--r--src/lib/elementary/efl_ui_win.eo1
3 files changed, 101 insertions, 16 deletions
diff --git a/src/bin/elementary/test_win_dialog.c b/src/bin/elementary/test_win_dialog.c
index a0924fd2fd..a7c3bf31eb 100644
--- a/src/bin/elementary/test_win_dialog.c
+++ b/src/bin/elementary/test_win_dialog.c
@@ -3,8 +3,6 @@
#endif
#include <Elementary.h>
-
-
static void
_bt_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
@@ -52,6 +50,55 @@ _bt2_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_
efl_gfx_visible_set(dia, EINA_TRUE);
}
+static void
+_size_update(void *data, const Efl_Event *ev)
+{
+ int w, h, W, H, wc, hc, ww, hh;
+ char buf[2048];
+ Eo *dia = ev->object;
+ Eo *lbl = data;
+
+ efl_gfx_size_hint_combined_min_get(dia, &wc, &hc);
+ efl_gfx_size_hint_min_get(dia, &w, &h);
+ efl_gfx_size_hint_max_get(dia, &W, &H);
+ efl_gfx_size_get(dia, &ww, &hh);
+
+ sprintf(buf, "This is a dialog with min/max size<br>"
+ "Min size: %dx%d (requested) %dx%d (effective)<br>"
+ "Max size: %dx%d<br>"
+ "Current size: %dx%d", w, h, wc, hc, W, H, ww, hh);
+ //efl_text_set(lbl, buf);
+ elm_object_text_set(lbl, buf);
+}
+
+static void
+_bt3_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Efl_Canvas_Object *dia, *lb, *parent = data;
+
+ dia = efl_add(EFL_UI_WIN_STANDARD_CLASS, parent,
+ efl_ui_win_type_set(efl_added, EFL_UI_WIN_DIALOG_BASIC),
+ efl_ui_win_name_set(efl_added, "window-dia-3"),
+ efl_ui_win_autodel_set(efl_added, EINA_TRUE),
+ efl_text_set(efl_added, "Min/Max Size Dialog"));
+
+ //lb = efl_add(EFL_UI_TEXT_CLASS, dia);,
+ lb = elm_label_add(dia);
+ efl_event_callback_add(dia, EFL_GFX_EVENT_CHANGE_SIZE_HINTS, _size_update, lb);
+ efl_event_callback_add(dia, EFL_GFX_EVENT_RESIZE, _size_update, lb);
+ elm_object_text_set(lb, "This is a Dialog Window");
+ efl_gfx_size_hint_weight_set(lb, 1.0, 1.0);
+
+ // Swallow in the label as the default content, this will make it visible.
+ efl_content_set(dia, lb);
+
+ // Set min & max size (app-side)
+ efl_gfx_size_hint_min_set(dia, ELM_SCALE_SIZE(0), ELM_SCALE_SIZE(100));
+ efl_gfx_size_hint_max_set(dia, ELM_SCALE_SIZE(800), ELM_SCALE_SIZE(600));
+
+ efl_gfx_visible_set(dia, EINA_TRUE);
+}
+
void
test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
@@ -77,6 +124,12 @@ test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *even
elm_box_pack_end(box, bt);
evas_object_show(bt);
+ bt = elm_button_add(win);
+ elm_object_text_set(bt, "Create a new dialog with min/max sizes");
+ evas_object_smart_callback_add(bt, "clicked", _bt3_clicked_cb, win);
+ elm_box_pack_end(box, bt);
+ evas_object_show(bt);
+
evas_object_resize(win, 400, 400);
evas_object_show(win);
}
diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c
index d667bef1d4..7b4799aed7 100644
--- a/src/lib/elementary/efl_ui_win.c
+++ b/src/lib/elementary/efl_ui_win.c
@@ -5,6 +5,7 @@
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
#define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
#define EFL_INPUT_EVENT_PROTECTED
+#define EFL_GFX_SIZE_HINT_PROTECTED
#include <Elementary.h>
#include <Elementary_Cursor.h>
@@ -180,6 +181,7 @@ struct _Efl_Ui_Win_Data
int aspect_w, aspect_h; /* used for the get API */
int size_base_w, size_base_h;
int size_step_w, size_step_h;
+ int max_w, max_h;
int norender;
int modal_count;
int response;
@@ -248,6 +250,7 @@ struct _Efl_Ui_Win_Data
Eina_Bool noblank : 1;
Eina_Bool theme_alpha : 1; /**< alpha value fetched by a theme. this has higher priority than application_alpha */
Eina_Bool application_alpha : 1; /**< alpha value set by an elm_win_alpha_set() api. this has lower priority than theme_alpha */
+ Eina_Bool tmp_updating_hints : 1;
};
struct _Input_Pointer_Iterator
@@ -1534,8 +1537,8 @@ _elm_win_state_change(Ecore_Evas *ee)
}
if (ch_wm_rotation)
{
- evas_object_size_hint_min_set(obj, -1, -1);
- evas_object_size_hint_max_set(obj, -1, -1);
+ efl_gfx_size_hint_restricted_min_set(obj, -1, -1);
+ efl_gfx_size_hint_max_set(obj, -1, -1);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
#endif
@@ -3276,7 +3279,7 @@ static void
_elm_win_resize_objects_eval(Evas_Object *obj)
{
ELM_WIN_DATA_GET(obj, sd);
- Evas_Coord w, h, minw, minh, maxw, maxh;
+ Evas_Coord w, h, minw, minh, maxw, maxh, ow, oh;
Eina_Bool unresizable;
double wx, wy;
@@ -3284,11 +3287,17 @@ _elm_win_resize_objects_eval(Evas_Object *obj)
if (minw < 1) minw = 1;
if (minh < 1) minh = 1;
- evas_object_size_hint_weight_get(sd->legacy.edje, &wx, &wy);
+ efl_gfx_size_hint_weight_get(sd->legacy.edje, &wx, &wy);
+ maxw = sd->max_w;
+ maxh = sd->max_h;
if (!wx) maxw = minw;
- else maxw = 32767;
+ else if (maxw < 1) maxw = 32767;
if (!wy) maxh = minh;
- else maxh = 32767;
+ else if (maxh < 1) maxh = 32767;
+ if (maxw < minw) maxw = minw;
+ if (maxh < minh) maxh = minh;
+ if (maxw > 32767) maxw = 32767;
+ if (maxh > 32767) maxh = 32767;
unresizable = ((minw == maxw) && (minh == maxh));
if (sd->csd.need_unresizable != unresizable)
@@ -3308,14 +3317,19 @@ _elm_win_resize_objects_eval(Evas_Object *obj)
maxh += fh;
}
- evas_object_size_hint_min_set(obj, minw, minh);
- evas_object_size_hint_max_set(obj, maxw, maxh);
+ sd->tmp_updating_hints = 1;
+ efl_gfx_size_hint_restricted_min_set(obj, minw, minh);
+ efl_gfx_size_hint_max_set(obj, maxw, maxh);
+ sd->tmp_updating_hints = 0;
- evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+ evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
+ w = ow;
+ h = oh;
if (w < minw) w = minw;
if (h < minh) h = minh;
if (w > maxw) w = maxw;
if (h > maxh) h = maxh;
+ if ((w == ow) && (h == oh)) return;
if (sd->img_obj) evas_object_resize(obj, w, h);
else
{
@@ -5592,6 +5606,23 @@ _efl_ui_win_efl_gfx_size_hint_hint_step_set(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data
}
EOLIAN static void
+_efl_ui_win_efl_gfx_size_hint_hint_max_set(Eo *obj, Efl_Ui_Win_Data *sd, int w, int h)
+{
+ if (sd->tmp_updating_hints)
+ {
+ efl_gfx_size_hint_max_set(efl_super(obj, MY_CLASS), w, h);
+ }
+ else
+ {
+ if (w < 1) w = -1;
+ if (h < 1) h = -1;
+ sd->max_w = w;
+ sd->max_h = h;
+ _elm_win_resize_objects_eval(obj);
+ }
+}
+
+EOLIAN static void
_efl_ui_win_efl_gfx_size_hint_hint_step_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, int *w, int *h)
{
if (w) *w = sd->size_step_w;
@@ -5659,8 +5690,8 @@ _win_rotate(Evas_Object *obj, Efl_Ui_Win_Data *sd, int rotation, Eina_Bool resiz
sd->rot = rotation;
if (resize) TRAP(sd, rotation_with_resize_set, rotation);
else TRAP(sd, rotation_set, rotation);
- evas_object_size_hint_min_set(obj, -1, -1);
- evas_object_size_hint_max_set(obj, -1, -1);
+ efl_gfx_size_hint_restricted_min_set(obj, -1, -1);
+ efl_gfx_size_hint_max_set(obj, -1, -1);
_elm_win_resize_objects_eval(obj);
#ifdef HAVE_ELEMENTARY_X
_elm_win_xwin_update(sd);
@@ -7592,7 +7623,7 @@ _window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
EINA_LIST_FOREACH(p->children, l, opt)
{
child = opt->obj;
- evas_object_size_hint_weight_get(child, &wx, &wy);
+ efl_gfx_size_hint_weight_get(child, &wx, &wy);
if (wx == 0.0) weight_x = 0;
if (wy == 0.0) weight_y = 0;
@@ -7601,7 +7632,7 @@ _window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
if (h > minh) minh = h;
}
- evas_object_size_hint_min_set(o, minw, minh);
+ efl_gfx_size_hint_restricted_min_set(o, minw, minh);
evas_object_geometry_get(o, &x, &y, &w, &h);
if (w < minw) w = minw;
if (h < minh) h = minh;
@@ -7615,7 +7646,7 @@ _window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
}
ELM_WIN_DATA_GET(data, sd);
- evas_object_size_hint_weight_set(sd->legacy.edje, weight_x, weight_y);
+ efl_gfx_size_hint_weight_set(sd->legacy.edje, weight_x, weight_y);
evas_object_smart_changed(sd->legacy.edje);
}
diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo
index 7af31b9d94..2623067c33 100644
--- a/src/lib/elementary/efl_ui_win.eo
+++ b/src/lib/elementary/efl_ui_win.eo
@@ -920,6 +920,7 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Elm.Interface.Atspi.Window,
Efl.Gfx.Size.Hint.hint_step.get;
Efl.Gfx.Size.Hint.hint_aspect.set;
Efl.Gfx.Size.Hint.hint_aspect.get;
+ Efl.Gfx.Size.Hint.hint_max.set;
Efl.Text.text.set;
Efl.Text.text.get;
Efl.Input.Interface.pointer_xy.get;