1 #include "e.h"
2 #include "e_mod_main.h"
3 #include "e_int_config_randr2.h"
4 
5 /* local structures */
6 struct _E_Config_Dialog_Data
7 {
8    char *params;
9    E_Config_Dialog *cfd;
10    Eina_List *screen_items;
11    Eina_List *screen_items2;
12    Eina_List *screens;
13    Eina_List *freelist;
14    Evas_Object *name_obj;
15    Evas_Object *screen_obj;
16    Evas_Object *lid_obj;
17    Evas_Object *backlight_obj;
18    Evas_Object *size_obj;
19    Evas_Object *modes_obj;
20    Evas_Object *rotations_obj;
21    Evas_Object *enabled_obj;
22    Evas_Object *priority_obj;
23    Evas_Object *rel_mode_obj;
24    Evas_Object *rel_to_obj;
25    Evas_Object *rel_align_obj;
26    Evas_Object *use_profile_obj;
27    Evas_Object *profile_list_obj;
28    Evas_Object *scale_custom_obj;
29    Evas_Object *scale_value_obj;
30    Evas_Object *policy_obj;
31    int restore;
32    int hotplug;
33    int acpi;
34    int screen;
35    E_Randr2_Policy policy;
36 };
37 
38 typedef struct
39 {
40    E_Config_Dialog_Data *cfdata;
41    E_Randr2_Mode mode;
42 } Mode_CBData;
43 
44 typedef struct
45 {
46    E_Config_Dialog_Data *cfdata;
47    int rot;
48 } Rot_CBData;
49 
50 /* local function prototypes */
51 static void        *_create_data(E_Config_Dialog *cfd);
52 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
53 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
54 static int          _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
55 static int          _basic_check(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
56 
57 /* public functions */
58 E_Config_Dialog *
e_int_config_randr2(Evas_Object * parent EINA_UNUSED,const char * params)59 e_int_config_randr2(Evas_Object *parent EINA_UNUSED, const char *params)
60 {
61    E_Config_Dialog *cfd;
62    E_Config_Dialog_View *v;
63 
64    if (e_config_dialog_find("E", "screen/screen_setup")) return NULL;
65    if (!(v = E_NEW(E_Config_Dialog_View, 1))) return NULL;
66 
67    /* set dialog view functions & properties */
68    v->create_cfdata        = _create_data;
69    v->free_cfdata          = _free_data;
70    v->basic.create_widgets = _basic_create;
71    v->basic.apply_cfdata   = _basic_apply;
72    v->basic.check_changed  = _basic_check;
73    v->override_auto_apply  = EINA_TRUE;
74 
75    /* create new dialog */
76    cfd = e_config_dialog_new(NULL, _("Screen Setup"),
77                              "E", "screen/screen_setup",
78                              "preferences-system-screen-resolution",
79                              0, v, (void *)params);
80    return cfd;
81 }
82 
83 /* local functions */
84 static double
_multiplier_for_scale(double scale)85 _multiplier_for_scale(double scale)
86 {
87    return scale / elm_config_scale_get();
88 }
89 
90 static double
_scale_for_multiplier(double multiplier)91 _scale_for_multiplier(double multiplier)
92 {
93    return multiplier * elm_config_scale_get();
94 }
95 
96 static void *
_create_data(E_Config_Dialog * cfd EINA_UNUSED)97 _create_data(E_Config_Dialog *cfd EINA_UNUSED)
98 {
99    E_Config_Dialog_Data *cfdata;
100 
101    if (!(cfdata = E_NEW(E_Config_Dialog_Data, 1))) return NULL;
102    if (cfd->data) cfdata->params = strdup(cfd->data);
103    cfdata->restore = e_randr2_cfg->restore;
104    cfdata->hotplug = !e_randr2_cfg->ignore_hotplug_events;
105    cfdata->acpi = !e_randr2_cfg->ignore_acpi_events;
106    cfdata->policy = e_randr2_cfg->default_policy;
107    return cfdata;
108 }
109 
110 static void
_free_data(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)111 _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
112 {
113    void *dt;
114    E_Config_Randr2_Screen *cs;
115 
116    EINA_LIST_FREE(cfdata->screens, cs)
117      {
118         eina_stringshare_del(cs->id);
119         eina_stringshare_del(cs->rel_to);
120         eina_stringshare_del(cs->profile);
121         free(cs);
122      }
123    free(cfdata->params);
124    eina_list_free(cfdata->screen_items);
125    eina_list_free(cfdata->screen_items2);
126    EINA_LIST_FREE(cfdata->freelist, dt) free(dt);
127    E_FREE(cfdata);
128 }
129 
130 static void
_cb_restore_changed(void * data EINA_UNUSED,Evas_Object * obj,void * event EINA_UNUSED)131 _cb_restore_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
132 {
133    E_Config_Dialog_Data *cfdata = data;
134    cfdata->restore = elm_check_state_get(obj);
135    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
136 }
137 
138 static void
_cb_hotplug_changed(void * data EINA_UNUSED,Evas_Object * obj,void * event EINA_UNUSED)139 _cb_hotplug_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
140 {
141    E_Config_Dialog_Data *cfdata = data;
142    cfdata->hotplug = elm_check_state_get(obj);
143    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
144 }
145 
146 static void
_cb_acpi_changed(void * data EINA_UNUSED,Evas_Object * obj,void * event EINA_UNUSED)147 _cb_acpi_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
148 {
149    E_Config_Dialog_Data *cfdata = data;
150    cfdata->acpi = elm_check_state_get(obj);
151    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
152 }
153 
154 static E_Config_Randr2_Screen *
_config_screen_find(E_Config_Dialog_Data * cfdata)155 _config_screen_find(E_Config_Dialog_Data *cfdata)
156 {
157    return eina_list_nth(cfdata->screens, cfdata->screen);
158 }
159 
160 static E_Config_Randr2_Screen *
_config_screen_n_find(E_Config_Dialog_Data * cfdata,int n)161 _config_screen_n_find(E_Config_Dialog_Data *cfdata, int n)
162 {
163    return eina_list_nth(cfdata->screens, n);
164 }
165 
166 static E_Randr2_Screen *
_screen_config_find(E_Config_Randr2_Screen * cs)167 _screen_config_find(E_Config_Randr2_Screen *cs)
168 {
169    Eina_List *l;
170    E_Randr2_Screen *s;
171 
172    if (!cs->id) return NULL;
173    EINA_LIST_FOREACH(e_randr2->screens, l, s)
174      {
175         if (!s->id) continue;
176         if (!strcmp(cs->id, s->id)) return s;
177      }
178    return NULL;
179 }
180 
181 static E_Randr2_Screen *
_screen_config_id_find(const char * id)182 _screen_config_id_find(const char *id)
183 {
184    Eina_List *l;
185    E_Randr2_Screen *s;
186 
187    if (!id) return NULL;
188    EINA_LIST_FOREACH(e_randr2->screens, l, s)
189      {
190         if (!s->id) continue;
191         if (!strcmp(s->id, id)) return s;
192      }
193    return NULL;
194 }
195 
196 static E_Config_Randr2_Screen *
_screen_config_randr_id_find(const char * id)197 _screen_config_randr_id_find(const char *id)
198 {
199    Eina_List *l;
200    E_Config_Randr2_Screen *cs;
201 
202    if (!id) return NULL;
203    EINA_LIST_FOREACH(e_randr2_cfg->screens, l, cs)
204      {
205         if (!cs->id) continue;
206         if (!strcmp(cs->id, id)) return cs;
207      }
208    return NULL;
209 }
210 
211 static void
_cb_mode_set(void * data,Evas_Object * obj EINA_UNUSED,void * event EINA_UNUSED)212 _cb_mode_set(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
213 {
214    Mode_CBData *dat = data;
215    E_Config_Dialog_Data *cfdata = dat->cfdata;
216    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
217    if (!cs) return;
218    cs->mode_w = dat->mode.w;
219    cs->mode_h = dat->mode.h;
220    cs->mode_refresh = dat->mode.refresh;
221    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
222 }
223 
224 static void
_cb_rot_set(void * data,Evas_Object * obj EINA_UNUSED,void * event EINA_UNUSED)225 _cb_rot_set(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
226 {
227    Rot_CBData *dat = data;
228    E_Config_Dialog_Data *cfdata = dat->cfdata;
229    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
230    if (!cs) return;
231    cs->rotation = dat->rot;
232    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
233 }
234 
235 typedef struct _Profile_Item
236 {
237    char *profile;
238    E_Config_Dialog_Data *cfdata;
239 } Profile_Item;
240 
241 static void
_profiles_list_selected_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)242 _profiles_list_selected_cb(void *data,
243                            Evas_Object *obj EINA_UNUSED,
244                            void *event_info EINA_UNUSED)
245 {
246    Profile_Item *p = data;
247    E_Config_Randr2_Screen *cs = _config_screen_find(p->cfdata);
248    if (!cs) return;
249    eina_stringshare_del(cs->profile);
250    cs->profile = eina_stringshare_add(p->profile);
251    e_config_dialog_changed_set(p->cfdata->cfd, EINA_TRUE);
252 }
253 
254 static void
_profiles_list_item_del_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)255 _profiles_list_item_del_cb(void *data,
256                            Evas_Object *obj EINA_UNUSED,
257                            void *event_info EINA_UNUSED)
258 {
259    Profile_Item *p = data;
260    free(p->profile);
261    free(p);
262 }
263 
264 static void
_basic_profile_list_fill(E_Config_Dialog_Data * cfdata,const char * prof_sel)265 _basic_profile_list_fill(E_Config_Dialog_Data *cfdata, const char *prof_sel)
266 {
267    Evas_Object *list = cfdata->profile_list_obj;
268    Eina_List *names = elm_config_profile_list_get();
269    Eina_List *l;
270    Elm_Object_Item *sel_it = NULL;
271    const char *profile;
272 
273    if (!names) return;
274 
275    elm_list_clear(list);
276 
277    if (!prof_sel)
278      {
279         elm_list_go(list);
280         elm_config_profile_list_free(names);
281         return;
282      }
283 
284    EINA_LIST_FOREACH(names, l, profile)
285      {
286         Efreet_Desktop *desk = NULL;
287         const char *label, *ext, *pdir;
288         char buf[PATH_MAX];
289         Elm_Object_Item *list_it;
290         Evas_Object *ic;
291         Profile_Item *p;
292 
293         pdir = elm_config_profile_dir_get(profile, EINA_TRUE);
294         if (!pdir) pdir = elm_config_profile_dir_get(profile, EINA_FALSE);
295 
296         snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
297         desk = efreet_desktop_new(buf);
298         if ((desk) && (desk->name)) label = desk->name;
299         else
300           {
301              if (desk) efreet_desktop_free(desk);
302              if (pdir) elm_config_profile_dir_free(pdir);
303 
304              pdir = elm_config_profile_dir_get(profile, EINA_FALSE);
305              snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
306              desk = efreet_desktop_new(buf);
307              if ((desk) && (desk->name)) label = desk->name;
308              else label = profile;
309           }
310 
311         buf[0] = 0;
312         if (pdir) snprintf(buf, sizeof(buf), "%s/icon.edj", pdir);
313         if ((desk) && (desk->icon) && (pdir))
314           snprintf(buf, sizeof(buf), "%s/%s", pdir, desk->icon);
315         ic = elm_icon_add(list);
316         ext = strrchr(buf, '.');
317         if (ext)
318           {
319              if (!strcmp(ext, ".edj")) elm_image_file_set(ic, buf, "icon");
320              else elm_image_file_set(ic, buf, NULL);
321           }
322 
323         evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL,
324                                          1, 1);
325         evas_object_show(ic);
326 
327         p = malloc(sizeof(Profile_Item));
328         p->profile = strdup(profile);
329         p->cfdata = cfdata;
330         list_it = elm_list_item_append(list, label, ic, NULL,
331                                        _profiles_list_selected_cb, p);
332         elm_object_item_del_cb_set(list_it, _profiles_list_item_del_cb);
333         if ((prof_sel) && (!strcmp(profile, prof_sel))) sel_it = list_it;
334 
335         elm_config_profile_dir_free(pdir);
336 
337         if (desk) efreet_desktop_free(desk);
338      }
339 
340    elm_list_go(list);
341 
342    if (sel_it) elm_list_item_selected_set(sel_it, EINA_TRUE);
343 
344    elm_config_profile_list_free(names);
345 }
346 
347 static void
_basic_screen_info_fill(E_Config_Dialog_Data * cfdata,E_Config_Randr2_Screen * cs,E_Randr2_Screen * s)348 _basic_screen_info_fill(E_Config_Dialog_Data *cfdata, E_Config_Randr2_Screen *cs, E_Randr2_Screen *s)
349 {
350    char buf[100];
351    Eina_List *items, *l;
352    E_Randr2_Mode *m;
353    Elm_Object_Item *it, *it_sel;
354    Elm_Widget_Item *iwt;
355    void *dt;
356 
357    if (!s) return;
358    // fill all the screen status info
359    elm_object_text_set(cfdata->name_obj, s->info.name);
360    elm_object_text_set(cfdata->screen_obj, s->info.screen);
361    elm_check_state_set(cfdata->lid_obj, s->info.is_lid);
362    elm_check_state_set(cfdata->backlight_obj, s->info.backlight);
363    snprintf(buf, sizeof(buf), "%imm x %imm", s->info.size.w, s->info.size.h);
364    elm_object_text_set(cfdata->size_obj, buf);
365    // XXX: connector
366 
367    EINA_LIST_FREE(cfdata->freelist, dt) free(dt);
368 
369    elm_list_clear(cfdata->modes_obj);
370    it_sel = NULL;
371    EINA_LIST_FOREACH(s->info.modes, l, m)
372      {
373         Mode_CBData *mode_cbdata = calloc(1, sizeof(Mode_CBData));
374 
375         if (mode_cbdata)
376           {
377              mode_cbdata->cfdata = cfdata;
378              mode_cbdata->mode = *m;
379              snprintf(buf, sizeof(buf), "%ix%i @ %1.2fHz", m->w, m->h, m->refresh);
380              it = elm_list_item_append(cfdata->modes_obj, buf, NULL, NULL, _cb_mode_set, mode_cbdata);
381              cfdata->freelist = eina_list_append(cfdata->freelist, mode_cbdata);
382              /* printf("mode add %p %p %p\n", mode_cbdata, cfdata->modes_obj, it); */
383              if ((cs->mode_w == m->w) && (cs->mode_h == m->h) &&
384                  (fabs(cs->mode_refresh - m->refresh) < 0.01 ))
385                it_sel = it;
386           }
387      }
388    if (it_sel) elm_list_item_selected_set(it_sel, EINA_TRUE);
389    elm_list_go(cfdata->modes_obj);
390 
391    elm_list_clear(cfdata->rotations_obj);
392    it_sel = NULL;
393    if (s->info.can_rot_0)
394      {
395         Rot_CBData *rot_cbdata = calloc(1, sizeof(Rot_CBData));
396         if (rot_cbdata)
397           {
398              rot_cbdata->cfdata = cfdata;
399              rot_cbdata->rot = 0;
400              it = elm_list_item_append(cfdata->rotations_obj, "0", NULL, NULL, _cb_rot_set, rot_cbdata);
401              cfdata->freelist = eina_list_append(cfdata->freelist, rot_cbdata);
402              if (cs->rotation == 0) it_sel = it;
403           }
404      }
405    if (s->info.can_rot_90)
406      {
407         Rot_CBData *rot_cbdata = calloc(1, sizeof(Rot_CBData));
408         if (rot_cbdata)
409           {
410              rot_cbdata->cfdata = cfdata;
411              rot_cbdata->rot = 90;
412              it = elm_list_item_append(cfdata->rotations_obj, "90", NULL, NULL, _cb_rot_set, rot_cbdata);
413              cfdata->freelist = eina_list_append(cfdata->freelist, rot_cbdata);
414              if (cs->rotation == 90) it_sel = it;
415           }
416      }
417    if (s->info.can_rot_180)
418      {
419         Rot_CBData *rot_cbdata = calloc(1, sizeof(Rot_CBData));
420         if (rot_cbdata)
421           {
422              rot_cbdata->cfdata = cfdata;
423              rot_cbdata->rot = 180;
424              it = elm_list_item_append(cfdata->rotations_obj, "180", NULL, NULL, _cb_rot_set, rot_cbdata);
425              cfdata->freelist = eina_list_append(cfdata->freelist, rot_cbdata);
426              if (cs->rotation == 180) it_sel = it;
427           }
428      }
429    if (s->info.can_rot_270)
430      {
431         Rot_CBData *rot_cbdata = calloc(1, sizeof(Rot_CBData));
432         if (rot_cbdata)
433           {
434              rot_cbdata->cfdata = cfdata;
435              rot_cbdata->rot = 270;
436              it = elm_list_item_append(cfdata->rotations_obj, "270", NULL, NULL, _cb_rot_set, rot_cbdata);
437              cfdata->freelist = eina_list_append(cfdata->freelist, rot_cbdata);
438              if (cs->rotation == 270) it_sel = it;
439           }
440      }
441    if (it_sel) elm_list_item_selected_set(it_sel, EINA_TRUE);
442    elm_list_go(cfdata->rotations_obj);
443 
444    elm_check_state_set(cfdata->enabled_obj, cs->enabled);
445 
446    elm_slider_value_set(cfdata->priority_obj, cs->priority);
447 
448    if (cs->rel_mode == E_RANDR2_RELATIVE_NONE)
449      elm_object_text_set(cfdata->rel_mode_obj, _("None"));
450    else if (cs->rel_mode == E_RANDR2_RELATIVE_CLONE)
451      elm_object_text_set(cfdata->rel_mode_obj, _("Clone"));
452    else if (cs->rel_mode == E_RANDR2_RELATIVE_TO_LEFT)
453      elm_object_text_set(cfdata->rel_mode_obj, _("Left of"));
454    else if (cs->rel_mode == E_RANDR2_RELATIVE_TO_RIGHT)
455      elm_object_text_set(cfdata->rel_mode_obj, _("Right of"));
456    else if (cs->rel_mode == E_RANDR2_RELATIVE_TO_ABOVE)
457      elm_object_text_set(cfdata->rel_mode_obj, _("Above"));
458    else if (cs->rel_mode == E_RANDR2_RELATIVE_TO_BELOW)
459      elm_object_text_set(cfdata->rel_mode_obj, _("Below"));
460    else
461      elm_object_text_set(cfdata->rel_mode_obj, _("Unconfigured"));
462 
463    elm_slider_value_set(cfdata->rel_align_obj, cs->rel_align);
464 
465    if (cs->profile)
466      {
467         elm_check_state_set(cfdata->use_profile_obj, EINA_TRUE);
468         elm_object_disabled_set(cfdata->profile_list_obj, EINA_FALSE);
469         elm_object_disabled_set(cfdata->scale_custom_obj, EINA_FALSE);
470 
471         _basic_profile_list_fill(cfdata, cs->profile);
472 
473         if (cs->scale_multiplier > 0.0)
474           {
475              elm_check_state_set(cfdata->scale_custom_obj, EINA_TRUE);
476              elm_object_disabled_set(cfdata->scale_value_obj, EINA_FALSE);
477              elm_slider_value_set(cfdata->scale_value_obj,
478                                   _scale_for_multiplier(cs->scale_multiplier));
479           }
480         else
481           {
482              elm_check_state_set(cfdata->scale_custom_obj, EINA_FALSE);
483              elm_object_disabled_set(cfdata->scale_value_obj, EINA_TRUE);
484              elm_slider_value_set(cfdata->scale_value_obj, elm_config_scale_get());
485           }
486      }
487    else
488      {
489         items = (Eina_List *)elm_list_items_get(cfdata->profile_list_obj);
490         EINA_LIST_FOREACH(items, l, iwt)
491           {
492              elm_list_item_selected_set(iwt, EINA_FALSE);
493           }
494         elm_check_state_set(cfdata->use_profile_obj, EINA_FALSE);
495         elm_object_disabled_set(cfdata->profile_list_obj, EINA_TRUE);
496         elm_object_disabled_set(cfdata->scale_custom_obj, EINA_TRUE);
497         elm_object_disabled_set(cfdata->scale_value_obj, EINA_TRUE);
498      }
499 
500    if (!cs->rel_to)
501      elm_object_text_set(cfdata->rel_to_obj, "");
502    else
503      {
504         char *str = strdup(cs->rel_to);
505         if (str)
506           {
507              char *p = strchr(str, '/');
508              if (p)
509                {
510                   *p = 0;
511                   elm_object_text_set(cfdata->rel_to_obj, str);
512                }
513              free(str);
514           }
515      }
516 }
517 
518 static void
_cb_screen_select(void * data,Evas_Object * obj,void * event)519 _cb_screen_select(void *data, Evas_Object *obj, void *event)
520 {
521    E_Config_Dialog_Data *cfdata = data;
522    Elm_Object_Item *it;
523    Eina_List *l;
524    int i = 0;
525 
526    EINA_LIST_FOREACH(cfdata->screen_items, l, it)
527      {
528         if (it == event)
529           {
530              E_Config_Randr2_Screen *cs;
531              cfdata->screen = i;
532              cs = _config_screen_find(cfdata);
533              if (cs)
534                {
535                   E_Randr2_Screen *s = _screen_config_find(cs);
536                   if (s)
537                     {
538                        elm_object_text_set(obj, s->info.name);
539                        _basic_screen_info_fill(cfdata, cs, s);
540                     }
541                }
542              e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
543              return;
544           }
545         i++;
546      }
547 }
548 
549 static void
_cb_rel_to_set(void * data,Evas_Object * obj,void * event)550 _cb_rel_to_set(void *data, Evas_Object *obj, void *event)
551 {
552    E_Config_Dialog_Data *cfdata = data;
553    Elm_Object_Item *it;
554    Eina_List *l;
555    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
556    if (!cs) return;
557    int i = 0;
558 
559    EINA_LIST_FOREACH(cfdata->screen_items2, l, it)
560      {
561         if (it == event)
562           {
563              E_Config_Randr2_Screen *cs2 = _config_screen_n_find(cfdata, i);
564              if (cs2)
565                {
566                   printf("find cs = %p\n", cs2);
567                   printf("cs id = %s\n", cs2->id);
568                }
569              if (cs2 == cs) return;
570              if (cs2)
571                {
572                   E_Randr2_Screen *s = _screen_config_id_find(cs2->id);
573                   if (s)
574                     {
575                        printf("Set to %p [%s]\n", cs, cs->id);
576                        printf("find s = %p\n", s);
577                        printf("s id = %s\n", s->id);
578                        elm_object_text_set(obj, s->info.name);
579                        eina_stringshare_replace(&cs->rel_to, s->id);
580                     }
581                }
582              e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
583              return;
584           }
585         i++;
586      }
587 }
588 
589 static void
_cb_profile_enabled_changed(void * data,Evas_Object * obj EINA_UNUSED,void * event EINA_UNUSED)590 _cb_profile_enabled_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
591 {
592    E_Config_Dialog_Data *cfdata = data;
593    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
594    if (!cs) return;
595    if (elm_check_state_get(obj))
596      {
597         eina_stringshare_del(cs->profile);
598         cs->profile = eina_stringshare_add("standard");
599         _basic_profile_list_fill(cfdata, cs->profile);
600         elm_object_disabled_set(cfdata->profile_list_obj, EINA_FALSE);
601         elm_object_disabled_set(cfdata->scale_custom_obj, EINA_FALSE);
602         if (cs->scale_multiplier > 0.0)
603           elm_object_disabled_set(cfdata->scale_value_obj, EINA_FALSE);
604         else
605           elm_object_disabled_set(cfdata->scale_value_obj, EINA_TRUE);
606      }
607    else
608      {
609         eina_stringshare_del(cs->profile);
610         cs->profile = NULL;
611         elm_list_clear(cfdata->profile_list_obj);
612         elm_object_disabled_set(cfdata->profile_list_obj, EINA_TRUE);
613         elm_object_disabled_set(cfdata->scale_custom_obj, EINA_TRUE);
614         elm_object_disabled_set(cfdata->scale_value_obj, EINA_TRUE);
615      }
616    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
617 }
618 
619 static void
_cb_custom_scale_changed(void * data,Evas_Object * obj EINA_UNUSED,void * event EINA_UNUSED)620 _cb_custom_scale_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
621 {
622    E_Config_Dialog_Data *cfdata = data;
623    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
624    if (!cs) return;
625 
626    elm_slider_value_set(cfdata->scale_value_obj, elm_config_scale_get());
627    if (elm_check_state_get(obj))
628      {
629         elm_object_disabled_set(cfdata->scale_value_obj, EINA_FALSE);
630         cs->scale_multiplier = 1.0;
631      }
632    else
633      {
634         elm_object_disabled_set(cfdata->scale_value_obj, EINA_TRUE);
635         cs->scale_multiplier = 0.0;
636      }
637    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
638 }
639 
640 static void
_cb_scale_value_changed(void * data,Evas_Object * obj EINA_UNUSED,void * event EINA_UNUSED)641 _cb_scale_value_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
642 {
643    E_Config_Dialog_Data *cfdata = data;
644    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
645    if (!cs) return;
646    cs->scale_multiplier =
647      _multiplier_for_scale(elm_slider_value_get(cfdata->scale_value_obj));
648    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
649 }
650 
651 static void
_cb_rel_align_changed(void * data,Evas_Object * obj EINA_UNUSED,void * event EINA_UNUSED)652 _cb_rel_align_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
653 {
654    E_Config_Dialog_Data *cfdata = data;
655    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
656    if (!cs) return;
657    cs->rel_align = elm_slider_value_get(obj);
658    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
659 }
660 
661 static void
_cb_rel_mode_none(void * data,Evas_Object * obj,void * event EINA_UNUSED)662 _cb_rel_mode_none(void *data, Evas_Object *obj, void *event EINA_UNUSED)
663 {
664    E_Config_Dialog_Data *cfdata = data;
665    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
666    if (!cs) return;
667    cs->rel_mode = E_RANDR2_RELATIVE_NONE;
668    elm_object_text_set(obj, _("None"));
669    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
670 }
671 
672 static void
_cb_rel_mode_clone(void * data,Evas_Object * obj,void * event EINA_UNUSED)673 _cb_rel_mode_clone(void *data, Evas_Object *obj, void *event EINA_UNUSED)
674 {
675    E_Config_Dialog_Data *cfdata = data;
676    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
677    if (!cs) return;
678    cs->rel_mode = E_RANDR2_RELATIVE_CLONE;
679    elm_object_text_set(obj, _("Clone"));
680    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
681 }
682 
683 static void
_cb_rel_mode_left_of(void * data,Evas_Object * obj,void * event EINA_UNUSED)684 _cb_rel_mode_left_of(void *data, Evas_Object *obj, void *event EINA_UNUSED)
685 {
686    E_Config_Dialog_Data *cfdata = data;
687    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
688    if (!cs) return;
689    cs->rel_mode = E_RANDR2_RELATIVE_TO_LEFT;
690    elm_object_text_set(obj, _("Left of"));
691    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
692 }
693 
694 static void
_cb_rel_mode_right_of(void * data,Evas_Object * obj,void * event EINA_UNUSED)695 _cb_rel_mode_right_of(void *data, Evas_Object *obj, void *event EINA_UNUSED)
696 {
697    E_Config_Dialog_Data *cfdata = data;
698    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
699    if (!cs) return;
700    cs->rel_mode = E_RANDR2_RELATIVE_TO_RIGHT;
701    elm_object_text_set(obj, _("Right of"));
702    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
703 }
704 
705 static void
_cb_rel_mode_above(void * data,Evas_Object * obj,void * event EINA_UNUSED)706 _cb_rel_mode_above(void *data, Evas_Object *obj, void *event EINA_UNUSED)
707 {
708    E_Config_Dialog_Data *cfdata = data;
709    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
710    if (!cs) return;
711    cs->rel_mode = E_RANDR2_RELATIVE_TO_ABOVE;
712    elm_object_text_set(obj, _("Above"));
713    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
714 }
715 
716 static void
_cb_rel_mode_below(void * data,Evas_Object * obj,void * event EINA_UNUSED)717 _cb_rel_mode_below(void *data, Evas_Object *obj, void *event EINA_UNUSED)
718 {
719    E_Config_Dialog_Data *cfdata = data;
720    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
721    if (!cs) return;
722    cs->rel_mode = E_RANDR2_RELATIVE_TO_BELOW;
723    elm_object_text_set(obj, _("Below"));
724    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
725 }
726 
727 static void
_cb_priority_changed(void * data,Evas_Object * obj EINA_UNUSED,void * event EINA_UNUSED)728 _cb_priority_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
729 {
730    E_Config_Dialog_Data *cfdata = data;
731    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
732    if (!cs) return;
733    cs->priority = elm_slider_value_get(obj);
734    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
735 }
736 
737 static void
_cb_enabled_changed(void * data,Evas_Object * obj,void * event EINA_UNUSED)738 _cb_enabled_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
739 {
740    E_Config_Dialog_Data *cfdata = data;
741    E_Config_Randr2_Screen *cs = _config_screen_find(cfdata);
742    if (!cs) return;
743    cs->enabled = elm_check_state_get(obj);
744    printf("RR: enabled = %i\n", cs->enabled);
745    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
746 }
747 
748 static void
_policy_text_update(E_Config_Dialog_Data * cfdata)749 _policy_text_update(E_Config_Dialog_Data *cfdata)
750 {
751    char pbuf[128];
752    const char *policy[] =
753    {
754       _("Ignore"),
755       _("Extend"),
756       _("Clone"),
757       _("Ask")
758    };
759 
760    snprintf(pbuf, sizeof(pbuf), _("Hotplug Policy (%s)"), policy[cfdata->policy]);
761    elm_object_text_set(cfdata->policy_obj, pbuf);
762 }
763 
764 static void
_cb_policy_ignore(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)765 _cb_policy_ignore(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
766 {
767    E_Config_Dialog_Data *cfdata = data;
768 
769    if (cfdata->policy == E_RANDR2_POLICY_NONE) return;
770    cfdata->policy = E_RANDR2_POLICY_NONE;
771    _policy_text_update(cfdata);
772    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
773 }
774 
775 static void
_cb_policy_ask(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)776 _cb_policy_ask(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
777 {
778    E_Config_Dialog_Data *cfdata = data;
779 
780    if (cfdata->policy == E_RANDR2_POLICY_ASK) return;
781    cfdata->policy = E_RANDR2_POLICY_ASK;
782    _policy_text_update(cfdata);
783    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
784 }
785 
786 static void
_cb_policy_extend(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)787 _cb_policy_extend(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
788 {
789    E_Config_Dialog_Data *cfdata = data;
790 
791    if (cfdata->policy == E_RANDR2_POLICY_EXTEND) return;
792    cfdata->policy = E_RANDR2_POLICY_EXTEND;
793    _policy_text_update(cfdata);
794    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
795 }
796 
797 static void
_cb_policy_clone(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)798 _cb_policy_clone(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
799 {
800    E_Config_Dialog_Data *cfdata = data;
801 
802    if (cfdata->policy == E_RANDR2_POLICY_CLONE) return;
803    cfdata->policy = E_RANDR2_POLICY_CLONE;
804    _policy_text_update(cfdata);
805    e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
806 }
807 
808 static Evas_Object *
_basic_create(E_Config_Dialog * cfd,Evas * evas EINA_UNUSED,E_Config_Dialog_Data * cfdata)809 _basic_create(E_Config_Dialog *cfd, Evas *evas EINA_UNUSED, E_Config_Dialog_Data *cfdata)
810 {
811    Evas_Object *win = cfd->dia->win;
812    Evas_Object *o, *bx, *tb, *bx2;
813    Eina_List *l;
814    E_Randr2_Screen *s, *first = NULL;
815    E_Config_Randr2_Screen *first_cfg = NULL;
816    int i;
817 
818    e_dialog_resizable_set(cfd->dia, 1);
819 
820    o = elm_box_add(win);
821    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
822    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
823    evas_object_show(o);
824    bx = o;
825 
826 ///////////////////////////////////////////////////////////////////////
827    o = elm_table_add(win);
828    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
829    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
830    elm_box_pack_end(bx, o);
831    evas_object_show(o);
832    tb = o;
833 
834    o = elm_hoversel_add(win);
835    evas_object_size_hint_weight_set(o, 0.0, 0.0);
836    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
837    elm_object_text_set(o, _("Outputs"));
838    cfdata->screens = NULL;
839    cfdata->screen_items = NULL;
840    i = 0;
841    EINA_LIST_FOREACH(e_randr2->screens, l, s)
842      {
843         Elm_Object_Item *it = NULL;
844 
845         if (s->info.connected)
846           {
847              E_Config_Randr2_Screen *cs;
848 
849              cs = calloc(1, sizeof(E_Config_Randr2_Screen));
850              if (cs)
851                {
852                   if (s->id)
853                     cs->id = eina_stringshare_add(s->id);
854                   if (s->config.relative.to)
855                     cs->rel_to = eina_stringshare_add(s->config.relative.to);
856                   cs->rel_align = s->config.relative.align;
857                   cs->mode_refresh = s->config.mode.refresh;
858                   cs->mode_w = s->config.mode.w;
859                   cs->mode_h = s->config.mode.h;
860                   cs->rotation = s->config.rotation;
861                   cs->priority = s->config.priority;
862                   cs->rel_mode = s->config.relative.mode;
863                   cs->enabled = s->config.enabled;
864                   if (s->config.profile)
865                     cs->profile = eina_stringshare_add(s->config.profile);
866                   cs->scale_multiplier = s->config.scale_multiplier;
867                   cfdata->screens = eina_list_append(cfdata->screens, cs);
868                   it = elm_hoversel_item_add(o, s->info.name,
869                                              NULL, ELM_ICON_NONE,
870                                              _cb_screen_select, cfdata);
871                   if (cfdata->params)
872                     {
873                        if ((s->info.name) &&
874                            (!strcmp(s->info.name, cfdata->params)) &&
875                            (!first))
876                          {
877                             first = s;
878                             first_cfg = cs;
879                             cfdata->screen = i;
880                             elm_object_text_set(o, s->info.name);
881                           }
882                     }
883                   else
884                     {
885                        if (!first)
886                          {
887                             first = s;
888                             first_cfg = cs;
889                             cfdata->screen = i;
890                             elm_object_text_set(o, s->info.name);
891                          }
892                     }
893                   cfdata->screen_items = eina_list_append(cfdata->screen_items, it);
894                   i++;
895                }
896           }
897      }
898    elm_table_pack(tb, o, 0, 0, 1, 1);
899    evas_object_show(o);
900 
901    o = elm_entry_add(win);
902    elm_entry_scrollable_set(o, EINA_TRUE);
903    elm_entry_single_line_set(o, EINA_TRUE);
904    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
905    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
906    elm_table_pack(tb, o, 0, 1, 1, 1);
907    evas_object_show(o);
908    cfdata->name_obj = o;
909 
910    o = elm_entry_add(win);
911    elm_entry_scrollable_set(o, EINA_TRUE);
912    elm_entry_single_line_set(o, EINA_TRUE);
913    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
914    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
915    elm_table_pack(tb, o, 0, 2, 1, 1);
916    evas_object_show(o);
917    cfdata->screen_obj = o;
918 
919    o = elm_check_add(win);
920    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
921    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
922    elm_object_text_set(o, _("Laptop lid"));
923    elm_table_pack(tb, o, 0, 3, 1, 1);
924    evas_object_show(o);
925    cfdata->lid_obj = o;
926 
927    o = elm_check_add(win);
928    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
929    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
930    elm_object_text_set(o, _("Backlight"));
931    elm_table_pack(tb, o, 0, 4, 1, 1);
932    evas_object_show(o);
933    cfdata->backlight_obj = o;
934 
935    o = elm_label_add(win);
936    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
937    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
938    elm_table_pack(tb, o, 0, 5, 1, 1);
939    evas_object_show(o);
940    cfdata->size_obj = o;
941 
942 ///////////////////////////////////////////////////////////////////////
943    o = elm_list_add(win);
944    elm_scroller_content_min_limit(o, 1, 0);
945    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
946    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
947    elm_table_pack(tb, o, 1, 0, 1, 14);
948    evas_object_show(o);
949    cfdata->modes_obj = o;
950 
951 ///////////////////////////////////////////////////////////////////////
952    o = elm_list_add(win);
953    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
954    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
955    elm_table_pack(tb, o, 2, 0, 1, 4);
956    evas_object_show(o);
957    cfdata->rotations_obj = o;
958 
959    o = elm_check_add(win);
960    evas_object_size_hint_weight_set(o, 0.0, 0.0);
961    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
962    elm_object_text_set(o, _("On"));
963    elm_table_pack(tb, o, 2, 4, 1, 1);
964    evas_object_show(o);
965    evas_object_smart_callback_add(o, "changed", _cb_enabled_changed, cfdata);
966    cfdata->enabled_obj = o;
967 
968    o = elm_slider_add(win);
969    evas_object_size_hint_weight_set(o, 0.0, 0.0);
970    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
971    elm_object_text_set(o, _("Priority"));
972    elm_slider_unit_format_set(o, "%3.0f");
973    elm_slider_span_size_set(o, 100);
974    elm_slider_min_max_set(o, 0, 100);
975    elm_table_pack(tb, o, 2, 5, 1, 1);
976    evas_object_show(o);
977    evas_object_smart_callback_add(o, "changed", _cb_priority_changed, cfdata);
978    cfdata->priority_obj = o;
979 
980    o = elm_hoversel_add(win);
981    evas_object_size_hint_weight_set(o, 0.0, 0.0);
982    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
983    elm_object_text_set(o, _("Relative"));
984    elm_hoversel_item_add(o, _("None"), NULL, ELM_ICON_NONE, _cb_rel_mode_none, cfdata);
985    elm_hoversel_item_add(o, _("Clone"), NULL, ELM_ICON_NONE, _cb_rel_mode_clone, cfdata);
986    elm_hoversel_item_add(o, _("Left of"), NULL, ELM_ICON_NONE, _cb_rel_mode_left_of, cfdata);
987    elm_hoversel_item_add(o, _("Right of"), NULL, ELM_ICON_NONE, _cb_rel_mode_right_of, cfdata);
988    elm_hoversel_item_add(o, _("Above"), NULL, ELM_ICON_NONE, _cb_rel_mode_above, cfdata);
989    elm_hoversel_item_add(o, _("Below"), NULL, ELM_ICON_NONE, _cb_rel_mode_below, cfdata);
990    elm_table_pack(tb, o, 2, 6, 1, 1);
991    evas_object_show(o);
992    cfdata->rel_mode_obj = o;
993 
994    o = elm_hoversel_add(win);
995    evas_object_size_hint_weight_set(o, 0.0, 0.0);
996    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
997    elm_object_text_set(o, _("To"));
998    EINA_LIST_FOREACH(e_randr2->screens, l, s)
999      {
1000         Elm_Object_Item *it = NULL;
1001 
1002         if (s->info.connected)
1003           {
1004              it = elm_hoversel_item_add(o, s->info.name,
1005                                         NULL, ELM_ICON_NONE,
1006                                         _cb_rel_to_set, cfdata);
1007              cfdata->screen_items2 = eina_list_append(cfdata->screen_items2, it);
1008           }
1009      }
1010    elm_table_pack(tb, o, 2, 7, 1, 1);
1011    evas_object_show(o);
1012    cfdata->rel_to_obj = o;
1013 
1014    o = elm_slider_add(win);
1015    evas_object_size_hint_weight_set(o, 0.0, 0.0);
1016    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
1017    elm_object_text_set(o, _("Align"));
1018    elm_slider_unit_format_set(o, "%1.1f");
1019    elm_slider_span_size_set(o, 100);
1020    elm_slider_min_max_set(o, 0.0, 1.0);
1021    elm_table_pack(tb, o, 2, 8, 1, 1);
1022    evas_object_show(o);
1023    evas_object_smart_callback_add(o, "changed", _cb_rel_align_changed, cfdata);
1024    cfdata->rel_align_obj = o;
1025 
1026    // // // // // // // // // // // // // // // // // // // // // // //
1027    o = elm_separator_add(win);
1028    elm_separator_horizontal_set(o, EINA_TRUE);
1029    evas_object_size_hint_weight_set(o, 0.0, 0.0);
1030    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
1031    elm_table_pack(tb, o, 2, 9, 1, 1);
1032    evas_object_show(o);
1033 
1034    o = elm_check_add(win);
1035    evas_object_size_hint_weight_set(o, 0.0, 0.0);
1036    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
1037    elm_object_text_set(o, _("Use Profile"));
1038    elm_table_pack(tb, o, 2, 10, 1, 1);
1039    evas_object_show(o);
1040    cfdata->use_profile_obj = o;
1041    evas_object_smart_callback_add(o, "changed", _cb_profile_enabled_changed, cfdata);
1042 
1043    o = elm_list_add(win);
1044    evas_object_size_hint_weight_set(o, 0.0, EVAS_HINT_EXPAND);
1045    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
1046    elm_table_pack(tb, o, 2, 11, 1, 1);
1047    evas_object_show(o);
1048    cfdata->profile_list_obj = o;
1049 
1050    o = elm_check_add(win);
1051    evas_object_size_hint_weight_set(o, 0.0, 0.0);
1052    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
1053    elm_object_text_set(o, _("Custom Scale"));
1054    elm_table_pack(tb, o, 2, 12, 1, 1);
1055    evas_object_show(o);
1056    cfdata->scale_custom_obj = o;
1057    evas_object_smart_callback_add(o, "changed", _cb_custom_scale_changed, cfdata);
1058 
1059    o = elm_slider_add(win);
1060    evas_object_size_hint_weight_set(o, 0.0, 0.0);
1061    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
1062    elm_object_text_set(o, _("Scale"));
1063    elm_slider_unit_format_set(o, "%1.1f");
1064    elm_slider_span_size_set(o, 100);
1065    elm_slider_min_max_set(o, 0.5, 5.5);
1066    elm_slider_value_set(o, elm_config_scale_get());
1067    elm_table_pack(tb, o, 2, 13, 1, 1);
1068    evas_object_show(o);
1069    cfdata->scale_value_obj = o;
1070    evas_object_smart_callback_add(o, "changed", _cb_scale_value_changed, cfdata);
1071 
1072    _basic_profile_list_fill(cfdata, NULL);
1073    _basic_screen_info_fill(cfdata, first_cfg, first);
1074 ///////////////////////////////////////////////////////////////////////
1075 
1076    o = elm_box_add(win);
1077    elm_box_horizontal_set(o, EINA_TRUE);
1078    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
1079    evas_object_size_hint_align_set(o, 0.0, EVAS_HINT_FILL);
1080    elm_box_pack_end(bx, o);
1081    evas_object_show(o);
1082    bx2 = o;
1083 
1084    o = elm_check_add(win);
1085    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
1086    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
1087    elm_object_text_set(o, _("Restore setup on start"));
1088    elm_check_state_set(o, cfdata->restore);
1089    elm_box_pack_end(bx2, o);
1090    evas_object_show(o);
1091    evas_object_smart_callback_add(o, "changed", _cb_restore_changed, cfdata);
1092 
1093    o = elm_check_add(win);
1094    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
1095    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
1096    elm_object_text_set(o, _("Monitor hotplug"));
1097    elm_check_state_set(o, cfdata->hotplug);
1098    elm_box_pack_end(bx2, o);
1099    evas_object_show(o);
1100    evas_object_smart_callback_add(o, "changed", _cb_hotplug_changed, cfdata);
1101 
1102    o = elm_check_add(win);
1103    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
1104    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
1105    elm_object_text_set(o, _("Lid Events"));
1106    elm_check_state_set(o, cfdata->acpi);
1107    elm_box_pack_end(bx2, o);
1108    evas_object_show(o);
1109    evas_object_smart_callback_add(o, "changed", _cb_acpi_changed, cfdata);
1110 
1111    cfdata->policy_obj = o = elm_hoversel_add(win);
1112    evas_object_size_hint_weight_set(o, 0.0, 0.0);
1113    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
1114    _policy_text_update(cfdata);
1115    elm_hoversel_item_add(o, _("Clone"), NULL, ELM_ICON_NONE, _cb_policy_clone, cfdata);
1116    elm_hoversel_item_add(o, _("Extend"), NULL, ELM_ICON_NONE, _cb_policy_extend, cfdata);
1117    elm_hoversel_item_add(o, _("Ask"), NULL, ELM_ICON_NONE, _cb_policy_ask, cfdata);
1118    elm_hoversel_item_add(o, _("Ignore"), NULL, ELM_ICON_NONE, _cb_policy_ignore, cfdata);
1119    elm_box_pack_end(bx2, o);
1120    evas_object_show(o);
1121 
1122    evas_smart_objects_calculate(evas_object_evas_get(win));
1123 
1124    e_util_win_auto_resize_fill(win);
1125    elm_win_center(win, 1, 1);
1126    cfdata->cfd = cfd;
1127    return bx;
1128 }
1129 
1130 static int
_basic_apply(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)1131 _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
1132 {
1133    Eina_List *l;
1134    E_Config_Randr2_Screen *cs, *cs2;
1135 
1136    e_randr2_cfg->restore = cfdata->restore;
1137    e_randr2_cfg->ignore_hotplug_events = !cfdata->hotplug;
1138    e_randr2_cfg->ignore_acpi_events = !cfdata->acpi;
1139    e_randr2_cfg->default_policy = cfdata->policy;
1140 
1141    printf("APPLY....................\n");
1142    EINA_LIST_FOREACH(cfdata->screens, l, cs2)
1143      {
1144         if (!cs2->id) continue;
1145         printf("APPLY .... %p\n", cs2);
1146         cs = _screen_config_randr_id_find(cs2->id);
1147         if (!cs)
1148           {
1149              cs = calloc(1, sizeof(E_Config_Randr2_Screen));
1150              cs->id = eina_stringshare_add(cs2->id);
1151              e_randr2_cfg->screens = eina_list_append(e_randr2_cfg->screens, cs);
1152           }
1153         if (cs->rel_to) eina_stringshare_del(cs->rel_to);
1154         cs->rel_to = NULL;
1155         printf("APPLY %s .... rel to %s\n", cs->id, cs2->rel_to);
1156         if (cs2->rel_to) cs->rel_to = eina_stringshare_add(cs2->rel_to);
1157         cs->rel_align = cs2->rel_align;
1158         cs->mode_w = cs2->mode_w;
1159         cs->mode_h = cs2->mode_h;
1160         cs->mode_refresh = cs2->mode_refresh;
1161         cs->rotation = cs2->rotation;
1162         cs->priority = cs2->priority;
1163         cs->rel_mode = cs2->rel_mode;
1164         if (cs->profile) eina_stringshare_del(cs->profile);
1165         cs->profile = NULL;
1166         if (cs2->profile) cs->profile = eina_stringshare_add(cs2->profile);
1167         cs->scale_multiplier = cs2->scale_multiplier;
1168         printf("APPLY %s .... rel mode %i\n", cs->id, cs->rel_mode);
1169         cs->enabled = cs2->enabled;
1170      }
1171    e_randr2_config_save();
1172    e_randr2_config_apply();
1173    return 1;
1174 }
1175 
1176 static int
_basic_check(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata EINA_UNUSED)1177 _basic_check(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata EINA_UNUSED)
1178 {
1179    return 1;
1180 }
1181