gimp r25715 - in trunk: . app/actions app/widgets menus



Author: neo
Date: Mon May 19 21:11:03 2008
New Revision: 25715
URL: http://svn.gnome.org/viewvc/gimp?rev=25715&view=rev

Log:
2008-05-19  Sven Neumann  <sven gimp org>

	* app/widgets/gimpdockable.[ch]
	* app/widgets/gimpdockbook.[ch]: added a "locked" propery to
	GimpDockable. A locked dockable cannot be moved by drag-n-drop.
	Allows users to protect their dockables from accidental changes,
	mainly when working with a tablet.

	* app/widgets/gimpsessioninfo-dockable.[ch]: store the "locked"
	property in the session info.

	* app/actions/dockable-actions.c
	* app/actions/dockable-commands.[ch]: added an action for 
toggling
	the "locked" state.

	* app/widgets/gimphelp-ids.h: new help-id "gimp-dock-tab-lock".

	* menus/dockable-menu.xml.in: show the new menu item.

	* app/actions/plug-in-actions.c: formatting.



Modified:
   trunk/ChangeLog
   trunk/app/actions/dockable-actions.c
   trunk/app/actions/dockable-commands.c
   trunk/app/actions/dockable-commands.h
   trunk/app/actions/plug-in-actions.c
   trunk/app/widgets/gimpdockable.c
   trunk/app/widgets/gimpdockable.h
   trunk/app/widgets/gimpdockbook.c
   trunk/app/widgets/gimpdockbook.h
   trunk/app/widgets/gimphelp-ids.h
   trunk/app/widgets/gimpsessioninfo-dockable.c
   trunk/app/widgets/gimpsessioninfo-dockable.h
   trunk/menus/dockable-menu.xml.in

Modified: trunk/app/actions/dockable-actions.c
==============================================================================
--- trunk/app/actions/dockable-actions.c	(original)
+++ trunk/app/actions/dockable-actions.c	Mon May 19 21:11:03 2008
@@ -104,6 +104,12 @@
 
 static const GimpToggleActionEntry dockable_toggle_actions[] =
 {
+  { "dockable-lock-tab", NULL,
+    N_("Loc_k Tab to Dock"), NULL, NULL,
+    G_CALLBACK (dockable_lock_tab_cmd_callback),
+    FALSE,
+    GIMP_HELP_DOCK_TAB_LOCK },
+
   { "dockable-show-button-bar", NULL,
     N_("Show _Button Bar"), NULL, NULL,
     G_CALLBACK (dockable_show_button_bar_cmd_callback),
@@ -175,6 +181,7 @@
   GimpViewType            view_type           = -1;
   gboolean                list_view_available = FALSE;
   gboolean                grid_view_available = FALSE;
+  gboolean                locked              = FALSE;
   GimpViewSize            view_size           = -1;
   GimpTabStyle            tab_style           = -1;
   gint                    n_pages             = 0;
@@ -250,7 +257,13 @@
 #define SET_SENSITIVE(action,sensitive) \
         gimp_action_group_set_action_sensitive (group, action, (sensitive) != 0)
 
-  SET_SENSITIVE ("dockable-detach-tab", n_pages > 1 || n_books > 1);
+
+  locked = gimp_dockable_is_locked (dockable);
+
+  SET_SENSITIVE ("dockable-detach-tab", (! locked &&
+                                         (n_pages > 1 || n_books > 1)));
+
+  SET_ACTIVE ("dockable-lock-tab", locked);
 
   SET_VISIBLE ("dockable-preview-size-menu", view_size != -1);
 

Modified: trunk/app/actions/dockable-commands.c
==============================================================================
--- trunk/app/actions/dockable-commands.c	(original)
+++ trunk/app/actions/dockable-commands.c	Mon May 19 21:11:03 2008
@@ -40,6 +40,9 @@
 #include "dockable-commands.h"
 
 
+static GimpDockable * dockable_get_current (GimpDockbook *dockbook);
+
+
 /*  public functions  */
 
 void
@@ -83,13 +86,7 @@
                                  gpointer   data)
 {
   GimpDockbook *dockbook = GIMP_DOCKBOOK (data);
-  GimpDockable *dockable;
-  gint          page_num;
-
-  page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
-
-  dockable = (GimpDockable *)
-    gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook), page_num);
+  GimpDockable *dockable = dockable_get_current (dockbook);
 
   if (dockable)
     gimp_dockbook_remove (dockbook, dockable);
