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+
5259enum {
5360 PROP_0 ,
5461 PROP_CONFIG ,
5562 PROP_LAST
5663};
5764
58- G_DEFINE_TYPE (CcDisplayLabeler , cc_display_labeler , G_TYPE_OBJECT );
59-
6065static void cc_display_labeler_finalize (GObject * object );
61- static void setup_from_config (CcDisplayLabeler * labeler );
6266
6367static GdkFilterReturn
6468screen_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-
126119static void
127120cc_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
147142static 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-
218176static void
219177rounded_rectangle (cairo_t * cr ,
220178 gint x ,
@@ -262,10 +220,11 @@ rounded_rectangle (cairo_t *cr,
262220static void
263221label_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
366326static 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- }
0 commit comments