gnome-terminal r2573 - trunk/src



Author: chpe
Date: Thu May 29 19:34:50 2008
New Revision: 2573
URL: http://svn.gnome.org/viewvc/gnome-terminal?rev=2573&view=rev

Log:
Add terminal-screen-container.[ch], to move the scrollbar logic out of TerminalScreen.
We really want to put the screen into a GtkScrolledWindow, but that doesn't work yet.
Make TerminalScreen inherit directly from VteTerminal.


Added:
   trunk/src/terminal-screen-container.c
   trunk/src/terminal-screen-container.h
Modified:
   trunk/src/Makefile.am
   trunk/src/terminal-screen.c
   trunk/src/terminal-screen.h
   trunk/src/terminal-tabs-menu.c
   trunk/src/terminal-widget-vte.c
   trunk/src/terminal-widget.h
   trunk/src/terminal-window.c

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Thu May 29 19:34:50 2008
@@ -37,6 +37,8 @@
 	terminal-profile.h			\
 	terminal-screen.c			\
 	terminal-screen.h			\
+	terminal-screen-container.c		\
+	terminal-screen-container.h		\
 	terminal-tabs-menu.c			\
 	terminal-tabs-menu.h			\
 	terminal-widget.h			\

Added: trunk/src/terminal-screen-container.c
==============================================================================
--- (empty file)
+++ trunk/src/terminal-screen-container.c	Thu May 29 19:34:50 2008
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2008 Christian Persch
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#include <config.h>
+
+#include "terminal-widget.h"
+#include "terminal-screen-container.h"
+
+#define SCREEN_DATA_KEY    "TSC::Screen"
+#define SCROLLBAR_DATA_KEY "TSC::Scrollbar"
+
+GtkWidget *
+terminal_screen_container_new (TerminalScreen *screen)
+{
+#ifdef USE_SCROLLED_WINDOW
+  GtkWidget *scrolled_window;
+
+  g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+
+  scrolled_window = gtk_scrolled_window_new (NULL, terminal_widget_get_scroll_adjustment (GTK_WIDGET (screen)));
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+                                  GTK_POLICY_AUTOMATIC,
+                                  GTK_POLICY_AUTOMATIC);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
+                                       GTK_SHADOW_NONE);
+  gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (screen));
+  gtk_widget_show (GTK_WIDGET (screen));
+
+  return scrolled_window;
+#else
+  GtkWidget *hbox, *scrollbar;
+
+  g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+
+  hbox = gtk_hbox_new (FALSE, 0);
+
+  scrollbar = gtk_vscrollbar_new (terminal_widget_get_scroll_adjustment (GTK_WIDGET (screen)));
+
+  gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (screen), TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
+
+  g_object_set_data (G_OBJECT (hbox), SCREEN_DATA_KEY, screen);
+  g_object_set_data (G_OBJECT (hbox), SCROLLBAR_DATA_KEY, scrollbar);
+  
+  gtk_widget_show_all (hbox);
+
+  return hbox;
+#endif
+}
+
+TerminalScreen *
+terminal_screen_container_get_screen (GtkWidget *container)
+{
+#ifdef USE_SCROLLED_WINDOW
+  g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (container), NULL);
+
+  return TERMINAL_SCREEN (gtk_bin_get_child (GTK_BIN (container)));
+#else
+  g_return_val_if_fail (GTK_IS_HBOX (container), NULL);
+
+  return TERMINAL_SCREEN (g_object_get_data (G_OBJECT (container), SCREEN_DATA_KEY));
+#endif
+}
+
+#ifndef USE_SCROLLED_WINDOW
+GtkWidget *
+terminal_screen_container_get_scrollbar (GtkWidget *container)
+{
+  return g_object_get_data (G_OBJECT (container), SCROLLBAR_DATA_KEY);
+}
+#endif
+
+void
+terminal_screen_container_set_policy (GtkWidget *container,
+                                      GtkPolicyType hpolicy G_GNUC_UNUSED,
+                                      GtkPolicyType vpolicy)
+{
+#ifdef USE_SCROLLED_WINDOW
+  g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container));
+
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (container), hpolicy, vpolicy);
+#else
+  GtkWidget *scrollbar;
+
+  g_return_if_fail (GTK_IS_HBOX (container));
+
+  scrollbar = terminal_screen_container_get_scrollbar (container);
+  switch (vpolicy) {
+    case GTK_POLICY_NEVER:
+      gtk_widget_hide (scrollbar);
+      break;
+    case GTK_POLICY_AUTOMATIC:
+    case GTK_POLICY_ALWAYS:
+      gtk_widget_show (scrollbar);
+      break;
+  }
+#endif
+}
+
+void
+terminal_screen_container_set_placement (GtkWidget *container,
+                                         GtkCornerType corner)
+{
+#ifdef USE_SCROLLED_WINDOW
+  g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container));
+
+  gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (container), corner);
+#else
+  GtkWidget *scrollbar;
+
+  g_return_if_fail (GTK_IS_HBOX (container));
+
+  scrollbar = terminal_screen_container_get_scrollbar (container);
+  switch (corner) {
+    case GTK_CORNER_TOP_LEFT:
+    case GTK_CORNER_BOTTOM_LEFT:
+      gtk_box_reorder_child (GTK_BOX (container), scrollbar, 1);
+      break;
+    case GTK_CORNER_TOP_RIGHT:
+    case GTK_CORNER_BOTTOM_RIGHT:
+      gtk_box_reorder_child (GTK_BOX (container), scrollbar, 0);
+      break;
+  }
+#endif
+}

