update for beta release
[framework/uifw/e17.git] / src / modules / conf_randr / e_int_config_randr_policies.c
1 #include "e_int_config_randr.h"
2 #include "e_randr.h"
3
4 #ifndef  ECORE_X_RANDR_1_2
5 #define ECORE_X_RANDR_1_2   ((1 << 16) | 2)
6 #endif
7 #ifndef  ECORE_X_RANDR_1_3
8 #define ECORE_X_RANDR_1_3   ((1 << 16) | 3)
9 #endif
10
11 #ifndef  Ecore_X_Randr_Unset
12 #define Ecore_X_Randr_Unset -1
13 #endif
14
15 Evas_Object *dialog_subdialog_policies_basic_create_widgets(Evas *canvas);
16 Eina_Bool    dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
17 Eina_Bool    dialog_subdialog_policies_basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
18 Eina_Bool    dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
19 void         dialog_subdialog_policies_update_radio_buttons(Evas_Object *crtc);
20
21 static void  _dialog_subdialog_policies_policy_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
22 extern E_Config_Dialog_Data *e_config_runtime_info;
23 extern char _theme_file_path[];
24
25 /*
26    static void
27    _dialog_subdialog_policies_radio_add_callbacks(void)
28    {
29    evas_object_event_callback_add(e_config_runtime_info->gui.subdialogs.policies.radio_none, EVAS_CALLBACK_MOUSE_UP, _dialog_subdialog_policies_policy_mouse_up_cb, NULL);
30    evas_object_event_callback_add(e_config_runtime_info->gui.subdialogs.policies.radio_clone, EVAS_CALLBACK_MOUSE_UP, _dialog_subdialog_policies_policy_mouse_up_cb, NULL);
31    evas_object_event_callback_add(e_config_runtime_info->gui.subdialogs.policies.radio_left, EVAS_CALLBACK_MOUSE_UP, _dialog_subdialog_policies_policy_mouse_up_cb, NULL);
32    evas_object_event_callback_add(e_config_runtime_info->gui.subdialogs.policies.radio_below, EVAS_CALLBACK_MOUSE_UP, _dialog_subdialog_policies_policy_mouse_up_cb, NULL);
33    evas_object_event_callback_add(e_config_runtime_info->gui.subdialogs.policies.radio_above, EVAS_CALLBACK_MOUSE_UP, _dialog_subdialog_policies_policy_mouse_up_cb, NULL);
34    evas_object_event_callback_add(e_config_runtime_info->gui.subdialogs.policies.radio_right, EVAS_CALLBACK_MOUSE_UP, _dialog_subdialog_policies_policy_mouse_up_cb, NULL);
35    }
36  */
37
38 Eina_Bool
39 dialog_subdialog_policies_create_data(E_Config_Dialog_Data *e_config_runtime_info)
40 {
41    E_Config_Randr_Dialog_Output_Dialog_Data *odd;
42    Eina_List *iter;
43
44    if (!e_config_runtime_info || !e_config_runtime_info->output_dialog_data_list) return EINA_FALSE;
45
46    EINA_LIST_FOREACH(e_config_runtime_info->output_dialog_data_list, iter, odd)
47      {
48         E_Randr_Output_Info *oi;
49         if (odd->crtc)
50           oi = eina_list_data_get(eina_list_last(odd->crtc->outputs));
51         else if (odd->output)
52           oi = odd->output;
53         else continue;
54         odd->previous_policy = oi->policy;
55         odd->new_policy = Ecore_X_Randr_Unset;
56      }
57
58    return EINA_TRUE;
59 }
60
61 Evas_Object *
62 dialog_subdialog_policies_basic_create_widgets(Evas *canvas)
63 {
64    Evas_Object *subdialog;
65    E_Radio_Group *rg;
66    //char signal[29];
67
68    if (!canvas || !e_config_runtime_info) return NULL;
69
70    if (e_config_runtime_info->gui.subdialogs.policies.dialog) return e_config_runtime_info->gui.subdialogs.policies.dialog;
71
72    if (!(subdialog = e_widget_framelist_add(canvas, _("Screen attachement policy"), EINA_FALSE))) return NULL;
73
74    // Add radio buttons
75    if (!(rg = e_widget_radio_group_new(&e_config_runtime_info->gui.subdialogs.policies.radio_val))) goto _dialog_subdialog_policies_radio_add_fail;
76
77    //IMPROVABLE: use enum to determine objects via 'switch'-statement
78    e_config_runtime_info->gui.subdialogs.policies.radio_above = e_widget_radio_add(canvas, _("Above"), ECORE_X_RANDR_OUTPUT_POLICY_ABOVE, rg);
79    e_widget_framelist_object_append(subdialog, e_config_runtime_info->gui.subdialogs.policies.radio_above);
80
81    e_config_runtime_info->gui.subdialogs.policies.radio_right = e_widget_radio_add(canvas, _("Right"), ECORE_X_RANDR_OUTPUT_POLICY_RIGHT, rg);
82    e_widget_framelist_object_append(subdialog, e_config_runtime_info->gui.subdialogs.policies.radio_right);
83
84    e_config_runtime_info->gui.subdialogs.policies.radio_below = e_widget_radio_add(canvas, _("Below"), ECORE_X_RANDR_OUTPUT_POLICY_BELOW, rg);
85    e_widget_framelist_object_append(subdialog, e_config_runtime_info->gui.subdialogs.policies.radio_below);
86
87    e_config_runtime_info->gui.subdialogs.policies.radio_left = e_widget_radio_add(canvas, _("Left"), ECORE_X_RANDR_OUTPUT_POLICY_LEFT, rg);
88    e_widget_framelist_object_append(subdialog, e_config_runtime_info->gui.subdialogs.policies.radio_left);
89
90    e_config_runtime_info->gui.subdialogs.policies.radio_clone = e_widget_radio_add(canvas, _("Clone display content"), ECORE_X_RANDR_OUTPUT_POLICY_CLONE, rg);
91    e_widget_framelist_object_append(subdialog, e_config_runtime_info->gui.subdialogs.policies.radio_clone);
92
93    e_config_runtime_info->gui.subdialogs.policies.radio_none = e_widget_radio_add(canvas, _("No reaction"), ECORE_X_RANDR_OUTPUT_POLICY_NONE, rg);
94    e_widget_framelist_object_append(subdialog, e_config_runtime_info->gui.subdialogs.policies.radio_none);
95
96    //_dialog_subdialog_policies_radio_add_callbacks();
97
98    /*
99       // Add policies demonstration edje
100       if (!(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje = edje_object_add(canvas)))
101       {
102         goto _dialog_subdialog_policies_edje_add_fail;
103
104       }
105       if (!edje_object_file_set(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje, _theme_file_path, "e/conf/randr/dialog/subdialog/policies"))
106       {
107         goto _dialog_subdialog_policies_edje_set_fail;
108       }
109
110       e_widget_table_object_align_append(subdialog, e_config_runtime_info->gui.subdialogs.policies.swallowing_edje, 1, 0, 1, 1, 1, 1, 1, 1, 1.0, 1.0);
111     */
112
113    /*
114       evas_object_show(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje);
115
116       //emit signal to edje so a demonstration can be shown
117       snprintf(signal, sizeof(signal), "conf,randr,dialog,policies,%d", e_randr_screen_info->rrvd_info.randr_info_12->output_policy);
118       edje_object_signal_emit(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje, signal, "e");
119       fprintf(stderr, "CONF_RANDR: Initial signal emitted to policy dialog: %s\n", signal);
120
121       //Use theme's background as screen representation
122       e_config_runtime_info->gui.subdialogs.policies.new_display = edje_object_add(canvas);
123       e_theme_edje_object_set(e_config_runtime_info->gui.subdialogs.policies.new_display, "base/theme/widgets", "e/widgets/frame");
124       e_config_runtime_info->gui.subdialogs.policies.new_display_background = edje_object_add(canvas);
125       e_theme_edje_object_set(e_config_runtime_info->gui.subdialogs.policies.new_display_background, "base/theme/background", "e/desktop/background");
126       edje_object_part_swallow(e_config_runtime_info->gui.subdialogs.policies.new_display, "e.swallow.content", e_config_runtime_info->gui.subdialogs.policies.new_display_background);
127       edje_object_part_text_set(e_config_runtime_info->gui.subdialogs.policies.new_display, "e.text.label", _("New display"));
128       edje_object_part_swallow(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje, "new_display.swallow.content", e_config_runtime_info->gui.subdialogs.policies.new_display);
129       //add theme's frame
130       //for now use the theme's background for the new display as well
131       e_config_runtime_info->gui.subdialogs.policies.current_displays_setup = edje_object_add(canvas);
132       e_theme_edje_object_set(e_config_runtime_info->gui.subdialogs.policies.current_displays_setup, "base/theme/widgets", "e/widgets/frame");
133       e_config_runtime_info->gui.subdialogs.policies.current_displays_setup_background = edje_object_add(canvas);
134       e_theme_edje_object_set(e_config_runtime_info->gui.subdialogs.policies.current_displays_setup_background, "base/theme/background", "e/desktop/background");
135       edje_object_part_swallow(e_config_runtime_info->gui.subdialogs.policies.current_displays_setup, "e.swallow.content", e_config_runtime_info->gui.subdialogs.policies.current_displays_setup_background);
136       edje_object_part_text_set(e_config_runtime_info->gui.subdialogs.policies.current_displays_setup, "e.text.label", _("Used display"));
137       edje_object_part_swallow(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje, "current_displays_setup.swallow.content", e_config_runtime_info->gui.subdialogs.policies.current_displays_setup);
138     */
139
140    evas_object_show(subdialog);
141
142    return subdialog;
143
144    /*
145       _dialog_subdialog_policies_edje_set_fail:
146       evas_object_del(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje);
147       _dialog_subdialog_policies_edje_add_fail:
148       fprintf(stderr, "CONF_RANDR: Couldn't set edj for policies subdialog!\n");
149       evas_object_del(subdialog);
150       return NULL;
151     */
152 _dialog_subdialog_policies_radio_add_fail:
153    evas_object_del(subdialog);
154    return NULL;
155 }
156
157 static void
158 _dialog_subdialog_policies_policy_mouse_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
159 {
160    char signal[29];
161    int policy = ECORE_X_RANDR_OUTPUT_POLICY_NONE;
162
163    /*
164     * IMPROVABLE:
165     * "sadly" the evas callbacks are called before radio_val is set to its new
166     * value. If that is ever changed, remove the used code below and just use the
167     * 1-liner below.
168     * snprintf(signal, sizeof(signal), "conf,randr,dialog,policies,%d", e_config_runtime_info->gui.subdialogs.policies.radio_val);
169     */
170    if (obj == e_config_runtime_info->gui.subdialogs.policies.radio_above) policy = ECORE_X_RANDR_OUTPUT_POLICY_ABOVE;
171    if (obj == e_config_runtime_info->gui.subdialogs.policies.radio_right) policy = ECORE_X_RANDR_OUTPUT_POLICY_RIGHT;
172    if (obj == e_config_runtime_info->gui.subdialogs.policies.radio_below) policy = ECORE_X_RANDR_OUTPUT_POLICY_BELOW;
173    if (obj == e_config_runtime_info->gui.subdialogs.policies.radio_left) policy = ECORE_X_RANDR_OUTPUT_POLICY_LEFT;
174    if (obj == e_config_runtime_info->gui.subdialogs.policies.radio_clone) policy = ECORE_X_RANDR_OUTPUT_POLICY_CLONE;
175    if (obj == e_config_runtime_info->gui.subdialogs.policies.radio_none) policy = ECORE_X_RANDR_OUTPUT_POLICY_NONE;
176
177    snprintf(signal, sizeof(signal), "conf,randr,dialog,policies,%d", policy);
178
179    //edje_object_signal_emit(e_config_runtime_info->gui.subdialogs.policies.swallowing_edje, signal, "e");
180
181    fprintf(stderr, "CONF_RANDR: mouse button released. Emitted signal to policy: %s\n", signal);
182 }
183
184 Eina_Bool
185 dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__)
186 {
187    if (!e_randr_screen_info || !e_config_runtime_info->gui.selected_output_dd) return EINA_FALSE;
188
189    //policy update
190    e_config_runtime_info->gui.selected_output_dd->previous_policy = e_config_runtime_info->gui.selected_output_dd->new_policy;
191    e_config_runtime_info->gui.selected_output_dd->new_policy = e_config_runtime_info->gui.subdialogs.policies.radio_val;
192    fprintf(stderr, "CONF_RANDR: 'New display attached'-policy set to %d\n", e_config_runtime_info->gui.selected_output_dd->new_policy);
193
194    return EINA_TRUE;
195 }
196
197 Eina_Bool
198 dialog_subdialog_policies_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
199 {
200    if (!e_randr_screen_info || !cfdata || !cfdata->gui.selected_output_dd) return EINA_FALSE;
201
202    return (int)cfdata->gui.selected_output_dd->previous_policy != (int)cfdata->gui.subdialogs.policies.radio_val;
203 }
204
205 void
206 dialog_subdialog_policies_update_radio_buttons(Evas_Object *crtc)
207 {
208    E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data;
209    E_Randr_Output_Info *output = NULL;
210    Ecore_X_Randr_Output_Policy policy;
211
212    //disable widgets, if no crtc is selected
213    if (!crtc || !(output_dialog_data = evas_object_data_get(crtc, "output_info")))
214      {
215         //Evas_Object *radio_above, *radio_right, *radio_below, *radio_left, *radio_clone, *radio_none;
216         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_above, EINA_TRUE);
217         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_right, EINA_TRUE);
218         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_below, EINA_TRUE);
219         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_left, EINA_TRUE);
220         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_clone, EINA_TRUE);
221         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_none, EINA_TRUE);
222         return;
223      }
224    else
225      {
226         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_above, EINA_FALSE);
227         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_right, EINA_FALSE);
228         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_below, EINA_FALSE);
229         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_left, EINA_FALSE);
230         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_clone, EINA_FALSE);
231         e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.policies.radio_none, EINA_FALSE);
232      }
233
234    if (output_dialog_data->crtc && output_dialog_data->crtc->outputs)
235      {
236         output = (E_Randr_Output_Info *)eina_list_data_get(eina_list_last(output_dialog_data->crtc->outputs));
237      }
238    else if (output_dialog_data->output)
239      {
240         output = output_dialog_data->output;
241      }
242
243    if (!output) return;
244    policy = output->policy;
245    e_config_runtime_info->gui.selected_output_dd = output_dialog_data;
246    //toggle the switch of the currently used policies
247    switch (policy)
248      {
249       case ECORE_X_RANDR_OUTPUT_POLICY_RIGHT:
250         e_widget_radio_toggle_set(e_config_runtime_info->gui.subdialogs.policies.radio_right, EINA_TRUE);
251         break;
252
253       case ECORE_X_RANDR_OUTPUT_POLICY_BELOW:
254         e_widget_radio_toggle_set(e_config_runtime_info->gui.subdialogs.policies.radio_below, EINA_TRUE);
255         break;
256
257       case ECORE_X_RANDR_OUTPUT_POLICY_LEFT:
258         e_widget_radio_toggle_set(e_config_runtime_info->gui.subdialogs.policies.radio_left, EINA_TRUE);
259         break;
260
261       case ECORE_X_RANDR_OUTPUT_POLICY_CLONE:
262         e_widget_radio_toggle_set(e_config_runtime_info->gui.subdialogs.policies.radio_clone, EINA_TRUE);
263         break;
264
265       case ECORE_X_RANDR_OUTPUT_POLICY_NONE:
266         e_widget_radio_toggle_set(e_config_runtime_info->gui.subdialogs.policies.radio_none, EINA_TRUE);
267         break;
268
269       default: //== ECORE_X_RANDR_OUTPUT_POLICY_ABOVE:
270         e_widget_radio_toggle_set(e_config_runtime_info->gui.subdialogs.policies.radio_above, EINA_TRUE);
271      }
272 }
273
274 void
275 dialog_subdialog_policies_keep_changes(E_Config_Dialog_Data *cfdata)
276 {
277    E_Config_Randr_Dialog_Output_Dialog_Data *odd;
278    Eina_List *iter;
279
280    if (!cfdata) return;
281
282    EINA_LIST_FOREACH(cfdata->output_dialog_data_list, iter, odd)
283      {
284         if (!odd || ((int)odd->previous_policy == Ecore_X_Randr_Unset)) continue;
285         odd->previous_policy = odd->new_policy;
286         if (odd->output)
287           odd->output->policy = odd->new_policy;
288         odd->new_policy = Ecore_X_Randr_Unset;
289      }
290 }
291
292 void
293 dialog_subdialog_policies_discard_changes(E_Config_Dialog_Data *cfdata)
294 {
295    E_Config_Randr_Dialog_Output_Dialog_Data *odd;
296    Eina_List *iter;
297
298    if (!cfdata) return;
299
300    EINA_LIST_FOREACH(cfdata->output_dialog_data_list, iter, odd)
301      {
302         if (!odd->crtc || ((int)odd->previous_policy == Ecore_X_Randr_Unset)) continue;
303         odd->new_policy = odd->previous_policy;
304         odd->previous_policy = Ecore_X_Randr_Unset;
305      }
306 }
307