1 #include "e_int_config_randr.h"
3 #include "e_widget_ilist.h"
5 #ifdef Ecore_X_Randr_Unset
6 #undef Ecore_X_Randr_Unset
7 #define Ecore_X_Randr_Unset -1
9 #define Ecore_X_Randr_Unset -1
12 #ifdef Ecore_X_Randr_None
13 #undef Ecore_X_Randr_None
15 #define Ecore_X_Randr_None 0
18 #define ICON_HEIGHT 10
19 #define RESOLUTION_TXT_MAX_LENGTH 50
21 Evas_Object *dialog_subdialog_resolutions_basic_create_widgets(Evas *canvas);
22 Eina_Bool dialog_subdialog_resolutions_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
23 Eina_Bool dialog_subdialog_resolutions_basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
24 void dialog_subdialog_resolutions_update_list(Evas_Object *crtc);
25 void dialog_subdialog_resolutions_keep_changes(E_Config_Dialog_Data *cfdata);
26 void dialog_subdialog_resolutions_discard_changes(E_Config_Dialog_Data *cfdata);
28 extern E_Config_Dialog_Data *e_config_runtime_info;
31 dialog_subdialog_resolutions_create_data(E_Config_Dialog_Data *cfdata)
33 E_Config_Randr_Dialog_Output_Dialog_Data *odd;
34 Ecore_X_Randr_Mode_Info *mi;
37 if (!cfdata || !cfdata->output_dialog_data_list) return EINA_FALSE;
39 EINA_LIST_FOREACH(cfdata->output_dialog_data_list, iter, odd)
41 if (odd->previous_mode || odd->preferred_mode)
43 //this means, that mode info is already filled
44 //(by the display arrangement code)
49 if (!(mi = odd->crtc->current_mode))
50 mi = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->crtc->outputs_common_modes));
51 odd->previous_mode = mi;
55 odd->preferred_mode = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->output->preferred_modes));
63 dialog_subdialog_resolutions_basic_create_widgets(Evas *canvas)
65 Evas_Object *subdialog;
67 if (!canvas || !e_config_runtime_info || e_config_runtime_info->gui.subdialogs.resolutions.dialog || !(subdialog = e_widget_ilist_add(canvas, ICON_WIDTH * e_scale, ICON_HEIGHT * e_scale, NULL))) return NULL;
69 e_widget_ilist_multi_select_set(subdialog, EINA_FALSE);
70 e_widget_disabled_set(subdialog, EINA_TRUE);
72 evas_object_show(subdialog);
78 dialog_subdialog_resolutions_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata __UNUSED__)
81 Ecore_X_Randr_Mode_Info *selected_mode;
82 Ecore_X_ID selected_mode_xid;
83 E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data;
84 Ecore_X_Randr_Output *output = NULL;
85 E_Randr_Crtc_Info *crtc_info = NULL, *crtc_iter;
87 int noutputs = Ecore_X_Randr_Unset;
89 if (!e_config_runtime_info->gui.selected_eo || !(output_dialog_data = evas_object_data_get(e_config_runtime_info->gui.selected_eo, "output_info")))
91 fprintf(stderr, "CONF_RADNR: no crtc was selected or no output info could be retrieved for the selected crtc element (%p).\n", e_config_runtime_info->gui.selected_eo);
95 if (output_dialog_data->crtc)
97 //CRTC is already asssigned, easy one!
98 crtc_info = output_dialog_data->crtc;
100 else if (output_dialog_data->output)
102 //CRTC not assigned yet. Let's try to find a non occupied one.
103 fprintf(stderr, "CONF_RANDR: Trying to find a CRTC for output %x, %d crtcs are possible.\n", output_dialog_data->output->xid, eina_list_count(output_dialog_data->output->possible_crtcs));
104 output = &output_dialog_data->output->xid;
106 EINA_LIST_FOREACH(output_dialog_data->output->possible_crtcs, iter, crtc_iter)
108 if (!crtc_iter->outputs)
110 //CRTC is not occupied yet
111 crtc_info = crtc_iter;
118 fprintf(stderr, "CONF_RANDR: Changing mode failed, no unoccupied CRTC found!\n");
122 if ((selected_mode = (Ecore_X_Randr_Mode_Info *)e_widget_ilist_selected_data_get(e_config_runtime_info->gui.subdialogs.resolutions.dialog)))
124 selected_mode_xid = selected_mode->xid;
128 selected_mode_xid = Ecore_X_Randr_None;
131 fprintf(stderr, "CONF_RANDR: Change mode of crtc %x to %x.\n", crtc_info->xid, selected_mode_xid);
133 if (ecore_x_randr_crtc_mode_set(cfd->con->manager->root, crtc_info->xid, output, noutputs, selected_mode_xid))
135 //remove unused space
136 ecore_x_randr_screen_reset(cfd->con->manager->root);
138 if (!output_dialog_data->crtc)
139 output_dialog_data->crtc = crtc_info;
140 output_dialog_data->new_mode = selected_mode;
148 dialog_subdialog_resolutions_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__)
150 Ecore_X_Randr_Mode_Info *selected_mode;
151 E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data;
153 if (!e_config_runtime_info->gui.selected_eo || !(selected_mode = (Ecore_X_Randr_Mode_Info *)e_widget_ilist_selected_data_get(e_config_runtime_info->gui.subdialogs.resolutions.dialog)) || !(output_dialog_data = evas_object_data_get(e_config_runtime_info->gui.selected_eo, "output_info"))) return EINA_FALSE;
155 return selected_mode != output_dialog_data->previous_mode;
159 dialog_subdialog_resolutions_update_list(Evas_Object *crtc)
161 Eina_List *iter, *modelist = NULL;
162 E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data;
163 Ecore_X_Randr_Mode_Info *mode_info, *current_mode;
164 char resolution_text[RESOLUTION_TXT_MAX_LENGTH];
168 e_widget_ilist_freeze(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
169 e_widget_ilist_clear(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
172 e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.resolutions.dialog, EINA_TRUE);
175 if (!(output_dialog_data = evas_object_data_get(crtc, "output_info")))
178 //select correct mode list
179 if (output_dialog_data->crtc)
181 current_mode = output_dialog_data->crtc->current_mode;
182 modelist = output_dialog_data->crtc->outputs_common_modes;
184 else if (output_dialog_data->output)
187 if (output_dialog_data->output->modes)
188 modelist = output_dialog_data->output->modes;
190 modelist = output_dialog_data->output->modes;
192 EINA_LIST_FOREACH(modelist, iter, mode_info)
194 //calculate refresh rate
195 if (!mode_info) continue;
196 if (mode_info->hTotal && mode_info->vTotal)
197 rate = ((float)mode_info->dotClock /
198 ((float)mode_info->hTotal * (float)mode_info->vTotal));
202 str_ret = snprintf(resolution_text, RESOLUTION_TXT_MAX_LENGTH, "%dx%d@%.1fHz", mode_info->width, mode_info->height, rate);
203 if (str_ret < 0 || str_ret > (RESOLUTION_TXT_MAX_LENGTH - 1))
205 fprintf(stderr, "CONF_RANDR: Resolution text could not be created.");
208 e_widget_ilist_append(e_config_runtime_info->gui.subdialogs.resolutions.dialog, NULL, resolution_text, NULL, mode_info, NULL);
210 //select currently enabled mode
211 if (mode_info == current_mode)
212 e_widget_ilist_selected_set(e_config_runtime_info->gui.subdialogs.resolutions.dialog, i);
216 //append 'disabled' mode
217 e_widget_ilist_append(e_config_runtime_info->gui.subdialogs.resolutions.dialog, NULL, _("Disabled"), NULL, NULL, NULL);
220 e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.resolutions.dialog, EINA_FALSE);
221 e_widget_ilist_go(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
222 e_widget_ilist_thaw(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
226 dialog_subdialog_resolutions_keep_changes(E_Config_Dialog_Data *cfdata)
228 E_Config_Randr_Dialog_Output_Dialog_Data *odd;
233 EINA_LIST_FOREACH(cfdata->output_dialog_data_list, iter, odd)
235 if (odd && odd->new_mode && (odd->new_mode != odd->previous_mode))
237 odd->previous_mode = odd->new_mode;
238 odd->new_mode = NULL;
244 dialog_subdialog_resolutions_discard_changes(E_Config_Dialog_Data *cfdata)
246 E_Config_Randr_Dialog_Output_Dialog_Data *odd;
251 EINA_LIST_FOREACH(cfdata->output_dialog_data_list, iter, odd)
253 //for now, there is no way to redisable an output during discartion
254 if (!odd->crtc || !odd->previous_mode) continue;
255 //use currently used outputs (noutputs == Ecore_X_Randr_Unset)
256 if (ecore_x_randr_crtc_mode_set(cfdata->manager->root, odd->crtc->xid, NULL, Ecore_X_Randr_Unset, odd->previous_mode->xid))
258 odd->new_mode = odd->previous_mode;
259 odd->previous_mode = NULL;
260 ecore_x_randr_screen_reset(cfdata->manager->root);