Added: trunk/src/terminal-screen-container.h
==============================================================================
--- (empty file)
+++ trunk/src/terminal-screen-container.h	Thu May 29 19:34:50 2008
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2008 Christian Persch
+*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef TERMINAL_SCREEN_CONTAINER_H
+#define TERMINAL_SCREEN_CONTAINER_H
+
+#include <gtk/gtk.h>
+#include "terminal-screen.h"
+
+G_BEGIN_DECLS
+
+GtkWidget *terminal_screen_container_new (TerminalScreen *screen);
+
+TerminalScreen *terminal_screen_container_get_screen (GtkWidget *container);
+
+void terminal_screen_container_set_policy (GtkWidget *container,
+                                           GtkPolicyType hpolicy,
+                                           GtkPolicyType vpolicy);
+
+void terminal_screen_container_set_placement (GtkWidget *container,
+                                              GtkCornerType corner);
+
+G_END_DECLS
+
+#endif /* TERMINAL_SCREEN_CONTAINER_H */

Modified: trunk/src/terminal-screen.c
==============================================================================
--- trunk/src/terminal-screen.c	(original)
+++ trunk/src/terminal-screen.c	Thu May 29 19:34:50 2008
@@ -35,6 +35,7 @@
 #include "terminal-window.h"
 #include "terminal-widget.h"
 #include "terminal-profile.h"
+#include "terminal-screen-container.h"
 #include "terminal.h"
 #include "skey-popup.h"
 #include <libgnome/gnome-util.h> /* gnome_util_user_shell */
@@ -67,16 +68,11 @@
   double font_scale;
   guint recheck_working_dir_idle;
   guint gconf_connection_id;
-  GtkWidget *hbox;
-  GtkWidget *scrollbar;
   gboolean user_title; /* title was manually set */
 };
 
 enum {
   PROFILE_SET,
-  ICON_TITLE_CHANGED,
-  SELECTION_CHANGED,
-  ENCODING_CHANGED,
   SHOW_POPUP_MENU,
   LAST_SIGNAL
 };
@@ -90,11 +86,6 @@
 static void terminal_screen_class_init  (TerminalScreenClass *klass);
 static void terminal_screen_dispose     (GObject             *object);
 static void terminal_screen_finalize    (GObject             *object);
-static void terminal_screen_size_allocate (GtkWidget *widget,
-                                           GtkAllocation *allocation);
-static void terminal_screen_size_request (GtkWidget *widget,
-                                           GtkRequisition *requisition);
-static void terminal_screen_map         (GtkWidget           *widget);
 static void terminal_screen_update_on_realize (GtkWidget      *widget,
                                                TerminalScreen *screen);
 static void terminal_screen_change_font (TerminalScreen *screen);
@@ -112,12 +103,6 @@
 static void terminal_screen_widget_child_died        (GtkWidget      *term,
                                                       TerminalScreen *screen);
 
-static void terminal_screen_widget_selection_changed (GtkWidget      *term,
-                                                      TerminalScreen *screen);
-
-static void terminal_screen_widget_encoding_changed  (GtkWidget      *term,
-                                                      TerminalScreen *screen);
-
 static void terminal_screen_setup_dnd                (TerminalScreen *screen);
 
 static void update_color_scheme                      (TerminalScreen *screen);
@@ -136,7 +121,7 @@
 
 static guint signals[LAST_SIGNAL];
 
-G_DEFINE_TYPE (TerminalScreen, terminal_screen, GTK_TYPE_BIN)
+G_DEFINE_TYPE (TerminalScreen, terminal_screen, VTE_TYPE_TERMINAL)
 
 static void
 style_set_callback (GtkWidget *widget,
@@ -147,28 +132,41 @@
     terminal_screen_change_font (TERMINAL_SCREEN (data));
 }
 
