]> git.sur5r.net Git - glabels/blobdiff - src/window.c
Removed gtk_status_bar_set_has_resize_grip().
[glabels] / src / window.c
index 42d24a589f7070fc145c99706c39a36ea2d0474c..98df0c93649f93e5f52c291a95064909cb4c7035 100644 (file)
@@ -44,7 +44,7 @@
 #define DEFAULT_WINDOW_HEIGHT 600
 
 #define CURSOR_INFO_WIDTH     150
-#define ZOOM_INFO_WIDTH        50
+#define ZOOM_INFO_WIDTH        75
 
 
 /*===========================================================================*/
@@ -59,7 +59,7 @@ static GList *window_list = NULL;
 /*===========================================================================*/
 
 static void     gl_window_finalize     (GObject       *object);
-static void     gl_window_destroy      (GtkObject     *gtk_object);
+static void     gl_window_dispose      (GObject       *object);
 
 static void     set_window_title       (glWindow *window,
                                        glLabel  *label);
@@ -94,6 +94,20 @@ static void     name_changed_cb        (glLabel       *label,
 static void     modified_changed_cb    (glLabel       *label,
                                        glWindow      *window);
 
+static void     clipboard_changed_cb   (GtkClipboard  *clipboard,
+                                        GdkEvent      *event,
+                                       glWindow      *window);
+
+static void     focus_widget_changed_cb(GtkWindow     *gtk_window,
+                                        GtkWidget     *widget,
+                                       glWindow      *window);
+
+static void     set_copy_paste_sensitivity  (glWindow      *window,
+                                             GtkWidget     *focus_widget);
+
+static void     label_changed_cb       (glLabel       *label,
+                                       glWindow      *window);
+
 
 /****************************************************************************/
 /* Boilerplate Object stuff.                                                */
@@ -105,15 +119,13 @@ static void
 gl_window_class_init (glWindowClass *class)
 {
        GObjectClass   *object_class     = G_OBJECT_CLASS (class);
-       GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (class);
 
        gl_debug (DEBUG_WINDOW, "START");
 
        gl_window_parent_class = g_type_class_peek_parent (class);
 
        object_class->finalize = gl_window_finalize;
-
-       gtk_object_class->destroy = gl_window_destroy;
+       object_class->dispose  = gl_window_dispose;
 
        gl_debug (DEBUG_WINDOW, "END");
 }
@@ -155,7 +167,6 @@ gl_window_init (glWindow *window)
        gtk_box_pack_start (GTK_BOX (vbox1), status_hbox, FALSE, FALSE, 0);
 
        window->status_bar = gtk_statusbar_new ();
-       gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (window->status_bar), FALSE);
        gtk_box_pack_start (GTK_BOX (status_hbox),
                            window->status_bar,
                            TRUE, TRUE, 0);
@@ -218,16 +229,17 @@ gl_window_finalize (GObject *object)
 
 
 static void
-gl_window_destroy (GtkObject *gtk_object)
+gl_window_dispose (GObject *object)
 {
-       glWindow *window;
+       glWindow          *window;
+        GtkClipboard      *clipboard;
 
        gl_debug (DEBUG_WINDOW, "START");
 
-       g_return_if_fail (gtk_object != NULL);
-       g_return_if_fail (GL_IS_WINDOW (gtk_object));
+       g_return_if_fail (object != NULL);
+       g_return_if_fail (GL_IS_WINDOW (object));
 
-       window = GL_WINDOW (gtk_object);
+       window = GL_WINDOW (object);
        window_list = g_list_remove (window_list, window);
 
         if (window->ui) {
@@ -235,8 +247,20 @@ gl_window_destroy (GtkObject *gtk_object)
                window->ui = NULL;
         }
 
-       if (GTK_OBJECT_CLASS (gl_window_parent_class)->destroy) {
-               GTK_OBJECT_CLASS (gl_window_parent_class)->destroy (gtk_object);
+        if (window->label)
+        {
+                clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window),
+                                                      GDK_SELECTION_CLIPBOARD);
+
+                g_signal_handlers_disconnect_by_func (G_OBJECT (clipboard),
+                                                      G_CALLBACK (clipboard_changed_cb),
+                                                      window);
+
+               g_object_unref (window->label);
+        }
+
+       if (G_OBJECT_CLASS (gl_window_parent_class)->dispose) {
+               G_OBJECT_CLASS (gl_window_parent_class)->dispose (object);
        }
 
        gl_debug (DEBUG_WINDOW, "END");
