[Goodies-commits] r6815 - in xfmpc/trunk: . src

Vincent Legout vincent at xfce.org
Sun Mar 1 11:55:12 CET 2009


Author: vincent
Date: 2009-03-01 10:55:12 +0000 (Sun, 01 Mar 2009)
New Revision: 6815

Added:
   xfmpc/trunk/src/main-window.c
   xfmpc/trunk/src/main-window.h
Modified:
   xfmpc/trunk/ChangeLog
   xfmpc/trunk/src/Makefile.am
   xfmpc/trunk/src/extended-interface.c
   xfmpc/trunk/src/main.c
Log:
New XfmpcMainWindow widget


Modified: xfmpc/trunk/ChangeLog
===================================================================
--- xfmpc/trunk/ChangeLog	2009-03-01 10:21:26 UTC (rev 6814)
+++ xfmpc/trunk/ChangeLog	2009-03-01 10:55:12 UTC (rev 6815)
@@ -1,3 +1,13 @@
+2009-03-01	Vincent Legout <vincent at legout.info>
+
+New XfmpcMainWindow widget
+	* src/main-window.c, src/main-window.h:
+	  - New files
+	* src/main.c:
+	  - move window from main.c to XfmpcMainWindow
+	* src/extended-interface.c:
+	  - move statusbar from XfmpcExtendedInterface to XfmpcMainWindow
+
 2009-02-25	Mike Massonnet <mmassonnet at gmail.com>
 
 Fix apply button in preferences dialog

Modified: xfmpc/trunk/src/Makefile.am
===================================================================
--- xfmpc/trunk/src/Makefile.am	2009-03-01 10:21:26 UTC (rev 6814)
+++ xfmpc/trunk/src/Makefile.am	2009-03-01 10:55:12 UTC (rev 6815)
@@ -3,6 +3,8 @@
 xfmpc_SOURCES =								\
 	main.c								\
 	main-ui.h							\
+	main-window.c							\
+	main-window.h							\
 	interface.c							\
 	interface.h							\
 	interface-ui.h							\

Modified: xfmpc/trunk/src/extended-interface.c
===================================================================
--- xfmpc/trunk/src/extended-interface.c	2009-03-01 10:21:26 UTC (rev 6814)
+++ xfmpc/trunk/src/extended-interface.c	2009-03-01 10:55:12 UTC (rev 6815)
@@ -74,24 +74,8 @@
                                                                gboolean *push_in,
                                                                GtkWidget *widget);
 
-static void xfmpc_extended_interface_action_statusbar_changed (GtkToggleAction *action,
-                                                               XfmpcExtendedInterface *extended_interface);
 
-static void xfmpc_extended_interface_update_statusbar         (XfmpcExtendedInterface *extended_interface);
 