+#ifdef DEBUG_GEOMETRY
+static void
+parent_size_request (GtkWidget *scrolled_window, GtkRequisition *req, GtkWidget *screen)
+{
+  g_print ("screen %p scrolled-window size req %d : %d\n", screen, req->width, req->height);
+}
+#endif
+
 static void
 parent_set_callback (TerminalScreen *screen,
                      GtkWidget      *old_parent)
 {
   TerminalScreenPrivate *priv = screen->priv;
 
+#ifdef DEBUG_GEOMETRY
+  if (old_parent)
+    g_signal_handlers_disconnect_by_func (old_parent, G_CALLBACK (parent_size_request), screen);
+  if (GTK_WIDGET (screen)->parent)
+    g_signal_connect (GTK_WIDGET (screen)->parent, "size-request", G_CALLBACK (parent_size_request), screen);
+#endif
+
   if (GTK_WIDGET (screen)->parent == NULL)
     {
       priv->window = NULL;
     }
   else
     {
+      GtkWidget *parent;
       GtkWidget *window;
 
-      g_return_if_fail (GTK_IS_NOTEBOOK (GTK_WIDGET (screen)->parent));
-
       window = gtk_widget_get_toplevel (GTK_WIDGET (screen)->parent);
+      if (!TERMINAL_IS_WINDOW (window))
+        return; /* FIXMEchpe */
 
-      g_return_if_fail (window != NULL);
-      g_return_if_fail (TERMINAL_IS_WINDOW (window));
-
-      priv->window = TERMINAL_WINDOW (gtk_widget_get_toplevel (window));
+      priv->window = TERMINAL_WINDOW (window);
     }
 }
 
@@ -214,34 +212,6 @@
 }
 
 static void
-terminal_screen_size_request (GtkWidget *widget,
-                              GtkRequisition *requisition)
-{
-  TerminalScreen *screen = TERMINAL_SCREEN (widget);
-  TerminalScreenPrivate *priv = screen->priv;
-  GtkRequisition widget_request;
-
-  gtk_widget_size_request (priv->hbox, &widget_request);
-
-  requisition->width = widget_request.width;
-  requisition->height = widget_request.height;
-}
-
-static void
-terminal_screen_size_allocate (GtkWidget *widget,
-      GtkAllocation *allocation)
-{
-  GtkWidget *child;
-
-  widget->allocation = *allocation;
-
-  child = GTK_BIN (widget)->child;
-  g_assert (child != NULL);
-
-  gtk_widget_size_allocate (child, allocation);
-}
-
-static void
 terminal_screen_sync_settings (GtkSettings *settings,
                                GParamSpec *pspec,
                                TerminalScreen *screen)
@@ -284,15 +254,20 @@
                     G_CALLBACK (terminal_screen_sync_settings), widget);
 }
 
-static void
-terminal_screen_grab_focus (GtkWidget *widget)
+#ifdef DEBUG_GEOMETRY
+
+static void size_request (GtkWidget *widget, GtkRequisition *req)
 {
-  TerminalScreen *screen = TERMINAL_SCREEN (widget);
-  TerminalScreenPrivate *priv = screen->priv;
+  g_print ("Screen %p size-request %d : %d\n", widget, req->width, req->height);
+}
 
-  gtk_widget_grab_focus (priv->term);
+static void size_allocate (GtkWidget *widget, GtkAllocation *allocation)
+{
+  g_print ("Screen %p size-alloc   %d : %d at (%d, %d)\n", widget, allocation->width, allocation->height, allocation->x, allocation->y);
 }
 
+#endif
+
 static void
 terminal_screen_init (TerminalScreen *screen)
 {
@@ -307,7 +282,8 @@
 
   priv->recheck_working_dir_idle = 0;
 
-  priv->term = terminal_widget_new ();
+  priv->term = GTK_WIDGET (screen);
+  terminal_widget_set_implementation (priv->term);
 
   priv->font_scale = PANGO_SCALE_MEDIUM;
 
@@ -369,40 +345,26 @@
                                          G_CALLBACK (terminal_screen_widget_title_changed),
                                          screen);
 
-  terminal_widget_connect_icon_title_changed (priv->term,
-                                              G_CALLBACK (terminal_screen_widget_icon_title_changed),
-                                              screen);
+  g_signal_connect (screen, "icon-title-changed",
+                    G_CALLBACK (terminal_screen_widget_icon_title_changed),
+                    screen);
 
   terminal_widget_connect_child_died (priv->term,
                                       G_CALLBACK (terminal_screen_widget_child_died),
                                       screen);
 
-  terminal_widget_connect_selection_changed (priv->term,
-                                             G_CALLBACK (terminal_screen_widget_selection_changed),
-                                             screen);
-
-  terminal_widget_connect_encoding_changed (priv->term,
-                                            G_CALLBACK (terminal_screen_widget_encoding_changed),
-                                            screen);
-
   connect_monospace_font_change (screen);
 
