1 #include "e.h"
2 
3 /* local function prototypes */
4 static void        *_create_data(E_Config_Dialog *cfd);
5 static void         _fill_data(E_Config_Dialog_Data *cfdata);
6 static void         _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata);
7 static Evas_Object *_basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata);
8 static int          _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata);
9 static Evas_Object *_adv_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata);
10 static int          _adv_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata);
11 static int          _adv_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata);
12 static void         _adv_policy_changed(void *data, Evas_Object *obj EINA_UNUSED);
13 
14 struct _E_Config_Dialog_Data
15 {
16    int    use_dpi;
17    double min, max, factor;
18    int    use_mode, base_dpi, use_custom;
19    struct
20    {
21       struct
22       {
23          Evas_Object *o_lbl, *o_slider;
24       } basic;
25       struct
26       {
27          Evas_Object *dpi_lbl, *dpi_slider;
28          Evas_Object *custom_slider;
29          Evas_Object *min_lbl, *min_slider;
30          Evas_Object *max_lbl, *max_slider;
31       } adv;
32    } gui;
33    Eina_List *obs;
34    E_Config_Dialog *cfd;
35 };
36 
37 static void
_scale_preview_sel_set(Evas_Object * ob,int sel)38 _scale_preview_sel_set(Evas_Object *ob, int sel)
39 {
40    Evas_Object *rc, *ob2;
41    double *sc, scl;
42    int v;
43    Eina_List *l;
44    E_Config_Dialog_Data *cfdata;
45 
46    cfdata = evas_object_data_get(ob, "cfdata");
47    rc = evas_object_data_get(ob, "rec");
48    if (sel)
49      {
50         evas_object_color_set(rc, 0, 0, 0, 0);
51         sc = evas_object_data_get(ob, "scalep");
52         v = (int)(unsigned long)evas_object_data_get(ob, "scale");
53         scl = (double)v / 1000.0;
54         if (sc) *sc = scl;
55         e_config_dialog_changed_set(cfdata->cfd, (!EINA_DBL_EQ(scl, e_config->scale.factor)));
56         if (evas_object_data_get(ob, "dpi"))
57           {
58              cfdata->use_dpi = EINA_TRUE;
59              cfdata->use_mode = 1;
60              cfdata->use_custom = 0;
61              fprintf(stderr, "custom 0\n");
62           }
63         else
64           {
65              cfdata->use_dpi = EINA_FALSE;
66              cfdata->use_mode = 2;
67              cfdata->use_custom = 1;
68              fprintf(stderr, "custom 1\n");
69           }
70         EINA_LIST_FOREACH(cfdata->obs, l, ob2)
71           {
72              if (ob == ob2) continue;
73              _scale_preview_sel_set(ob2, 0);
74           }
75      }
76    else evas_object_color_set(rc, 0, 0, 0, 192);
77 }
78 
79 static void
_scale_down(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)80 _scale_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
81 {
82    Evas_Object *ob = data;
83 
84    _scale_preview_sel_set(ob, 1);
85 }
86 
87 static Evas_Object *
_scale_preview_new(E_Config_Dialog_Data * cfdata,Evas * e,double sc,double * scp,const char * tit,Eina_Bool dpi)88 _scale_preview_new(E_Config_Dialog_Data *cfdata, Evas *e, double sc, double *scp, const char *tit, Eina_Bool dpi)
89 {
90    Evas_Object *ob, *bg, *cm, *bd, *wb, *rc;
91    const char *file;
92    char buf[64];
93    int v;
94 
95 #define SZW 160
96 #define SZH 100
97    ob = e_widget_preview_add(e, SZW, SZH);
98    e_widget_preview_vsize_set(ob, SZW, SZH);
99 
100    bg = edje_object_add(e_widget_preview_evas_get(ob));
101    file = e_bg_file_get(0, 0, 0);
102    edje_object_file_set(bg, file, "e/desktop/background");
103    eina_stringshare_del(file);
104    evas_object_move(bg, 0, 0);
105    evas_object_resize(bg, 640, 480);
106    evas_object_show(bg);
107 
108    cm = edje_object_add(e_widget_preview_evas_get(ob));
109    e_theme_edje_object_set(cm, "base/theme/borders", "e/comp/frame/default");
110    evas_object_move(cm, 16, 16);
111    evas_object_resize(cm, 180 * sc, 70);
112    evas_object_show(cm);
113 
114    bd = edje_object_add(e_widget_preview_evas_get(ob));
115    e_theme_edje_object_set(bd, "base/theme/borders", "e/widgets/border/default/border");
116    edje_object_part_swallow(cm, "e.swallow.content", bd);
117    evas_object_show(bd);
118 
119    wb = edje_object_add(e_widget_preview_evas_get(ob));
120    e_theme_edje_object_set(wb, "base/theme/dialog", "e/widgets/dialog/main");
121    edje_object_part_swallow(bd, "e.swallow.client", wb);
122    evas_object_show(wb);
123 
124    rc = evas_object_rectangle_add(e_widget_preview_evas_get(ob));
125    evas_object_move(rc, 0, 0);
126    evas_object_resize(rc, 640, 480);
127    evas_object_color_set(rc, 0, 0, 0, 192);
128    evas_object_show(rc);
129 
130    if (!tit)
131      {
132         snprintf(buf, sizeof(buf), "%1.1f %s", sc, _("Factor"));
133         edje_object_part_text_set(bd, "e.text.title", buf);
134      }
135    else
136      edje_object_part_text_set(bd, "e.text.title", tit);
137    edje_object_signal_emit(bd, "e,state,focused", "e");
138    edje_object_signal_emit(bd, "e,state,shadow,on", "e");
139 
140    edje_object_signal_emit(cm, "e,state,visible", "e");
141    edje_object_signal_emit(cm, "e,state,focus,on", "e");
142 
143    edje_object_scale_set(bd, sc);
144    edje_object_scale_set(cm, sc);
145    edje_object_scale_set(bg, sc);
146    edje_object_scale_set(wb, sc);
147 
148    evas_object_data_set(ob, "rec", rc);
149    v = sc * 1000;
150    evas_object_data_set(ob, "scale", (void *)(unsigned long)v);
151    evas_object_data_set(ob, "scalep", scp);
152    evas_object_data_set(ob, "dpi", (void *)(unsigned long)dpi);
153    evas_object_data_set(ob, "cfdata", cfdata);
154 
155    evas_object_event_callback_add(rc,
156                                   EVAS_CALLBACK_MOUSE_DOWN,
157                                   _scale_down, ob);
158    cfdata->obs = eina_list_append(cfdata->obs, ob);
159 
160    return ob;
161 }
162 
163 E_Config_Dialog *
e_int_config_scale(Evas_Object * parent EINA_UNUSED,const char * params EINA_UNUSED)164 e_int_config_scale(Evas_Object *parent EINA_UNUSED, const char *params EINA_UNUSED)
165 {
166    E_Config_Dialog *cfd;
167    E_Config_Dialog_View *v;
168 
169    if (e_config_dialog_find("E", "appearance/scale")) return NULL;
170 
171    v = E_NEW(E_Config_Dialog_View, 1);
172    v->create_cfdata = _create_data;
173    v->free_cfdata = _free_data;
174    v->basic.create_widgets = _basic_create;
175    v->basic.apply_cfdata = _basic_apply;
176    v->advanced.create_widgets = _adv_create;
177    v->advanced.apply_cfdata = _adv_apply;
178    v->advanced.check_changed = _adv_changed;
179 
180    cfd = e_config_dialog_new(NULL, _("Scale Settings"), "E", "appearance/scale",
181                              "preferences-scale", 0, v, NULL);
182    e_config_dialog_changed_auto_set(cfd, 1);
183    return cfd;
184 }
185 
186 /* local function prototypes */
187 static void *
_create_data(E_Config_Dialog * cfd)188 _create_data(E_Config_Dialog *cfd)
189 {
190    E_Config_Dialog_Data *cfdata;
191 
192    cfdata = E_NEW(E_Config_Dialog_Data, 1);
193    cfdata->cfd = cfd;
194    return cfdata;
195 }
196 
197 static void
_fill_data(E_Config_Dialog_Data * cfdata)198 _fill_data(E_Config_Dialog_Data *cfdata)
199 {
200    cfdata->use_dpi = e_config->scale.use_dpi;
201    cfdata->use_custom = e_config->scale.use_custom;
202    cfdata->use_mode = 0;
203    if (cfdata->use_dpi) cfdata->use_mode = 1;
204    else if (cfdata->use_custom) cfdata->use_mode = 2;
205    cfdata->min = e_config->scale.min;
206    cfdata->max = e_config->scale.max;
207    cfdata->factor = e_config->scale.factor;
208    cfdata->base_dpi = e_config->scale.base_dpi;
209 }
210 
211 static void
_free_data(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)212 _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
213 {
214    eina_list_free(cfdata->obs);
215    E_FREE(cfdata);
216 }
217 
218 static Evas_Object *
_basic_create(E_Config_Dialog * cfd EINA_UNUSED,Evas * evas,E_Config_Dialog_Data * cfdata)219 _basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
220 {
221    Evas_Object *o, *ob;
222    double sc = 1.0;
223    int dpi = 0, x = 0, y = 0;
224 
225    _fill_data(cfdata);
226    o = e_widget_table_add(e_win_evas_win_get(evas), 1);
227 
228 #ifndef HAVE_WAYLAND_ONLY
229    if (e_comp->comp_type == E_PIXMAP_TYPE_X)
230      dpi = ecore_x_dpi_get();
231 #endif
232 #ifdef HAVE_WAYLAND
233    if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
234      {
235         int xdpi = 0, ydpi = 0;
236 
237         ecore_evas_screen_dpi_get(e_comp->ee, &xdpi, &ydpi);
238         if (xdpi == 0) xdpi = 75;
239         if (ydpi == 0) ydpi = 75;
240         dpi = ((xdpi + ydpi) / 2);
241      }
242 #endif
243 
244    if ((dpi > 0) && (cfdata->base_dpi > 0))
245      sc = (double)dpi / (double)cfdata->base_dpi;
246 
247    ob = _scale_preview_new(cfdata, evas, sc, &(cfdata->factor), _("DPI Scaling"), EINA_TRUE);
248    e_widget_table_object_align_append(o, ob, 0, 0, 1, 1, 0, 0, 0, 0, 0.5, 0.5);
249    if (cfdata->use_dpi) _scale_preview_sel_set(ob, 1);
250 
251    x = 1;
252 
253 #define COL 3
254 #define SCALE_OP(v) do { \
255    ob = _scale_preview_new(cfdata, evas, v, &(cfdata->factor), NULL, EINA_FALSE); \
256    e_widget_table_object_align_append(o, ob, x, y, 1, 1, 0, 0, 0, 0, 0.5, 0.5); \
257    if (cfdata->use_custom && ((cfdata->factor >= (v - 0.05)) && (cfdata->factor < v + 0.05))) \
258      _scale_preview_sel_set(ob, 1); \
259    x++; if (x >= COL) { x = 0; y++; } \
260 } while (0)
261 
262    SCALE_OP(0.8);
263    SCALE_OP(1.0);
264    SCALE_OP(1.2);
265    SCALE_OP(1.5);
266    SCALE_OP(1.7);
267    SCALE_OP(1.9);
268    SCALE_OP(2.0);
269    SCALE_OP(2.2);
270    return o;
271 }
272 
273 static int
_basic_apply(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)274 _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
275 {
276    E_Action *a;
277 
278    if (cfdata->use_dpi) cfdata->use_mode = 1;
279    else cfdata->use_mode = 0;
280 
281    e_config->scale.use_dpi = cfdata->use_dpi;
282    e_config->scale.use_custom = cfdata->use_custom;
283    e_config->scale.min = cfdata->min;
284    e_config->scale.max = cfdata->max;
285    e_config->scale.factor = cfdata->factor;
286    e_config->scale.base_dpi = cfdata->base_dpi;
287 
288    fprintf(stderr, "dpi: %i, custom: %i, min: %3.3f, max: %3.3f, sc: %3.3f: base: %i\n",
289            e_config->scale.use_dpi, e_config->scale.use_custom,
290            e_config->scale.min, e_config->scale.max, e_config->scale.factor,
291            e_config->scale.base_dpi);
292 
293    e_win_no_reopen_set(cfd->dia->win, 1);
294    e_remember_update(e_win_client_get(cfd->dia->win));
295    e_config_save_queue();
296 
297    a = e_action_find("restart");
298    if ((a) && (a->func.go)) a->func.go(NULL, NULL);
299 
300    return 1;
301 }
302 
303 static Evas_Object *
_adv_create(E_Config_Dialog * cfd EINA_UNUSED,Evas * evas,E_Config_Dialog_Data * cfdata)304 _adv_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
305 {
306    Evas_Object *o, *otb, *ow;
307    E_Radio_Group *rg;
308    char buff[256] = {0};
309    int dpi = 0;
310 
311    _fill_data(cfdata);
312    if (cfdata->obs) cfdata->obs = eina_list_free(cfdata->obs);
313    otb = e_widget_toolbook_add(evas, 24, 24);
314 
315    /* Policy */
316    o = e_widget_list_add(evas, 0, 0);
317    rg = e_widget_radio_group_new(&(cfdata->use_mode));
318    ow = e_widget_radio_add(evas, _("Don't Scale"), 0, rg);
319    e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
320    e_widget_list_object_append(o, ow, 1, 1, 0.5);
321    ow = e_widget_radio_add(evas, _("Scale relative to screen DPI"), 1, rg);
322    e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
323    e_widget_list_object_append(o, ow, 1, 1, 0.5);
324 
325 #ifndef HAVE_WAYLAND_ONLY
326    if (e_comp->comp_type == E_PIXMAP_TYPE_X)
327      dpi = ecore_x_dpi_get();
328 #endif
329 #ifdef HAVE_WAYLAND
330    if (e_comp->comp_type == E_PIXMAP_TYPE_WL)
331      {
332         int xdpi = 0, ydpi = 0;
333 
334         ecore_evas_screen_dpi_get(e_comp->ee, &xdpi, &ydpi);
335         if (xdpi == 0) xdpi = 75;
336         if (ydpi == 0) ydpi = 75;
337         dpi = ((xdpi + ydpi) / 2);
338      }
339 #endif
340 
341    snprintf(buff, sizeof(buff), _("Base DPI (Currently %i DPI)"), dpi);
342 
343    ow = e_widget_label_add(evas, buff);
344    cfdata->gui.adv.dpi_lbl = ow;
345    e_widget_list_object_append(o, ow, 1, 1, 0.5);
346    ow = e_widget_slider_add(evas, 1, 0, _("%1.0f DPI"), 30, 600, 1, 0,
347                             NULL, &(cfdata->base_dpi), 100);
348    cfdata->gui.adv.dpi_slider = ow;
349    e_widget_list_object_append(o, ow, 1, 1, 0.5);
350    ow = e_widget_radio_add(evas, _("Custom scaling factor"), 2, rg);
351    e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
352    e_widget_list_object_append(o, ow, 1, 1, 0.5);
353    ow = e_widget_slider_add(evas, 1, 0, _("%1.2f x"), 0.25, 8.0, 0.05,
354                             0, &(cfdata->factor), NULL, 100);
355    cfdata->gui.adv.custom_slider = ow;
356    e_widget_list_object_append(o, ow, 1, 1, 0.5);
357    e_widget_toolbook_page_append(otb, NULL, _("Policy"), o,
358                                  1, 0, 1, 0, 0.5, 0.0);
359 
360    /* Constraints */
361    o = e_widget_list_add(evas, 0, 0);
362    ow = e_widget_label_add(evas, _("Minimum"));
363    cfdata->gui.adv.min_lbl = ow;
364    e_widget_list_object_append(o, ow, 1, 1, 0.5);
365    ow = e_widget_slider_add(evas, 1, 0, _("%1.2f times"), 0.25, 8.0, 0.05,
366                             0, &(cfdata->min), NULL, 150);
367    cfdata->gui.adv.min_slider = ow;
368    e_widget_list_object_append(o, ow, 1, 1, 0.5);
369    ow = e_widget_label_add(evas, _("Maximum"));
370    cfdata->gui.adv.max_lbl = ow;
371    e_widget_list_object_append(o, ow, 1, 1, 0.5);
372    ow = e_widget_slider_add(evas, 1, 0, _("%1.2f times"), 0.25, 8.0, 0.05,
373                             0, &(cfdata->max), NULL, 150);
374    cfdata->gui.adv.max_slider = ow;
375    e_widget_list_object_append(o, ow, 1, 1, 0.5);
376    e_widget_toolbook_page_append(otb, NULL, _("Constraints"), o,
377                                  1, 0, 1, 0, 0.5, 0.0);
378 
379    e_widget_toolbook_page_show(otb, 0);
380    _adv_policy_changed(cfdata, NULL);
381    return otb;
382 }
383 
384 static int
_adv_apply(E_Config_Dialog * cfd,E_Config_Dialog_Data * cfdata)385 _adv_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
386 {
387    E_Action *a;
388 
389    cfdata->use_custom = 0;
390    cfdata->use_dpi = 0;
391    if (cfdata->use_mode == 1)
392      cfdata->use_dpi = 1;
393    else if (cfdata->use_mode == 2)
394      cfdata->use_custom = 1;
395 
396    e_config->scale.use_dpi = cfdata->use_dpi;
397    e_config->scale.use_custom = cfdata->use_custom;
398    e_config->scale.min = cfdata->min;
399    e_config->scale.max = cfdata->max;
400    e_config->scale.factor = cfdata->factor;
401    e_config->scale.base_dpi = cfdata->base_dpi;
402 
403    e_win_no_reopen_set(cfd->dia->win, 1);
404    e_remember_update(e_win_client_get(cfd->dia->win));
405    e_config_save_queue();
406 
407    a = e_action_find("restart");
408    if ((a) && (a->func.go)) a->func.go(NULL, NULL);
409 
410    return 1;
411 }
412 
413 static int
_adv_changed(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)414 _adv_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
415 {
416    int use_dpi = 0, use_custom = 0;
417 
418    if (cfdata->use_mode == 1)
419      use_dpi = 1;
420    else if (cfdata->use_mode == 2)
421      use_custom = 1;
422 
423    return (use_dpi != e_config->scale.use_dpi) ||
424           (use_custom != e_config->scale.use_custom) ||
425           (!EINA_DBL_EQ(cfdata->min, e_config->scale.min)) ||
426           (!EINA_DBL_EQ(cfdata->max, e_config->scale.max)) ||
427           (!EINA_DBL_EQ(cfdata->factor, e_config->scale.factor)) ||
428           (cfdata->base_dpi != e_config->scale.base_dpi);
429 }
430 
431 static void
_adv_policy_changed(void * data,Evas_Object * obj EINA_UNUSED)432 _adv_policy_changed(void *data, Evas_Object *obj EINA_UNUSED)
433 {
434    E_Config_Dialog_Data *cfdata;
435 
436    if (!(cfdata = data)) return;
437    e_widget_disabled_set(cfdata->gui.adv.dpi_lbl, (cfdata->use_mode != 1));
438    e_widget_disabled_set(cfdata->gui.adv.dpi_slider, (cfdata->use_mode != 1));
439    e_widget_disabled_set(cfdata->gui.adv.custom_slider, (cfdata->use_mode != 2));
440 }
441 
442