display res dialog now offers rotate & flip... if your x/drivers can do it.

SVN revision: 22555
This commit is contained in:
Carsten Haitzler 2006-05-12 15:07:39 +00:00
parent a4bef14b22
commit 25fb9ffe5d
4 changed files with 121 additions and 59 deletions

View File

@ -463,6 +463,7 @@ e_config_init(void)
E_CONFIG_VAL(D, T, display_res_width, INT); E_CONFIG_VAL(D, T, display_res_width, INT);
E_CONFIG_VAL(D, T, display_res_height, INT); E_CONFIG_VAL(D, T, display_res_height, INT);
E_CONFIG_VAL(D, T, display_res_hz, INT); E_CONFIG_VAL(D, T, display_res_hz, INT);
E_CONFIG_VAL(D, T, display_res_rotation, INT);
e_config = e_config_domain_load("e", _e_config_edd); e_config = e_config_domain_load("e", _e_config_edd);
if (e_config) if (e_config)
@ -635,6 +636,7 @@ e_config_init(void)
e_config->display_res_width = 0; e_config->display_res_width = 0;
e_config->display_res_height = 0; e_config->display_res_height = 0;
e_config->display_res_hz = 0; e_config->display_res_hz = 0;
e_config->display_res_rotation = 0;
{ {
E_Config_Module *em; E_Config_Module *em;
@ -1207,6 +1209,7 @@ e_config_init(void)
E_CONFIG_LIMIT(e_config->display_res_width, 1, 8192); E_CONFIG_LIMIT(e_config->display_res_width, 1, 8192);
E_CONFIG_LIMIT(e_config->display_res_height, 1, 8192); E_CONFIG_LIMIT(e_config->display_res_height, 1, 8192);
E_CONFIG_LIMIT(e_config->display_res_hz, 0, 250); E_CONFIG_LIMIT(e_config->display_res_hz, 0, 250);
E_CONFIG_LIMIT(e_config->display_res_rotation, 0, 0xff);
e_config_save_queue(); e_config_save_queue();

View File

@ -210,8 +210,8 @@ struct _E_Config
int use_app_icon; // GUI int use_app_icon; // GUI
int cfgdlg_auto_apply; // GUI int cfgdlg_auto_apply; // GUI
int cfgdlg_default_mode; // GUI int cfgdlg_default_mode; // GUI
Evas_List *gadcons; Evas_List *gadcons; // GUI
Evas_List *shelves; Evas_List *shelves; // GUI
int font_hinting; // GUI int font_hinting; // GUI
char *desklock_personal_passwd; // GUI char *desklock_personal_passwd; // GUI
@ -221,12 +221,13 @@ struct _E_Config
int desklock_autolock; // GUI int desklock_autolock; // GUI
int desklock_use_timeout; // GUI int desklock_use_timeout; // GUI
double desklock_timeout; // GUI double desklock_timeout; // GUI
int desklock_disable_screensaver; int desklock_disable_screensaver; // GUI
int display_res_restore; int display_res_restore; // GUI
int display_res_width; int display_res_width; // GUI
int display_res_height; int display_res_height; // GUI
int display_res_hz; int display_res_hz; // GUI
int display_res_rotation; // GUI
}; };
struct _E_Config_Module struct _E_Config_Module

View File