-  priv->scrollbar = gtk_vscrollbar_new (NULL);
-
-  priv->hbox = gtk_hbox_new (FALSE, 0);
-
-  gtk_box_pack_start (GTK_BOX (priv->hbox), GTK_WIDGET (priv->term), TRUE, TRUE, 0);
-                      
-  gtk_range_set_adjustment (GTK_RANGE (priv->scrollbar),
-                            terminal_widget_get_scroll_adjustment (priv->term));
-  
-  gtk_container_add (GTK_CONTAINER (screen), GTK_WIDGET (priv->hbox));
-
-  gtk_widget_show_all (priv->hbox);
-
   g_signal_connect (G_OBJECT (screen), "parent-set",
                     G_CALLBACK (parent_set_callback), 
                     NULL);
+
+#ifdef DEBUG_GEOMETRY
+  g_signal_connect_after (screen, "size-request", G_CALLBACK (size_request), NULL);
+  g_signal_connect_after (screen, "size-allocate", G_CALLBACK (size_allocate), NULL);
+#endif
+
+  gtk_widget_show (GTK_WIDGET (screen)); /* FIXMEchpe remove this */
 }
 
 static void
@@ -434,11 +396,7 @@
   object_class->finalize = terminal_screen_finalize;
   object_class->get_property = terminal_screen_get_property;
 
-  widget_class->size_allocate = terminal_screen_size_allocate;
   widget_class->screen_changed = terminal_screen_screen_changed;
-  widget_class->size_request = terminal_screen_size_request;
-  widget_class->map = terminal_screen_map;
-  widget_class->grab_focus = terminal_screen_grab_focus;
 
   signals[PROFILE_SET] =
     g_signal_new (I_("profile_set"),
@@ -449,38 +407,11 @@
                   g_cclosure_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
   
-  signals[ICON_TITLE_CHANGED] =
-    g_signal_new (I_("icon_title_changed"),
-                  G_OBJECT_CLASS_TYPE (object_class),
-                  G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (TerminalScreenClass, icon_title_changed),
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__VOID,
-                  G_TYPE_NONE, 0);
-
-  signals[SELECTION_CHANGED] =
-    g_signal_new (I_("selection_changed"),
-                  G_OBJECT_CLASS_TYPE (object_class),
-                  G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (TerminalScreenClass, selection_changed),
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__VOID,
-                  G_TYPE_NONE, 0);  
-
-  signals[ENCODING_CHANGED] =
-    g_signal_new (I_("encoding_changed"),
-                  G_OBJECT_CLASS_TYPE (object_class),
-                  G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (TerminalScreenClass, encoding_changed),
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__VOID,
-                  G_TYPE_NONE, 0);
-
   signals[SHOW_POPUP_MENU] =
     g_signal_new (I_("show-popup-menu"),
                   G_OBJECT_CLASS_TYPE (object_class),
                   G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (TerminalScreenClass, encoding_changed),
+                  G_STRUCT_OFFSET (TerminalScreenClass, show_popup_menu),
                   NULL, NULL,
                   g_cclosure_marshal_VOID__POINTER,
                   G_TYPE_NONE,
@@ -554,19 +485,6 @@
   return g_object_new (TERMINAL_TYPE_SCREEN, NULL);
 }
 
-static void
-terminal_screen_map (GtkWidget *widget)
-{
-  GtkWidget *child;
-
-  g_assert (GTK_WIDGET_REALIZED (widget));
-
-  child = GTK_BIN (widget)->child;
-  g_assert (child != NULL);
-
-  GTK_WIDGET_CLASS (terminal_screen_parent_class)->map (widget);
-}
-
 TerminalWindow*
 terminal_screen_get_window (TerminalScreen *screen)
 {
@@ -808,8 +726,12 @@
 {
   TerminalScreenPrivate *priv = screen->priv;
   
+  cook_title (screen, priv->raw_icon_title, &priv->cooked_icon_title);
+#if 0
+  /* FIXMEchpe */
   if (cook_title (screen, priv->raw_icon_title, &priv->cooked_icon_title))
     g_signal_emit (G_OBJECT (screen), signals[ICON_TITLE_CHANGED], 0);
+#endif
 }
 
 static void
@@ -1747,20 +1669,6 @@
 }
 
 static void
-terminal_screen_widget_selection_changed (GtkWidget      *term,
-                                          TerminalScreen *screen)
-{
-  g_signal_emit (G_OBJECT (screen), signals[SELECTION_CHANGED], 0);
-}
-
-static void
-terminal_screen_widget_encoding_changed (GtkWidget      *term,
-                                         TerminalScreen *screen)
-{
-  g_signal_emit (G_OBJECT (screen), signals[ENCODING_CHANGED], 0);
-}
-
-static void
 title_entry_changed (GtkWidget      *entry,
                      TerminalScreen *screen)
 {
@@ -2249,49 +2157,44 @@
                      GDK_ACTION_COPY | GDK_ACTION_MOVE);
 }
 