-static void cb_playlist_changed                               (XfmpcExtendedInterface *extended_interface);
-static void cb_show_statusbar_changed                         (XfmpcExtendedInterface *extended_interface,
-                                                               GParamSpec *pspec);
-
-
-
-static const GtkToggleActionEntry toggle_action_entries[] =
-{
-  { "view-statusbar", NULL, "Statusbar", NULL, "Change the visibility of the statusbar", G_CALLBACK (xfmpc_extended_interface_action_statusbar_changed), FALSE, },
-};
-
-
-
 struct _XfmpcExtendedInterfaceClass
 {
   GtkVBoxClass                      parent_class;
@@ -108,13 +92,11 @@
 
 struct _XfmpcExtendedInterfacePrivate
 {
-  GtkActionGroup                   *action_group;
   GtkListStore                     *list_store;
   GtkWidget                        *combobox;
   GtkWidget                        *notebook;
   GtkWidget                        *context_button;
   GtkWidget                        *context_menu;
-  GtkWidget                        *statusbar;
 };
 
 
@@ -169,8 +151,6 @@
 xfmpc_extended_interface_init (XfmpcExtendedInterface *extended_interface)
 {
   XfmpcExtendedInterfacePrivate *priv = extended_interface->priv = GET_PRIVATE (extended_interface);
-  GtkAction *action;
-  gboolean active;
 
   extended_interface->mpdclient = xfmpc_mpdclient_get ();
   extended_interface->preferences = xfmpc_preferences_get ();
@@ -236,23 +216,6 @@
 
   child = xfmpc_dbbrowser_new ();
   xfmpc_extended_interface_append_child (extended_interface, child, _("Browse database"));
-
-  /* Action Group */
-  priv->action_group = gtk_action_group_new ("XfmpxExtendedInterface");
-  gtk_action_group_add_toggle_actions (priv->action_group, toggle_action_entries,
-                                       G_N_ELEMENTS (toggle_action_entries), GTK_WIDGET (extended_interface));
-
-  /* show-statusbar action */
-  action = gtk_action_group_get_action (priv->action_group, "view-statusbar");
-  g_object_get (G_OBJECT (extended_interface->preferences), "show-statusbar", &active, NULL);
-  gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
-
-  /* === Signals === */
-  g_signal_connect_swapped (extended_interface->mpdclient, "playlist-changed",
-                            G_CALLBACK (cb_playlist_changed), extended_interface);
-
-  g_signal_connect_swapped (extended_interface->preferences, "notify::show-statusbar",
-                            G_CALLBACK (cb_show_statusbar_changed), extended_interface);
 }
 
 static void
@@ -455,74 +418,3 @@
   *push_in = FALSE;
 }
 
-static void
-xfmpc_extended_interface_action_statusbar_changed (GtkToggleAction *action,
-                                                   XfmpcExtendedInterface *extended_interface)
-{
-  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE (extended_interface)->priv;
-
-  gboolean active;
-
-  active = gtk_toggle_action_get_active (action);
-  
-  if (!active && priv->statusbar != NULL)
-    {
-      gtk_widget_destroy (priv->statusbar);
-      priv->statusbar = NULL;
-    }
-  else if (active && priv->statusbar == NULL)
-    {
-      priv->statusbar = xfmpc_statusbar_new ();
-      gtk_widget_show (priv->statusbar);
-      gtk_box_pack_start (GTK_BOX (extended_interface), priv->statusbar, FALSE, FALSE, 2);
-    }
-}
-
-static void
-cb_playlist_changed (XfmpcExtendedInterface *extended_interface)
-{
-  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE (extended_interface)->priv;
-
-  if (priv->statusbar == NULL)
-    return;
-
-  xfmpc_extended_interface_update_statusbar (extended_interface);
-}
-
-static void
-xfmpc_extended_interface_update_statusbar (XfmpcExtendedInterface *extended_interface)
-{
-  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE (extended_interface)->priv;
-  gchar    *text;
-  gint      seconds, length;
-
-  if (priv->statusbar == NULL)
-    return;
-
-  length = xfmpc_mpdclient_playlist_get_length (extended_interface->mpdclient);
-  seconds = xfmpc_mpdclient_playlist_get_total_time (extended_interface->mpdclient);
-
-  if (seconds / 3600 > 0)
-    text = g_strdup_printf (_("%d songs, %d hours and %d minutes"), length, seconds / 3600, (seconds / 60) % 60);
-  else
-    text = g_strdup_printf (_("%d songs, %d minutes"), length, (seconds / 60) % 60);
-
-  g_object_set (G_OBJECT (priv->statusbar), "text", text, NULL);
-  g_free (text);
-}
-
-static void
-cb_show_statusbar_changed (XfmpcExtendedInterface *extended_interface,
-                           GParamSpec *pspec)
-{
-  XfmpcExtendedInterfacePrivate *priv = extended_interface->priv;
-  gboolean active;
-  GtkAction *action;
-
-  action = gtk_action_group_get_action (priv->action_group, "view-statusbar");
-  g_object_get (extended_interface->preferences, "show-statusbar", &active, NULL);
-
-  gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
-  xfmpc_extended_interface_update_statusbar (extended_interface);
-}
-