@@ -100,16 +97,25 @@
                                   gpointer   data)
 {
   GimpDockbook *dockbook = GIMP_DOCKBOOK (data);
-  GimpDockable *dockable;
-  gint          page_num;
+  GimpDockable *dockable = dockable_get_current (dockbook);
 
-  page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
+  if (dockable)
+    gimp_dockable_detach (dockable);
+}
 
-  dockable = (GimpDockable *)
-    gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook), page_num);
+void
+dockable_lock_tab_cmd_callback (GtkAction *action,
+                                gpointer   data)
+{
+  GimpDockbook *dockbook = GIMP_DOCKBOOK (data);
+  GimpDockable *dockable = dockable_get_current (dockbook);
 
   if (dockable)
-    gimp_dockable_detach (dockable);
+    {
+      gboolean lock = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+      gimp_dockable_set_locked (dockable, lock);
+    }
 }
 
 void
@@ -219,17 +225,11 @@
                                  gpointer   data)
 {
   GimpDockbook *dockbook = GIMP_DOCKBOOK (data);
-  GimpDockable *dockable;
+  GimpDockable *dockable = dockable_get_current (dockbook);
   gint          view_size;
-  gint          page_num;
 
   view_size = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
 
-  page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
-
-  dockable = (GimpDockable *)
-    gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook), page_num);
-
   if (dockable)
     {
       GimpContainerView *view = gimp_container_view_get_by_dockable (dockable);
@@ -253,25 +253,19 @@
                                  gpointer   data)
 {
   GimpDockbook *dockbook = GIMP_DOCKBOOK (data);
-  GimpDockable *dockable;
+  GimpDockable *dockable = dockable_get_current (dockbook);
   GimpTabStyle  tab_style;
-  gint          page_num;
 
   tab_style = (GimpTabStyle)
     gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
 
-  page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
-
-  dockable = (GimpDockable *)
-    gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook), page_num);
-
   if (dockable && dockable->tab_style != tab_style)
     {
       GtkWidget *tab_widget;
 
       gimp_dockable_set_tab_style (dockable, tab_style);
 
-      tab_widget = gimp_dockbook_get_tab_widget (dockbook, dockable);
+      tab_widget = gimp_dockbook_create_tab_widget (dockbook, dockable);
 
       gtk_notebook_set_tab_label (GTK_NOTEBOOK (dockbook),
                                   GTK_WIDGET (dockable),
@@ -284,13 +278,7 @@
                                        gpointer   data)
 {
   GimpDockbook *dockbook = GIMP_DOCKBOOK (data);
-  GimpDockable *dockable;
-  gint          page_num;
-
-  page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
-
-  dockable = (GimpDockable *)
-    gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook), page_num);
+  GimpDockable *dockable = dockable_get_current (dockbook);
 
   if (dockable)
     {
@@ -303,3 +291,12 @@
       gimp_docked_set_show_button_bar (docked, show);
     }
 }
+
+static GimpDockable *
+dockable_get_current (GimpDockbook *dockbook)
+{
+  gint page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
+
+  return (GimpDockable *) gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook),
+                                                     page_num);
+}

Modified: trunk/app/actions/dockable-commands.h
==============================================================================
--- trunk/app/actions/dockable-commands.h	(original)
+++ trunk/app/actions/dockable-commands.h	Mon May 19 21:11:03 2008
@@ -27,6 +27,8 @@
                                               gpointer     data);
 void   dockable_detach_tab_cmd_callback      (GtkAction   *action,
                                               gpointer     data);