+/* FIXMEchpe move this to TerminalWindow! */
 void
 terminal_screen_update_scrollbar (TerminalScreen *screen)
 {
   TerminalScreenPrivate *priv = screen->priv;
   TerminalProfile *profile;
+  GtkWidget *parent;
+  GtkScrolledWindow *scrolled_window;
+  GtkPolicyType policy = GTK_POLICY_ALWAYS;
+  GtkCornerType corner = GTK_CORNER_TOP_LEFT;
 
   profile = terminal_screen_get_profile (screen);
 
   if (profile == NULL)
     return;
-  
-  g_object_ref (G_OBJECT (priv->scrollbar));
 
-  if (priv->scrollbar->parent)
-    {
-      gtk_container_remove (GTK_CONTAINER (priv->hbox), 
-                            priv->scrollbar);
-    }
-  
+  parent = GTK_WIDGET (screen)->parent;
+  if (!parent)
+    return;
+
   switch (terminal_profile_get_scrollbar_position (profile))
     {
     case TERMINAL_SCROLLBAR_HIDDEN:
-      gtk_widget_hide (priv->scrollbar);
-      /* pack just to hold refcount */
-      gtk_box_pack_end (GTK_BOX (priv->hbox),
-                        priv->scrollbar, FALSE, FALSE, 0);
+      policy = GTK_POLICY_NEVER;
       break;
     case TERMINAL_SCROLLBAR_RIGHT:
-      gtk_box_pack_end (GTK_BOX (priv->hbox),
-                        priv->scrollbar, FALSE, FALSE, 0);
-      gtk_box_reorder_child (GTK_BOX (priv->hbox), priv->scrollbar, -1);
-      gtk_widget_show (priv->scrollbar);
+      policy = GTK_POLICY_ALWAYS;
+      corner = GTK_CORNER_TOP_LEFT;
       break;
     case TERMINAL_SCROLLBAR_LEFT:
-      gtk_box_pack_start (GTK_BOX (priv->hbox),
-                          priv->scrollbar, FALSE, FALSE, 0);
-      gtk_box_reorder_child (GTK_BOX (priv->hbox), priv->scrollbar, 0);
-      gtk_widget_show (priv->scrollbar);
+      policy = GTK_POLICY_ALWAYS;
+      corner = GTK_CORNER_TOP_RIGHT;
       break;
     default:
       g_assert_not_reached ();
       break;
     }
 
-  g_object_unref (G_OBJECT (priv->scrollbar));
+  terminal_screen_container_set_placement (parent, corner);
+  terminal_screen_container_set_policy (parent, GTK_POLICY_NEVER, policy);
 }

Modified: trunk/src/terminal-screen.h
==============================================================================
--- trunk/src/terminal-screen.h	(original)
+++ trunk/src/terminal-screen.h	Thu May 29 19:34:50 2008
@@ -22,7 +22,7 @@
 #ifndef TERMINAL_SCREEN_H
 #define TERMINAL_SCREEN_H
 
-#include <gtk/gtkbin.h>
+#include <vte/vte.h>
 
 #include "terminal-profile.h"
 
@@ -45,19 +45,16 @@
 
 struct _TerminalScreen
 {
-  GtkBin parent_instance;
+  VteTerminal parent_instance;
 
   TerminalScreenPrivate *priv;
 };
 
 struct _TerminalScreenClass
 {
-  GtkBinClass parent_class;
+  VteTerminalClass parent_class;
 
   void (* profile_set)        (TerminalScreen *screen);
-  void (* icon_title_changed) (TerminalScreen *screen);
-  void (* selection_changed)  (TerminalScreen *screen);
-  void (* encoding_changed)   (TerminalScreen *screen);
   void (* show_popup_menu)    (TerminalScreen *screen,
                                TerminalScreenPopupInfo *info);
 };

Modified: trunk/src/terminal-tabs-menu.c
==============================================================================
--- trunk/src/terminal-tabs-menu.c	(original)
+++ trunk/src/terminal-tabs-menu.c	Thu May 29 19:34:50 2008
@@ -24,6 +24,7 @@
 
 #include "terminal-tabs-menu.h"
 #include "terminal-screen.h"
+#include "terminal-screen-container.h"
 
 #include "terminal-intl.h"
 #include <gtk/gtklabel.h>
