summaryrefslogtreecommitdiff
path: root/libmate-desktop/mate-rr-labeler.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmate-desktop/mate-rr-labeler.c')
-rw-r--r--libmate-desktop/mate-rr-labeler.c212
1 files changed, 128 insertions, 84 deletions
diff --git a/libmate-desktop/mate-rr-labeler.c b/libmate-desktop/mate-rr-labeler.c
index e515b51..e4aaa3e 100644
--- a/libmate-desktop/mate-rr-labeler.c
+++ b/libmate-desktop/mate-rr-labeler.c
@@ -29,7 +29,6 @@
#include <config.h>
#include <glib/gi18n-lib.h>
-#include "mate-rr-labeler.h"
#include <gtk/gtk.h>
#include <X11/Xproto.h>
@@ -38,9 +37,9 @@
#include <X11/Xatom.h>
#include <gdk/gdkx.h>
-struct _MateRRLabeler {
- GObject parent;
+#include "mate-rr-labeler.h"
+struct _MateRRLabelerPrivate {
MateRRConfig *config;
int num_outputs;
@@ -56,14 +55,17 @@ struct _MateRRLabeler {
Atom workarea_atom;
};
-struct _MateRRLabelerClass {
- GObjectClass parent_class;
+enum {
+ PROP_0,
+ PROP_CONFIG,
+ PROP_LAST
};
G_DEFINE_TYPE (MateRRLabeler, mate_rr_labeler, G_TYPE_OBJECT);
static void mate_rr_labeler_finalize (GObject *object);
static void create_label_windows (MateRRLabeler *labeler);
+static void setup_from_config (MateRRLabeler *labeler);
static gboolean
get_work_area (MateRRLabeler *labeler,
@@ -82,16 +84,16 @@ get_work_area (MateRRLabeler *labeler,
int disp_screen;
Display *display;
- display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (labeler->screen));
+ display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (labeler->priv->screen));
workarea = XInternAtom (display, "_NET_WORKAREA", True);
- disp_screen = GDK_SCREEN_XNUMBER (labeler->screen);
+ disp_screen = GDK_SCREEN_XNUMBER (labeler->priv->screen);
/* Defaults in case of error */
rect->x = 0;
rect->y = 0;
- rect->width = gdk_screen_get_width (labeler->screen);
- rect->height = gdk_screen_get_height (labeler->screen);
+ rect->width = gdk_screen_get_width (labeler->priv->screen);
+ rect->height = gdk_screen_get_height (labeler->priv->screen);
if (workarea == None)
return FALSE;
@@ -139,7 +141,7 @@ screen_xevent_filter (GdkXEvent *xevent,
xev = (XEvent *) xevent;
if (xev->type == PropertyNotify &&
- xev->xproperty.atom == labeler->workarea_atom) {
+ xev->xproperty.atom == labeler->priv->workarea_atom) {
/* update label positions */
mate_rr_labeler_hide (labeler);
create_label_windows (labeler);
@@ -153,25 +155,62 @@ mate_rr_labeler_init (MateRRLabeler *labeler)
{
GdkWindow *gdkwindow;
- labeler->workarea_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
- "_NET_WORKAREA",
- True);
+ labeler->priv = G_TYPE_INSTANCE_GET_PRIVATE (labeler, MATE_TYPE_RR_LABELER, MateRRLabelerPrivate);
- labeler->screen = gdk_screen_get_default ();
+ labeler->priv->workarea_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+ "_NET_WORKAREA",
+ True);
+
+ labeler->priv->screen = gdk_screen_get_default ();
/* code is not really designed to handle multiple screens so *shrug* */
- gdkwindow = gdk_screen_get_root_window (labeler->screen);
+ gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
gdk_window_add_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
gdk_window_set_events (gdkwindow, gdk_window_get_events (gdkwindow) | GDK_PROPERTY_CHANGE_MASK);
}
static void
-mate_rr_labeler_class_init (MateRRLabelerClass *class)
+mate_rr_labeler_set_property (GObject *gobject, guint property_id, const GValue *value, GParamSpec *param_spec)
+{
+ MateRRLabeler *self = MATE_RR_LABELER (gobject);
+
+ switch (property_id) {
+ case PROP_CONFIG:
+ self->priv->config = MATE_RR_CONFIG (g_value_get_object (value));
+ return;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, param_spec);
+ }
+}
+
+static GObject *
+mate_rr_labeler_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)
+{
+ MateRRLabeler *self = (MateRRLabeler*) G_OBJECT_CLASS (mate_rr_labeler_parent_class)->constructor (type, n_construct_properties, construct_properties);
+
+ setup_from_config (self);
+
+ return (GObject*) self;
+}
+
+static void
+mate_rr_labeler_class_init (MateRRLabelerClass *klass)
{
GObjectClass *object_class;
- object_class = (GObjectClass *) class;
+ g_type_class_add_private (klass, sizeof (MateRRLabelerPrivate));
+ object_class = (GObjectClass *) klass;
+
+ object_class->set_property = mate_rr_labeler_set_property;
object_class->finalize = mate_rr_labeler_finalize;
+ object_class->constructor = mate_rr_labeler_constructor;
+
+ g_object_class_install_property (object_class, PROP_CONFIG, g_param_spec_object ("config",
+ "Configuration",
+ "RandR configuration to label",
+ MATE_TYPE_RR_CONFIG,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
}
static void
@@ -182,21 +221,19 @@ mate_rr_labeler_finalize (GObject *object)
labeler = MATE_RR_LABELER (object);
- gdkwindow = gdk_screen_get_root_window (labeler->screen);
+ gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
gdk_window_remove_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
- /* We don't destroy the labeler->config (a MateRRConfig*) here; let our
- * caller do that instead.
- */
+ if (labeler->priv->config != NULL) {
+ g_object_unref (labeler->priv->config);
+ }
- if (labeler->windows != NULL) {
+ if (labeler->priv->windows != NULL) {
mate_rr_labeler_hide (labeler);
- g_free (labeler->windows);
- labeler->windows = NULL;
+ g_free (labeler->priv->windows);
}
- g_free (labeler->palette);
- labeler->palette = NULL;
+ g_free (labeler->priv->palette);
G_OBJECT_CLASS (mate_rr_labeler_parent_class)->finalize (object);
}
@@ -205,8 +242,9 @@ static int
count_outputs (MateRRConfig *config)
{
int i;
+ MateRROutputInfo **outputs = mate_rr_config_get_outputs (config);
- for (i = 0; config->outputs[i] != NULL; i++)
+ for (i = 0; outputs[i] != NULL; i++)
;
return i;
@@ -227,36 +265,36 @@ make_palette (MateRRLabeler *labeler)
double end_hue;
int i;
- g_assert (labeler->num_outputs > 0);
+ g_assert (labeler->priv->num_outputs > 0);
#if GTK_CHECK_VERSION (3, 0, 0)
- labeler->palette = g_new (GdkRGBA, labeler->num_outputs);
+ labeler->priv->palette = g_new (GdkRGBA, labeler->priv->num_outputs);
#else
- labeler->palette = g_new (GdkColor, labeler->num_outputs);
+ labeler->priv->palette = g_new (GdkColor, labeler->priv->num_outputs);
#endif
start_hue = 0.0; /* red */
end_hue = 2.0/3; /* blue */
- for (i = 0; i < labeler->num_outputs; i++) {
+ for (i = 0; i < labeler->priv->num_outputs; i++) {
double h, s, v;
double r, g, b;
- h = start_hue + (end_hue - start_hue) / labeler->num_outputs * i;
+ h = start_hue + (end_hue - start_hue) / labeler->priv->num_outputs * i;
s = 1.0 / 3;
v = 1.0;
gtk_hsv_to_rgb (h, s, v, &r, &g, &b);
#if GTK_CHECK_VERSION (3, 0, 0)
- labeler->palette[i].red = r;
- labeler->palette[i].green = g;
- labeler->palette[i].blue = b;
- labeler->palette[i].alpha = 1.0;
+ labeler->priv->palette[i].red = r;
+ labeler->priv->palette[i].green = g;
+ labeler->priv->palette[i].blue = b;
+ labeler->priv->palette[i].alpha = 1.0;
#else
- labeler->palette[i].red = (int) (65535 * r + 0.5);
- labeler->palette[i].green = (int) (65535 * g + 0.5);
- labeler->palette[i].blue = (int) (65535 * b + 0.5);
+ labeler->priv->palette[i].red = (int) (65535 * r + 0.5);
+ labeler->priv->palette[i].green = (int) (65535 * g + 0.5);
+ labeler->priv->palette[i].blue = (int) (65535 * b + 0.5);
#endif
}
}
@@ -327,8 +365,8 @@ position_window (MateRRLabeler *labeler,
int monitor_num;
get_work_area (labeler, &workarea);
- monitor_num = gdk_screen_get_monitor_at_point (labeler->screen, x, y);
- gdk_screen_get_monitor_geometry (labeler->screen,
+ monitor_num = gdk_screen_get_monitor_at_point (labeler->priv->screen, x, y);
+ gdk_screen_get_monitor_geometry (labeler->priv->screen,
monitor_num,
&monitor);
gdk_rectangle_intersect (&monitor, &workarea, &workarea);
@@ -338,10 +376,10 @@ position_window (MateRRLabeler *labeler,
#if GTK_CHECK_VERSION (3, 0, 0)
static GtkWidget *
-create_label_window (MateRRLabeler *labeler, MateOutputInfo *output, GdkRGBA *color)
+create_label_window (MateRRLabeler *labeler, MateRROutputInfo *output, GdkRGBA *color)
#else
static GtkWidget *
-create_label_window (MateRRLabeler *labeler, MateOutputInfo *output, GdkColor *color)
+create_label_window (MateRRLabeler *labeler, MateRROutputInfo *output, GdkColor *color)
#endif
{
GtkWidget *window;
@@ -349,6 +387,7 @@ create_label_window (MateRRLabeler *labeler, MateOutputInfo *output, GdkColor *c
char *str;
const char *display_name;
GdkColor black = { 0, 0, 0, 0 };
+ int x,y;
window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_widget_set_app_paintable (window, TRUE);
@@ -369,7 +408,7 @@ create_label_window (MateRRLabeler *labeler, MateOutputInfo *output, GdkColor *c
G_CALLBACK (label_window_expose_event_cb), labeler);
#endif
- if (labeler->config->clone) {
+ if (mate_rr_config_get_clone (labeler->priv->config)) {
/* Keep this string in sync with mate-control-center/capplets/display/xrandr-capplet.c:get_display_name() */
/* Translators: this is the feature where what you see on your laptop's
@@ -379,7 +418,7 @@ create_label_window (MateRRLabeler *labeler, MateOutputInfo *output, GdkColor *c
*/
display_name = _("Mirror Screens");
} else
- display_name = output->display_name;
+ display_name = mate_rr_output_info_get_display_name (output);
str = g_strdup_printf ("<b>%s</b>", display_name);
widget = gtk_label_new (NULL);
@@ -395,7 +434,8 @@ create_label_window (MateRRLabeler *labeler, MateOutputInfo *output, GdkColor *c
gtk_container_add (GTK_CONTAINER (window), widget);
/* Should we center this at the top edge of the monitor, instead of using the upper-left corner? */
- position_window (labeler, window, output->x, output->y);
+ mate_rr_output_info_get_geometry (output, &x, &y, NULL, NULL);
+ position_window (labeler, window, x, y);
gtk_widget_show_all (window);
@@ -407,26 +447,29 @@ create_label_windows (MateRRLabeler *labeler)
{
int i;
gboolean created_window_for_clone;
+ MateRROutputInfo **outputs;
- labeler->windows = g_new (GtkWidget *, labeler->num_outputs);
+ labeler->priv->windows = g_new (GtkWidget *, labeler->priv->num_outputs);
created_window_for_clone = FALSE;
- for (i = 0; i < labeler->num_outputs; i++) {
- if (!created_window_for_clone && labeler->config->outputs[i]->on) {
- labeler->windows[i] = create_label_window (labeler, labeler->config->outputs[i], labeler->palette + i);
+ outputs = mate_rr_config_get_outputs (labeler->priv->config);
+
+ for (i = 0; i < labeler->priv->num_outputs; i++) {
+ if (!created_window_for_clone && mate_rr_output_info_get_active (outputs[i])) {
+ labeler->priv->windows[i] = create_label_window (labeler, outputs[i], labeler->priv->palette + i);
- if (labeler->config->clone)
+ if (mate_rr_config_get_clone (labeler->priv->config))
created_window_for_clone = TRUE;
} else
- labeler->windows[i] = NULL;
+ labeler->priv->windows[i] = NULL;
}
}
static void
setup_from_config (MateRRLabeler *labeler)
{
- labeler->num_outputs = count_outputs (labeler->config);
+ labeler->priv->num_outputs = count_outputs (labeler->priv->config);
make_palette (labeler);
@@ -436,51 +479,49 @@ setup_from_config (MateRRLabeler *labeler)
MateRRLabeler *
mate_rr_labeler_new (MateRRConfig *config)
{
- MateRRLabeler *labeler;
-
- g_return_val_if_fail (config != NULL, NULL);
-
- labeler = g_object_new (MATE_TYPE_RR_LABELER, NULL);
- labeler->config = config;
+ g_return_val_if_fail (MATE_IS_RR_CONFIG (config), NULL);
- setup_from_config (labeler);
-
- return labeler;
+ return g_object_new (MATE_TYPE_RR_LABELER, "config", config, NULL);
}
void
mate_rr_labeler_hide (MateRRLabeler *labeler)
{
int i;
+ MateRRLabelerPrivate *priv;
g_return_if_fail (MATE_IS_RR_LABELER (labeler));
- if (labeler->windows == NULL)
- return;
+ priv = labeler->priv;
- for (i = 0; i < labeler->num_outputs; i++)
- if (labeler->windows[i] != NULL) {
- gtk_widget_destroy (labeler->windows[i]);
- labeler->windows[i] = NULL;
- }
- g_free (labeler->windows);
- labeler->windows = NULL;
+ if (priv->windows == NULL)
+ return;
+ for (i = 0; i < priv->num_outputs; i++)
+ if (priv->windows[i] != NULL) {
+ gtk_widget_destroy (priv->windows[i]);
+ priv->windows[i] = NULL;
+ }
+ g_free (priv->windows);
+ priv->windows = NULL;
}
#if GTK_CHECK_VERSION (3, 0, 0)
void
-mate_rr_labeler_get_rgba_for_output (MateRRLabeler *labeler, MateOutputInfo *output, GdkRGBA *color_out)
+mate_rr_labeler_get_rgba_for_output (MateRRLabeler *labeler, MateRROutputInfo *output, GdkRGBA *color_out)
{
int i;
+ MateRROutputInfo **outputs;
g_return_if_fail (MATE_IS_RR_LABELER (labeler));
- g_return_if_fail (output != NULL);
+ g_return_if_fail (MATE_IS_RR_OUTPUT_INFO (output))
g_return_if_fail (color_out != NULL);
- for (i = 0; i < labeler->num_outputs; i++)
- if (labeler->config->outputs[i] == output) {
- *color_out = labeler->palette[i];
+ outputs = mate_rr_config_get_outputs (labeler->priv->config);
+
+ for (i = 0; i < labeler->priv->num_outputs; i++)
+ if (outputs[i] == output) {
+ *color_out = labeler->priv->palette[i];
return;
}
@@ -494,22 +535,25 @@ mate_rr_labeler_get_rgba_for_output (MateRRLabeler *labeler, MateOutputInfo *out
#endif
void
-mate_rr_labeler_get_color_for_output (MateRRLabeler *labeler, MateOutputInfo *output, GdkColor *color_out)
+mate_rr_labeler_get_color_for_output (MateRRLabeler *labeler, MateRROutputInfo *output, GdkColor *color_out)
{
int i;
+ MateRROutputInfo **outputs;
g_return_if_fail (MATE_IS_RR_LABELER (labeler));
- g_return_if_fail (output != NULL);
+ g_return_if_fail (MATE_IS_RR_OUTPUT_INFO (output));
g_return_if_fail (color_out != NULL);
- for (i = 0; i < labeler->num_outputs; i++)
- if (labeler->config->outputs[i] == output) {
+ outputs = mate_rr_config_get_outputs (labeler->priv->config);
+
+ for (i = 0; i < labeler->priv->num_outputs; i++)
+ if (outputs[i] == output) {
#if GTK_CHECK_VERSION (3, 0, 0)
- color_out->red = labeler->palette[i].red * 0xffff;
- color_out->green = labeler->palette[i].green * 0xffff;
- color_out->blue = labeler->palette[i].blue * 0xffff;
+ color_out->red = labeler->priv->palette[i].red * 0xffff;
+ color_out->green = labeler->priv->palette[i].green * 0xffff;
+ color_out->blue = labeler->priv->palette[i].blue * 0xffff;
#else
- *color_out = labeler->palette[i];
+ *color_out = labeler->priv->palette[i];
#endif
return;
}