+void   dockable_lock_tab_cmd_callback        (GtkAction   *action,
+                                              gpointer     data);
 
 void   dockable_toggle_view_cmd_callback     (GtkAction   *action,
                                               GtkAction   *current,

Modified: trunk/app/actions/plug-in-actions.c
==============================================================================
--- trunk/app/actions/plug-in-actions.c	(original)
+++ trunk/app/actions/plug-in-actions.c	Mon May 19 21:11:03 2008
@@ -506,8 +506,10 @@
       gimp_action_group_set_action_label (group, "plug-in-repeat", repeat);
       gimp_action_group_set_action_label (group, "plug-in-reshow", reshow);
 
-      gimp_action_group_set_action_sensitive (group, "plug-in-repeat", sensitive);
-      gimp_action_group_set_action_sensitive (group, "plug-in-reshow", sensitive);
+      gimp_action_group_set_action_sensitive (group,
+                                              "plug-in-repeat", sensitive);
+      gimp_action_group_set_action_sensitive (group,
+                                              "plug-in-reshow", sensitive);
 
       g_free (repeat);
       g_free (reshow);

Modified: trunk/app/widgets/gimpdockable.c
==============================================================================
--- trunk/app/widgets/gimpdockable.c	(original)
+++ trunk/app/widgets/gimpdockable.c	Mon May 19 21:11:03 2008
@@ -21,6 +21,8 @@
 
 #include "config.h"
 
+#include <string.h>
+
 #include <gtk/gtk.h>
 
 #include "libgimpwidgets/gimpwidgets.h"
@@ -36,12 +38,27 @@
 #include "gimpdockbook.h"
 #include "gimpdocked.h"
 #include "gimphelp-ids.h"
+#include "gimpsessioninfo-aux.h"
 #include "gimpuimanager.h"
 #include "gimpwidgets-utils.h"
 
 #include "gimp-intl.h"
 
 
+enum
+{
+  PROP_0,
+  PROP_LOCKED
+};
+
+static void       gimp_dockable_set_property      (GObject        *object,
+                                                   guint           property_id,
+                                                   const GValue   *value,
+                                                   GParamSpec     *pspec);
+static void       gimp_dockable_get_property      (GObject        *object,
+                                                   guint           property_id,
+                                                   GValue         *value,
+                                                   GParamSpec     *pspec);
 static void       gimp_dockable_destroy           (GtkObject      *object);
 static void       gimp_dockable_size_request      (GtkWidget      *widget,
                                                    GtkRequisition *requisition);
@@ -76,6 +93,8 @@
                                                    GtkCallback     callback,
                                                    gpointer        callback_data);
 
+static void       gimp_dockable_cursor_setup      (GimpDockable   *dockable);
+
 static void       gimp_dockable_get_title_area    (GimpDockable   *dockable,
                                                    GdkRectangle   *area);
 static void       gimp_dockable_clear_title_area  (GimpDockable   *dockable);
@@ -100,11 +119,15 @@
 static void
 gimp_dockable_class_init (GimpDockableClass *klass)
 {
-  GtkObjectClass    *object_class    = GTK_OBJECT_CLASS (klass);
-  GtkWidgetClass    *widget_class    = GTK_WIDGET_CLASS (klass);
-  GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
+  GObjectClass      *object_class     = G_OBJECT_CLASS (klass);
+  GtkObjectClass    *gtk_object_class = GTK_OBJECT_CLASS (klass);
+  GtkWidgetClass    *widget_class     = GTK_WIDGET_CLASS (klass);
+  GtkContainerClass *container_class  = GTK_CONTAINER_CLASS (klass);
 
-  object_class->destroy       = gimp_dockable_destroy;
+  object_class->set_property  = gimp_dockable_set_property;
+  object_class->get_property  = gimp_dockable_get_property;
+
+  gtk_object_class->destroy   = gimp_dockable_destroy;
 
   widget_class->size_request  = gimp_dockable_size_request;
   widget_class->size_allocate = gimp_dockable_size_allocate;
@@ -122,6 +145,11 @@
   container_class->child_type = gimp_dockable_child_type;
   container_class->forall     = gimp_dockable_forall;
 
+  g_object_class_install_property (object_class, PROP_LOCKED,
+                                   g_param_spec_boolean ("locked", NULL, NULL,
+                                                         FALSE,
+                                                         GIMP_PARAM_READWRITE));
+
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_int ("content-border",
                                                              NULL, NULL,
@@ -175,7 +203,7 @@
                      dialog_target_table, G_N_ELEMENTS (dialog_target_table),
                      GDK_ACTION_MOVE);
 
-  /*  Filter out all button_press events not coming from the event window
+  /*  Filter out all button-press events not coming from the event window
       over the title area.  This keeps events that originate from widgets
       in the dockable to start a drag.
    */
@@ -188,6 +216,44 @@
 }
 
 static void
