[Xfce4-commits] <xfce4-panel:master> Clock: Add calendar popup to clock plugin (bug #9034).

Nick Schermer noreply at xfce.org
Mon Jul 23 18:00:01 CEST 2012


Updating branch refs/heads/master
         to 0456c33cceb85e64c609beecddee942624b51a72 (commit)
       from 17643fd28f499691ae97503eb58755b4b9fabb53 (commit)

commit 0456c33cceb85e64c609beecddee942624b51a72
Author: Guido Berhoerster <gber at opensuse.org>
Date:   Mon Jul 23 17:58:50 2012 +0200

    Clock: Add calendar popup to clock plugin (bug #9034).

 plugins/clock/clock.c |  152 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 142 insertions(+), 10 deletions(-)

diff --git a/plugins/clock/clock.c b/plugins/clock/clock.c
index 2e38943..85a9d76 100644
--- a/plugins/clock/clock.c
+++ b/plugins/clock/clock.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007-2010 Nick Schermer <nick at xfce.org>
+ * Copyright (C) 2012      Guido Berhoerster <gber at opensuse.org>
  *
  * This library 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
@@ -68,8 +69,13 @@ static gboolean clock_plugin_size_changed              (XfcePanelPlugin       *p
 static void     clock_plugin_size_ratio_changed        (XfcePanelPlugin       *panel_plugin);
 static void     clock_plugin_mode_changed              (XfcePanelPlugin       *panel_plugin,
                                                         XfcePanelPluginMode    mode);
+static void     clock_plugin_screen_position_changed   (XfcePanelPlugin       *panel_plugin,
+                                                        XfceScreenPosition     position);
 static void     clock_plugin_configure_plugin          (XfcePanelPlugin       *panel_plugin);
 static void     clock_plugin_set_mode                  (ClockPlugin           *plugin);
+static void     clock_plugin_reposition_calendar       (ClockPlugin          *plugin);
+static void     clock_plugin_popup_calendar            (ClockPlugin           *plugin);
+static void     clock_plugin_hide_calendar             (ClockPlugin           *plugin);
 static gboolean clock_plugin_tooltip                   (gpointer               user_data);
 static gboolean clock_plugin_timeout_running           (gpointer               user_data);
 static void     clock_plugin_timeout_destroyed         (gpointer               user_data);
@@ -114,6 +120,9 @@ struct _ClockPlugin
   GtkWidget          *clock;
   GtkWidget          *frame;
 
+  GtkWidget          *calendar_window;
+  GtkWidget          *calendar;
+
   guint               show_frame : 1;
   gchar              *command;
   ClockPluginMode     mode;
@@ -197,6 +206,7 @@ clock_plugin_class_init (ClockPluginClass *klass)
   plugin_class->free_data = clock_plugin_free_data;
   plugin_class->size_changed = clock_plugin_size_changed;
   plugin_class->mode_changed = clock_plugin_mode_changed;
+  plugin_class->screen_position_changed = clock_plugin_screen_position_changed;
   plugin_class->configure_plugin = clock_plugin_configure_plugin;
 
   g_object_class_install_property (gobject_class,
@@ -333,6 +343,11 @@ clock_plugin_set_property (GObject      *object,
     case PROP_COMMAND:
       g_free (plugin->command);
       plugin->command = g_value_dup_string (value);
+      /*
+       * ensure the calendar window is hidden since a non-empty command disables
+       * toggling
+       */
+      clock_plugin_hide_calendar (plugin);
       break;
 
     case PROP_ROTATE_VERTICALLY:
@@ -396,19 +411,35 @@ clock_plugin_button_press_event (GtkWidget      *widget,
   ClockPlugin *plugin = XFCE_CLOCK_PLUGIN (widget);
   GError      *error = NULL;
 
-  if (event->button == 1
-      && event->type == GDK_2BUTTON_PRESS
-      && !exo_str_is_empty (plugin->command))
+  if (event->button == 1)
     {
-      /* launch command */
-      if (!xfce_spawn_command_line_on_screen (gtk_widget_get_screen (widget),
-                                              plugin->command, FALSE, FALSE, &error))
+      if (event->type == GDK_BUTTON_PRESS &&
+          exo_str_is_empty (plugin->command))
         {
-          xfce_dialog_show_error (NULL, error, _("Failed to execute clock command"));
-          g_error_free (error);
+          /* toggle calendar window visibility */
+          if (plugin->calendar_window == NULL
+              || !gtk_widget_get_visible (GTK_WIDGET (plugin->calendar_window)))
+            clock_plugin_popup_calendar (plugin);
+          else
+            clock_plugin_hide_calendar (plugin);
+
+          return TRUE;
         }
+      else if (event->type == GDK_2BUTTON_PRESS
+               && !exo_str_is_empty (plugin->command))
+        {
+          /* launch command */
+          if (!xfce_spawn_command_line_on_screen (gtk_widget_get_screen (widget),
+                                                  plugin->command, FALSE,
+                                                  FALSE, &error))
+            {
+              xfce_dialog_show_error (NULL, error,
+                                      _("Failed to execute clock command"));
+              g_error_free (error);
+            }
 
-      return TRUE;
+          return TRUE;
+        }
     }
 
   return (*GTK_WIDGET_CLASS (clock_plugin_parent_class)->button_press_event) (widget, event);
@@ -453,6 +484,9 @@ clock_plugin_free_data (XfcePanelPlugin *panel_plugin)
   if (plugin->tooltip_timeout != NULL)
     clock_plugin_timeout_free (plugin->tooltip_timeout);
 
+  if (plugin->calendar_window != NULL)
+    gtk_widget_destroy (plugin->calendar_window);
+
   g_free (plugin->tooltip_format);
   g_free (plugin->command);
 }
@@ -513,6 +547,10 @@ clock_plugin_size_changed (XfcePanelPlugin *panel_plugin,
       gtk_widget_set_size_request (GTK_WIDGET (panel_plugin), size, ratio_size);
     }
 
+  if (plugin->calendar_window != NULL
+      && gtk_widget_get_visible (GTK_WIDGET (plugin->calendar_window)))
+    clock_plugin_reposition_calendar (plugin);
+
   return TRUE;
 }
 
@@ -547,6 +585,19 @@ clock_plugin_mode_changed (XfcePanelPlugin     *panel_plugin,
 
 
 static void
+clock_plugin_screen_position_changed (XfcePanelPlugin    *panel_plugin,
+                                      XfceScreenPosition  position)
+{
+  ClockPlugin *plugin = XFCE_CLOCK_PLUGIN (panel_plugin);
+
+  if (plugin->calendar_window != NULL
+      && gtk_widget_get_visible (GTK_WIDGET (plugin->calendar_window)))
+    clock_plugin_reposition_calendar (plugin);
+}
+
+
+
+static void
 clock_plugin_configure_plugin_mode_changed (GtkComboBox       *combo,
                                             ClockPluginDialog *dialog)
 {
@@ -880,6 +931,87 @@ clock_plugin_set_mode (ClockPlugin *plugin)
 
 
 
+static void
+clock_plugin_reposition_calendar (ClockPlugin *plugin)
+{
+  gint x, y;
+
+  xfce_panel_plugin_position_widget (XFCE_PANEL_PLUGIN (plugin),
+                                     GTK_WIDGET (plugin->calendar_window),
+                                     NULL, &x, &y);
+  gtk_window_move (GTK_WINDOW (plugin->calendar_window), x, y);
+}
+
+
+
+static void
+clock_plugin_calendar_show_event (GtkWidget   *calendar_window,
+                                  ClockPlugin *plugin)
+{
+  struct tm tm;
+
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN (plugin));
+
+  clock_plugin_reposition_calendar (plugin);
+
+  clock_plugin_get_localtime (&tm);
+  gtk_calendar_select_month (GTK_CALENDAR (plugin->calendar), tm.tm_mon,
+                             1900 + tm.tm_year);
+  gtk_calendar_select_day (GTK_CALENDAR (plugin->calendar), tm.tm_mday);
+}
+
+
+
+static void
+clock_plugin_popup_calendar (ClockPlugin *plugin)
+{
+  GtkWidget *calendar_frame;
+
+  if (plugin->calendar_window == NULL)
+    {
+      plugin->calendar_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      gtk_window_set_type_hint (GTK_WINDOW (plugin->calendar_window),
+                                GDK_WINDOW_TYPE_HINT_UTILITY);
+      gtk_window_set_decorated (GTK_WINDOW (plugin->calendar_window), FALSE);
+      gtk_window_set_resizable (GTK_WINDOW (plugin->calendar_window), FALSE);
+      gtk_window_set_skip_taskbar_hint(GTK_WINDOW (plugin->calendar_window), TRUE);
+      gtk_window_set_skip_pager_hint(GTK_WINDOW (plugin->calendar_window), TRUE);
+      gtk_window_set_keep_above (GTK_WINDOW (plugin->calendar_window), TRUE);
+      gtk_window_stick (GTK_WINDOW (plugin->calendar_window));
+
+      calendar_frame = gtk_frame_new (NULL);
+      gtk_frame_set_shadow_type (GTK_FRAME (calendar_frame), GTK_SHADOW_OUT);
+      gtk_container_add (GTK_CONTAINER (plugin->calendar_window), calendar_frame);
+      gtk_widget_show (calendar_frame);
+
+      plugin->calendar = gtk_calendar_new ();
+      gtk_calendar_set_display_options (GTK_CALENDAR (plugin->calendar),
+                                        GTK_CALENDAR_SHOW_HEADING
+                                        | GTK_CALENDAR_SHOW_DAY_NAMES
+                                        | GTK_CALENDAR_SHOW_WEEK_NUMBERS);
+      g_signal_connect (G_OBJECT (plugin->calendar_window), "show",
+                        G_CALLBACK (clock_plugin_calendar_show_event), plugin);
+      gtk_container_add (GTK_CONTAINER (calendar_frame), plugin->calendar);
+      gtk_widget_show (plugin->calendar);
+    }
+
+  gtk_widget_show (GTK_WIDGET (plugin->calendar_window));
+  xfce_panel_plugin_block_autohide (XFCE_PANEL_PLUGIN (plugin), TRUE);
+}
+
+
+
+static void
+clock_plugin_hide_calendar (ClockPlugin *plugin)
+{
+  panel_return_if_fail (plugin->calendar_window != NULL);
+
+  gtk_widget_hide (GTK_WIDGET (plugin->calendar_window));
+  xfce_panel_plugin_block_autohide (XFCE_PANEL_PLUGIN (plugin), FALSE);
+}
+
+
+
 static gboolean
 clock_plugin_tooltip (gpointer user_data)
 {


More information about the Xfce4-commits mailing list