Record primary output in randr config.

Signed-off-by: Chris Michael <devilhorns@comcast.net>
This commit is contained in:
Chris Michael 2013-05-24 13:04:58 +01:00
parent d6a392d127
commit 9f95515926
2 changed files with 19 additions and 13 deletions

View File

@ -156,6 +156,7 @@ _e_randr_config_load(void)
E_CONFIG_VAL(D, T, restore, UCHAR);
E_CONFIG_VAL(D, T, poll_interval, INT);
E_CONFIG_VAL(D, T, config_timestamp, ULL);
E_CONFIG_VAL(D, T, primary, INT);
/* try to load the randr config */
if ((e_randr_cfg = e_config_domain_load("e_randr", _e_randr_edd)))
@ -232,7 +233,7 @@ _e_randr_config_new(void)
root = ecore_x_window_root_first_get();
/* get which output is primary */
primary = ecore_x_randr_primary_output_get(root);
e_randr_cfg->primary = ecore_x_randr_primary_output_get(root);
/* record the current screen size in our config */
ecore_x_randr_screen_current_size_get(root, &e_randr_cfg->screen.width,
@ -277,7 +278,7 @@ _e_randr_config_new(void)
/* assign crtc for this output */
output_cfg->crtc = crtcs[i];
output_cfg->exists = EINA_TRUE;
if (outputs[j] == primary)
if ((int)outputs[j] == e_randr_cfg->primary)
output_cfg->primary = EINA_TRUE;
if (!primary)
@ -288,10 +289,10 @@ _e_randr_config_new(void)
/* if no primary is set, then we should
* use the first output listed by xrandr */
output_cfg->primary = EINA_TRUE;
primary = outputs[j];
e_randr_cfg->primary = (int)outputs[j];
ecore_x_randr_primary_output_set(root,
primary);
e_randr_cfg->primary);
}
}
@ -550,7 +551,8 @@ _e_randr_config_restore(void)
crtc_cfg->orient);
EINA_LIST_FOREACH(valid_outputs, o, out)
if (out->primary)
if ((out->primary) &&
((int)out->xid == e_randr_cfg->primary))
{
ecore_x_randr_primary_output_set(root, out->xid);
break;
@ -574,6 +576,7 @@ _e_randr_event_cb_screen_change(void *data EINA_UNUSED, int type EINA_UNUSED, vo
{
Ecore_X_Event_Screen_Change *ev;
Eina_Bool changed = EINA_FALSE;
Ecore_X_Randr_Output primary = 0;
ev = event;
@ -584,6 +587,14 @@ _e_randr_event_cb_screen_change(void *data EINA_UNUSED, int type EINA_UNUSED, vo
if (ev->root != e_manager_current_get()->root)
return ECORE_CALLBACK_RENEW;
primary = ecore_x_randr_primary_output_get(ev->root);
if (e_randr_cfg->primary != (int)primary)
{
e_randr_cfg->primary = (int)primary;
changed = EINA_TRUE;
}
if (e_randr_cfg->screen.width != ev->size.width)
{
printf("\tWidth Changed\n");
@ -861,13 +872,7 @@ _e_randr_event_cb_output_change(void *data EINA_UNUSED, int type EINA_UNUSED, vo
/* if we added or removed any outputs, we need to reset */
if ((output_new) || (output_removed))
{
/* we need to inform X about the changes */
/* easier just to call the restore function with the updated config */
/* _e_randr_config_restore(); */
ecore_x_randr_screen_reset(ev->win);
}
ecore_x_randr_screen_reset(ev->win);
return ECORE_CALLBACK_RENEW;
}

View File

@ -14,7 +14,7 @@ typedef struct _E_Randr_Config E_Randr_Config;
#define E_RANDR_VERSION_1_4 ((1 << 16) | 4)
#define E_RANDR_CONFIG_FILE_EPOCH 1
#define E_RANDR_CONFIG_FILE_GENERATION 2
#define E_RANDR_CONFIG_FILE_GENERATION 3
#define E_RANDR_CONFIG_FILE_VERSION \
((E_RANDR_CONFIG_FILE_EPOCH * 1000000) + E_RANDR_CONFIG_FILE_GENERATION)
@ -56,6 +56,7 @@ struct _E_Randr_Config
int poll_interval;
unsigned char restore;
unsigned long config_timestamp;
int primary;
};
EINTERN Eina_Bool e_randr_init(void);