+gimp_dockable_set_property (GObject      *object,
+                            guint         property_id,
+                            const GValue *value,
+                            GParamSpec   *pspec)
+{
+  GimpDockable *dockable = GIMP_DOCKABLE (object);
+
+  switch (property_id)
+    {
+    case PROP_LOCKED:
+      gimp_dockable_set_locked (dockable, g_value_get_boolean (value));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+gimp_dockable_get_property (GObject    *object,
+                            guint       property_id,
+                            GValue     *value,
+                            GParamSpec *pspec)
+{
+  GimpDockable *dockable = GIMP_DOCKABLE (object);
+
+  switch (property_id)
+    {
+    case PROP_LOCKED:
+      g_value_set_boolean (value, dockable->locked);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
 gimp_dockable_destroy (GtkObject *object)
 {
   GimpDockable *dockable = GIMP_DOCKABLE (object);
@@ -344,7 +410,6 @@
     {
       GdkWindowAttr  attributes;
       GdkRectangle   area;
-      GdkCursor     *cursor;
 
       gimp_dockable_get_title_area (dockable, &area);
 
@@ -367,12 +432,9 @@
                                                 GDK_WA_NOREDIR));
 
       gdk_window_set_user_data (dockable->title_window, widget);
-
-      cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
-                                           GDK_HAND2);
-      gdk_window_set_cursor (dockable->title_window, cursor);
-      gdk_cursor_unref (cursor);
     }
+
+  gimp_dockable_cursor_setup (dockable);
 }
 
 static void
@@ -742,6 +804,7 @@
   return GTK_WIDGET (dockable);
 }
 
+
 void
 gimp_dockable_set_aux_info (GimpDockable *dockable,
                             GList        *aux_info)
@@ -771,6 +834,32 @@
   return NULL;
 }
 
+
+void
+gimp_dockable_set_locked (GimpDockable *dockable,
+                          gboolean      lock)
+{
+  g_return_if_fail (GIMP_IS_DOCKABLE (dockable));
+
+  if (dockable->locked != lock)
+    {
+      dockable->locked = lock ? TRUE : FALSE;
+
+      gimp_dockable_cursor_setup (dockable);
+
+      g_object_notify (G_OBJECT (dockable), "locked");
+    }
+}
+
+gboolean
+gimp_dockable_is_locked (GimpDockable *dockable)
+{
+  g_return_val_if_fail (GIMP_IS_DOCKABLE (dockable), FALSE);
+
+  return dockable->locked;
+}
+
+
 void
 gimp_dockable_set_tab_style (GimpDockable *dockable,
                              GimpTabStyle  tab_style)
@@ -939,9 +1028,36 @@
     }
 }
 
+
 /*  private functions  */
 
 static void
