Merge lp:~chrisccoulson/unity-settings-daemon/lp1542699 into lp:unity-settings-daemon

Proposed by Chris Coulson
Status: Merged
Approved by: Sebastien Bacher
Approved revision: 4133
Merged at revision: 4161
Proposed branch: lp:~chrisccoulson/unity-settings-daemon/lp1542699
Merge into: lp:unity-settings-daemon
Diff against target: 132 lines (+61/-25)
1 file modified
gnome-settings-daemon/gsd-rr.c (+61/-25)
To merge this branch: bzr merge lp:~chrisccoulson/unity-settings-daemon/lp1542699
Reviewer Review Type Date Requested Status
Unity Settings Daemon Development Team Pending
Review via email: mp+288952@code.launchpad.net

Commit message

Filter out outputs that don't have any corresponding CRTCs or modes.

To post a comment you must log in.
Revision history for this message
Sebastien Bacher (seb128) wrote :

urg, seems like that one got forgetten, looks good and should be landed!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'gnome-settings-daemon/gsd-rr.c'
2--- gnome-settings-daemon/gsd-rr.c 2015-11-18 09:28:50 +0000
3+++ gnome-settings-daemon/gsd-rr.c 2016-03-14 16:04:22 +0000
4@@ -130,6 +130,9 @@
5 static gboolean output_initialize (GsdRROutput *output,
6 XRRScreenResources *res,
7 GError **error);
8+static gboolean output_initialize_clones (GsdRROutput *output,
9+ XRRScreenResources *res,
10+ GError **error);
11
12 static GsdRROutput *output_copy (const GsdRROutput *from);
13 static void output_free (GsdRROutput *output);
14@@ -363,26 +366,38 @@
15 info->crtcs = (GsdRRCrtc **)g_ptr_array_free (a, FALSE);
16
17 a = g_ptr_array_new ();
18+ for (i = 0; i < resources->nmode; ++i)
19+ {
20+ GsdRRMode *mode = mode_new (info, resources->modes[i].id);
21+
22+ g_ptr_array_add (a, mode);
23+ }
24+ g_ptr_array_add (a, NULL);
25+ info->modes = (GsdRRMode **)g_ptr_array_free (a, FALSE);
26+
27+ /* We create and partially initialize the outputs in one pass to make it
28+ * easier to filter out ones that don't have any valid modes or CRTCs
29+ */
30+ a = g_ptr_array_new ();
31 for (i = 0; i < resources->noutput; ++i)
32 {
33 GsdRROutput *output = output_new (info, resources->outputs[i]);
34-
35+ if (!output_initialize (output, resources, error)) {
36+ output_free(output);
37+ g_ptr_array_foreach (a, (GFunc) output_free, NULL);
38+ g_ptr_array_free (a, FALSE);
39+ return FALSE;
40+ }
41+ if (!output->possible_crtcs[0] || !output->modes[0]) {
42+ output_free(output);
43+ continue;
44+ }
45 g_ptr_array_add (a, output);
46 }
47 g_ptr_array_add (a, NULL);
48 info->outputs = (GsdRROutput **)g_ptr_array_free (a, FALSE);
49
50- a = g_ptr_array_new ();
51- for (i = 0; i < resources->nmode; ++i)
52- {
53- GsdRRMode *mode = mode_new (info, resources->modes[i].id);
54-
55- g_ptr_array_add (a, mode);
56- }
57- g_ptr_array_add (a, NULL);
58- info->modes = (GsdRRMode **)g_ptr_array_free (a, FALSE);
59-
60- /* Initialize */
61+ /* Initialize everything else */
62 for (crtc = info->crtcs; *crtc; ++crtc)
63 {
64 if (!crtc_initialize (*crtc, resources, error))
65@@ -391,7 +406,7 @@
66
67 for (output = info->outputs; *output; ++output)
68 {
69- if (!output_initialize (*output, resources, error))
70+ if (!output_initialize_clones (*output, resources, error))
71 return FALSE;
72 }
73
74@@ -1606,18 +1621,6 @@
75 g_ptr_array_add (a, NULL);
76 output->possible_crtcs = (GsdRRCrtc **)g_ptr_array_free (a, FALSE);
77
78- /* Clones */
79- a = g_ptr_array_new ();
80- for (i = 0; i < info->nclone; ++i)
81- {
82- GsdRROutput *gsd_rr_output = gsd_rr_output_by_id (output->info, info->clones[i]);
83-
84- if (gsd_rr_output)
85- g_ptr_array_add (a, gsd_rr_output);
86- }
87- g_ptr_array_add (a, NULL);
88- output->clones = (GsdRROutput **)g_ptr_array_free (a, FALSE);
89-
90 /* Modes */
91 a = g_ptr_array_new ();
92 for (i = 0; i < info->nmode; ++i)
93@@ -1644,6 +1647,39 @@
94 return TRUE;
95 }
96
97+static gboolean
98+output_initialize_clones (GsdRROutput *output, XRRScreenResources *res, GError **error)
99+{
100+ XRROutputInfo *info = XRRGetOutputInfo (DISPLAY (output), res, output->id);
101+ GPtrArray *a;
102+ int i;
103+
104+ if (!info || !output->info)
105+ {
106+ /* FIXME: see the comment in crtc_initialize() */
107+ /* Translators: here, an "output" is a video output */
108+ g_set_error (error, GSD_RR_ERROR, GSD_RR_ERROR_RANDR_ERROR,
109+ _("could not get information about output %d"),
110+ (int) output->id);
111+ return FALSE;
112+ }
113+
114+ a = g_ptr_array_new ();
115+ for (i = 0; i < info->nclone; ++i)
116+ {
117+ GsdRROutput *gsd_rr_output = gsd_rr_output_by_id (output->info, info->clones[i]);
118+
119+ if (gsd_rr_output)
120+ g_ptr_array_add (a, gsd_rr_output);
121+ }
122+ g_ptr_array_add (a, NULL);
123+ output->clones = (GsdRROutput **)g_ptr_array_free (a, FALSE);
124+
125+ XRRFreeOutputInfo (info);
126+
127+ return TRUE;
128+}
129+
130 static GsdRROutput*
131 output_copy (const GsdRROutput *from)
132 {

Subscribers

People subscribed via source and target branches