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 __UNUSED__, E_Config_Dialog_Data *cfdata);
7 static Evas_Object *_basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata);
8 static int _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
9 static Evas_Object *_adv_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata);
10 static int _adv_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
11 static int _adv_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
12 static void _adv_policy_changed(void *data, Evas_Object *obj __UNUSED__);
14 struct _E_Config_Dialog_Data
17 double min, max, factor;
18 int use_mode, base_dpi, use_custom;
23 Evas_Object *o_lbl, *o_slider;
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;
37 _scale_preview_sel_set(Evas_Object *ob, int sel)
39 Evas_Object *rc, *ob2;
43 E_Config_Dialog_Data *cfdata;
45 cfdata = evas_object_data_get(ob, "cfdata");
46 rc = evas_object_data_get(ob, "rec");
49 evas_object_color_set(rc, 0, 0, 0, 0);
50 sc = evas_object_data_get(ob, "scalep");
51 v = (int)(unsigned long)evas_object_data_get(ob, "scale");
52 scl = (double)v / 1000.0;
54 if (evas_object_data_get(ob, "dpi"))
56 cfdata->use_dpi = EINA_TRUE;
58 cfdata->use_custom = 0;
59 fprintf(stderr, "custom 0\n");
63 cfdata->use_dpi = EINA_FALSE;
65 cfdata->use_custom = 1;
66 fprintf(stderr, "custom 1\n");
68 EINA_LIST_FOREACH(cfdata->obs, l, ob2)
70 if (ob == ob2) continue;
71 _scale_preview_sel_set(ob2, 0);
74 else evas_object_color_set(rc, 0, 0, 0, 192);
78 _scale_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
80 Evas_Object *ob = data;
82 _scale_preview_sel_set(ob, 1);
86 _scale_preview_new(E_Config_Dialog_Data *cfdata, Evas *e, double sc, double *scp, const char *tit, Eina_Bool dpi)
88 Evas_Object *ob, *bg, *cm, *bd, *wb, *rc;
95 ob = e_widget_preview_add(e, SZW, SZH);
96 e_widget_preview_vsize_set(ob, SZW, SZH);
98 bg = edje_object_add(e_widget_preview_evas_get(ob));
99 file = e_bg_file_get(0, 0, 0, 0);
100 edje_object_file_set(bg, file, "e/desktop/background");
101 evas_object_move(bg, 0, 0);
102 evas_object_resize(bg, 640, 480);
103 evas_object_show(bg);
105 cm = edje_object_add(e_widget_preview_evas_get(ob));
106 e_theme_edje_object_set(cm, "base/theme/borders", "e/comp/default");
107 evas_object_move(cm, 16, 16);
108 evas_object_resize(cm, 320, 400);
109 evas_object_show(cm);
111 bd = edje_object_add(e_widget_preview_evas_get(ob));
112 e_theme_edje_object_set(bd, "base/theme/borders", "e/widgets/border/default/border");
113 edje_object_part_swallow(cm, "e.swallow.content", bd);
114 evas_object_show(bd);
116 wb = edje_object_add(e_widget_preview_evas_get(ob));
117 e_theme_edje_object_set(wb, "base/theme/dialog", "e/widgets/dialog/main");
118 edje_object_part_swallow(bd, "e.swallow.client", wb);
119 evas_object_show(wb);
121 rc = evas_object_rectangle_add(e_widget_preview_evas_get(ob));
122 evas_object_move(rc, 0, 0);
123 evas_object_resize(rc, 640, 480);
124 evas_object_color_set(rc, 0, 0, 0, 192);
125 evas_object_show(rc);
129 snprintf(buf, sizeof(buf), "%1.1f %s", sc, _("Factor"));
130 edje_object_part_text_set(bd, "e.text.title", buf);
133 edje_object_part_text_set(bd, "e.text.title", tit);
134 edje_object_signal_emit(bd, "e,state,focused", "e");
136 edje_object_signal_emit(cm, "e,state,visible,on", "e");
137 edje_object_signal_emit(cm, "e,state,shadow,on", "e");
138 edje_object_signal_emit(cm, "e,state,focus,on", "e");
140 edje_object_scale_set(bd, sc);
141 edje_object_scale_set(cm, sc);
142 edje_object_scale_set(bg, sc);
143 edje_object_scale_set(wb, sc);
145 evas_object_data_set(ob, "rec", rc);
147 evas_object_data_set(ob, "scale", (void *)(unsigned long)v);
148 evas_object_data_set(ob, "scalep", scp);
149 evas_object_data_set(ob, "dpi", (void *)(unsigned long)dpi);
150 evas_object_data_set(ob, "cfdata", cfdata);
152 evas_object_event_callback_add(rc,
153 EVAS_CALLBACK_MOUSE_DOWN,
155 cfdata->obs = eina_list_append(cfdata->obs, ob);
161 e_int_config_scale(E_Container *con, const char *params __UNUSED__)
163 E_Config_Dialog *cfd;
164 E_Config_Dialog_View *v;
166 if (e_config_dialog_find("E", "appearance/scale")) return NULL;
168 v = E_NEW(E_Config_Dialog_View, 1);
169 v->create_cfdata = _create_data;
170 v->free_cfdata = _free_data;
171 v->basic.create_widgets = _basic_create;
172 v->basic.apply_cfdata = _basic_apply;
173 v->advanced.create_widgets = _adv_create;
174 v->advanced.apply_cfdata = _adv_apply;
175 v->advanced.check_changed = _adv_changed;
177 cfd = e_config_dialog_new(con, _("Scale Settings"), "E", "appearance/scale",
178 "preferences-scale", 0, v, NULL);
179 e_config_dialog_changed_auto_set(cfd, 0);
180 e_config_dialog_changed_set(cfd, 1);
184 /* local function prototypes */
186 _create_data(E_Config_Dialog *cfd __UNUSED__)
188 E_Config_Dialog_Data *cfdata;
190 cfdata = E_NEW(E_Config_Dialog_Data, 1);
196 _fill_data(E_Config_Dialog_Data *cfdata)
198 cfdata->use_dpi = e_config->scale.use_dpi;
199 cfdata->use_custom = e_config->scale.use_custom;
200 cfdata->use_mode = 0;
201 if (cfdata->use_dpi) cfdata->use_mode = 1;
202 else if (cfdata->use_custom) cfdata->use_mode = 2;
203 cfdata->min = e_config->scale.min;
204 cfdata->max = e_config->scale.max;
205 cfdata->factor = e_config->scale.factor;
206 cfdata->base_dpi = e_config->scale.base_dpi;
210 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
212 eina_list_free(cfdata->obs);
217 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
221 int dpi, x = 0, y = 0;
223 o = e_widget_table_add(evas, 1);
225 dpi = ecore_x_dpi_get();
226 if ((dpi > 0) && (cfdata->base_dpi > 0))
227 sc = (double)dpi / (double)cfdata->base_dpi;
229 ob = _scale_preview_new(cfdata, evas, sc, &(cfdata->factor), _("DPI Scaling"), EINA_TRUE);
230 e_widget_table_object_align_append(o, ob, 0, 0, 1, 1, 0, 0, 0, 0, 0.5, 0.5);
231 if (cfdata->use_dpi) _scale_preview_sel_set(ob, 1);
236 #define SCALE_OP(v) do { \
237 ob = _scale_preview_new(cfdata, evas, v, &(cfdata->factor), NULL, EINA_FALSE); \
238 e_widget_table_object_align_append(o, ob, x, y, 1, 1, 0, 0, 0, 0, 0.5, 0.5); \
239 if ((cfdata->factor >= (v - 0.05)) && (cfdata->factor < v + 0.05)) \
240 _scale_preview_sel_set(ob, 1); \
241 x++; if (x >= COL) { x = 0; y++; } \
256 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
260 if (cfdata->use_dpi) cfdata->use_mode = 1;
261 else cfdata->use_mode = 0;
263 e_config->scale.use_dpi = cfdata->use_dpi;
264 e_config->scale.use_custom = cfdata->use_custom;
265 e_config->scale.min = cfdata->min;
266 e_config->scale.max = cfdata->max;
267 e_config->scale.factor = cfdata->factor;
268 e_config->scale.base_dpi = cfdata->base_dpi;
270 fprintf(stderr, "dpi: %i, custom: %i, min: %3.3f, max: %3.3f, sc: %3.3f: base: %i\n",
271 e_config->scale.use_dpi, e_config->scale.use_custom,
272 e_config->scale.min, e_config->scale.max, e_config->scale.factor,
273 e_config->scale.base_dpi);
275 e_config_save_queue();
277 a = e_action_find("restart");
278 if ((a) && (a->func.go)) a->func.go(NULL, NULL);
284 _adv_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
286 Evas_Object *o, *otb, *ow;
290 if (cfdata->obs) cfdata->obs = eina_list_free(cfdata->obs);
291 otb = e_widget_toolbook_add(evas, 24, 24);
294 o = e_widget_list_add(evas, 0, 0);
295 rg = e_widget_radio_group_new(&(cfdata->use_mode));
296 ow = e_widget_radio_add(evas, _("Don't Scale"), 0, rg);
297 e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
298 e_widget_list_object_append(o, ow, 1, 1, 0.5);
299 ow = e_widget_radio_add(evas, _("Scale relative to screen DPI"), 1, rg);
300 e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
301 e_widget_list_object_append(o, ow, 1, 1, 0.5);
303 snprintf(buff, sizeof(buff),
304 _("Base DPI (Currently %i DPI)"), ecore_x_dpi_get());
305 ow = e_widget_label_add(evas, buff);
306 cfdata->gui.adv.dpi_lbl = ow;
307 e_widget_list_object_append(o, ow, 1, 1, 0.5);
308 ow = e_widget_slider_add(evas, 1, 0, _("%1.0f DPI"), 30, 600, 1, 0,
309 NULL, &(cfdata->base_dpi), 100);
310 cfdata->gui.adv.dpi_slider = ow;
311 e_widget_list_object_append(o, ow, 1, 1, 0.5);
312 ow = e_widget_radio_add(evas, _("Custom scaling factor"), 2, rg);
313 e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
314 e_widget_list_object_append(o, ow, 1, 1, 0.5);
315 ow = e_widget_slider_add(evas, 1, 0, _("%1.2f x"), 0.25, 8.0, 0.05,
316 0, &(cfdata->factor), NULL, 100);
317 cfdata->gui.adv.custom_slider = ow;
318 e_widget_list_object_append(o, ow, 1, 1, 0.5);
319 e_widget_toolbook_page_append(otb, NULL, _("Policy"), o,
320 1, 0, 1, 0, 0.5, 0.0);
323 o = e_widget_list_add(evas, 0, 0);
324 ow = e_widget_label_add(evas, _("Minimum"));
325 cfdata->gui.adv.min_lbl = ow;
326 e_widget_list_object_append(o, ow, 1, 1, 0.5);
327 ow = e_widget_slider_add(evas, 1, 0, _("%1.2f times"), 0.25, 8.0, 0.05,
328 0, &(cfdata->min), NULL, 150);
329 cfdata->gui.adv.min_slider = ow;
330 e_widget_list_object_append(o, ow, 1, 1, 0.5);
331 ow = e_widget_label_add(evas, _("Maximum"));
332 cfdata->gui.adv.max_lbl = ow;
333 e_widget_list_object_append(o, ow, 1, 1, 0.5);
334 ow = e_widget_slider_add(evas, 1, 0, _("%1.2f times"), 0.25, 8.0, 0.05,
335 0, &(cfdata->max), NULL, 150);
336 cfdata->gui.adv.max_slider = ow;
337 e_widget_list_object_append(o, ow, 1, 1, 0.5);
338 e_widget_toolbook_page_append(otb, NULL, _("Constraints"), o,
339 1, 0, 1, 0, 0.5, 0.0);
341 e_widget_toolbook_page_show(otb, 0);
342 _adv_policy_changed(cfdata, NULL);
347 _adv_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
351 cfdata->use_custom = 0;
353 if (cfdata->use_mode == 1)
355 else if (cfdata->use_mode == 2)
356 cfdata->use_custom = 1;
358 e_config->scale.use_dpi = cfdata->use_dpi;
359 e_config->scale.use_custom = cfdata->use_custom;
360 e_config->scale.min = cfdata->min;
361 e_config->scale.max = cfdata->max;
362 e_config->scale.factor = cfdata->factor;
363 e_config->scale.base_dpi = cfdata->base_dpi;
365 e_config_save_queue();
367 a = e_action_find("restart");
368 if ((a) && (a->func.go)) a->func.go(NULL, NULL);
374 _adv_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
376 int use_dpi = 0, use_custom = 0;
378 if (cfdata->use_mode == 1)
380 else if (cfdata->use_mode == 2)
383 return (use_dpi != e_config->scale.use_dpi) ||
384 (use_custom != e_config->scale.use_custom) ||
385 (cfdata->min != e_config->scale.min) ||
386 (cfdata->max != e_config->scale.max) ||
387 (cfdata->factor != e_config->scale.factor) ||
388 (cfdata->base_dpi != e_config->scale.base_dpi);
393 _adv_policy_changed(void *data, Evas_Object *obj __UNUSED__)
395 E_Config_Dialog_Data *cfdata;
397 if (!(cfdata = data)) return;
398 e_widget_disabled_set(cfdata->gui.adv.dpi_lbl, (cfdata->use_mode != 1));
399 e_widget_disabled_set(cfdata->gui.adv.dpi_slider, (cfdata->use_mode != 1));
400 e_widget_disabled_set(cfdata->gui.adv.custom_slider, (cfdata->use_mode != 2));