+gimp_dockable_cursor_setup (GimpDockable *dockable)
+{
+  if (! GTK_WIDGET_REALIZED (dockable))
+    return;
+
+  if (! dockable->title_window)
+    return;
+
+  /*  only show a hand cursor for unlocked dockables  */
+
+  if (gimp_dockable_is_locked (dockable))
+    {
+      gdk_window_set_cursor (dockable->title_window, NULL);
+    }
+  else
+    {
+      GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (dockable));
+      GdkCursor  *cursor;
+
+      cursor = gdk_cursor_new_for_display (display, GDK_HAND2);
+      gdk_window_set_cursor (dockable->title_window, cursor);
+      gdk_cursor_unref (cursor);
+    }
+}
+
+static void
 gimp_dockable_get_title_area (GimpDockable *dockable,
                               GdkRectangle *area)
 {

Modified: trunk/app/widgets/gimpdockable.h
==============================================================================
--- trunk/app/widgets/gimpdockable.h	(original)
+++ trunk/app/widgets/gimpdockable.h	Mon May 19 21:11:03 2008
@@ -48,6 +48,7 @@
   gchar        *stock_id;
   gchar        *help_id;
   GimpTabStyle  tab_style;
+  gboolean      locked;
 
   GimpDockbook *dockbook;
 
@@ -82,6 +83,10 @@
                                                GList          *aux_info);
 GList         * gimp_dockable_get_aux_info    (GimpDockable   *dockable);
 
+void            gimp_dockable_set_locked      (GimpDockable   *dockable,
+                                               gboolean        lock);
+gboolean        gimp_dockable_is_locked       (GimpDockable   *dockable);
+
 void            gimp_dockable_set_tab_style   (GimpDockable   *dockable,
                                                GimpTabStyle    tab_style);
 GtkWidget     * gimp_dockable_get_tab_widget  (GimpDockable   *dockable,

Modified: trunk/app/widgets/gimpdockbook.c
==============================================================================
--- trunk/app/widgets/gimpdockbook.c	(original)
+++ trunk/app/widgets/gimpdockbook.c	Mon May 19 21:11:03 2008
@@ -35,6 +35,7 @@
 #include "gimpdnd.h"
 #include "gimpdockable.h"
 #include "gimpdockbook.h"
+#include "gimpdocked.h"
 #include "gimphelp-ids.h"
 #include "gimpimagedock.h"
 #include "gimpmenufactory.h"
@@ -79,6 +80,8 @@
 static void      gimp_dockbook_update_tabs        (GimpDockbook   *dockbook,
                                                    gboolean        added);
 
+static void      gimp_dockbook_tab_drag_source_setup (GtkWidget    *widget,
+                                                      GimpDockable *dockable);
 static void      gimp_dockbook_tab_drag_begin     (GtkWidget      *widget,
                                                    GdkDragContext *context,
                                                    GimpDockable   *dockable);
@@ -106,6 +109,9 @@
                                                    GimpDockable   *dockable);
 static void      gimp_dockbook_remove_tab_timeout (GimpDockbook   *dockbook);
 static gboolean  gimp_dockbook_tab_timeout        (GimpDockbook   *dockbook);
+static void      gimp_dockbook_tab_locked_notify  (GimpDockable   *dockable,
+                                                   GParamSpec     *pspec,
+                                                   GimpDockbook   *dockbook);
 
 static void      gimp_dockbook_help_func          (const gchar    *help_id,
                                                    gpointer        help_data);