Added: xfmpc/trunk/src/main-window.c
===================================================================
--- xfmpc/trunk/src/main-window.c	                        (rev 0)
+++ xfmpc/trunk/src/main-window.c	2009-03-01 10:55:12 UTC (rev 6815)
@@ -0,0 +1,426 @@
+/*
+ *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ *  Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ *  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.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <libxfce4util/libxfce4util.h>
+
+#include "main-window.h"
+#include "preferences.h"
+#include "interface.h"
+#include "main-ui.h"
+#include "extended-interface.h"
+#include "statusbar.h"
+
+#define BORDER 4
+
+#define GET_PRIVATE(o) \
+    (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFMPC_TYPE_MAIN_WINDOW, XfmpcMainWindowPrivate))
+
+
+
+static void     xfmpc_main_window_class_init               (XfmpcMainWindowClass *klass);
+static void     xfmpc_main_window_init                     (XfmpcMainWindow *main_window);
+static void     xfmpc_main_window_finalize                 (GObject *object);
+
+static gboolean cb_window_state_event                      (GtkWidget *window,
+                                                            GdkEventWindowState *event);
+static gboolean cb_window_closed                           (GtkWidget *window,
+                                                            GdkEvent *event);
+static void     action_close                               (GtkAction *action,
+                                                            GtkWidget *window);
+static void     action_previous                            (GtkAction *action,
+                                                            GtkWidget *window);
+static void     action_pp                                  (GtkAction *action,
+                                                            GtkWidget *window);
+static void     action_stop                                (GtkAction *action,
+                                                            GtkWidget *window);
+static void     action_next                                (GtkAction *action,
+                                                            GtkWidget *window);
+static void     action_volume                              (GtkAction *action,
+                                                            GtkWidget *window);
+
+static void     action_statusbar                           (GtkToggleAction *action,
+                                                            XfmpcMainWindow *main_window);
+
+static void     xfmpc_main_window_update_statusbar         (XfmpcMainWindow *main_window);
+
+static void     cb_playlist_changed                        (XfmpcMainWindow *main_window);
+static void     cb_show_statusbar_changed                  (XfmpcMainWindow *main_window,
+                                                            GParamSpec *pspec);
+
+
+
+static const GtkToggleActionEntry toggle_action_entries[] =
+{
+  { "view-statusbar", NULL, "", NULL, NULL, G_CALLBACK (action_statusbar), FALSE, },
+};
+
+
+
+static const GtkActionEntry action_entries[] =
+{
+  { "quit", NULL, "", "<control>q", NULL, G_CALLBACK (action_close), },
+
+  { "previous", NULL, "", "<control>b", NULL, G_CALLBACK (action_previous), },
+  { "pp", NULL, "", "<control>p", NULL, G_CALLBACK (action_pp), },
+  { "stop", NULL, "", "<control>s", NULL, G_CALLBACK (action_stop), },
+  { "next", NULL, "", "<control>f", NULL, G_CALLBACK (action_next), },
+  { "volume", NULL, "", "<control>v", NULL, G_CALLBACK (action_volume), },
+};
+
+
+
+struct _XfmpcMainWindowClass
+{
+  GtkWindowClass          parent;
+};
+
+struct _XfmpcMainWindow
+{
+  GtkWindow               parent;
+  XfmpcPreferences       *preferences;
+  XfmpcMpdclient         *mpdclient;
+  /*<private>*/
+  XfmpcMainWindowPrivate *priv;
+};
+
+struct _XfmpcMainWindowPrivate
+{
+  GtkActionGroup         *action_group;
+  GtkWidget              *statusbar;
+  GtkWidget              *vbox;
+};
+
+
+
+static GObjectClass *parent_class = NULL;
+
+
+
+GType
+xfmpc_main_window_get_type (void)
+{
+  static GType xfmpc_main_window_type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (xfmpc_main_window_type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo xfmpc_main_window_info =
+      {
+        sizeof (XfmpcMainWindowClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) xfmpc_main_window_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (XfmpcMainWindow),
+        0,
+        (GInstanceInitFunc) xfmpc_main_window_init,
+        NULL
+      };
+
+      xfmpc_main_window_type = g_type_register_static (GTK_TYPE_WINDOW, "XfmpcMainWindow", &xfmpc_main_window_info, 0);
+    }
+
+  return xfmpc_main_window_type;
+}
+
+static void
+xfmpc_main_window_class_init (XfmpcMainWindowClass *klass)
+{
+  GObjectClass *gobject_class;
+
+  g_type_class_add_private (klass, sizeof (XfmpcMainWindowPrivate));
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = xfmpc_main_window_finalize;
+}
+
+static void
+xfmpc_main_window_init (XfmpcMainWindow *window)
+{
+  XfmpcMainWindowPrivate *priv = window->priv = GET_PRIVATE (window);
+
+  GtkAction *action;
+  gboolean active;
+  gint posx, posy;
+  gint width, height;
+  gboolean sticky;
+
+  window->mpdclient = xfmpc_mpdclient_get ();
+  window->preferences = xfmpc_preferences_get ();
+
+  g_object_get (G_OBJECT (window->preferences),
+                "last-window-posx", &posx,
+                "last-window-posy", &posy,
+                "last-window-width", &width,
+                "last-window-height", &height,
+                "last-window-state-sticky", &sticky,
+                NULL);
+
+  /* Window */
+  gtk_window_set_default_icon_name ("xfmpc");
+  gtk_window_set_icon_name (GTK_WINDOW (window), "stock_volume");
+  gtk_window_set_title (GTK_WINDOW (window), "Xfmpc");
+  gtk_window_set_default_size (GTK_WINDOW (window), 330, 330);
+  g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (cb_window_closed), NULL);
+  g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (cb_window_state_event), NULL);
+
+  priv->vbox = gtk_vbox_new (FALSE, 0);
+  gtk_container_add (GTK_CONTAINER (window), priv->vbox);
+
+  if (G_LIKELY (posx != -1 && posy != -1))
+    gtk_window_move (GTK_WINDOW (window), posx, posy);
+  if (G_LIKELY (width != -1 && height != -1))
+    gtk_window_set_default_size (GTK_WINDOW (window), width, height);
+  if (sticky == TRUE)
+    gtk_window_stick (GTK_WINDOW (window));
+
+  /* Interface */
+  GtkWidget *interface = xfmpc_interface_new ();
+  g_object_set_data (G_OBJECT (window), "XfmpcInterface", interface);
+  gtk_box_pack_start (GTK_BOX (priv->vbox), interface, FALSE, FALSE, BORDER);
+
+  /* Separator */
+  GtkWidget *separator = gtk_hseparator_new ();
+  gtk_box_pack_start (GTK_BOX (priv->vbox), separator, FALSE, FALSE, 0);
+
+  /* ExtendedInterface */
+  GtkWidget *extended_interface = xfmpc_extended_interface_new ();
+  gtk_box_pack_start (GTK_BOX (priv->vbox), extended_interface, TRUE, TRUE, 0);
+
+  /* Accelerators */
+  GtkUIManager *ui_manager = gtk_ui_manager_new ();
+
+  /* Action group */
+  priv->action_group = gtk_action_group_new ("XfmpcMainWindow");
+  gtk_action_group_add_actions (priv->action_group, action_entries,
+                                G_N_ELEMENTS (action_entries),
+                                GTK_WIDGET (window));
+  gtk_action_group_add_toggle_actions (priv->action_group, toggle_action_entries,
+                                       G_N_ELEMENTS (toggle_action_entries),
+                                       GTK_WIDGET (window));
+  gtk_ui_manager_insert_action_group (ui_manager, priv->action_group, 0);
+  gtk_ui_manager_add_ui_from_string (ui_manager, main_ui, main_ui_length, NULL);
+
+  /* Accel group */
+  GtkAccelGroup *accel_group = gtk_ui_manager_get_accel_group (ui_manager);
+  gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
+
+  /* show-statusbar action */
+  action = gtk_action_group_get_action (priv->action_group, "view-statusbar");
+  g_object_get (G_OBJECT (window->preferences), "show-statusbar", &active, NULL);
+  gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
+
+  /* === Signals === */
+  g_signal_connect_swapped (window->mpdclient, "playlist-changed",
+                            G_CALLBACK (cb_playlist_changed), window);
+
+  g_signal_connect_swapped (window->preferences, "notify::show-statusbar",
+                            G_CALLBACK (cb_show_statusbar_changed), window);
+}
+
+static void
+xfmpc_main_window_finalize (GObject *object)
+{
+  XfmpcMainWindow *window = XFMPC_MAIN_WINDOW (object);
+  g_object_unref (G_OBJECT (window->mpdclient));
+  g_object_unref (G_OBJECT (window->preferences));
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+
+GtkWidget*
+xfmpc_main_window_new ()
+{
+  return g_object_new (XFMPC_TYPE_MAIN_WINDOW, NULL);
+}
+
+static gboolean
+cb_window_state_event (GtkWidget *window,
+                       GdkEventWindowState *event)
+{
+  if (G_UNLIKELY (event->type != GDK_WINDOW_STATE))
+    return FALSE;
+
+  /**
+   * Hiding the top level window will unstick it too, and send a
+   * window-state-event signal, so here we take the value only if
+   * the window is visible
+   **/
+  if (event->changed_mask & GDK_WINDOW_STATE_STICKY && GTK_WIDGET_VISIBLE (window))
+    {
+      gboolean sticky = ((gboolean) event->new_window_state & GDK_WINDOW_STATE_STICKY) == FALSE ? FALSE : TRUE;
+      XfmpcPreferences *preferences = xfmpc_preferences_get ();
+      g_object_set (G_OBJECT (preferences),
+                    "last-window-state-sticky", sticky,
+                    NULL);
+      g_object_unref (preferences);
+    }
+
+  return FALSE;
+}
+
+static gboolean
+cb_window_closed (GtkWidget *window,
+                  GdkEvent *event)
+{
+  gint posx, posy;
+  gint width, height;
+  gtk_window_get_position (GTK_WINDOW (window), &posx, &posy);
+  gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+
+  XfmpcPreferences *preferences = xfmpc_preferences_get ();
+  g_object_set (G_OBJECT (preferences),
+                "last-window-posx", posx,
+                "last-window-posy", posy,
+                "last-window-width", width,
+                "last-window-height", height,
+                NULL);
+  g_object_unref (preferences);
+
+  gtk_main_quit ();
+  return FALSE;
+}
+
+
+static void
+action_close (GtkAction *action,
+              GtkWidget *window)
+{
+  cb_window_closed (window, NULL);
+}
+
+static void
+action_previous (GtkAction *action,
+                 GtkWidget *window)
+{
+  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
+  xfmpc_mpdclient_previous (interface->mpdclient);
+}
+
+static void
+action_pp (GtkAction *action,
+           GtkWidget *window)
+{
+  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
+  xfmpc_interface_pp_clicked (interface);
+}
+
+static void
+action_stop (GtkAction *action,
+             GtkWidget *window)
+{
+  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
+  xfmpc_mpdclient_stop (interface->mpdclient);
+}
+
+static void
+action_next (GtkAction *action,
+             GtkWidget *window)
+{
+  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
+  xfmpc_mpdclient_next (interface->mpdclient);
+}
+
+static void
+action_volume (GtkAction *action,
+               GtkWidget *window)
+{
+  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
+  xfmpc_interface_popup_volume (interface);
+}
+
+static void
+action_statusbar (GtkToggleAction *action,
+                  XfmpcMainWindow *window)
+{
+  XfmpcMainWindowPrivate *priv = XFMPC_MAIN_WINDOW (window)->priv;
+
+  gboolean active;
+
+  active = gtk_toggle_action_get_active (action);
+
+  if (!active && priv->statusbar != NULL)
+    {
+      gtk_widget_destroy (priv->statusbar);
+      priv->statusbar = NULL;
+    }
+  else if (active && priv->statusbar == NULL)
+    {
+      priv->statusbar = xfmpc_statusbar_new ();
+      gtk_widget_show (priv->statusbar);
+      gtk_box_pack_start (GTK_BOX (priv->vbox), priv->statusbar, FALSE, FALSE, 2);
+    }
+}
+
+static void
+xfmpc_main_window_update_statusbar (XfmpcMainWindow *window)
+{
+  XfmpcMainWindowPrivate *priv = XFMPC_MAIN_WINDOW (window)->priv;
+  gchar    *text;
+  gint      seconds, length;
+
+  if (G_UNLIKELY (priv->statusbar == NULL))
+    return;
+
+  length = xfmpc_mpdclient_playlist_get_length (window->mpdclient);
+  seconds = xfmpc_mpdclient_playlist_get_total_time (window->mpdclient);
+
+  if (seconds / 3600 > 0)
+    text = g_strdup_printf (_("%d songs, %d hours and %d minutes"), length, seconds / 3600, (seconds / 60) % 60);
+  else
+    text = g_strdup_printf (_("%d songs, %d minutes"), length, (seconds / 60) % 60);
+
+  g_object_set (G_OBJECT (priv->statusbar), "text", text, NULL);
+  g_free (text);
+}
+
+static void
+cb_playlist_changed (XfmpcMainWindow *window)
+{
+  XfmpcMainWindowPrivate *priv = XFMPC_MAIN_WINDOW (window)->priv;
+
+  if (priv->statusbar == NULL)
+    return;
+
+  xfmpc_main_window_update_statusbar (window);
+}
+
+static void
+cb_show_statusbar_changed (XfmpcMainWindow *window,
+                           GParamSpec *pspec)
+{
+  XfmpcMainWindowPrivate *priv = window->priv;
+  gboolean active;
+  GtkAction *action;
+
+  action = gtk_action_group_get_action (priv->action_group, "view-statusbar");
+  g_object_get (window->preferences, "show-statusbar", &active, NULL);
+
+  gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
+  xfmpc_main_window_update_statusbar (window);
+}
+

Added: xfmpc/trunk/src/main-window.h
===================================================================
--- xfmpc/trunk/src/main-window.h	                        (rev 0)
+++ xfmpc/trunk/src/main-window.h	2009-03-01 10:55:12 UTC (rev 6815)
@@ -0,0 +1,43 @@
+/*
+ *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ *  Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ *  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.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __XFMPC_MAIN_WINDOW_H__
+#define __XFMPC_MAIN_WINDOW_H__
+
+G_BEGIN_DECLS;
+
+#define XFMPC_TYPE_MAIN_WINDOW               (xfmpc_main_window_get_type ())
+
+#define XFMPC_MAIN_WINDOW(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFMPC_TYPE_MAIN_WINDOW, XfmpcMainWindow))
+#define XFMPC_MAIN_WINDOW_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), XFMPC_TYPE_MAIN_WINDOW, XfmpcMainWindowClass))
+#define XFMPC_IS_MAIN_WINDOW(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFMPC_TYPE_MAIN_WINDOW))
+#define XFMPC_IS_MAIN_WINDOW_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE ((klass), XFMPC_TYPE_MAIN_WINDOW))
+#define XFMPC_MAIN_WINDOW_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), XFMPC_TYPE_MAIN_WINDOW, XfmpcMainWindowClass))
+
+typedef struct _XfmpcMainWindowClass         XfmpcMainWindowClass;
+typedef struct _XfmpcMainWindow              XfmpcMainWindow;
+typedef struct _XfmpcMainWindowPrivate       XfmpcMainWindowPrivate;
+
+GType          xfmpc_main_window_get_type    (void) G_GNUC_CONST;
+
+GtkWidget*     xfmpc_main_window_new         (void);
+
+G_END_DECLS;
+
+#endif

Modified: xfmpc/trunk/src/main.c
===================================================================
--- xfmpc/trunk/src/main.c	2009-03-01 10:21:26 UTC (rev 6814)
+++ xfmpc/trunk/src/main.c	2009-03-01 10:55:12 UTC (rev 6815)
@@ -30,50 +30,11 @@
 
 #include <gtk/gtk.h>
 #include <libxfcegui4/libxfcegui4.h>
-#include <libxfce4util/libxfce4util.h>
 
-#include "preferences.h"
-#include "mpdclient.h"
-#include "main-ui.h"
-#include "interface.h"
-#include "extended-interface.h"
+#include "main-window.h"
 
-#define BORDER 4
 
 
-
-static gboolean         cb_window_state_event                       (GtkWidget *window,
-                                                                     GdkEventWindowState *event);
-static gboolean         cb_window_closed                            (GtkWidget *window,
-                                                                     GdkEvent *event);
-static void             action_close                                (GtkAction *action,
-                                                                     GtkWidget *window);
-static void             action_previous                             (GtkAction *action,
-                                                                     GtkWidget *window);
-static void             action_pp                                   (GtkAction *action,
-                                                                     GtkWidget *window);
-static void             action_stop                                 (GtkAction *action,
-                                                                     GtkWidget *window);
-static void             action_next                                 (GtkAction *action,
-                                                                     GtkWidget *window);
-static void             action_volume                               (GtkAction *action,
-                                                                     GtkWidget *window);
-
-
-
-static const GtkActionEntry action_entries[] =
-{
-  { "quit", NULL, "", "<control>q", NULL, G_CALLBACK (action_close), },
-
-  { "previous", NULL, "", "<control>b", NULL, G_CALLBACK (action_previous), },
-  { "pp", NULL, "", "<control>p", NULL, G_CALLBACK (action_pp), },
-  { "stop", NULL, "", "<control>s", NULL, G_CALLBACK (action_stop), },
-  { "next", NULL, "", "<control>f", NULL, G_CALLBACK (action_next), },
-  { "volume", NULL, "", "<control>v", NULL, G_CALLBACK (action_volume), },
-};
-
-
-
 static void
 transform_string_to_int (const GValue *src,
                          GValue *dst)
@@ -100,172 +61,11 @@
   g_value_register_transform_func (G_TYPE_STRING, G_TYPE_INT, transform_string_to_int);
   g_value_register_transform_func (G_TYPE_STRING, G_TYPE_BOOLEAN, transform_string_to_boolean);
 
-  gtk_window_set_default_icon_name ("xfmpc");
-
-  /* Read window preferences */
-  gint posx, posy;
-  gint width, height;
-  gboolean sticky;
-
-  XfmpcPreferences *preferences = xfmpc_preferences_get ();
-  g_object_get (G_OBJECT (preferences),
-                "last-window-posx", &posx,
-                "last-window-posy", &posy,
-                "last-window-width", &width,
-                "last-window-height", &height,
-                "last-window-state-sticky", &sticky,
-                NULL);
-
-  /* Window */
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_icon_name (GTK_WINDOW (window), "stock_volume");
-  gtk_window_set_title (GTK_WINDOW (window), _("Xfmpc"));
-  gtk_window_set_default_size (GTK_WINDOW (window), 330, 330);
-  g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (cb_window_closed), NULL);
-  g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (cb_window_state_event), NULL);
-
-  GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
-  if (G_LIKELY (posx != -1 && posy != -1))
-    gtk_window_move (GTK_WINDOW (window), posx, posy);
-  if (G_LIKELY (width != -1 && height != -1))
-    gtk_window_set_default_size (GTK_WINDOW (window), width, height);
-  if (sticky == TRUE)
-    gtk_window_stick (GTK_WINDOW (window));
-
-  /* Interface */
-  GtkWidget *interface = xfmpc_interface_new ();
-  g_object_set_data (G_OBJECT (window), "XfmpcInterface", interface);
-  gtk_box_pack_start (GTK_BOX (vbox), interface, FALSE, FALSE, BORDER);
-
-  /* Separator */
-  GtkWidget *separator = gtk_hseparator_new ();
-  gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);
-
+  GtkWidget *window = xfmpc_main_window_new ();
   gtk_widget_show_all (window);
 
