vinagre r567 - in trunk: . src
- From: jwendell svn gnome org
- To: svn-commits-list gnome org
- Subject: vinagre r567 - in trunk: . src
- Date: Thu, 22 Jan 2009 13:25:54 +0000 (UTC)
Author: jwendell
Date: Thu Jan 22 13:25:54 2009
New Revision: 567
URL: http://svn.gnome.org/viewvc/vinagre?rev=567&view=rev
Log:
2009-01-22 Jonh Wendell <jwendell gnome org>
* src/vinagre-applet.c: Rewrite of the applet, now using GObject.
Also, fix the icon on transparent panels, closes #568674.
Modified:
trunk/ChangeLog
trunk/src/vinagre-applet.c
Modified: trunk/src/vinagre-applet.c
==============================================================================
--- trunk/src/vinagre-applet.c (original)
+++ trunk/src/vinagre-applet.c Thu Jan 22 13:25:54 2009
@@ -2,7 +2,7 @@
* vinagre-applet.c
* This file is part of vinagre
*
- * Copyright (C) 2008 - Jonh Wendell <wendell bani com br>
+ * Copyright (C) 2008,2009 - Jonh Wendell <wendell bani com br>
*
* 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
@@ -33,6 +33,177 @@
#include "vinagre-mdns.h"
#endif
+#define VINAGRE_TYPE_APPLET (vinagre_applet_get_type ())
+#define VINAGRE_APPLET(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), VINAGRE_TYPE_APPLET, VinagreApplet))
+#define VINAGRE_APPLET_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), VINAGRE_TYPE_APPLET, VinagreAppletClass))
+#define VINAGRE_IS_APPLET(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), VINAGRE_TYPE_APPLET))
+#define VINAGRE_IS_APPLET_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), VINAGRE_TYPE_APPLET))
+#define VINAGRE_APPLET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), VINAGRE_TYPE_APPLET, VinagreAppletClass))
+
+#define VINAGRE_APPLET_OAFID "OAFIID:GNOME_VinagreApplet"
+#define VINAGRE_APPLET_FACTORY_OAFID "OAFIID:GNOME_VinagreApplet_Factory"
+#define PANEL_APPLET_VERTICAL(p) (((p) == PANEL_APPLET_ORIENT_LEFT) || ((p) == PANEL_APPLET_ORIENT_RIGHT))
+
+typedef struct{
+ PanelApplet parent;
+ GdkPixbuf *icon;
+ gint icon_width, icon_height, size;
+} VinagreApplet;
+
+typedef struct{
+ PanelAppletClass parent_class;
+} VinagreAppletClass;
+
+GType vinagre_applet_get_type (void);
+static void vinagre_applet_class_init (VinagreAppletClass *klass);
+static void vinagre_applet_init (VinagreApplet *applet);
+
+static void vinagre_applet_get_icon (VinagreApplet *applet);
+static void vinagre_applet_check_size (VinagreApplet *applet);
+static gboolean vinagre_applet_draw_cb (VinagreApplet *applet);
+static void vinagre_applet_update_tooltip (VinagreApplet *applet);
+static void vinagre_applet_dialog_about_cb (BonoboUIComponent *uic, gpointer data, const gchar *verbname);
+static gboolean vinagre_applet_bonobo_cb (PanelApplet *_applet, const gchar *iid, gpointer data);
+static void vinagre_applet_destroy_cb (GtkObject *object);
+
+G_DEFINE_TYPE (VinagreApplet, vinagre_applet, PANEL_TYPE_APPLET)
+
+static void
+vinagre_applet_get_icon (VinagreApplet *applet)
+{
+ if (applet->icon != NULL)
+ {
+ g_object_unref (applet->icon);
+ applet->icon = NULL;
+ }
+
+ if (applet->size <= 2)
+ return;
+
+ applet->icon = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+ "vinagre",
+ applet->size - 2,
+ 0,
+ NULL);
+
+ applet->icon_height = gdk_pixbuf_get_height (applet->icon);
+ applet->icon_width = gdk_pixbuf_get_width (applet->icon);
+}
+
+static void
+vinagre_applet_check_size (VinagreApplet *applet)
+{
+ /* we don't use the size function here, but the yet allocated size because the
+ size value is false (kind of rounded) */
+ if (PANEL_APPLET_VERTICAL(panel_applet_get_orient (PANEL_APPLET (applet))))
+ {
+ if (applet->size != GTK_WIDGET(applet)->allocation.width)
+ {
+ applet->size = GTK_WIDGET(applet)->allocation.width;
+ vinagre_applet_get_icon (applet);
+ gtk_widget_set_size_request (GTK_WIDGET(applet), applet->size, applet->icon_height + 2);
+ }
+
+ /* Adjusting in case the icon size has changed */
+ if (GTK_WIDGET(applet)->allocation.height < applet->icon_height + 2)
+ {
+ gtk_widget_set_size_request (GTK_WIDGET(applet), applet->size, applet->icon_height + 2);
+ }
+ }
+ else
+ {
+ if (applet->size != GTK_WIDGET(applet)->allocation.height)
+ {
+ applet->size = GTK_WIDGET(applet)->allocation.height;
+ vinagre_applet_get_icon (applet);
+ gtk_widget_set_size_request (GTK_WIDGET(applet), applet->icon_width + 2, applet->size);
+ }
+
+ /* Adjusting in case the icon size has changed */
+ if (GTK_WIDGET(applet)->allocation.width < applet->icon_width + 2)
+ {
+ gtk_widget_set_size_request (GTK_WIDGET(applet), applet->icon_width + 2, applet->size);
+ }
+ }
+}
+
+static gboolean
+vinagre_applet_draw_cb (VinagreApplet *applet)
+{
+ gint w, h, bg_type;
+ GdkColor color;
+ GdkGC *gc;
+ GdkPixmap *background;
+
+ if (GTK_WIDGET (applet)->window == NULL)
+ return FALSE;
+
+ /* Clear the window so we can draw on it later */
+ gdk_window_clear (GTK_WIDGET(applet)->window);
+
+ /* retrieve applet size */
+ vinagre_applet_get_icon (applet);
+ vinagre_applet_check_size (applet);
+ if (applet->size <= 2)
+ return FALSE;
+
+ /* if no icon, then don't try to display */
+ if (applet->icon == NULL)
+ return FALSE;
+
+ w = GTK_WIDGET(applet)->allocation.width;
+ h = GTK_WIDGET(applet)->allocation.height;
+
+ gc = gdk_gc_new (GTK_WIDGET(applet)->window);
+
+ /* draw pixmap background */
+ bg_type = panel_applet_get_background (PANEL_APPLET (applet), &color, &background);
+ if (bg_type == PANEL_PIXMAP_BACKGROUND)
+ {
+ /* fill with given background pixmap */
+ gdk_draw_drawable (GTK_WIDGET(applet)->window, gc, background, 0, 0, 0, 0, w, h);
+ }
+
+ /* draw color background */
+ if (bg_type == PANEL_COLOR_BACKGROUND)
+ {
+ gdk_gc_set_rgb_fg_color (gc,&color);
+ gdk_gc_set_fill (gc,GDK_SOLID);
+ gdk_draw_rectangle (GTK_WIDGET(applet)->window, gc, TRUE, 0, 0, w, h);
+ }
+
+ /* draw icon at center */
+ gdk_draw_pixbuf (GTK_WIDGET(applet)->window, gc, applet->icon,
+ 0, 0, (w - applet->icon_width)/2, (h - applet->icon_height)/2,
+ applet->icon_width, applet->icon_height,
+ GDK_RGB_DITHER_NONE, 0, 0);
+
+ return TRUE;
+}
+
+static void
+vinagre_applet_change_background_cb (VinagreApplet *applet,
+ PanelAppletBackgroundType arg1,
+ GdkColor *arg2, GdkPixmap *arg3, gpointer data)
+{
+ gtk_widget_queue_draw (GTK_WIDGET (applet));
+}
+
+static void
+vinagre_applet_destroy_cb (GtkObject *object)
+{
+ VinagreApplet *applet = VINAGRE_APPLET (object);
+
+ if (applet->icon != NULL)
+ g_object_unref (applet->icon);
+}
+
+static void
+vinagre_applet_class_init (VinagreAppletClass *klass)
+{
+ /* nothing to do here */
+}
+
static void
menu_position (GtkMenu *menu,
gint *x,
@@ -181,9 +352,9 @@
}
static gboolean
-click_cb (GtkWidget *applet,
- GdkEventButton *event,
- gpointer user_data)
+vinagre_applet_click_cb (GtkWidget *applet,
+ GdkEventButton *event,
+ gpointer user_data)
{
GtkWidget *menu, *item, *image;
GSList *all;
@@ -216,49 +387,32 @@
}
static void
-help_cb (BonoboUIComponent *ui_container,
- gpointer data,
- const gchar *cname)
+vinagre_applet_help_cb (BonoboUIComponent *ui_container,
+ gpointer data,
+ const gchar *cname)
{
vinagre_utils_help_contents (NULL);
}
static void
-about_cb (BonoboUIComponent *ui_container,
- gpointer data,
- const gchar *cname)
+vinagre_applet_about_cb (BonoboUIComponent *ui_container,
+ gpointer data,
+ const gchar *cname)
{
vinagre_utils_help_about (NULL);
}
-static gboolean
-vinagre_applet_fill (PanelApplet *applet,
- const gchar *iid,
- gpointer data)
+
+static void
+vinagre_applet_init (VinagreApplet *applet)
{
- GtkWidget *image, *button;
gchar *tmp;
- static const BonoboUIVerb menu_verbs[] = {
- BONOBO_UI_VERB ("VinagreHelp", help_cb),
- BONOBO_UI_VERB ("VinagreAbout", about_cb),
- BONOBO_UI_VERB_END
- };
-
#ifdef VINAGRE_ENABLE_AVAHI
VinagreMdns *mdns;
#endif
- if (strcmp (iid, "OAFIID:GNOME_VinagreApplet") != 0)
- return FALSE;
-
- bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- textdomain (GETTEXT_PACKAGE);
- gtk_window_set_default_icon_name ("vinagre");
- g_set_application_name (_("Remote Desktop Viewer"));
-
- image = gtk_image_new_from_icon_name ("vinagre", GTK_ICON_SIZE_LARGE_TOOLBAR);
- g_signal_connect (applet, "button-press-event", G_CALLBACK (click_cb), NULL);
+ applet->size = 0;
+ applet->icon = NULL;
tmp = g_strdup_printf ("%s\n%s",
_("Remote Desktop Viewer"),
@@ -266,26 +420,71 @@
gtk_widget_set_tooltip_text (GTK_WIDGET (applet), tmp);
g_free (tmp);
- panel_applet_set_flags (applet, PANEL_APPLET_EXPAND_MINOR);
- panel_applet_setup_menu_from_file (applet, NULL,
- DATADIR "/vinagre/GNOME_VinagreApplet.xml",
- NULL, menu_verbs, NULL);
+ panel_applet_set_flags (PANEL_APPLET (applet), PANEL_APPLET_EXPAND_MINOR);
+ gtk_widget_show_all (GTK_WIDGET(applet));
+ vinagre_applet_draw_cb (applet);
+
+ g_signal_connect (G_OBJECT (applet), "button-press-event",
+ G_CALLBACK (vinagre_applet_click_cb), NULL);
+
+ g_signal_connect (G_OBJECT (applet), "expose-event",
+ G_CALLBACK (vinagre_applet_draw_cb), NULL);
+
+ /* We use g_signal_connect_after because letting the panel draw
+ * the background is the only way to have the correct
+ * background when a theme defines a background picture. */
+ g_signal_connect_after (G_OBJECT (applet), "expose-event",
+ G_CALLBACK (vinagre_applet_draw_cb), NULL);
- gtk_container_add (GTK_CONTAINER (applet), image);
- gtk_widget_show_all (GTK_WIDGET (applet));
+ g_signal_connect (G_OBJECT (applet), "change-background",
+ G_CALLBACK (vinagre_applet_change_background_cb), NULL);
+
+ g_signal_connect (G_OBJECT (applet), "change-orient",
+ G_CALLBACK (vinagre_applet_draw_cb), NULL);
+
+ g_signal_connect (G_OBJECT (applet), "destroy",
+ G_CALLBACK (vinagre_applet_destroy_cb), NULL);
#ifdef VINAGRE_ENABLE_AVAHI
mdns = vinagre_mdns_get_default ();
#endif
+}
+
+static gboolean
+vinagre_applet_fill (PanelApplet *_applet,
+ const gchar *iid,
+ gpointer data)
+{
+ VinagreApplet *applet = VINAGRE_APPLET (_applet);
+
+ static const BonoboUIVerb menu_verbs[] = {
+ BONOBO_UI_VERB ("VinagreHelp", vinagre_applet_help_cb),
+ BONOBO_UI_VERB ("VinagreAbout", vinagre_applet_about_cb),
+ BONOBO_UI_VERB_END
+ };
+ if (strcmp (iid, VINAGRE_APPLET_OAFID) != 0)
+ return FALSE;
+
+ bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+ gtk_window_set_default_icon_name ("vinagre");
+ g_set_application_name (_("Remote Desktop Viewer"));
+
+ panel_applet_setup_menu_from_file (_applet,
+ NULL,
+ DATADIR "/vinagre/GNOME_VinagreApplet.xml",
+ NULL, menu_verbs, applet);
+ vinagre_applet_draw_cb (applet);
return TRUE;
}
-
-PANEL_APPLET_BONOBO_FACTORY ("OAFIID:GNOME_VinagreApplet_Factory",
- PANEL_TYPE_APPLET,
+PANEL_APPLET_BONOBO_FACTORY (VINAGRE_APPLET_FACTORY_OAFID,
+ VINAGRE_TYPE_APPLET,
"VinagreApplet",
- "0",
+ VERSION,
vinagre_applet_fill,
NULL);
+/* vim: set ts=8: */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]