@@ -244,8 +250,8 @@
     {
       GtkWidget *tab_widget;
 
-      tab_widget = gimp_dockbook_get_tab_widget (GIMP_DOCKBOOK (widget),
-                                                 GIMP_DOCKABLE (list->data));
+      tab_widget = gimp_dockbook_create_tab_widget (GIMP_DOCKBOOK (widget),
+                                                    GIMP_DOCKABLE (list->data));
 
       gtk_notebook_set_tab_label (GTK_NOTEBOOK (widget),
                                   GTK_WIDGET (list->data),
@@ -337,7 +343,7 @@
   g_return_if_fail (GIMP_IS_DOCKABLE (dockable));
   g_return_if_fail (dockable->dockbook == NULL);
 
-  tab_widget = gimp_dockbook_get_tab_widget (dockbook, dockable);
+  tab_widget = gimp_dockbook_create_tab_widget (dockbook, dockable);
 
   g_return_if_fail (GTK_IS_WIDGET (tab_widget));
 
@@ -370,6 +376,10 @@
 
   gimp_dockable_set_context (dockable, dockbook->dock->context);
 
+  g_signal_connect (dockable, "notify::locked",
+                    G_CALLBACK (gimp_dockbook_tab_locked_notify),
+                    dockbook);
+
   g_signal_emit (dockbook, dockbook_signals[DOCKABLE_ADDED], 0, dockable);
 }
 
@@ -385,6 +395,10 @@
 
   g_object_ref (dockable);
 
+  g_signal_handlers_disconnect_by_func (dockable,
+                                        G_CALLBACK (gimp_dockbook_tab_locked_notify),
+                                        dockbook);
+
   if (dockbook->tab_hover_dockable == dockable)
     gimp_dockbook_remove_tab_timeout (dockbook);
 
@@ -407,8 +421,8 @@
 }
 
 GtkWidget *
-gimp_dockbook_get_tab_widget (GimpDockbook *dockbook,
-                              GimpDockable *dockable)
+gimp_dockbook_create_tab_widget (GimpDockbook *dockbook,
+                                 GimpDockable *dockable)
 {
   GtkWidget   *tab_widget;
   GtkIconSize  tab_size = DEFAULT_TAB_ICON_SIZE;
@@ -482,13 +496,8 @@
 
   g_object_set_data (G_OBJECT (tab_widget), "gimp-dockable", dockable);
 
-  /*  set the drag source *before* connecting button_press because we
-   *  stop button_press emission by returning TRUE from the callback
-   */
-  gtk_drag_source_set (GTK_WIDGET (tab_widget),
-                       GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
-                       dialog_target_table, G_N_ELEMENTS (dialog_target_table),
-                       GDK_ACTION_MOVE);
+  gimp_dockbook_tab_drag_source_setup (tab_widget, dockable);
+
   g_signal_connect (tab_widget, "drag-begin",
                     G_CALLBACK (gimp_dockbook_tab_drag_begin),
                     dockable);
@@ -496,10 +505,6 @@
                     G_CALLBACK (gimp_dockbook_tab_drag_end),
                     dockable);
 
-  gtk_drag_source_set (GTK_WIDGET (dockable),
-                       GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
-                       dialog_target_table, G_N_ELEMENTS (dialog_target_table),
-                       GDK_ACTION_MOVE);
   g_signal_connect (dockable, "drag-begin",
                     G_CALLBACK (gimp_dockbook_tab_drag_begin),
                     dockable);
@@ -507,7 +512,7 @@
                     G_CALLBACK (gimp_dockbook_tab_drag_end),
                     dockable);
 
-  gtk_drag_dest_set (GTK_WIDGET (tab_widget),
+  gtk_drag_dest_set (tab_widget,
                      GTK_DEST_DEFAULT_DROP,
                      dialog_target_table, G_N_ELEMENTS (dialog_target_table),
                      GDK_ACTION_MOVE);
@@ -571,6 +576,34 @@
 /*  tab DND source side  */
 
 static void
+gimp_dockbook_tab_drag_source_setup (GtkWidget    *widget,
+                                     GimpDockable *dockable)
+{
+  if (gimp_dockable_is_locked (dockable))
+    {
+      if (widget)
+        gtk_drag_source_unset (widget);
+
+      gtk_drag_source_unset (GTK_WIDGET (dockable));
+    }
+  else
+    {
+      if (widget)
+        gtk_drag_source_set (widget,
+                             GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                             dialog_target_table,
+                             G_N_ELEMENTS (dialog_target_table),
+                             GDK_ACTION_MOVE);
+
+      gtk_drag_source_set (GTK_WIDGET (dockable),
+                           GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           dialog_target_table,
+                           G_N_ELEMENTS (dialog_target_table),
+                           GDK_ACTION_MOVE);
+    }
+}
+
+static void
 gimp_dockbook_tab_drag_begin (GtkWidget      *widget,
                               GdkDragContext *context,
                               GimpDockable   *dockable)
@@ -797,15 +830,26 @@
 }
 
 static void