@@ -185,7 +186,7 @@
 
 static void
 notebook_page_added_cb (GtkNotebook *notebook,
-			TerminalScreen *screen,
+                        GtkWidget *container,
 			guint position,
 			TerminalTabsMenu *menu)
 {
@@ -193,6 +194,9 @@
 	GtkAction *action;
 	char verb[ACTION_VERB_FORMAT_LENGTH];
 	GSList *group;
+        TerminalScreen *screen;
+
+        screen = terminal_screen_container_get_screen (container);
 
 	g_snprintf (verb, sizeof (verb), ACTION_VERB_FORMAT, allocate_tab_id ());
   
@@ -230,12 +234,15 @@
 
 static void
 notebook_page_removed_cb (GtkNotebook *notebook,
-			  TerminalScreen *screen,
+                          GtkWidget *container,
 			  guint position,
 			  TerminalTabsMenu *menu)
 {
 	TerminalTabsMenuPrivate *priv = menu->priv;
 	GtkAction *action;
+        TerminalScreen *screen;
+
+        screen = terminal_screen_container_get_screen (container);
 
 	action = g_object_get_data (G_OBJECT (screen), DATA_KEY);
 	g_return_if_fail (action != NULL);
@@ -256,7 +263,7 @@
 
 static void
 notebook_page_reordered_cb (GtkNotebook *notebook,
-			    TerminalScreen *screen,
+			    GtkBin *bin,
 			    guint position,
 			    TerminalTabsMenu *menu)
 {
@@ -480,7 +487,10 @@
 
 	for (l = tabs; l != NULL; l = l->next)
 	{
-		action = g_object_get_data (G_OBJECT (l->data), DATA_KEY);
+                GtkWidget *container = l->data;
+                GObject *screen = G_OBJECT (terminal_screen_container_get_screen (container));
+
+		action = g_object_get_data (screen, DATA_KEY);
 		g_return_if_fail (action != NULL);
   
 		verb = gtk_action_get_name (action);

Modified: trunk/src/terminal-widget-vte.c
==============================================================================
--- trunk/src/terminal-widget-vte.c	(original)
+++ trunk/src/terminal-widget-vte.c	Thu May 29 19:34:50 2008
@@ -60,14 +60,12 @@
   g_free (vte);
 }
 
-GtkWidget *
-terminal_widget_new (void)
+/* FIXMEchpe: to be removed later */
+void
+terminal_widget_set_implementation (GtkWidget *terminal)
 {
-  GtkWidget *terminal;
   VteData *data;
   
-  terminal = vte_terminal_new ();
-
   vte_terminal_set_mouse_autohide(VTE_TERMINAL(terminal), TRUE);
   
   data = g_new0 (VteData, 1);
@@ -77,8 +75,6 @@
 
   g_object_set_data_full (G_OBJECT (terminal), "terminal-widget-data",
                           data, free_vte_data);
-  
-  return terminal;
 }
 
 void
@@ -465,23 +461,6 @@
 }
 
 void
-terminal_widget_connect_icon_title_changed (GtkWidget *widget,
-					    GCallback  callback,
-					    void      *data)
-{
-  g_signal_connect (widget, "icon_title_changed",
-		    G_CALLBACK (callback), data);
-}
-
-void
-terminal_widget_disconnect_icon_title_changed (GtkWidget *widget,
-					       GCallback  callback,
-					       void      *data)
-{
-  g_signal_handlers_disconnect_by_func (widget, callback, data);
-}
-
-void
 terminal_widget_connect_child_died (GtkWidget *widget,
 				    GCallback  callback,
 				    void      *data)
@@ -498,40 +477,6 @@
   g_signal_handlers_disconnect_by_func (widget, callback, data);
 }
 
-void
-terminal_widget_connect_selection_changed (GtkWidget *widget,
-					   GCallback  callback,
-					   void      *data)
-{
-  g_signal_connect (widget, "selection-changed",
-		    G_CALLBACK (callback), data);
-}
-
-void
-terminal_widget_disconnect_selection_changed (GtkWidget *widget,
-					      GCallback  callback,
-					      void      *data)
-{
-  g_signal_handlers_disconnect_by_func (widget, callback, data);
-}
-
-void
-terminal_widget_connect_encoding_changed      (GtkWidget *widget,
-                                               GCallback  callback,
-                                               void      *data)
-{
-  g_signal_connect (widget, "encoding-changed",
-		    G_CALLBACK (callback), data);
-}
-
-void
-terminal_widget_disconnect_encoding_changed   (GtkWidget *widget,
-                                               GCallback  callback,
-                                               void      *data)
-{
-  g_signal_handlers_disconnect_by_func (widget, callback, data);
-}
-
 const char*
 terminal_widget_get_title (GtkWidget *widget)
 {

Modified: trunk/src/terminal-widget.h
==============================================================================
--- trunk/src/terminal-widget.h	(original)
+++ trunk/src/terminal-widget.h	Thu May 29 19:34:50 2008
@@ -37,7 +37,7 @@
  *
  */
 
-GtkWidget* terminal_widget_new                        (void);
+void       terminal_widget_set_implementation         (GtkWidget            *widget);
 void       terminal_widget_set_size                   (GtkWidget            *widget,
                                                        int                   width_chars,
                                                        int                   height_chars);
@@ -116,30 +116,12 @@
 void terminal_widget_disconnect_title_changed      (GtkWidget *widget,
                                                     GCallback  callback,
                                                     void      *data);
-void terminal_widget_connect_icon_title_changed    (GtkWidget *widget,
-                                                    GCallback  callback,
-                                                    void      *data);
-void terminal_widget_disconnect_icon_title_changed (GtkWidget *widget,
-                                                    GCallback  callback,
-                                                    void      *data);
 void terminal_widget_connect_child_died            (GtkWidget *widget,
                                                     GCallback  callback,
                                                     void      *data);
 void terminal_widget_disconnect_child_died         (GtkWidget *widget,
                                                     GCallback  callback,
                                                     void      *data);
-void terminal_widget_connect_selection_changed     (GtkWidget *widget,
-                                                    GCallback  callback,
-                                                    void      *data);
-void terminal_widget_disconnect_selection_changed  (GtkWidget *widget,
-                                                    GCallback  callback,
-                                                    void      *data);
-void terminal_widget_connect_encoding_changed      (GtkWidget *widget,
-                                                    GCallback  callback,
-                                                    void      *data);
-void terminal_widget_disconnect_encoding_changed   (GtkWidget *widget,
-                                                    GCallback  callback,
-                                                    void      *data);
 
 const char* terminal_widget_get_title         (GtkWidget *widget);
 const char* terminal_widget_get_icon_title    (GtkWidget *widget);

Modified: trunk/src/terminal-window.c
==============================================================================
--- trunk/src/terminal-window.c	(original)
+++ trunk/src/terminal-window.c	Thu May 29 19:34:50 2008
@@ -26,6 +26,7 @@
 #include "terminal-accels.h"
 #include "terminal-widget.h"
 #include "terminal-window.h"
+#include "terminal-screen-container.h"
 #include "terminal-tabs-menu.h"
 #include "terminal.h"
 #include "encoding.h"
@@ -109,11 +110,11 @@
                                               guint            page_num,
                                               TerminalWindow  *window);
 static void notebook_page_added_callback     (GtkWidget       *notebook,
-                                              TerminalScreen  *screen,
+                                              GtkWidget       *container,
                                               guint            page_num,
                                               TerminalWindow  *window);
 static void notebook_page_removed_callback   (GtkWidget       *notebook,
-                                              TerminalScreen  *screen,
+                                              GtkWidget       *container,
                                               guint            page_num,
                                               TerminalWindow  *window);
 
@@ -1559,13 +1560,13 @@
 
 static void
 close_button_clicked_cb (GtkWidget *widget,
-                         GtkWidget *screen)
+                         GtkWidget *screen_container)
 {
   GtkWidget *notebook;
   guint page_num;
 
-  notebook = gtk_widget_get_parent (GTK_WIDGET (screen));
-  page_num = gtk_notebook_page_num (GTK_NOTEBOOK (notebook), screen);
+  notebook = gtk_widget_get_parent (screen_container);
+  page_num = gtk_notebook_page_num (GTK_NOTEBOOK (notebook), screen_container);
   gtk_notebook_remove_page (GTK_NOTEBOOK (notebook), page_num);
 }
 
