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