+gimp_dockbook_tab_locked_notify (GimpDockable *dockable,
+                                 GParamSpec   *pspec,
+                                 GimpDockbook *dockbook)
+{
+  GtkWidget *tab_widget;
+
+  tab_widget = gtk_notebook_get_tab_label (GTK_NOTEBOOK (dockbook),
+                                           GTK_WIDGET (dockable));
+
+  gimp_dockbook_tab_drag_source_setup (tab_widget, dockable);
+}
+
+static void
 gimp_dockbook_help_func (const gchar *help_id,
                          gpointer     help_data)
 {
-  GimpDockbook *dockbook;
+  GimpDockbook *dockbook = GIMP_DOCKBOOK (help_data);
   GtkWidget    *dockable;
   gint          page_num;
 
-  dockbook = GIMP_DOCKBOOK (help_data);
-
   page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
 
   dockable = gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook), page_num);

Modified: trunk/app/widgets/gimpdockbook.h
==============================================================================
--- trunk/app/widgets/gimpdockbook.h	(original)
+++ trunk/app/widgets/gimpdockbook.h	Mon May 19 21:11:03 2008
@@ -60,20 +60,20 @@
 };
 
 
-GType       gimp_dockbook_get_type       (void) G_GNUC_CONST;
+GType       gimp_dockbook_get_type          (void) G_GNUC_CONST;
 
-GtkWidget * gimp_dockbook_new            (GimpMenuFactory  *menu_factory);
+GtkWidget * gimp_dockbook_new               (GimpMenuFactory  *menu_factory);
 
-void        gimp_dockbook_add            (GimpDockbook     *dockbook,
-                                          GimpDockable     *dockable,
-                                          gint              position);
-void        gimp_dockbook_remove         (GimpDockbook     *dockbook,
-                                          GimpDockable     *dockable);
-
-GtkWidget * gimp_dockbook_get_tab_widget (GimpDockbook     *dockbook,
-                                          GimpDockable     *dockable);
-gboolean    gimp_dockbook_drop_dockable  (GimpDockbook     *dockbook,
-                                          GtkWidget        *drag_source);
+void        gimp_dockbook_add               (GimpDockbook     *dockbook,
+                                             GimpDockable     *dockable,
+                                             gint              position);
+void        gimp_dockbook_remove            (GimpDockbook     *dockbook,
+                                             GimpDockable     *dockable);
+
+GtkWidget * gimp_dockbook_create_tab_widget (GimpDockbook     *dockbook,
+                                             GimpDockable     *dockable);
+gboolean    gimp_dockbook_drop_dockable     (GimpDockbook     *dockbook,
+                                             GtkWidget        *drag_source);
 
 
 #endif /* __GIMP_DOCKBOOK_H__ */

Modified: trunk/app/widgets/gimphelp-ids.h
==============================================================================
--- trunk/app/widgets/gimphelp-ids.h	(original)
+++ trunk/app/widgets/gimphelp-ids.h	Mon May 19 21:11:03 2008
@@ -452,6 +452,7 @@
 
 #define GIMP_HELP_DOCK_TAB_ADD                    "gimp-dock-tab-add"
 #define GIMP_HELP_DOCK_TAB_CLOSE                  "gimp-dock-tab-close"
+#define GIMP_HELP_DOCK_TAB_LOCK                   "gimp-dock-tab-lock"
 #define GIMP_HELP_DOCK_TAB_MENU                   "gimp-dock-tab-menu"
 #define GIMP_HELP_DOCK_TAB_DETACH                 "gimp-dock-tab-detach"
 #define GIMP_HELP_DOCK_PREVIEW_SIZE               "gimp-dock-preview-size"

