SF.net SVN: geany-plugins:[1776] trunk/geany-plugins/webhelper/src

colombanw at users.sourceforge.net colombanw at xxxxx
Sun Dec 19 13:23:32 UTC 2010


Revision: 1776
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1776&view=rev
Author:   colombanw
Date:     2010-12-19 13:23:32 +0000 (Sun, 19 Dec 2010)

Log Message:
-----------
WebHelper: make possible to place the browser widget in it's own window

This may be useful for dual-head setups, or simply for better
flexibility.

Modified Paths:
--------------
    trunk/geany-plugins/webhelper/src/gwh-browser.h
    trunk/geany-plugins/webhelper/src/gwh-plugin.c
    trunk/geany-plugins/webhelper/src/gwh-settings.c

Modified: trunk/geany-plugins/webhelper/src/gwh-browser.h
===================================================================
--- trunk/geany-plugins/webhelper/src/gwh-browser.h	2010-12-19 13:23:10 UTC (rev 1775)
+++ trunk/geany-plugins/webhelper/src/gwh-browser.h	2010-12-19 13:23:32 UTC (rev 1776)
@@ -36,7 +36,8 @@
 
 typedef enum {
   GWH_BROWSER_POSITION_MESSAGE_WINDOW,
-  GWH_BROWSER_POSITION_SIDEBAR
+  GWH_BROWSER_POSITION_SIDEBAR,
+  GWH_BROWSER_POSITION_SEPARATE_WINDOW
 } GwhBrowserPosition;
 
 

Modified: trunk/geany-plugins/webhelper/src/gwh-plugin.c
===================================================================
--- trunk/geany-plugins/webhelper/src/gwh-plugin.c	2010-12-19 13:23:10 UTC (rev 1775)
+++ trunk/geany-plugins/webhelper/src/gwh-plugin.c	2010-12-19 13:23:32 UTC (rev 1776)
@@ -29,6 +29,7 @@
 #include <geany.h>
 #include <document.h>
 
+#include "gwh-utils.h"
 #include "gwh-browser.h"
 #include "gwh-settings.h"
 
@@ -55,50 +56,130 @@
 )
 
 
+enum {
+  CONTAINER_NOTEBOOK,
+  CONTAINER_WINDOW
+};
+
+
 static GtkWidget   *G_browser   = NULL;
-static gint         G_page_num  = 0;
-static GtkWidget   *G_notebook  = NULL;
+static struct {
+  guint       type;
+  GtkWidget  *widget;
+  
+  /* only valid if type == CONTAINER_NOTEBOOK */
+  gint        page_num;
+} G_container;
 static GwhSettings *G_settings  = NULL;
 
 
 static void
+on_separate_window_destroy (GtkWidget  *widget,
+                            gpointer    data)
+{
+  gwh_browser_set_inspector_transient_for (GWH_BROWSER (G_browser), NULL);
+  gtk_container_remove (GTK_CONTAINER (G_container.widget), G_browser);
+}
+
+static gboolean
+on_idle_widget_show (gpointer data)
+{
+  gchar *geometry;
+  
+  gtk_widget_show (data);
+  g_object_get (G_settings, "browser-separate-window-geometry", &geometry, NULL);
+  gwh_set_window_geometry (GTK_WINDOW (data), geometry, NULL, NULL);
+  g_free (geometry);
+  /* present back the Geany's window because it is very unlikely the user
+   * expects the focus on our newly created window at this point, since we
+   * either just loaded the plugin or activated a element from Geany's UI */
+  gtk_window_present (GTK_WINDOW (geany_data->main_widgets->window));
+  
+  return FALSE;
+}
+
+static GtkWidget *
+create_separate_window (void)
+{
+  GtkWidget *window;
+  
+  window = g_object_new (GTK_TYPE_WINDOW,
+                         "type", GTK_WINDOW_TOPLEVEL,
+                         "skip-taskbar-hint", TRUE,
+                         "title", _("Web view"),
+                         "deletable", FALSE,
+                         NULL);
+  g_signal_connect (window, "destroy",
+                    G_CALLBACK (on_separate_window_destroy), NULL);
+  gtk_container_add (GTK_CONTAINER (window), G_browser);
+  gtk_window_set_transient_for (GTK_WINDOW (window),
+                                GTK_WINDOW (geany_data->main_widgets->window));
+  gwh_browser_set_inspector_transient_for (GWH_BROWSER (G_browser),
+                                           GTK_WINDOW (window));
+  
+  return window;
+}
+
+static void
 attach_browser (void)
 {
   GwhBrowserPosition position;
   
   g_object_get (G_settings, "browser-position", &position, NULL);
-  if (position == GWH_BROWSER_POSITION_SIDEBAR) {
-    G_notebook = geany_data->main_widgets->sidebar_notebook;
+  if (position == GWH_BROWSER_POSITION_SEPARATE_WINDOW) {
+    G_container.type = CONTAINER_WINDOW;
+    G_container.widget = create_separate_window ();
+    /* seems that if a window is shown before it's transient parent, bad stuff
+     * happend. so, show our window a little later. */
+    g_idle_add (on_idle_widget_show, G_container.widget);
   } else {
-    G_notebook = geany_data->main_widgets->message_window_notebook;
+    G_container.type = CONTAINER_NOTEBOOK;
+    if (position == GWH_BROWSER_POSITION_SIDEBAR) {
+      G_container.widget = geany_data->main_widgets->sidebar_notebook;
+    } else {
+      G_container.widget = geany_data->main_widgets->message_window_notebook;
+    }
+    G_container.page_num = gtk_notebook_append_page (GTK_NOTEBOOK (G_container.widget),
+                                                     G_browser,
+                                                     gtk_label_new (_("Web preview")));
+    gwh_browser_set_inspector_transient_for (GWH_BROWSER (G_browser),
+                                             GTK_WINDOW (geany_data->main_widgets->window));
   }
-  G_page_num = gtk_notebook_append_page (GTK_NOTEBOOK (G_notebook), G_browser,
-                                         gtk_label_new (_("Web preview")));
 }
 
 static void
 detach_browser (void)
 {
-  /* remove the page we added. we handle the case where the page were
-   * reordered */
-  if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (G_notebook),
-                                 G_page_num) != G_browser) {
-    gint i;
-    gint n;
+  if (G_container.type == CONTAINER_WINDOW) {
+    gchar *geometry;
     
-    G_page_num = -1;
-    n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (G_notebook));
-    for (i = 0; i < n; i++) {
-      if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (G_notebook),
-                                     i) == G_browser) {
-        G_page_num = i;
-        break;
+    geometry = gwh_get_window_geometry (GTK_WINDOW (G_container.widget), 0, 0);
+    g_object_set (G_settings, "browser-separate-window-geometry", geometry, NULL);
+    g_free (geometry);
+    gtk_widget_destroy (G_container.widget);
+  } else {
+    GtkNotebook  *notebook = GTK_NOTEBOOK (G_container.widget);
+    gint          page_num = G_container.page_num;
+    
+    /* remove the page we added. we handle the case where the page were
+     * reordered */
+    if (gtk_notebook_get_nth_page (notebook, page_num) != G_browser) {
+      gint i;
+      gint n;
+      
+      page_num = -1;
+      n = gtk_notebook_get_n_pages (notebook);
+      for (i = 0; i < n; i++) {
+        if (gtk_notebook_get_nth_page (notebook, i) == G_browser) {
+          page_num = i;
+          break;
+        }
       }
     }
+    if (page_num >= 0) {
+      gtk_notebook_remove_page (notebook, page_num);
+    }
   }
