Improve conf_randr dialog.

Adjust to changes in e_randr.h.
Change "display disabled" to "display disconnected"

SVN revision: 68116
This commit is contained in:
Leif Middelschulte 2012-02-18 16:49:17 +00:00
parent 7cda77af23
commit 62ded22064
7 changed files with 105 additions and 76 deletions

View File

@ -36,6 +36,7 @@
#define THEME_FILENAME "/e-module-conf_randr.edj" #define THEME_FILENAME "/e-module-conf_randr.edj"
#define TOOLBAR_ICONSIZE 16 #define TOOLBAR_ICONSIZE 16
#define E_RANDR_12 (e_randr_screen_info.rrvd_info.randr_info_12)
static void *create_data(E_Config_Dialog *cfd); static void *create_data(E_Config_Dialog *cfd);
static void free_cfdata(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static void free_cfdata(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
@ -92,13 +93,18 @@ _dialog_output_dialog_data_new(E_Randr_Crtc_Info *crtc_info, E_Randr_Output_Info
{ {
E_Config_Randr_Dialog_Output_Dialog_Data *dialog_data; E_Config_Randr_Dialog_Output_Dialog_Data *dialog_data;
if ((!crtc_info && !output_info) || !(dialog_data = E_NEW(E_Config_Randr_Dialog_Output_Dialog_Data, 1))) return NULL; EINA_SAFETY_ON_NULL_RETURN_VAL(output_info, NULL);
dialog_data = E_NEW(E_Config_Randr_Dialog_Output_Dialog_Data, 1);
fprintf(stderr, "CONF_RANDR: Added output data struct for Output %d/CRTC %d.\n", output_info->xid, (output_info->crtc ? output_info->crtc->xid : Ecore_X_Randr_None));
if (crtc_info) if (crtc_info)
{ {
//already enabled screen //already enabled screen, output info is already available in crtc
//struct
dialog_data->crtc = crtc_info; dialog_data->crtc = crtc_info;
} }
else if (output_info) else
{ {
//disabled monitor //disabled monitor
dialog_data->output = output_info; dialog_data->output = output_info;
@ -114,24 +120,27 @@ create_data(E_Config_Dialog *cfd)
E_Config_Randr_Dialog_Output_Dialog_Data *odd; E_Config_Randr_Dialog_Output_Dialog_Data *odd;
// Prove we got all things to get going // Prove we got all things to get going
EINA_SAFETY_ON_TRUE_RETURN_VAL(!e_randr_screen_info || (e_randr_screen_info->randr_version < ECORE_X_RANDR_1_2), NULL); EINA_SAFETY_ON_TRUE_RETURN_VAL(!E_RANDR_12, NULL);
EINA_SAFETY_ON_FALSE_RETURN_VAL(e_randr_screen_info_refresh(), NULL); e_randr_screen_info_refresh();
EINA_SAFETY_ON_TRUE_RETURN_VAL(!(e_config_runtime_info = E_NEW(E_Config_Dialog_Data, 1)), NULL); e_config_runtime_info = E_NEW(E_Config_Dialog_Data, 1);
e_config_runtime_info->cfd = cfd; e_config_runtime_info->cfd = cfd;
//Compose theme's file path and name //Compose theme's file path and name
snprintf(_theme_file_path, sizeof(_theme_file_path), "%s%s", conf_randr_module->dir, THEME_FILENAME); snprintf(_theme_file_path, sizeof(_theme_file_path), "%s%s", conf_randr_module->dir, THEME_FILENAME);
e_config_runtime_info->manager = e_manager_current_get(); e_config_runtime_info->manager = e_manager_current_get();
EINA_LIST_FOREACH(e_randr_screen_info->rrvd_info.randr_info_12->outputs, iter, output_info) e_config_runtime_info->output_dialog_data_list = NULL;
EINA_LIST_FOREACH(e_randr_screen_info.rrvd_info.randr_info_12->outputs, iter, output_info)
{ {
if (!output_info)
{
fprintf(stderr, "CONF_RANDR: WWWWWWWWWWWWOOOOOOOOOOOOOTTTT an output_info of the central struct is NULL!\n");
continue;
}
if ((odd = _dialog_output_dialog_data_new(output_info->crtc, output_info))) if ((odd = _dialog_output_dialog_data_new(output_info->crtc, output_info)))
e_config_runtime_info->output_dialog_data_list = eina_list_append(e_config_runtime_info->output_dialog_data_list, odd); e_config_runtime_info->output_dialog_data_list = eina_list_append(e_config_runtime_info->output_dialog_data_list, odd);
} }
fprintf(stderr, "CONF_RANDR: Added %d output data structs.\n", eina_list_count(e_config_runtime_info->output_dialog_data_list));
//FIXME: Properly (stack-like) free data when creation fails //FIXME: Properly (stack-like) free data when creation fails
EINA_SAFETY_ON_FALSE_GOTO(dialog_subdialog_arrangement_create_data(e_config_runtime_info), _e_conf_randr_create_data_failed_free_data); EINA_SAFETY_ON_FALSE_GOTO(dialog_subdialog_arrangement_create_data(e_config_runtime_info), _e_conf_randr_create_data_failed_free_data);
EINA_SAFETY_ON_FALSE_GOTO(dialog_subdialog_resolutions_create_data(e_config_runtime_info), _e_conf_randr_create_data_failed_free_data); EINA_SAFETY_ON_FALSE_GOTO(dialog_subdialog_resolutions_create_data(e_config_runtime_info), _e_conf_randr_create_data_failed_free_data);
@ -148,7 +157,10 @@ _e_conf_randr_create_data_failed_free_data:
static void static void
free_cfdata(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) free_cfdata(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{ {
EINA_SAFETY_ON_TRUE_RETURN(!e_randr_screen_info); E_Config_Randr_Dialog_Output_Dialog_Data *dialog_data;
EINA_SAFETY_ON_TRUE_RETURN(!E_RANDR_12);
dialog_subdialog_arrangement_free_data(cfd, cfdata); dialog_subdialog_arrangement_free_data(cfd, cfdata);
evas_object_del(cfdata->gui.subdialogs.arrangement.dialog); evas_object_del(cfdata->gui.subdialogs.arrangement.dialog);
@ -156,6 +168,12 @@ free_cfdata(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
evas_object_del(cfdata->gui.subdialogs.resolutions.dialog); evas_object_del(cfdata->gui.subdialogs.resolutions.dialog);
evas_object_del(cfdata->gui.subdialogs.orientation.dialog); evas_object_del(cfdata->gui.subdialogs.orientation.dialog);
EINA_LIST_FREE(cfdata->output_dialog_data_list, dialog_data)
{
free(dialog_data);
}
cfdata->output_dialog_data_list = NULL;
free(cfdata); free(cfdata);
} }
@ -271,7 +289,7 @@ _e_conf_randr_confirmation_dialog_store_cb(void *data, E_Dialog *dia)
_e_conf_randr_confirmation_dialog_delete_cb(dia->win); _e_conf_randr_confirmation_dialog_delete_cb(dia->win);
//but actually trigger saving the stuff //but actually trigger saving the stuff
e_randr_store_configuration(e_randr_screen_info, modifier); e_randr_store_configuration(modifier);
} }
@ -318,7 +336,7 @@ basic_create_widgets(E_Config_Dialog *cfd, Evas *canvas, E_Config_Dialog_Data *c
{ {
Evas_Object *table = NULL, *wl = NULL; Evas_Object *table = NULL, *wl = NULL;
EINA_SAFETY_ON_TRUE_RETURN_VAL (!e_randr_screen_info || (e_randr_screen_info->randr_version < ECORE_X_RANDR_1_2), NULL); EINA_SAFETY_ON_TRUE_RETURN_VAL (!E_RANDR_12 || (e_randr_screen_info.randr_version < ECORE_X_RANDR_1_2), NULL);
EINA_SAFETY_ON_TRUE_RETURN_VAL((!canvas || !cfdata), NULL); EINA_SAFETY_ON_TRUE_RETURN_VAL((!canvas || !cfdata), NULL);
e_config_runtime_info->gui.canvas = canvas; e_config_runtime_info->gui.canvas = canvas;
@ -408,7 +426,7 @@ e_int_config_randr(E_Container *con, const char *params __UNUSED__){
E_Config_Dialog *cfd; E_Config_Dialog *cfd;
E_Config_Dialog_View *v; E_Config_Dialog_View *v;
if (!e_randr_screen_info || (e_randr_screen_info->randr_version < ECORE_X_RANDR_1_2)) if (!E_RANDR_12 || (e_randr_screen_info.randr_version < ECORE_X_RANDR_1_2))
{ {
ecore_timer_add(0.5, _deferred_noxrandr_error, NULL); ecore_timer_add(0.5, _deferred_noxrandr_error, NULL);
fprintf(stderr, "CONF_RANDR: XRandR version >= 1.2 necessary to work.\n"); fprintf(stderr, "CONF_RANDR: XRandR version >= 1.2 necessary to work.\n");

View File

@ -23,10 +23,10 @@ struct _E_Config_Dialog_Data
E_Config_Randr_Dialog_Confirmation_Dialog_Data *confirmation_dialog; E_Config_Randr_Dialog_Confirmation_Dialog_Data *confirmation_dialog;
struct { struct {
struct { struct {
Evas_Object *dialog, *widget_list, *swallowing_edje, *smart_parent, *suggestion, *clipper, *check_display_disabled_outputs; Evas_Object *dialog, *widget_list, *swallowing_edje, *smart_parent, *suggestion, *clipper, *check_display_disconnected_outputs;
Evas_Coord_Point previous_pos, relative_zero; Evas_Coord_Point previous_pos, relative_zero;
Evas_Coord_Rectangle disabled_output_size; Evas_Coord_Rectangle disabled_output_size;
int suggestion_dist_min, check_val_display_disabled_outputs; int suggestion_dist_min, check_val_display_disconnected_outputs;
} arrangement; } arrangement;
struct { struct {
Evas_Object *dialog; Evas_Object *dialog;
@ -72,7 +72,7 @@ struct _E_Config_Randr_Dialog_Confirmation_Dialog_Data
struct _Config struct _Config
{ {
Eina_Bool display_disabled_outputs; Eina_Bool display_disconnected_outputs;
}; };
E_Config_Dialog *e_int_config_randr(E_Container *con, const char *params __UNUSED__); E_Config_Dialog *e_int_config_randr(E_Container *con, const char *params __UNUSED__);

View File

@ -68,14 +68,18 @@ _dialog_subdialog_arrangement_rep_dialog_data_fill(E_Config_Randr_Dialog_Output_
{ {
//disabled monitor //disabled monitor
odd->previous_mode = NULL; odd->previous_mode = NULL;
if (odd->output->monitor)
//try to get a mode from the preferred list, else use default list
if (!(odd->preferred_mode = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->output->preferred_modes))))
{ {
if (odd->output->modes) //try to get a mode from the preferred list, else use default list
odd->preferred_mode = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->output->modes)); if (!(odd->preferred_mode = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->output->monitor->preferred_modes))))
else {
odd->preferred_mode = NULL; if (odd->output->monitor->modes)
odd->preferred_mode = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->output->monitor->modes));
}
}
else
{
odd->preferred_mode = NULL;
} }
odd->previous_pos.x = Ecore_X_Randr_Unset; odd->previous_pos.x = Ecore_X_Randr_Unset;
@ -97,6 +101,8 @@ _dialog_subdialog_arrangement_update(void)
if (!e_config_runtime_info || !e_config_runtime_info->gui.canvas || !e_config_runtime_info->output_dialog_data_list || !area) return; if (!e_config_runtime_info || !e_config_runtime_info->gui.canvas || !e_config_runtime_info->output_dialog_data_list || !area) return;
fprintf(stderr, "CONF_RANDR: Display disconnected outputs %d\n", randr_dialog_config->display_disconnected_outputs);
EINA_LIST_FOREACH(evas_object_smart_members_get(area), iter, rep) EINA_LIST_FOREACH(evas_object_smart_members_get(area), iter, rep)
{ {
//skip clipper //skip clipper
@ -108,12 +114,9 @@ _dialog_subdialog_arrangement_update(void)
EINA_LIST_FOREACH(e_config_runtime_info->output_dialog_data_list, iter, output_dialog_data) EINA_LIST_FOREACH(e_config_runtime_info->output_dialog_data_list, iter, output_dialog_data)
{ {
fprintf(stderr, "CONF_RANDR: Display disabled outputs %d\n", randr_dialog_config->display_disabled_outputs); if(!output_dialog_data->crtc &&
if (!output_dialog_data->crtc) (!output_dialog_data->output->monitor && (randr_dialog_config && !randr_dialog_config->display_disconnected_outputs)))
{ continue;
if(!output_dialog_data->output || (randr_dialog_config && !randr_dialog_config->display_disabled_outputs))
continue;
}
rep = _dialog_subdialog_arrangement_rep_add(e_config_runtime_info->gui.canvas, output_dialog_data); rep = _dialog_subdialog_arrangement_rep_add(e_config_runtime_info->gui.canvas, output_dialog_data);
@ -159,11 +162,11 @@ dialog_subdialog_arrangement_basic_create_widgets(Evas *canvas)
subdialog = e_widget_list_add(canvas, 0, 1); subdialog = e_widget_list_add(canvas, 0, 1);
//Add checkbox //Add checkbox
check = e_widget_check_add(canvas, _("Display disabled outputs"), &e_config_runtime_info->gui.subdialogs.arrangement.check_val_display_disabled_outputs); check = e_widget_check_add(canvas, _("Display disconnected outputs"), &e_config_runtime_info->gui.subdialogs.arrangement.check_val_display_disconnected_outputs);
if (randr_dialog_config) if (randr_dialog_config)
e_widget_check_checked_set(check, randr_dialog_config->display_disabled_outputs); e_widget_check_checked_set(check, randr_dialog_config->display_disconnected_outputs);
evas_object_event_callback_add(check, EVAS_CALLBACK_MOUSE_DOWN, _dialog_subdialog_arrangement_check_mouse_down_cb, NULL); evas_object_event_callback_add(check, EVAS_CALLBACK_MOUSE_DOWN, _dialog_subdialog_arrangement_check_mouse_down_cb, NULL);
e_config_runtime_info->gui.subdialogs.arrangement.check_display_disabled_outputs = check; e_config_runtime_info->gui.subdialogs.arrangement.check_display_disconnected_outputs = check;
//Add smart move area with outputs //Add smart move area with outputs
//initialize smart object //initialize smart object
@ -222,8 +225,9 @@ _dialog_subdialog_arrangement_rep_add(Evas *canvas, E_Config_Randr_Dialog_Output
output_info = output_dialog_data->output; output_info = output_dialog_data->output;
if (output_info) if (output_info)
{ {
if (ecore_x_randr_edid_has_valid_header(output_info->edid, output_info->edid_length)) if (output_info->monitor &&
output_name = ecore_x_randr_edid_display_name_get(output_info->edid, output_info->edid_length); ecore_x_randr_edid_has_valid_header(output_info->monitor->edid, output_info->monitor->edid_length))
output_name = ecore_x_randr_edid_display_name_get(output_info->monitor->edid, output_info->monitor->edid_length);
else if (output_info->name) else if (output_info->name)
output_name = output_info->name; output_name = output_info->name;
} }
@ -334,7 +338,7 @@ _dialog_subdialog_arrangement_smart_class_resize(Evas_Object *obj, Evas_Coord w,
{ {
new_geo.w = (int)((float)e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.w * scaling_factor); new_geo.w = (int)((float)e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.w * scaling_factor);
new_geo.h = (int)((float)e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.h * scaling_factor); new_geo.h = (int)((float)e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.h * scaling_factor);
fprintf(stderr, "CONF_RANDR: Neither mode nor preferred mode are avavailable for %x. Using %dx%d.\n", (output_dialog_data->crtc ? output_dialog_data->crtc->xid : output_dialog_data->output->xid), e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.w, e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.h); fprintf(stderr, "CONF_RANDR: Neither mode nor preferred mode are avavailable for %d. Using %dx%d.\n", (output_dialog_data->crtc ? output_dialog_data->crtc->xid : output_dialog_data->output->xid), e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.w, e_config_runtime_info->gui.subdialogs.arrangement.disabled_output_size.h);
} }
if ((new_geo.w <= 0) || (new_geo.h <= 0)) if ((new_geo.w <= 0) || (new_geo.h <= 0))
{ {
@ -380,10 +384,10 @@ _dialog_subdialog_arrangement_check_mouse_down_cb(void *data __UNUSED__, Evas *e
{ {
if (!obj || !e_config_runtime_info || !randr_dialog_config) return; if (!obj || !e_config_runtime_info || !randr_dialog_config) return;
if (obj == e_config_runtime_info->gui.subdialogs.arrangement.check_display_disabled_outputs) if (obj == e_config_runtime_info->gui.subdialogs.arrangement.check_display_disconnected_outputs)
{ {
//this is bad. The events are called _before_ the value is updated. //this is bad. The events are called _before_ the value is updated.
randr_dialog_config->display_disabled_outputs ^= EINA_TRUE; randr_dialog_config->display_disconnected_outputs ^= EINA_TRUE;
_dialog_subdialog_arrangement_update(); _dialog_subdialog_arrangement_update();
} }
} }
@ -631,18 +635,17 @@ void
dialog_subdialog_arrangement_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) dialog_subdialog_arrangement_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{ {
E_Config_Randr_Dialog_Output_Dialog_Data *dialog_data; E_Config_Randr_Dialog_Output_Dialog_Data *dialog_data;
Eina_List *iter;
EINA_SAFETY_ON_NULL_RETURN(cfdata); EINA_SAFETY_ON_NULL_RETURN(cfdata);
EINA_LIST_FREE(cfdata->output_dialog_data_list, dialog_data) EINA_LIST_FOREACH(cfdata->output_dialog_data_list, iter, dialog_data)
{ {
if (!dialog_data) continue;
if (dialog_data->bg) if (dialog_data->bg)
{ {
evas_object_del(dialog_data->bg); evas_object_del(dialog_data->bg);
dialog_data->bg = NULL; dialog_data->bg = NULL;
} }
free(dialog_data);
} }
} }
@ -836,7 +839,7 @@ dialog_subdialog_arrangement_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dia
|| ((odd->new_pos.x == Ecore_X_Randr_Unset) || (odd->new_pos.y == Ecore_X_Randr_Unset))) continue; || ((odd->new_pos.x == Ecore_X_Randr_Unset) || (odd->new_pos.y == Ecore_X_Randr_Unset))) continue;
if ((odd->previous_pos.x != odd->new_pos.x) || (odd->previous_pos.y != odd->new_pos.y)) if ((odd->previous_pos.x != odd->new_pos.x) || (odd->previous_pos.y != odd->new_pos.y))
{ {
fprintf(stderr, "CONF_RANDR: CRTC %x is moved to %dx%d\n", odd->crtc->xid, odd->new_pos.x, odd->new_pos.y); fprintf(stderr, "CONF_RANDR: CRTC %d is moved to %dx%d\n", odd->crtc->xid, odd->new_pos.x, odd->new_pos.y);
if (!ecore_x_randr_crtc_pos_set(cfd->con->manager->root, odd->crtc->xid, odd->new_pos.x, odd->new_pos.y)) if (!ecore_x_randr_crtc_pos_set(cfd->con->manager->root, odd->crtc->xid, odd->new_pos.x, odd->new_pos.y))
{ {
arrangement_failed = EINA_TRUE; arrangement_failed = EINA_TRUE;

View File

@ -281,7 +281,7 @@ dialog_subdialog_orientation_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dia
orientation = e_config_runtime_info->gui.subdialogs.orientation.radio_val; orientation = e_config_runtime_info->gui.subdialogs.orientation.radio_val;
fprintf(stderr, "CONF_RANDR: Change orientation of crtc %x to %d.\n", output_dialog_data->crtc->xid, orientation); fprintf(stderr, "CONF_RANDR: Change orientation of crtc %d to %d.\n", output_dialog_data->crtc->xid, orientation);
if (ecore_x_randr_crtc_orientation_set(cfd->con->manager->root, output_dialog_data->crtc->xid, orientation)) if (ecore_x_randr_crtc_orientation_set(cfd->con->manager->root, output_dialog_data->crtc->xid, orientation))
{ {

View File

@ -12,6 +12,8 @@
#define Ecore_X_Randr_Unset -1 #define Ecore_X_Randr_Unset -1
#endif #endif
#define E_RANDR_12 (e_randr_screen_info.rrvd_info.randr_info_12)
Evas_Object *dialog_subdialog_policies_basic_create_widgets(Evas *canvas); Evas_Object *dialog_subdialog_policies_basic_create_widgets(Evas *canvas);
Eina_Bool dialog_subdialog_policies_create_data(E_Config_Dialog_Data *e_config_runtime_info); Eina_Bool dialog_subdialog_policies_create_data(E_Config_Dialog_Data *e_config_runtime_info);
Eina_Bool dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); Eina_Bool dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
@ -198,7 +200,7 @@ _dialog_subdialog_policies_policy_mouse_up_cb(void *data __UNUSED__, Evas *e __U
Eina_Bool Eina_Bool
dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__) dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__)
{ {
if (!e_randr_screen_info || !e_config_runtime_info->gui.selected_output_dd) return EINA_FALSE; if (!E_RANDR_12 || !e_config_runtime_info->gui.selected_output_dd) return EINA_FALSE;
//policy update //policy update
e_config_runtime_info->gui.selected_output_dd->previous_policy = e_config_runtime_info->gui.selected_output_dd->new_policy; e_config_runtime_info->gui.selected_output_dd->previous_policy = e_config_runtime_info->gui.selected_output_dd->new_policy;
@ -211,7 +213,7 @@ dialog_subdialog_policies_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Co
Eina_Bool Eina_Bool
dialog_subdialog_policies_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) dialog_subdialog_policies_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{ {
if (!e_randr_screen_info || !cfdata || !cfdata->gui.selected_output_dd || !cfdata->gui.selected_output_dd->output) return EINA_FALSE; if (!E_RANDR_12 || !cfdata || !cfdata->gui.selected_output_dd || !cfdata->gui.selected_output_dd->output) return EINA_FALSE;
return (int)cfdata->gui.selected_output_dd->previous_policy != (int)cfdata->gui.subdialogs.policies.radio_val; return (int)cfdata->gui.selected_output_dd->previous_policy != (int)cfdata->gui.subdialogs.policies.radio_val;
} }

View File

@ -26,6 +26,7 @@ void dialog_subdialog_resolutions_keep_changes(E_Config_Dialog_Data *cfd
void dialog_subdialog_resolutions_discard_changes(E_Config_Dialog_Data *cfdata); void dialog_subdialog_resolutions_discard_changes(E_Config_Dialog_Data *cfdata);
extern E_Config_Dialog_Data *e_config_runtime_info; extern E_Config_Dialog_Data *e_config_runtime_info;
static Ecore_X_Randr_Mode_Info disabled_mode = {.xid = Ecore_X_Randr_None};
Eina_Bool Eina_Bool
dialog_subdialog_resolutions_create_data(E_Config_Dialog_Data *cfdata) dialog_subdialog_resolutions_create_data(E_Config_Dialog_Data *cfdata)
@ -50,10 +51,10 @@ dialog_subdialog_resolutions_create_data(E_Config_Dialog_Data *cfdata)
mi = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->crtc->outputs_common_modes)); mi = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->crtc->outputs_common_modes));
odd->previous_mode = mi; odd->previous_mode = mi;
} }
else if (odd->output) else if (odd->output && odd->output->monitor)
{ {
odd->previous_mode = NULL; odd->previous_mode = NULL;
odd->preferred_mode = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->output->preferred_modes)); odd->preferred_mode = (Ecore_X_Randr_Mode_Info *)eina_list_data_get(eina_list_last(odd->output->monitor->preferred_modes));
} }
} }
@ -80,9 +81,9 @@ dialog_subdialog_resolutions_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dia
{ {
//Apply new mode //Apply new mode
Ecore_X_Randr_Mode_Info *selected_mode; Ecore_X_Randr_Mode_Info *selected_mode;
Ecore_X_ID selected_mode_xid; Ecore_X_Randr_Mode mode;
E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data; E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data;
Ecore_X_Randr_Output *output = NULL; Ecore_X_Randr_Output *outputs = NULL;
E_Randr_Crtc_Info *crtc_info = NULL, *crtc_iter; E_Randr_Crtc_Info *crtc_info = NULL, *crtc_iter;
Eina_List *iter; Eina_List *iter;
int noutputs = Ecore_X_Randr_Unset; int noutputs = Ecore_X_Randr_Unset;
@ -101,8 +102,8 @@ dialog_subdialog_resolutions_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dia
else if (output_dialog_data->output) else if (output_dialog_data->output)
{ {
//CRTC not assigned yet. Let's try to find a non occupied one. //CRTC not assigned yet. Let's try to find a non occupied one.
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)); fprintf(stderr, "CONF_RANDR: Trying to find a CRTC for output %d, %d crtcs are possible.\n", output_dialog_data->output->xid, eina_list_count(output_dialog_data->output->possible_crtcs));
output = &output_dialog_data->output->xid; outputs = &output_dialog_data->output->xid;
noutputs = 1; noutputs = 1;
EINA_LIST_FOREACH(output_dialog_data->output->possible_crtcs, iter, crtc_iter) EINA_LIST_FOREACH(output_dialog_data->output->possible_crtcs, iter, crtc_iter)
{ {
@ -122,22 +123,24 @@ dialog_subdialog_resolutions_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dia
//get selected mode //get selected mode
if ((selected_mode = (Ecore_X_Randr_Mode_Info *)e_widget_ilist_selected_data_get(e_config_runtime_info->gui.subdialogs.resolutions.dialog))) if ((selected_mode = (Ecore_X_Randr_Mode_Info *)e_widget_ilist_selected_data_get(e_config_runtime_info->gui.subdialogs.resolutions.dialog)))
{ {
selected_mode_xid = selected_mode->xid; mode = selected_mode->xid;
} }
else if (selected_mode == crtc_info->current_mode)
{ {
selected_mode_xid = Ecore_X_Randr_None; if (output_dialog_data->output && (eina_list_data_find(crtc_info->outputs, output_dialog_data->output)))
{
fprintf(stderr, "CONF_RANDR: Nothing to be done for output %s.\n", output_dialog_data->output->name);
return EINA_TRUE;
}
fprintf(stderr, "CONF_RANDR: Resolution remains unchanged for CRTC %d.\n", crtc_info->xid);
return EINA_TRUE;
} }
fprintf(stderr, "CONF_RANDR: Changing mode of crtc %d to %d.\n", crtc_info->xid, mode);
fprintf(stderr, "CONF_RANDR: Change mode of crtc %x to %x.\n", crtc_info->xid, selected_mode_xid); if (ecore_x_randr_crtc_mode_set(cfd->con->manager->root, crtc_info->xid, outputs, noutputs, mode))
if (ecore_x_randr_crtc_mode_set(cfd->con->manager->root, crtc_info->xid, output, noutputs, selected_mode_xid))
{ {
//remove unused space
ecore_x_randr_screen_reset(cfd->con->manager->root);
//update information //update information
if (!output_dialog_data->crtc) output_dialog_data->crtc = crtc_info;
output_dialog_data->crtc = crtc_info;
output_dialog_data->new_mode = selected_mode; output_dialog_data->new_mode = selected_mode;
return EINA_TRUE; return EINA_TRUE;
} }
@ -157,7 +160,7 @@ dialog_subdialog_resolutions_basic_check_changed(E_Config_Dialog *cfd __UNUSED__
} }
void void
dialog_subdialog_resolutions_update_list(Evas_Object *crtc) dialog_subdialog_resolutions_update_list(Evas_Object *rep)
{ {
Eina_List *iter, *modelist = NULL; Eina_List *iter, *modelist = NULL;
E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data; E_Config_Randr_Dialog_Output_Dialog_Data *output_dialog_data;
@ -165,16 +168,13 @@ dialog_subdialog_resolutions_update_list(Evas_Object *crtc)
char resolution_text[RESOLUTION_TXT_MAX_LENGTH]; char resolution_text[RESOLUTION_TXT_MAX_LENGTH];
float rate; float rate;
int str_ret, i = 0; int str_ret, i = 0;
Eina_Bool enable = EINA_FALSE;
e_widget_ilist_freeze(e_config_runtime_info->gui.subdialogs.resolutions.dialog); e_widget_ilist_freeze(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
e_widget_ilist_clear(e_config_runtime_info->gui.subdialogs.resolutions.dialog); e_widget_ilist_clear(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
if (!crtc)
{ if (!rep || !(output_dialog_data = evas_object_data_get(rep, "rep_info")))
e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.resolutions.dialog, EINA_TRUE); goto _go_and_return;
return;
}
if (!(output_dialog_data = evas_object_data_get(crtc, "rep_info")))
return;
//select correct mode list //select correct mode list
if (output_dialog_data->crtc) if (output_dialog_data->crtc)
@ -182,12 +182,15 @@ dialog_subdialog_resolutions_update_list(Evas_Object *crtc)
current_mode = output_dialog_data->crtc->current_mode; current_mode = output_dialog_data->crtc->current_mode;
modelist = output_dialog_data->crtc->outputs_common_modes; modelist = output_dialog_data->crtc->outputs_common_modes;
} }
else if (output_dialog_data->output) else if (output_dialog_data->output && output_dialog_data->output->monitor)
{ {
current_mode = NULL; current_mode = NULL;
if (output_dialog_data->output->modes) if (output_dialog_data->output->monitor->modes)
modelist = output_dialog_data->output->modes; modelist = output_dialog_data->output->monitor->modes;
} }
if (!modelist)
goto _go_and_return;
EINA_LIST_FOREACH(modelist, iter, mode_info) EINA_LIST_FOREACH(modelist, iter, mode_info)
{ {
//calculate refresh rate //calculate refresh rate
@ -213,10 +216,13 @@ dialog_subdialog_resolutions_update_list(Evas_Object *crtc)
} }
//append 'disabled' mode //append 'disabled' mode
e_widget_ilist_append(e_config_runtime_info->gui.subdialogs.resolutions.dialog, NULL, _("Disabled"), NULL, NULL, NULL); e_widget_ilist_append(e_config_runtime_info->gui.subdialogs.resolutions.dialog, NULL, _("Disabled"), NULL, &disabled_mode, NULL);
//reenable widget //reenable widget
e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.resolutions.dialog, EINA_FALSE); enable = EINA_TRUE;
_go_and_return:
e_widget_disabled_set(e_config_runtime_info->gui.subdialogs.resolutions.dialog, enable);
e_widget_ilist_go(e_config_runtime_info->gui.subdialogs.resolutions.dialog); e_widget_ilist_go(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
e_widget_ilist_thaw(e_config_runtime_info->gui.subdialogs.resolutions.dialog); e_widget_ilist_thaw(e_config_runtime_info->gui.subdialogs.resolutions.dialog);
} }

View File

@ -31,7 +31,7 @@ e_modapi_init(E_Module *m)
#undef D #undef D
#define T Config #define T Config
#define D conf_edd #define D conf_edd
E_CONFIG_VAL(D, T, display_disabled_outputs, UCHAR); E_CONFIG_VAL(D, T, display_disconnected_outputs, UCHAR);
#undef T #undef T
#undef D #undef D
@ -39,7 +39,7 @@ e_modapi_init(E_Module *m)
if (!randr_dialog_config) if (!randr_dialog_config)
{ {
randr_dialog_config = E_NEW(Config, 1); randr_dialog_config = E_NEW(Config, 1);
randr_dialog_config->display_disabled_outputs = EINA_FALSE; randr_dialog_config->display_disconnected_outputs = EINA_FALSE;
} }
return m; return m;