Modified: trunk/app/widgets/gimpsessioninfo-dockable.c
==============================================================================
--- trunk/app/widgets/gimpsessioninfo-dockable.c	(original)
+++ trunk/app/widgets/gimpsessioninfo-dockable.c	Mon May 19 21:11:03 2008
@@ -38,6 +38,7 @@
 
 enum
 {
+  SESSION_INFO_DOCKABLE_LOCKED,
   SESSION_INFO_DOCKABLE_TAB_STYLE,
   SESSION_INFO_DOCKABLE_VIEW_SIZE,
   SESSION_INFO_DOCKABLE_AUX
@@ -89,6 +90,12 @@
   gimp_config_writer_open (writer, "dockable");
   gimp_config_writer_string (writer, info->identifier);
 
+  if (info->locked)
+    {
+      gimp_config_writer_open (writer, "locked");
+      gimp_config_writer_close (writer);
+    }
+
   enum_value = g_enum_get_value (enum_class, info->tab_style);
 
   if (enum_value)
@@ -126,6 +133,8 @@
   g_return_val_if_fail (scanner != NULL, G_TOKEN_LEFT_PAREN);
   g_return_val_if_fail (dockable != NULL, G_TOKEN_LEFT_PAREN);
 
+  g_scanner_scope_add_symbol (scanner, scope, "locked",
+                              GINT_TO_POINTER (SESSION_INFO_DOCKABLE_LOCKED));
   g_scanner_scope_add_symbol (scanner, scope, "tab-style",
                               GINT_TO_POINTER (SESSION_INFO_DOCKABLE_TAB_STYLE));
   g_scanner_scope_add_symbol (scanner, scope, "preview-size",
@@ -156,6 +165,10 @@
         case G_TOKEN_SYMBOL:
           switch (GPOINTER_TO_INT (scanner->value.v_symbol))
             {
+            case SESSION_INFO_DOCKABLE_LOCKED:
+              info->locked = TRUE;
+              break;
+
             case SESSION_INFO_DOCKABLE_TAB_STYLE:
               token = G_TOKEN_IDENTIFIER;
               if (g_scanner_peek_next_token (scanner) != token)
@@ -206,6 +219,7 @@
 
   g_type_class_unref (enum_class);
 
+  g_scanner_scope_remove_symbol (scanner, scope, "locked");
   g_scanner_scope_remove_symbol (scanner, scope, "tab-style");
   g_scanner_scope_remove_symbol (scanner, scope, "preview-size");
   g_scanner_scope_remove_symbol (scanner, scope, "aux-info");
@@ -237,6 +251,7 @@
 
   info = gimp_session_info_dockable_new ();
 
+  info->locked     = dockable->locked;
   info->identifier = g_strdup (entry->identifier);
   info->tab_style  = dockable->tab_style;
   info->view_size  = -1;
@@ -278,6 +293,7 @@
 
   if (dockable)
     {
+      gimp_dockable_set_locked    (GIMP_DOCKABLE (dockable), info->locked);
       gimp_dockable_set_tab_style (GIMP_DOCKABLE (dockable), info->tab_style);
 
       if (info->aux_info)

Modified: trunk/app/widgets/gimpsessioninfo-dockable.h
==============================================================================
--- trunk/app/widgets/gimpsessioninfo-dockable.h	(original)
+++ trunk/app/widgets/gimpsessioninfo-dockable.h	Mon May 19 21:11:03 2008
@@ -26,6 +26,7 @@
 struct _GimpSessionInfoDockable
 {
   gchar        *identifier;
+  gboolean      locked;
   GimpTabStyle  tab_style;
   gint          view_size;
 

Modified: trunk/menus/dockable-menu.xml.in
==============================================================================
--- trunk/menus/dockable-menu.xml.in	(original)
+++ trunk/menus/dockable-menu.xml.in	Mon May 19 21:11:03 2008
@@ -9,6 +9,7 @@
     </menu>
     <menuitem action="dockable-close-tab" />
     <menuitem action="dockable-detach-tab" />
+    <menuitem action="dockable-lock-tab" />
     <separator />
     <menu action="dockable-preview-size-menu">
       <menuitem action="dockable-preview-size-tiny" />



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