-  if (G_page_num >= 0) {
-    gtk_notebook_remove_page (GTK_NOTEBOOK (G_notebook), G_page_num);
-  }
 }
 
 static void
@@ -210,8 +291,6 @@
   load_config ();
   
   G_browser = gwh_browser_new ();
-  gwh_browser_set_inspector_transient_for (GWH_BROWSER (G_browser),
-                                           GTK_WINDOW (data->main_widgets->window));
   g_signal_connect (G_browser, "populate-popup",
                     G_CALLBACK (on_browser_populate_popup), NULL);
   

Modified: trunk/geany-plugins/webhelper/src/gwh-settings.c
===================================================================
--- trunk/geany-plugins/webhelper/src/gwh-settings.c	2010-12-19 13:23:10 UTC (rev 1775)
+++ trunk/geany-plugins/webhelper/src/gwh-settings.c	2010-12-19 13:23:32 UTC (rev 1776)
@@ -45,6 +45,7 @@
   gchar                *browser_last_uri;
   GtkOrientation        browser_orientation;
   GwhBrowserPosition    browser_position;
+  gchar                *browser_separate_window_geometry;
   gchar                *inspector_window_geometry;
 };
 
@@ -55,6 +56,7 @@
   PROP_BROWSER_LAST_URI,
   PROP_BROWSER_ORIENTATION,
   PROP_BROWSER_POSITION,
+  PROP_BROWSER_SEPARATE_WINDOW_GEOMETRY,
   PROP_INSPECTOR_WINDOW_GEOMETRY
 };
 
@@ -83,6 +85,9 @@
     case PROP_BROWSER_POSITION:
       g_value_set_enum (value, self->priv->browser_position);
       break;
+    case PROP_BROWSER_SEPARATE_WINDOW_GEOMETRY:
+      g_value_set_string (value, self->priv->browser_separate_window_geometry);
+      break;
     case PROP_INSPECTOR_WINDOW_GEOMETRY:
       g_value_set_string (value, self->priv->inspector_window_geometry);
       break;
@@ -113,6 +118,10 @@
     case PROP_BROWSER_POSITION:
       self->priv->browser_position = g_value_get_enum (value);
       break;
+    case PROP_BROWSER_SEPARATE_WINDOW_GEOMETRY:
+      setptr (self->priv->browser_separate_window_geometry,
+              g_value_dup_string (value));
+      break;
     case PROP_INSPECTOR_WINDOW_GEOMETRY:
       setptr (self->priv->inspector_window_geometry, g_value_dup_string (value));
       break;
@@ -193,6 +202,12 @@
                                                       GWH_TYPE_BROWSER_POSITION,
                                                       GWH_BROWSER_POSITION_MESSAGE_WINDOW,
                                                       G_PARAM_READWRITE));
+  g_object_class_install_property (object_class, PROP_BROWSER_SEPARATE_WINDOW_GEOMETRY,
+                                   g_param_spec_string ("browser-separate-window-geometry",
+                                                        "Browser separate window geometry",
+                                                        "Last geometry of the separated browser's window",
+                                                        "400x300",
+                                                        G_PARAM_READWRITE));
   g_object_class_install_property (object_class, PROP_INSPECTOR_WINDOW_GEOMETRY,
                                    g_param_spec_string ("inspector-window-geometry",
                                                         "Inspector window geometry",
@@ -212,6 +227,7 @@
   self->priv->browser_last_uri          = g_strdup ("about:blank");
   self->priv->browser_orientation       = GTK_ORIENTATION_VERTICAL;
   self->priv->browser_position          = GWH_BROWSER_POSITION_MESSAGE_WINDOW;
+  self->priv->browser_separate_window_geometry = g_strdup ("400x300");
   self->priv->inspector_window_geometry = g_strdup ("400x300");
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list