@@ -333,14 +357,16 @@ void
 gl_window_set_label (glWindow    *window,
                     glLabel     *label)
 {
-       gchar *string;
+       gchar             *string;
+        GtkClipboard      *clipboard;
+        GtkWidget         *focus_widget;
 
        gl_debug (DEBUG_WINDOW, "START");
 
        g_return_if_fail (GL_IS_WINDOW (window));
        g_return_if_fail (GL_IS_LABEL (label));
 
-        window->label = label;
+        window->label = g_object_ref (label);
 
        gl_label_clear_modified (label);
 
@@ -380,6 +406,11 @@ gl_window_set_label (glWindow    *window,
        gtk_label_set_text (GTK_LABEL(window->zoom_info), string);
        g_free (string);
 
+
+        clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window),
+                                              GDK_SELECTION_CLIPBOARD);
+
+
        g_signal_connect (G_OBJECT(window->label), "selection_changed",
                          G_CALLBACK(selection_changed_cb), window);
 
@@ -401,6 +432,19 @@ gl_window_set_label (glWindow    *window,
        g_signal_connect (G_OBJECT(label), "modified_changed",
                          G_CALLBACK(modified_changed_cb), window);
 
+       g_signal_connect (G_OBJECT(clipboard), "owner_change",
+                         G_CALLBACK(clipboard_changed_cb), window);
+
+       g_signal_connect (G_OBJECT(window), "set_focus",
+                         G_CALLBACK(focus_widget_changed_cb), window);
+
+        /* Initialize "Paste" sensitivity. */
+        focus_widget = gtk_window_get_focus (GTK_WINDOW (window));
+        set_copy_paste_sensitivity (window, focus_widget);
+
+       g_signal_connect (G_OBJECT(label), "changed",
+                         G_CALLBACK(label_changed_cb), window);
+
        gl_debug (DEBUG_WINDOW, "END");
 }
 
@@ -481,7 +525,7 @@ selection_changed_cb (glLabel  *label,
        g_return_if_fail (label && GL_IS_LABEL (label));
        g_return_if_fail (window && GL_IS_WINDOW (window));
 
-       gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view));
+        gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view), TRUE);
 
        gl_debug (DEBUG_WINDOW, "END");
 }
@@ -631,6 +675,97 @@ modified_changed_cb (glLabel  *label,
 }
 
 
+/*---------------------------------------------------------------------------*/
+/** PRIVATE.  Label "changed" callback.                                      */
+/*---------------------------------------------------------------------------*/
+static void
+label_changed_cb (glLabel  *label,
+                  glWindow *window)
+{
+       gl_debug (DEBUG_WINDOW, "START");
+
+       g_return_if_fail (label && GL_IS_LABEL (label));
+       g_return_if_fail (window && GL_IS_WINDOW (window));
+
+       gl_ui_update_undo_redo_verbs (window->ui, label);
+
+       gl_debug (DEBUG_WINDOW, "END");
+}
+
+
+
+/*---------------------------------------------------------------------------*/
+/** PRIVATE.  Clipboard "owner change" callback.                             */
+/*---------------------------------------------------------------------------*/
+static void
+clipboard_changed_cb (GtkClipboard *clipboard,
+                      GdkEvent     *event,
+                      glWindow     *window)
+{
+        GtkWidget    *focus_widget;
+
+       gl_debug (DEBUG_WINDOW, "START");
+
+       g_return_if_fail (window && GL_IS_WINDOW (window));
+
+        focus_widget = gtk_window_get_focus (GTK_WINDOW (window));
+        set_copy_paste_sensitivity (window, focus_widget);
+
+       gl_debug (DEBUG_WINDOW, "END");
+}
+
+
+/*---------------------------------------------------------------------------*/
+/** PRIVATE.  Window "set-focus" callback.                                   */
+/*---------------------------------------------------------------------------*/
+static void
+focus_widget_changed_cb (GtkWindow *gtk_window,
+                         GtkWidget *widget,
+                         glWindow  *window)
+{
+       gl_debug (DEBUG_WINDOW, "START");
+
+       g_return_if_fail (window && GL_IS_WINDOW (window));
+
+        if (widget)
+        {
+                gl_debug (DEBUG_WINDOW, "SET-FOCUS %x %s\n",
+                          widget,
+                          G_OBJECT_TYPE_NAME (widget));
+
+                set_copy_paste_sensitivity (window, widget);
+        }
+
+       gl_debug (DEBUG_WINDOW, "END");
+}
+
+
+/*---------------------------------------------------------------------------*/
+/** PRIVATE.  Set paste sensitivity.                                         */
+/*---------------------------------------------------------------------------*/
+static void
+set_copy_paste_sensitivity (glWindow  *window,
+                            GtkWidget *focus_widget)
+{
+       gl_debug (DEBUG_WINDOW, "START");
+
+       g_return_if_fail (window && GL_IS_WINDOW (window));
+
+        if ( focus_widget == GL_VIEW(window->view)->canvas )
+        {
+                gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view), TRUE);
+
+                gl_ui_update_paste_verbs (window->ui, gl_label_can_paste (window->label));
+        }
+        else
+        {
+                gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view), FALSE);
+                gl_ui_update_paste_verbs (window->ui, FALSE);
+        }
+
+       gl_debug (DEBUG_WINDOW, "END");
+}
+
 
 /*
  * Local Variables:       -- emacs