/* * Copyright (c) 2012 Mike Massonnet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * See the file COPYING for the full license text. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "monitor-label.h" typedef struct _XnlpMonitorLabelClass XnlpMonitorLabelClass; struct _XnlpMonitorLabelClass { GtkLabelClass parent_class; }; struct _XnlpMonitorLabel { GtkLabel parent; /**/ GtkCssProvider *css_provider; gint count_width; gint count_height; gint width; gint height; }; G_DEFINE_TYPE (XnlpMonitorLabel, xnlp_monitor_label, GTK_TYPE_LABEL) static void xnlp_monitor_label_constructed (GObject *object); static void cb_label_changed (GObject *object, GParamSpec *pspec, gpointer user_data); static void xnlp_monitor_label_class_init (XnlpMonitorLabelClass *klass) { GObjectClass *class = G_OBJECT_CLASS (klass); xnlp_monitor_label_parent_class = g_type_class_peek_parent (klass); } static void xnlp_monitor_label_init (XnlpMonitorLabel *label) { label->count_width = 0; label->count_height = 0; label->width = 0; label->height = 0; label->css_provider = gtk_css_provider_new (); gtk_style_context_add_provider ( GTK_STYLE_CONTEXT (gtk_widget_get_style_context (GTK_WIDGET (label))), GTK_STYLE_PROVIDER (label->css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_signal_connect (label, "notify::label", G_CALLBACK (cb_label_changed), NULL); } static void cb_label_changed (GObject *object, GParamSpec *pspec, gpointer user_data) { XnlpMonitorLabel *label = XNLP_MONITOR_LABEL (object); GtkWidget *widget = GTK_WIDGET (object); GtkRequisition minimum_size; GtkRequisition natural_size; gtk_widget_set_size_request (widget, -1, -1); gtk_widget_get_preferred_size (widget, &minimum_size, &natural_size); if (minimum_size.width >= label->width) { label->width = minimum_size.width; label->count_width = 0; } else if (label->count_width > 10) { label->width = minimum_size.width; label->count_width = 0; } else { minimum_size.width = label->width; label->count_width++; } if (minimum_size.height >= label->height) { label->height = minimum_size.height; label->count_height = 0; } else if (label->count_height > 10) { label->height = minimum_size.height; label->count_height = 0; } else { minimum_size.height = label->height; label->count_height++; } gtk_widget_set_size_request (widget, minimum_size.width, minimum_size.height); } GtkWidget * xnlp_monitor_label_new (const gchar *str) { GtkLabel *label; label = g_object_new (XNLP_TYPE_MONITOR_LABEL, NULL); if (str && *str) gtk_label_set_text (label, str); return GTK_WIDGET (label); } void xnlp_monitor_label_set_color (XnlpMonitorLabel *label, GdkRGBA* color) { gchar * css; if (color != NULL) { #if GTK_CHECK_VERSION (3, 20, 0) css = g_strdup_printf("label { color: %s; }", #else css = g_strdup_printf(".label { color: %s; }", #endif gdk_rgba_to_string(color)); } else { #if GTK_CHECK_VERSION (3, 20, 0) css = g_strdup_printf("label { color: inherit; }"); #else css = g_strdup_printf(".label { color: inherit; }"); #endif } DBG("setting label css: %s", gtk_css_provider_to_string (label->css_provider)); gtk_css_provider_load_from_data (label->css_provider, css, strlen(css), NULL); g_free(css); } void xnlp_monitor_label_reinit_size_request (XnlpMonitorLabel *label) { label->count_width = 0; label->count_height = 0; label->width = 0; label->height = 0; gtk_widget_set_size_request (GTK_WIDGET (label), -1, -1); }