-  /* ExtendedInterface */
-  GtkWidget *extended_interface = xfmpc_extended_interface_new ();
-  gtk_box_pack_start (GTK_BOX (vbox), extended_interface, TRUE, TRUE, 0);
-
-  gtk_widget_show_all (window);
-
-  /* Accelerators */
-  GtkUIManager *ui_manager = gtk_ui_manager_new ();
-
-  GtkActionGroup *action_group = gtk_action_group_new ("Main");
-  gtk_action_group_add_actions (action_group, action_entries,
-                                G_N_ELEMENTS (action_entries),
-                                GTK_WIDGET (window));
-  gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
-  gtk_ui_manager_add_ui_from_string (ui_manager, main_ui, main_ui_length, NULL);
-
-  GtkAccelGroup *accel_group = gtk_ui_manager_get_accel_group (ui_manager);
-  gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
-
-  /* Start teh app */
-  g_object_unref (preferences);
   gtk_main ();
 
   return 0;
 }
 
-
-
-static gboolean
-cb_window_state_event (GtkWidget *window,
-                       GdkEventWindowState *event)
-{
-  if (G_UNLIKELY (event->type != GDK_WINDOW_STATE))
-    return FALSE;
-
-  /**
-   * Hiding the top level window will unstick it too, and send a
-   * window-state-event signal, so here we take the value only if
-   * the window is visible
-   **/
-  if (event->changed_mask & GDK_WINDOW_STATE_STICKY && GTK_WIDGET_VISIBLE (window))
-    {
-      gboolean sticky = ((gboolean) event->new_window_state & GDK_WINDOW_STATE_STICKY) == FALSE ? FALSE : TRUE;
-      XfmpcPreferences *preferences = xfmpc_preferences_get ();
-      g_object_set (G_OBJECT (preferences),
-                    "last-window-state-sticky", sticky,
-                    NULL);
-      g_object_unref (preferences);
-    }
-
-  return FALSE;
-}
-
-static gboolean
-cb_window_closed (GtkWidget *window,
-                  GdkEvent *event)
-{
-  gint posx, posy;
-  gint width, height;
-  gtk_window_get_position (GTK_WINDOW (window), &posx, &posy);
-  gtk_window_get_size (GTK_WINDOW (window), &width, &height);
-
-  XfmpcPreferences *preferences = xfmpc_preferences_get ();
-  g_object_set (G_OBJECT (preferences),
-                "last-window-posx", posx,
-                "last-window-posy", posy,
-                "last-window-width", width,
-                "last-window-height", height,
-                NULL);
-  g_object_unref (preferences);
-
-  gtk_main_quit ();
-  return FALSE;
-}
-
-
-
-static void
-action_close (GtkAction *action,
-              GtkWidget *window)
-{
-  cb_window_closed (window, NULL);
-}
-
-static void
-action_previous (GtkAction *action,
-                 GtkWidget *window)
-{
-  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
-  xfmpc_mpdclient_previous (interface->mpdclient);
-}
-
-static void
-action_pp (GtkAction *action,
-           GtkWidget *window)
-{
-  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
-  xfmpc_interface_pp_clicked (interface);
-}
-
-static void
-action_stop (GtkAction *action,
-             GtkWidget *window)
-{
-  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
-  xfmpc_mpdclient_stop (interface->mpdclient);
-}
-
-static void
-action_next (GtkAction *action,
-             GtkWidget *window)
-{
-  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
-  xfmpc_mpdclient_next (interface->mpdclient);
-}
-
-static void
-action_volume (GtkAction *action,
-               GtkWidget *window)
-{
-  XfmpcInterface *interface = g_object_get_data (G_OBJECT (window), "XfmpcInterface");
-  xfmpc_interface_popup_volume (interface);
-}
-




More information about the Goodies-commits mailing list