@@ -1578,7 +1579,7 @@
   const char *title;
 
   title = terminal_screen_get_title (screen);
-
+g_print ("sync tab label %p title %s\n", screen, title);
   hbox = gtk_widget_get_parent (label);
 
   gtk_label_set_text (GTK_LABEL (label), title);
@@ -1599,7 +1600,7 @@
 }
 
 static GtkWidget *
-contruct_tab_label (TerminalWindow *window, TerminalScreen *screen)
+construct_tab_label (TerminalWindow *window, TerminalScreen *screen, GtkWidget *screen_container)
 {
   GtkWidget *hbox, *label, *close_button, *image;
 
@@ -1629,7 +1630,7 @@
                     G_CALLBACK (sync_tab_label), label);
 
   g_signal_connect (close_button, "clicked",
-		    G_CALLBACK (close_button_clicked_cb), screen);
+		    G_CALLBACK (close_button_clicked_cb), screen_container);
 
   g_signal_connect (hbox, "style-set",
                     G_CALLBACK (tab_label_style_set_cb), close_button);
@@ -1646,38 +1647,40 @@
 {
   TerminalWindowPrivate *priv = window->priv;
   TerminalWindow *old;
-  GtkWidget *tab_label;
+  GtkWidget *screen_container, *tab_label;
  
   old = terminal_screen_get_window (screen);
 
   if (old == window)
     return;  
 
-  g_object_ref (G_OBJECT (screen)); /* make our own new refcount */
+  g_object_ref_sink (screen); /* FIXMEchpe this leaks!!!! */
 
   if (old)
     terminal_window_remove_screen (old, screen);
 
-  terminal_screen_set_window (screen, window);
+  screen_container = terminal_screen_container_new (screen);
+  gtk_widget_show (screen_container);
 
-  gtk_widget_show_all (GTK_WIDGET (screen));
+  // FIXMEchpe remove this once the parent-set handler in TerminalScreen works
+  terminal_screen_set_window (screen, window);
 
   update_tab_visibility (window, +1);
 
-  tab_label = contruct_tab_label (window, screen);
+  tab_label = construct_tab_label (window, screen, screen_container);
 
   gtk_notebook_insert_page (GTK_NOTEBOOK (priv->notebook),
-                            GTK_WIDGET (screen),
+                            screen_container,
                             tab_label,
                             position);
   gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (priv->notebook),
-                                      GTK_WIDGET (screen),
+                                      screen_container,
                                       TRUE, TRUE, GTK_PACK_START);
   gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (priv->notebook),
