52
51
Atom workarea_atom;
55
struct _GnomeRRLabelerClass {
56
GObjectClass parent_class;
59
60
G_DEFINE_TYPE (GnomeRRLabeler, gnome_rr_labeler, G_TYPE_OBJECT);
61
62
static void gnome_rr_labeler_finalize (GObject *object);
62
63
static void create_label_windows (GnomeRRLabeler *labeler);
64
static void setup_from_config (GnomeRRLabeler *labeler);
65
67
get_work_area (GnomeRRLabeler *labeler,
81
display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (labeler->screen));
83
display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (labeler->priv->screen));
82
84
workarea = XInternAtom (display, "_NET_WORKAREA", True);
84
disp_screen = GDK_SCREEN_XNUMBER (labeler->screen);
86
disp_screen = GDK_SCREEN_XNUMBER (labeler->priv->screen);
86
88
/* Defaults in case of error */
89
rect->width = gdk_screen_get_width (labeler->screen);
90
rect->height = gdk_screen_get_height (labeler->screen);
91
rect->width = gdk_screen_get_width (labeler->priv->screen);
92
rect->height = gdk_screen_get_height (labeler->priv->screen);
92
94
if (workarea == None)
135
137
xev = (XEvent *) xevent;
137
139
if (xev->type == PropertyNotify &&
138
xev->xproperty.atom == labeler->workarea_atom) {
140
xev->xproperty.atom == labeler->priv->workarea_atom) {
139
141
/* update label positions */
140
142
gnome_rr_labeler_hide (labeler);
141
143
create_label_windows (labeler);
150
152
GdkWindow *gdkwindow;
152
labeler->workarea_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
156
labeler->screen = gdk_screen_get_default ();
154
labeler->priv = G_TYPE_INSTANCE_GET_PRIVATE (labeler, GNOME_TYPE_RR_LABELER, GnomeRRLabelerPrivate);
156
labeler->priv->workarea_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
160
labeler->priv->screen = gdk_screen_get_default ();
157
161
/* code is not really designed to handle multiple screens so *shrug* */
158
gdkwindow = gdk_screen_get_root_window (labeler->screen);
162
gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
159
163
gdk_window_add_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
160
164
gdk_window_set_events (gdkwindow, gdk_window_get_events (gdkwindow) | GDK_PROPERTY_CHANGE_MASK);
164
gnome_rr_labeler_class_init (GnomeRRLabelerClass *class)
168
gnome_rr_labeler_set_property (GObject *gobject, guint property_id, const GValue *value, GParamSpec *param_spec)
170
GnomeRRLabeler *self = GNOME_RR_LABELER (gobject);
172
switch (property_id) {
174
self->priv->config = GNOME_RR_CONFIG (g_value_get_object (value));
177
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, param_spec);
182
gnome_rr_labeler_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)
184
GnomeRRLabeler *self = (GnomeRRLabeler*) G_OBJECT_CLASS (gnome_rr_labeler_parent_class)->constructor (type, n_construct_properties, construct_properties);
186
setup_from_config (self);
188
return (GObject*) self;
192
gnome_rr_labeler_class_init (GnomeRRLabelerClass *klass)
166
194
GObjectClass *object_class;
168
object_class = (GObjectClass *) class;
196
g_type_class_add_private (klass, sizeof (GnomeRRLabelerPrivate));
198
object_class = (GObjectClass *) klass;
200
object_class->set_property = gnome_rr_labeler_set_property;
170
201
object_class->finalize = gnome_rr_labeler_finalize;
202
object_class->constructor = gnome_rr_labeler_constructor;
204
g_object_class_install_property (object_class, PROP_CONFIG, g_param_spec_object ("config",
206
"RandR configuration to label",
207
GNOME_TYPE_RR_CONFIG,
208
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
209
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
179
218
labeler = GNOME_RR_LABELER (object);
181
gdkwindow = gdk_screen_get_root_window (labeler->screen);
220
gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
182
221
gdk_window_remove_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
184
/* We don't destroy the labeler->config (a GnomeRRConfig*) here; let our
185
* caller do that instead.
223
if (labeler->priv->config != NULL) {
224
g_object_unref (labeler->priv->config);
188
if (labeler->windows != NULL) {
227
if (labeler->priv->windows != NULL) {
189
228
gnome_rr_labeler_hide (labeler);
190
g_free (labeler->windows);
191
labeler->windows = NULL;
229
g_free (labeler->priv->windows);
194
g_free (labeler->palette);
195
labeler->palette = NULL;
232
g_free (labeler->priv->palette);
197
234
G_OBJECT_CLASS (gnome_rr_labeler_parent_class)->finalize (object);
226
g_assert (labeler->num_outputs > 0);
264
g_assert (labeler->priv->num_outputs > 0);
228
labeler->palette = g_new (GdkColor, labeler->num_outputs);
266
labeler->priv->palette = g_new (GdkColor, labeler->priv->num_outputs);
230
268
start_hue = 0.0; /* red */
231
269
end_hue = 2.0/3; /* blue */
233
for (i = 0; i < labeler->num_outputs; i++) {
271
for (i = 0; i < labeler->priv->num_outputs; i++) {
237
h = start_hue + (end_hue - start_hue) / labeler->num_outputs * i;
275
h = start_hue + (end_hue - start_hue) / labeler->priv->num_outputs * i;
241
279
gtk_hsv_to_rgb (h, s, v, &r, &g, &b);
243
labeler->palette[i].red = (int) (65535 * r + 0.5);
244
labeler->palette[i].green = (int) (65535 * g + 0.5);
245
labeler->palette[i].blue = (int) (65535 * b + 0.5);
281
labeler->priv->palette[i].red = (int) (65535 * r + 0.5);
282
labeler->priv->palette[i].green = (int) (65535 * g + 0.5);
283
labeler->priv->palette[i].blue = (int) (65535 * b + 0.5);
295
333
get_work_area (labeler, &workarea);
296
monitor_num = gdk_screen_get_monitor_at_point (labeler->screen, x, y);
297
gdk_screen_get_monitor_geometry (labeler->screen,
334
monitor_num = gdk_screen_get_monitor_at_point (labeler->priv->screen, x, y);
335
gdk_screen_get_monitor_geometry (labeler->priv->screen,
300
338
gdk_rectangle_intersect (&monitor, &workarea, &workarea);
305
343
static GtkWidget *
306
create_label_window (GnomeRRLabeler *labeler, GnomeOutputInfo *output, GdkColor *color)
344
create_label_window (GnomeRRLabeler *labeler, GnomeRROutputInfo *output, GdkColor *color)
308
346
GtkWidget *window;
309
347
GtkWidget *widget;
311
349
const char *display_name;
312
350
GdkColor black = { 0, 0, 0, 0 };
314
353
window = gtk_window_new (GTK_WINDOW_POPUP);
315
354
gtk_widget_set_app_paintable (window, TRUE);
325
364
g_signal_connect (window, "draw",
326
365
G_CALLBACK (label_window_draw_event_cb), labeler);
328
if (labeler->config->clone) {
367
if (gnome_rr_config_get_clone (labeler->priv->config)) {
329
368
/* Keep this string in sync with gnome-control-center/capplets/display/xrandr-capplet.c:get_display_name() */
331
370
/* Translators: this is the feature where what you see on your laptop's
336
375
display_name = _("Mirror Screens");
338
display_name = output->display_name;
377
display_name = gnome_rr_output_info_get_display_name (output);
340
379
str = g_strdup_printf ("<b>%s</b>", display_name);
341
380
widget = gtk_label_new (NULL);
351
390
gtk_container_add (GTK_CONTAINER (window), widget);
353
392
/* Should we center this at the top edge of the monitor, instead of using the upper-left corner? */
354
position_window (labeler, window, output->x, output->y);
393
gnome_rr_output_info_get_geometry (output, &x, &y, NULL, NULL);
394
position_window (labeler, window, x, y);
356
396
gtk_widget_show_all (window);
365
405
gboolean created_window_for_clone;
406
GnomeRROutputInfo **outputs;
367
labeler->windows = g_new (GtkWidget *, labeler->num_outputs);
408
labeler->priv->windows = g_new (GtkWidget *, labeler->priv->num_outputs);
369
410
created_window_for_clone = FALSE;
371
for (i = 0; i < labeler->num_outputs; i++) {
372
if (!created_window_for_clone && labeler->config->outputs[i]->on) {
373
labeler->windows[i] = create_label_window (labeler, labeler->config->outputs[i], labeler->palette + i);
375
if (labeler->config->clone)
412
outputs = gnome_rr_config_get_outputs (labeler->priv->config);
414
for (i = 0; i < labeler->priv->num_outputs; i++) {
415
if (!created_window_for_clone && gnome_rr_output_info_is_active (outputs[i])) {
416
labeler->priv->windows[i] = create_label_window (labeler, outputs[i], labeler->priv->palette + i);
418
if (gnome_rr_config_get_clone (labeler->priv->config))
376
419
created_window_for_clone = TRUE;
378
labeler->windows[i] = NULL;
421
labeler->priv->windows[i] = NULL;
383
426
setup_from_config (GnomeRRLabeler *labeler)
385
labeler->num_outputs = count_outputs (labeler->config);
428
labeler->priv->num_outputs = count_outputs (labeler->priv->config);
387
430
make_palette (labeler);
393
436
gnome_rr_labeler_new (GnomeRRConfig *config)
395
GnomeRRLabeler *labeler;
397
g_return_val_if_fail (config != NULL, NULL);
399
labeler = g_object_new (GNOME_TYPE_RR_LABELER, NULL);
400
labeler->config = config;
402
setup_from_config (labeler);
438
g_return_val_if_fail (GNOME_IS_RR_CONFIG (config), NULL);
440
return g_object_new (GNOME_TYPE_RR_LABELER, "config", config, NULL);
408
444
gnome_rr_labeler_hide (GnomeRRLabeler *labeler)
447
GnomeRRLabelerPrivate *priv;
412
449
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
414
if (labeler->windows == NULL)
451
priv = labeler->priv;
453
if (priv->windows == NULL)
417
for (i = 0; i < labeler->num_outputs; i++)
418
if (labeler->windows[i] != NULL) {
419
gtk_widget_destroy (labeler->windows[i]);
420
labeler->windows[i] = NULL;
422
g_free (labeler->windows);
423
labeler->windows = NULL;
456
for (i = 0; i < priv->num_outputs; i++)
457
if (priv->windows[i] != NULL) {
458
gtk_widget_destroy (priv->windows[i]);
459
priv->windows[i] = NULL;
461
g_free (priv->windows);
462
priv->windows = NULL;
427
gnome_rr_labeler_get_color_for_output (GnomeRRLabeler *labeler, GnomeOutputInfo *output, GdkColor *color_out)
466
gnome_rr_labeler_get_color_for_output (GnomeRRLabeler *labeler, GnomeRROutputInfo *output, GdkColor *color_out)
469
GnomeRROutputInfo **outputs;
431
471
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
432
g_return_if_fail (output != NULL);
472
g_return_if_fail (GNOME_IS_RR_OUTPUT_INFO (output));
433
473
g_return_if_fail (color_out != NULL);
435
for (i = 0; i < labeler->num_outputs; i++)
436
if (labeler->config->outputs[i] == output) {
437
*color_out = labeler->palette[i];
475
outputs = gnome_rr_config_get_outputs (labeler->priv->config);
477
for (i = 0; i < labeler->priv->num_outputs; i++)
478
if (outputs[i] == output) {
479
*color_out = labeler->priv->palette[i];