randr - fix xrandr output off/on/config gen to not miss outputs

This commit is contained in:
Carsten Haitzler 2023-01-23 21:13:58 +00:00
parent fd64bd69c6
commit 42eedd5fe8
1 changed files with 31 additions and 20 deletions

View File

@ -521,10 +521,10 @@ _e_comp_xrandr_cmd(void)
printf("RRR: crtcs=%p outputs=%p\n", crtcs, outputs); printf("RRR: crtcs=%p outputs=%p\n", crtcs, outputs);
if ((crtcs) && (outputs)) if ((crtcs) && (outputs))
{ {
outconf = alloca(crtcs_num * sizeof(Ecore_X_Randr_Output)); outconf = alloca(outputs_num * sizeof(Ecore_X_Randr_Output));
screenconf = alloca(crtcs_num * sizeof(E_Randr2_Screen *)); screenconf = alloca(outputs_num * sizeof(E_Randr2_Screen *));
memset(outconf, 0, crtcs_num * sizeof(Ecore_X_Randr_Output)); memset(outconf, 0, outputs_num * sizeof(Ecore_X_Randr_Output));
memset(screenconf, 0, crtcs_num * sizeof(E_Randr2_Screen *)); memset(screenconf, 0, outputs_num * sizeof(E_Randr2_Screen *));
// decide which outputs get which crtcs // decide which outputs get which crtcs
EINA_LIST_FOREACH(e_randr2->screens, l, s) EINA_LIST_FOREACH(e_randr2->screens, l, s)
@ -540,13 +540,18 @@ _e_comp_xrandr_cmd(void)
{ {
if (s->config.priority > top_priority) if (s->config.priority > top_priority)
top_priority = s->config.priority; top_priority = s->config.priority;
for (i = 0; i < crtcs_num; i++) for (i = 0; i < outputs_num; i++)
{ {
if (!screenconf[i]) if (!screenconf[i])
{ {
Ecore_X_Randr_Crtc crtc =
ecore_x_randr_output_crtc_get(root,
outputs[i]);
info = NULL;
printf("RRR: crtc slot empty: %i\n", i); printf("RRR: crtc slot empty: %i\n", i);
info = ecore_x_randr_crtc_info_get(root, if (crtc)
crtcs[i]); info = ecore_x_randr_crtc_info_get(root,
crtc);
if (info) if (info)
{ {
if (_output_exists(out, info) && if (_output_exists(out, info) &&
@ -556,20 +561,26 @@ _e_comp_xrandr_cmd(void)
printf("RRR: assign slot out: %x\n", out); printf("RRR: assign slot out: %x\n", out);
outconf[i] = out; outconf[i] = out;
screenconf[i] = s; screenconf[i] = s;
ecore_x_randr_crtc_info_free(info);
break;
} }
ecore_x_randr_crtc_info_free(info); ecore_x_randr_crtc_info_free(info);
} }
if (!screenconf[i])
{
printf("RRR: assign slot off\n");
outconf[i] = 0;
screenconf[i] = s;
}
break;
} }
} }
} }
else else
{ {
for (i = 0; i < crtcs_num; i++) for (i = 0; i < outputs_num; i++)
{ {
if (!screenconf[i]) if (!screenconf[i])
{ {
printf("RRR: assign slot off 2\n");
outconf[i] = 0; outconf[i] = 0;
screenconf[i] = s; screenconf[i] = s;
break; break;
@ -579,7 +590,7 @@ _e_comp_xrandr_cmd(void)
} }
} }
numout = 0; numout = 0;
for (i = 0; i < crtcs_num; i++) for (i = 0; i < outputs_num; i++)
{ {
if (screenconf[i]) numout++; if (screenconf[i]) numout++;
} }
@ -591,7 +602,7 @@ _e_comp_xrandr_cmd(void)
sb = eina_strbuf_new(); sb = eina_strbuf_new();
eina_strbuf_append(sb, "xrandr "); eina_strbuf_append(sb, "xrandr ");
// set up a crtc to drive each output (or not) // set up a crtc to drive each output (or not)
for (i = 0; i < crtcs_num; i++) for (i = 0; i < numout; i++)
{ {
sc = screenconf[i]; sc = screenconf[i];
if (!sc) continue; if (!sc) continue;
@ -697,10 +708,10 @@ _e_comp_xrandr_ecore_x(void)
printf("RRR: crtcs=%p outputs=%p\n", crtcs, outputs); printf("RRR: crtcs=%p outputs=%p\n", crtcs, outputs);
if ((crtcs) && (outputs)) if ((crtcs) && (outputs))
{ {
outconf = alloca(crtcs_num * sizeof(Ecore_X_Randr_Output)); outconf = alloca(outputs_num * sizeof(Ecore_X_Randr_Output));
screenconf = alloca(crtcs_num * sizeof(E_Randr2_Screen *)); screenconf = alloca(outputs_num * sizeof(E_Randr2_Screen *));
memset(outconf, 0, crtcs_num * sizeof(Ecore_X_Randr_Output)); memset(outconf, 0, outputs_num * sizeof(Ecore_X_Randr_Output));
memset(screenconf, 0, crtcs_num * sizeof(E_Randr2_Screen *)); memset(screenconf, 0, outputs_num * sizeof(E_Randr2_Screen *));
// decide which outputs get which crtcs // decide which outputs get which crtcs
EINA_LIST_FOREACH(e_randr2->screens, l, s) EINA_LIST_FOREACH(e_randr2->screens, l, s)
@ -716,7 +727,7 @@ _e_comp_xrandr_ecore_x(void)
{ {
if (s->config.priority > top_priority) if (s->config.priority > top_priority)
top_priority = s->config.priority; top_priority = s->config.priority;
for (i = 0; i < crtcs_num; i++) for (i = 0; i < outputs_num; i++)
{ {
if (!outconf[i]) if (!outconf[i])
{ {
@ -743,18 +754,18 @@ _e_comp_xrandr_ecore_x(void)
} }
} }
numout = 0; numout = 0;
for (i = 0; i < crtcs_num; i++) for (i = 0; i < outputs_num; i++)
{ {
if (outconf[i]) numout++; if (outconf[i]) numout++;
} }
if (numout) if (numout)
{ {
Ecore_X_Rectangle *scrs = alloca(crtcs_num * sizeof(Ecore_X_Rectangle)); Ecore_X_Rectangle *scrs = alloca(numout * sizeof(Ecore_X_Rectangle));
int scrs_num; int scrs_num;
scrs_num = 0; scrs_num = 0;
// set up a crtc to drive each output (or not) // set up a crtc to drive each output (or not)
for (i = 0; i < crtcs_num; i++) for (i = 0; i < numout; i++)
{ {
// XXX: find clones and set them as outputs in an array // XXX: find clones and set them as outputs in an array
if (outconf[i]) if (outconf[i])