-                                    GTK_WIDGET (screen),
+                                    screen_container,
                                     TRUE);
   gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (priv->notebook),
-                                   GTK_WIDGET (screen),
+                                   screen_container,
                                    TRUE);
 }
 
@@ -1686,13 +1689,17 @@
                                TerminalScreen *screen)
 {
   TerminalWindowPrivate *priv = window->priv;
+  GtkWidget *scrolled_window;
   guint num_page;
 
   g_return_if_fail (terminal_screen_get_window (screen) == window);
 
   update_tab_visibility (window, -1);
 
-  num_page = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), GTK_WIDGET (screen));
+  scrolled_window = GTK_WIDGET (screen)->parent;
+  g_return_if_fail (scrolled_window != NULL);
+
+  num_page = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), scrolled_window);
   gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), num_page);
 }
 
@@ -1789,6 +1796,7 @@
   
   app = gtk_widget_get_toplevel (widget);
   g_assert (app != NULL);
+  g_print ("toplevel type %s\n", G_OBJECT_TYPE_NAME (app));
 
   gtk_widget_size_request (app, &toplevel_request);
   gtk_widget_size_request (widget, &widget_request);
@@ -1849,7 +1857,7 @@
   {
     GtkWidget *old_widget;
     old_widget = terminal_screen_get_widget (priv->active_term);
-    gtk_widget_hide (old_widget);
+    gtk_widget_hide (old_widget); /* FIXMEchpe */
   }
   
   widget = terminal_screen_get_widget (screen);
@@ -1879,7 +1887,8 @@
   gdk_window_set_icon_name (GTK_WIDGET (window)->window, terminal_screen_get_icon_title (screen));
   gtk_window_set_title (GTK_WINDOW (window), terminal_screen_get_title (screen));
 
-  page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), GTK_WIDGET (screen));
+  /* FIXMEchpe this is highly suspect code, called from below notebook_page_selected_callback!!! */
+  page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), GTK_WIDGET (screen)->parent);
   gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), page_num);
 
   /* set size of window to current grid size */
@@ -1925,9 +1934,7 @@
   page_widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook),
                                            page_num);
 
-  g_assert (page_widget);
-
-  screen = TERMINAL_SCREEN (page_widget);
+  screen = terminal_screen_container_get_screen (page_widget);
 
   g_assert (screen);
   
@@ -1941,13 +1948,16 @@
 
 static void
 notebook_page_added_callback (GtkWidget       *notebook,
-                              TerminalScreen  *screen,
+                              GtkWidget       *container,
                               guint            page_num,
                               TerminalWindow  *window)
 {
   TerminalWindowPrivate *priv = window->priv;
+  TerminalScreen *screen;
   GtkWidget *term;
 
+  screen = terminal_screen_container_get_screen (container);
+
   terminal_screen_set_window (screen, window);
   priv->terms++;
 
@@ -2018,16 +2028,19 @@
 
 static void
 notebook_page_removed_callback (GtkWidget       *notebook,
-                                TerminalScreen  *screen,
+                                GtkWidget       *container,
                                 guint            page_num,
                                 TerminalWindow  *window)
 {
   TerminalWindowPrivate *priv = window->priv;
+  TerminalScreen *screen;
   int pages;
 
   if (priv->disposed)
     return;
 
+  screen = terminal_screen_container_get_screen (container);
+
   g_signal_handlers_disconnect_by_func (G_OBJECT (screen),
                                         G_CALLBACK (profile_set_callback),
                                         window);
@@ -2640,12 +2653,14 @@
   TerminalWindowPrivate *priv = window->priv;
   GtkNotebook *notebook = GTK_NOTEBOOK (priv->notebook);
   gint page_num;
-  GtkWidget *page; 
+  GtkWidget *page;
+  TerminalScreen *screen;
 
   page_num = gtk_notebook_get_current_page (notebook);
   page = gtk_notebook_get_nth_page (notebook, page_num);
-  
-  detach_tab (TERMINAL_SCREEN (page), window);
+
+  screen = terminal_screen_container_get_screen (page);
+  detach_tab (screen, window);
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]