Skip to content

Commit 7360582

Browse files
mtwebsterclefebvre
authored andcommitted
display: Add wayland compatibility
This fixes the display labeler, mainly. - Under wayland, the labels will be provided by Cinnamon - Under x11, the built-in labeler is still used. - Use static colors (this was generated by the old palette code).
1 parent 3754965 commit 7360582

File tree

4 files changed

+247
-186
lines changed

4 files changed

+247
-186
lines changed

panels/display/cc-display-arrangement.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -551,8 +551,8 @@ on_output_changed_cb (CcDisplayArrangement *self,
551551
static gint
552552
sort_outputs_by_disabled (gconstpointer a, gconstpointer b)
553553
{
554-
CcDisplayMonitor *ma = CC_DISPLAY_MONITOR (a);
555-
CcDisplayMonitor *mb = CC_DISPLAY_MONITOR (b);
554+
CcDisplayMonitor *ma = CC_DISPLAY_MONITOR ((gpointer) a);
555+
CcDisplayMonitor *mb = CC_DISPLAY_MONITOR ((gpointer) b);
556556

557557
if (!cc_display_monitor_is_active (ma) && cc_display_monitor_is_active (mb))
558558
return -1;
@@ -561,7 +561,7 @@ sort_outputs_by_disabled (gconstpointer a, gconstpointer b)
561561
if (cc_display_monitor_is_active (ma) && !cc_display_monitor_is_active (mb))
562562
return 1;
563563

564-
return cc_display_monitor_get_ui_number (a) < cc_display_monitor_get_ui_number (b) ? -1 : 1;
564+
return cc_display_monitor_get_ui_number ((gpointer) a) < cc_display_monitor_get_ui_number ((gpointer) b) ? -1 : 1;
565565
}
566566

567567
static gboolean

panels/display/cc-display-labeler.c

Lines changed: 34 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -37,28 +37,32 @@
3737

3838
#include "cc-display-labeler.h"
3939

40-
struct _CcDisplayLabelerPrivate {
40+
typedef struct {
4141
CcDisplayConfig *config;
4242

4343
int num_outputs;
4444

45-
GdkRGBA *palette;
4645
GtkWidget **windows;
4746

4847
GdkScreen *screen;
4948
Atom workarea_atom;
49+
} CcDisplayLabelerPrivate;
50+
51+
struct _CcDisplayLabeler
52+
{
53+
GObject parent;
54+
CcDisplayLabelerPrivate *priv;
5055
};
5156

57+
G_DEFINE_TYPE_WITH_PRIVATE (CcDisplayLabeler, cc_display_labeler, G_TYPE_OBJECT)
58+
5259
enum {
5360
PROP_0,
5461
PROP_CONFIG,
5562
PROP_LAST
5663
};
5764

58-
G_DEFINE_TYPE (CcDisplayLabeler, cc_display_labeler, G_TYPE_OBJECT);
59-
6065
static void cc_display_labeler_finalize (GObject *object);
61-
static void setup_from_config (CcDisplayLabeler *labeler);
6266

6367
static GdkFilterReturn
6468
screen_xevent_filter (GdkXEvent *xevent,
@@ -86,14 +90,13 @@ cc_display_labeler_init (CcDisplayLabeler *labeler)
8690
{
8791
GdkWindow *gdkwindow;
8892

89-
labeler->priv = G_TYPE_INSTANCE_GET_PRIVATE (labeler, GNOME_TYPE_RR_LABELER, CcDisplayLabelerPrivate);
93+
labeler->priv = cc_display_labeler_get_instance_private (labeler);
9094

9195
labeler->priv->workarea_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
9296
"_NET_WORKAREA",
9397
True);
9498

9599
labeler->priv->screen = gdk_screen_get_default ();
96-
/* code is not really designed to handle multiple screens so *shrug* */
97100
gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
98101
gdk_window_add_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
99102
gdk_window_set_events (gdkwindow, gdk_window_get_events (gdkwindow) | GDK_PROPERTY_CHANGE_MASK);
@@ -113,35 +116,27 @@ cc_display_labeler_set_property (GObject *gobject, guint property_id, const GVal
113116
}
114117
}
115118

116-
static GObject *
117-
cc_display_labeler_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)
118-
{
119-
CcDisplayLabeler *self = (CcDisplayLabeler*) G_OBJECT_CLASS (cc_display_labeler_parent_class)->constructor (type, n_construct_properties, construct_properties);
120-
121-
setup_from_config (self);
122-
123-
return (GObject*) self;
124-
}
125-
126119
static void
127120
cc_display_labeler_class_init (CcDisplayLabelerClass *klass)
128121
{
129122
GObjectClass *object_class;
130123

131-
g_type_class_add_private (klass, sizeof (CcDisplayLabelerPrivate));
132-
133124
object_class = (GObjectClass *) klass;
134125

135126
object_class->set_property = cc_display_labeler_set_property;
136127
object_class->finalize = cc_display_labeler_finalize;
137-
object_class->constructor = cc_display_labeler_constructor;
138128

139129
g_object_class_install_property (object_class, PROP_CONFIG, g_param_spec_object ("config",
140130
"Configuration",
141131
"RandR configuration to label",
142132
CC_TYPE_DISPLAY_CONFIG,
143133
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
144134
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
135+
g_signal_new ("get-output-color",
136+
CC_TYPE_DISPLAY_LABELER,
137+
G_SIGNAL_RUN_LAST,
138+
0, NULL, NULL, NULL,
139+
G_TYPE_STRING, 1, CC_TYPE_DISPLAY_MONITOR);
145140
}
146141

147142
static void
@@ -152,8 +147,8 @@ cc_display_labeler_finalize (GObject *object)
152147

153148
labeler = CC_DISPLAY_LABELER (object);
154149

155-
gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
156-
gdk_window_remove_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
150+
gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
151+
gdk_window_remove_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
157152

158153
if (labeler->priv->config != NULL) {
159154
g_object_unref (labeler->priv->config);
@@ -164,8 +159,6 @@ cc_display_labeler_finalize (GObject *object)
164159
g_free (labeler->priv->windows);
165160
}
166161

167-
g_free (labeler->priv->palette);
168-
169162
G_OBJECT_CLASS (cc_display_labeler_parent_class)->finalize (object);
170163
}
171164

@@ -180,41 +173,6 @@ count_outputs (CcDisplayConfig *config)
180173
return i;
181174
}
182175

183-
static void
184-
make_palette (CcDisplayLabeler *labeler)
185-
{
186-
/* The idea is that we go around an hue color wheel. We want to start
187-
* at red, go around to green/etc. and stop at blue.
188-
*
189-
*/
190-
double start_hue;
191-
double end_hue;
192-
int i;
193-
194-
g_assert (labeler->priv->num_outputs > 0);
195-
196-
labeler->priv->palette = g_new (GdkRGBA, labeler->priv->num_outputs);
197-
198-
start_hue = 0.0; /* red */
199-
end_hue = 2.0/3; /* blue */
200-
201-
for (i = 0; i < labeler->priv->num_outputs; i++) {
202-
double h, s, v;
203-
double r, g, b;
204-
205-
h = start_hue + (end_hue - start_hue) / labeler->priv->num_outputs * i;
206-
s = 0.6;
207-
v = 1.0;
208-
209-
gtk_hsv_to_rgb (h, s, v, &r, &g, &b);
210-
211-
labeler->priv->palette[i].red = r;
212-
labeler->priv->palette[i].green = g;
213-
labeler->priv->palette[i].blue = b;
214-
labeler->priv->palette[i].alpha = 1.0;
215-
}
216-
}
217-
218176
static void
219177
rounded_rectangle (cairo_t *cr,
220178
gint x,
@@ -262,10 +220,11 @@ rounded_rectangle (cairo_t *cr,
262220
static void
263221
label_draw_background_and_frame (GtkWidget *widget, cairo_t *cr)
264222
{
265-
GdkRGBA *rgba;
223+
GdkRGBA rgba;
266224
GtkAllocation allocation;
225+
gchar *rgba_str;
267226

268-
rgba = g_object_get_data (G_OBJECT (widget), "rgba");
227+
rgba_str = g_object_get_data (G_OBJECT (widget), "rgba");
269228
gtk_widget_get_allocation (widget, &allocation);
270229

271230
cairo_save (cr);
@@ -284,8 +243,9 @@ label_draw_background_and_frame (GtkWidget *widget, cairo_t *cr)
284243
cairo_stroke (cr);
285244

286245
/* fill */
287-
rgba->alpha = 0.90;
288-
gdk_cairo_set_source_rgba (cr, rgba);
246+
gdk_rgba_parse (&rgba, rgba_str);
247+
rgba.alpha = 0.90;
248+
gdk_cairo_set_source_rgba (cr, &rgba);
289249

290250
rounded_rectangle (cr,
291251
LABEL_WINDOW_EDGE_THICKNESS,
@@ -364,7 +324,7 @@ label_window_composited_changed_cb (GtkWidget *widget, CcDisplayLabeler *labeler
364324
}
365325

366326
static GtkWidget *
367-
create_label_window (CcDisplayLabeler *labeler, CcDisplayMonitor *output, GdkRGBA *rgba, gint num)
327+
create_label_window (CcDisplayLabeler *labeler, CcDisplayMonitor *output, gchar *rgba_str, gint num)
368328
{
369329
GtkWidget *window;
370330
GtkWidget *widget;
@@ -390,7 +350,8 @@ create_label_window (CcDisplayLabeler *labeler, CcDisplayMonitor *output, GdkRGB
390350
* array. Note that in cc_display_labeler_finalize(), we are careful to
391351
* free the palette only after we free the windows.
392352
*/
393-
g_object_set_data (G_OBJECT (window), "rgba", rgba);
353+
354+
g_object_set_data_full (G_OBJECT (window), "rgba", rgba_str, (GDestroyNotify) g_free);
394355

395356
g_signal_connect (window, "draw",
396357
G_CALLBACK (label_window_draw_event_cb), labeler);
@@ -431,16 +392,6 @@ create_label_window (CcDisplayLabeler *labeler, CcDisplayMonitor *output, GdkRGB
431392
return window;
432393
}
433394

434-
static void
435-
setup_from_config (CcDisplayLabeler *labeler)
436-
{
437-
labeler->priv->num_outputs = count_outputs (labeler->priv->config);
438-
439-
make_palette (labeler);
440-
441-
cc_display_labeler_show (labeler);
442-
}
443-
444395
/**
445396
* cc_display_labeler_new:
446397
* @config: Configuration of the screens to label
@@ -457,7 +408,7 @@ cc_display_labeler_new (CcDisplayConfig *config)
457408
{
458409
g_return_val_if_fail (CC_IS_DISPLAY_CONFIG (config), NULL);
459410

460-
return g_object_new (GNOME_TYPE_RR_LABELER, "config", config, NULL);
411+
return g_object_new (CC_TYPE_DISPLAY_LABELER, "config", config, NULL);
461412
}
462413

463414
/**
@@ -473,11 +424,12 @@ cc_display_labeler_show (CcDisplayLabeler *labeler)
473424
gboolean created_window_for_clone;
474425
GList *outputs, *l;
475426

476-
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
427+
g_return_if_fail (CC_IS_DISPLAY_LABELER (labeler));
477428

478429
if (labeler->priv->windows != NULL)
479430
return;
480431

432+
labeler->priv->num_outputs = count_outputs (labeler->priv->config);
481433
labeler->priv->windows = g_new (GtkWidget *, labeler->priv->num_outputs);
482434

483435
created_window_for_clone = FALSE;
@@ -488,7 +440,10 @@ cc_display_labeler_show (CcDisplayLabeler *labeler)
488440
CcDisplayMonitor *output = CC_DISPLAY_MONITOR (l->data);
489441

490442
if (!created_window_for_clone) {
491-
labeler->priv->windows[i] = create_label_window (labeler, output, labeler->priv->palette + i, i + 1);
443+
gchar *rgba_str;
444+
445+
g_signal_emit_by_name (G_OBJECT (labeler), "get-output-color", output, &rgba_str);
446+
labeler->priv->windows[i] = create_label_window (labeler, output, rgba_str, i + 1);
492447

493448
if (cc_display_config_is_cloning (labeler->priv->config))
494449
created_window_for_clone = TRUE;
@@ -509,7 +464,7 @@ cc_display_labeler_hide (CcDisplayLabeler *labeler)
509464
int i;
510465
CcDisplayLabelerPrivate *priv;
511466

512-
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
467+
g_return_if_fail (CC_IS_DISPLAY_LABELER (labeler));
513468

514469
priv = labeler->priv;
515470

@@ -525,39 +480,3 @@ cc_display_labeler_hide (CcDisplayLabeler *labeler)
525480
priv->windows = NULL;
526481
}
527482

528-
/**
529-
* cc_display_labeler_get_rgba_for_output:
530-
* @labeler: A #CcDisplayLabeler
531-
* @output: Output device (i.e. monitor) to query
532-
* @rgba_out: (out): Color of selected monitor.
533-
*
534-
* Get the color used for the label on a given output (monitor).
535-
*/
536-
void
537-
cc_display_labeler_get_rgba_for_output (CcDisplayLabeler *labeler, CcDisplayMonitor *output, GdkRGBA *rgba_out)
538-
{
539-
int i;
540-
GList *outputs, *l;
541-
542-
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
543-
g_return_if_fail (CC_IS_DISPLAY_MONITOR (output));
544-
g_return_if_fail (rgba_out != NULL);
545-
546-
outputs = cc_display_config_get_ui_sorted_monitors (labeler->priv->config);
547-
548-
for (l = outputs, i = 0; l != NULL; l = l->next, i++) {
549-
CcDisplayMonitor *o = CC_DISPLAY_MONITOR (l->data);
550-
551-
if (o == output) {
552-
*rgba_out = labeler->priv->palette[i];
553-
return;
554-
}
555-
}
556-
557-
g_warning ("trying to get the color for unknown CcDisplayMonitor %p; returning magenta!", output);
558-
559-
rgba_out->red = 1.0;
560-
rgba_out->green = 0;
561-
rgba_out->blue = 1.0;
562-
rgba_out->alpha = 1.0;
563-
}

panels/display/cc-display-labeler.h

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,43 +22,18 @@
2222
*
2323
* Author: Federico Mena-Quintero <federico@novell.com>
2424
*/
25+
#pragma once
2526

26-
#ifndef CC_DISPLAY_LABELER_H
27-
#define CC_DISPLAY_LABELER_H
28-
29-
#define GNOME_DESKTOP_USE_UNSTABLE_API
27+
// #define GNOME_DESKTOP_USE_UNSTABLE_API
3028
#include "cc-display-config.h"
3129

32-
#define GNOME_TYPE_RR_LABELER (cc_display_labeler_get_type ())
33-
#define CC_DISPLAY_LABELER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_RR_LABELER, CcDisplayLabeler))
34-
#define CC_DISPLAY_LABELER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_RR_LABELER, CcDisplayLabelerClass))
35-
#define GNOME_IS_RR_LABELER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_RR_LABELER))
36-
#define GNOME_IS_RR_LABELER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_RR_LABELER))
37-
#define CC_DISPLAY_LABELER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_RR_LABELER, CcDisplayLabelerClass))
38-
39-
typedef struct _CcDisplayLabeler CcDisplayLabeler;
40-
typedef struct _CcDisplayLabelerClass CcDisplayLabelerClass;
41-
typedef struct _CcDisplayLabelerPrivate CcDisplayLabelerPrivate;
42-
43-
struct _CcDisplayLabeler {
44-
GObject parent;
45-
46-
/*< private >*/
47-
CcDisplayLabelerPrivate *priv;
48-
};
30+
G_BEGIN_DECLS
4931

50-
struct _CcDisplayLabelerClass {
51-
GObjectClass parent_class;
52-
};
53-
54-
GType cc_display_labeler_get_type (void);
32+
#define CC_TYPE_DISPLAY_LABELER (cc_display_labeler_get_type ())
33+
G_DECLARE_FINAL_TYPE (CcDisplayLabeler, cc_display_labeler, CC, DISPLAY_LABELER, GObject)
5534

5635
CcDisplayLabeler *cc_display_labeler_new (CcDisplayConfig *config);
57-
5836
void cc_display_labeler_show (CcDisplayLabeler *labeler);
59-
6037
void cc_display_labeler_hide (CcDisplayLabeler *labeler);
6138

62-
void cc_display_labeler_get_rgba_for_output (CcDisplayLabeler *labeler, CcDisplayMonitor *output, GdkRGBA *rgba_out);
63-
64-
#endif
39+
G_END_DECLS

0 commit comments

Comments
 (0)