@ -44,6 +44,10 @@ struct _E_Config_Dialog_Data
Ecore_X_Screen_Size orig_size; Ecore_X_Screen_Size orig_size;
Ecore_X_Screen_Refresh_Rate orig_rate; Ecore_X_Screen_Refresh_Rate orig_rate;
int restore; int restore;
int can_rotate;
int can_flip;
Ecore_X_Randr_Rotation rotation;
Ecore_X_Randr_Rotation flip;
SureBox *surebox; SureBox *surebox;
}; };
@ -186,7 +190,6 @@ e_int_config_display(E_Container *con)
v->override_auto_apply = 1; v->override_auto_apply = 1;
cfd = e_config_dialog_new(con, _("Display Settings"), NULL, 0, v, NULL); cfd = e_config_dialog_new(con, _("Display Settings"), NULL, 0, v, NULL);
e_dialog_resizable_set(cfd->dia, 1);
return cfd; return cfd;
} }
@ -194,11 +197,29 @@ static void
_fill_data(E_Config_Dialog_Data *cfdata) _fill_data(E_Config_Dialog_Data *cfdata)
{ {
E_Manager *man; E_Manager *man;
Ecore_X_Randr_Rotation rots;
man = e_manager_current_get(); man = e_manager_current_get();
cfdata->orig_size = ecore_x_randr_current_screen_size_get(man->root); cfdata->orig_size = ecore_x_randr_current_screen_size_get(man->root);
cfdata->orig_rate = ecore_x_randr_current_screen_refresh_rate_get(man->root); cfdata->orig_rate = ecore_x_randr_current_screen_refresh_rate_get(man->root);
cfdata->restore = e_config->display_res_restore; cfdata->restore = e_config->display_res_restore;
rots = ecore_x_randr_screen_rotations_get(man->root);
if (rots)
{
cfdata->rotation = ecore_x_randr_screen_rotation_get(man->root);
if ((rots & (ECORE_X_RANDR_FLIP_X | ECORE_X_RANDR_FLIP_Y)))
cfdata->can_flip = 1;
cfdata->flip = cfdata->rotation &
(ECORE_X_RANDR_FLIP_X | ECORE_X_RANDR_FLIP_Y);
if ((rots & (ECORE_X_RANDR_ROT_0 | ECORE_X_RANDR_ROT_90 |
ECORE_X_RANDR_ROT_180 | ECORE_X_RANDR_ROT_270)))
cfdata->can_rotate = 1;
cfdata->rotation = cfdata->rotation &
(ECORE_X_RANDR_ROT_0 | ECORE_X_RANDR_ROT_90 |
ECORE_X_RANDR_ROT_180 | ECORE_X_RANDR_ROT_270);
}
} }
static void * static void *
@ -241,43 +262,54 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
e_config->display_res_height = cfdata->orig_size.height; e_config->display_res_height = cfdata->orig_size.height;
e_config->display_res_hz = cfdata->orig_rate.rate; e_config->display_res_hz = cfdata->orig_rate.rate;
if ((cfdata->orig_size.width == w) &&
(cfdata->orig_size.height == h) &&
(cfdata->orig_rate.rate == r))
goto saveonly;
man = e_manager_current_get(); man = e_manager_current_get();
sizes = ecore_x_randr_screen_sizes_get(man->root, &n);
for (i = 0; i < n; i++) if (!((cfdata->orig_size.width == w) && (cfdata->orig_size.height == h) &&
(cfdata->orig_rate.rate == r)))
{ {
if ((sizes[i].width == w) && sizes = ecore_x_randr_screen_sizes_get(man->root, &n);
(sizes[i].height == h)) for (i = 0; i < n; i++)
{ {
size = sizes[i]; if ((sizes[i].width == w) &&
int k, rr; (sizes[i].height == h))
rates = ecore_x_randr_screen_refresh_rates_get(man->root, i, &rr);
for (k = 0; k < rr; k++)
{ {
if (rates[k].rate == r) size = sizes[i];
int k, rr;
rates = ecore_x_randr_screen_refresh_rates_get(man->root, i, &rr);
for (k = 0; k < rr; k++)
{ {
rate = rates[k]; if (rates[k].rate == r)
break; {
} rate = rates[k];
break;
}
}
break;
} }
break;
} }
e_config->display_res_width = size.width;
e_config->display_res_height = size.height;
e_config->display_res_hz = rate.rate;
ecore_x_randr_screen_refresh_rate_set(man->root, size, rate);
_surebox_new(cfd, cfdata);
cfdata->orig_size = size;
cfdata->orig_rate = rate;
} }
e_config->display_res_width = size.width; if ((cfdata->can_rotate) || (cfdata->can_flip))
e_config->display_res_height = size.height; {
e_config->display_res_hz = rate.rate; Ecore_X_Randr_Rotation rot;
ecore_x_randr_screen_refresh_rate_set(man->root, size, rate);
_surebox_new(cfd, cfdata); rot = ecore_x_randr_screen_rotation_get(man->root);
if (rot != cfdata->rotation | cfdata->flip)
ecore_x_randr_screen_rotation_set(man->root,
cfdata->rotation | cfdata->flip);
e_config->display_res_rotation = cfdata->rotation | cfdata->flip;
}
else
e_config->display_res_rotation = 0;
cfdata->orig_size = size;
cfdata->orig_rate = rate;
saveonly:
e_config->display_res_restore = cfdata->restore; e_config->display_res_restore = cfdata->restore;
e_config_save_queue(); e_config_save_queue();
@ -287,22 +319,24 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
static Evas_Object * static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{ {
Evas_Object *o, *of, *ol, *rl, *ob; Evas_Object *o, *of, *ol, *rl, *ob, *o2;
E_Radio_Group *rg;
E_Manager *man; E_Manager *man;
Ecore_X_Screen_Size *sizes; Ecore_X_Screen_Size *sizes;
Ecore_X_Screen_Size size; Ecore_X_Screen_Size size;
Ecore_X_Randr_Rotation rots, rot;
int i, r, s; int i, r, s;
_fill_data(cfdata); _fill_data(cfdata);
o = e_widget_list_add(evas, 0, 0); o = e_widget_list_add(evas, 0, 1);
o2 = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Resolution"), 0); of = e_widget_framelist_add(evas, _("Resolution"), 0);
ol = e_widget_ilist_add(evas, 32, 32, NULL); ol = e_widget_ilist_add(evas, 32, 32, NULL);
e_widget_min_size_set(ol, 140, 120); e_widget_min_size_set(ol, 140, 120);
e_widget_framelist_object_append(of, ol); e_widget_framelist_object_append(of, ol);
e_widget_list_object_append(o, of, 1, 1, 0.5); e_widget_list_object_append(o2, of, 1, 1, 0.5);
res_list = ol; res_list = ol;
@ -310,7 +344,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
rl = e_widget_ilist_add(evas, 8, 8, NULL); rl = e_widget_ilist_add(evas, 8, 8, NULL);
e_widget_min_size_set(rl, 140, 90); e_widget_min_size_set(rl, 140, 90);
e_widget_framelist_object_append(of, rl); e_widget_framelist_object_append(of, rl);
e_widget_list_object_append(o, of, 1, 1, 0.5); e_widget_list_object_append(o2, of, 1, 1, 0.5);
rate_list = rl; rate_list = rl;
@ -388,30 +422,51 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
} }
ob = e_widget_check_add(evas, _("Restore this resolution on login"), &(cfdata->restore)); ob = e_widget_check_add(evas, _("Restore this resolution on login"), &(cfdata->restore));
e_widget_list_object_append(o, ob, 1, 1, 0.5); e_widget_list_object_append(o2, ob, 1, 1, 0.5);
e_widget_ilist_go(ol); e_widget_ilist_go(ol);
e_widget_ilist_go(rl); e_widget_ilist_go(rl);
e_widget_list_object_append(o, o2, 1, 1, 0.5);
rots = ecore_x_randr_screen_rotations_get(man->root); if ((cfdata->can_rotate) || (cfdata->can_flip))
rot = ecore_x_randr_screen_rotation_get(man->root); o2 = e_widget_list_add(evas, 0, 0);
if (!rots)
if (cfdata->can_rotate)
{ {
printf("no randr support\n"); of = e_widget_framelist_add(evas, _("Rotation"), 0);
rg = e_widget_radio_group_new(&(cfdata->rotation));
ob = e_widget_radio_add(evas, _("Normal"), ECORE_X_RANDR_ROT_0, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("To the left"), ECORE_X_RANDR_ROT_90, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Turned around"), ECORE_X_RANDR_ROT_180, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("To the right"), ECORE_X_RANDR_ROT_270, rg);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o2, of, 0, 0, 0.5);
} }
if (rot & ECORE_X_RANDR_ROT_0) printf("rot: 0deg\n");
if (rot & ECORE_X_RANDR_ROT_90) printf("rot: 90deg\n"); if (cfdata->can_flip)
if (rot & ECORE_X_RANDR_ROT_180) printf("rot: 180deg\n"); {
if (rot & ECORE_X_RANDR_ROT_270) printf("rot: 270deg\n"); of = e_widget_framelist_add(evas, _("Mirroring"), 0);
if (rot & ECORE_X_RANDR_FLIP_X) printf("rot: flip x\n");
if (rot & ECORE_X_RANDR_FLIP_Y) printf("rot: flip y\n"); rg = e_widget_radio_group_new(&(cfdata->flip));
printf("---\n", rot);
if (rots & ECORE_X_RANDR_ROT_0) printf("support: 0deg\n"); ob = e_widget_radio_add(evas, _("Horizontally"), ECORE_X_RANDR_FLIP_X, rg);
if (rots & ECORE_X_RANDR_ROT_90) printf("support: 90deg\n"); e_widget_framelist_object_append(of, ob);
if (rots & ECORE_X_RANDR_ROT_180) printf("support: 180deg\n"); ob = e_widget_radio_add(evas, _("Vertically"), ECORE_X_RANDR_FLIP_Y, rg);
if (rots & ECORE_X_RANDR_ROT_270) printf("support: 270deg\n"); e_widget_framelist_object_append(of, ob);
if (rots & ECORE_X_RANDR_FLIP_X) printf("support: flip x\n");
if (rots & ECORE_X_RANDR_FLIP_Y) printf("support: flip y\n"); e_widget_list_object_append(o2, of, 0, 0, 0.5);
}
if ((cfdata->can_rotate) || (cfdata->can_flip))
e_widget_list_object_append(o, o2, 0, 0, 0.0);
return o; return o;
} }

View File

@ -128,6 +128,9 @@ e_manager_new(Ecore_X_Window root, int num)
size.height = e_config->display_res_height; size.height = e_config->display_res_height;
rate.rate = e_config->display_res_hz; rate.rate = e_config->display_res_hz;
ecore_x_randr_screen_refresh_rate_set(man->root, size, rate); ecore_x_randr_screen_refresh_rate_set(man->root, size, rate);
if (e_config->display_res_rotation)
ecore_x_randr_screen_rotation_set(man->root,
e_config->display_res_rotation);
} }
h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, _e_manager_cb_window_show_request, man); h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, _e_manager_cb_window_show_request, man);