app/actions/windows-commands.[ch] app/actions/windows-actions.c add

2008-05-11  Michael Natterer  <mitch@gimp.org>

	* app/actions/windows-commands.[ch]
	* app/actions/windows-actions.c
	* app/menus/windows-menu.c: add dynamic actions and menu items for
	all open docks. Present the dock when the menu item is selected.


svn path=/trunk/; revision=25633
This commit is contained in:
Michael Natterer 2008-05-11 08:15:00 +00:00 committed by Michael Natterer
parent d933812406
commit 7d25d6e6bc
5 changed files with 216 additions and 22 deletions

View File

@ -1,3 +1,10 @@
2008-05-11 Michael Natterer <mitch@gimp.org>
* app/actions/windows-commands.[ch]
* app/actions/windows-actions.c
* app/menus/windows-menu.c: add dynamic actions and menu items for
all open docks. Present the dock when the menu item is selected.
2008-05-10 Martin Nordholts <martinn@svn.gnome.org>
* app/tools/gimprectangletool.c
@ -42,7 +49,7 @@
* app/widgets/gimpactiongroup.h: fix parameter name.
2008-05-10 DindinX <dindinx@mitch.org>
2008-05-10 DindinX <dindinx@gimp.org>
* plug-ins/flame/cmap.c
* plug-ins/flame/libifs.c

View File

@ -32,25 +32,39 @@
#include "file/file-utils.h"
#include "widgets/gimpactiongroup.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpdock.h"
#include "widgets/gimphelp-ids.h"
#include "display/gimpdisplay.h"
#include "dialogs/dialogs.h"
#include "windows-actions.h"
#include "windows-commands.h"
#include "gimp-intl.h"
static void windows_actions_display_add (GimpContainer *container,
GimpDisplay *display,
GimpActionGroup *group);
static void windows_actions_display_remove (GimpContainer *container,
GimpDisplay *display,
GimpActionGroup *group);
static void windows_actions_image_notify (GimpDisplay *display,
const GParamSpec *unused,
GimpActionGroup *group);
static void windows_actions_display_add (GimpContainer *container,
GimpDisplay *display,
GimpActionGroup *group);
static void windows_actions_display_remove (GimpContainer *container,
GimpDisplay *display,
GimpActionGroup *group);
static void windows_actions_image_notify (GimpDisplay *display,
const GParamSpec *unused,
GimpActionGroup *group);
static void windows_actions_dock_added (GimpDialogFactory *factory,
GimpDock *dock,
GimpActionGroup *group);
static void windows_actions_dock_removed (GimpDialogFactory *factory,
GimpDock *dock,
GimpActionGroup *group);
static void windows_actions_dock_notify (GimpDock *dock,
const GParamSpec *pspec,
GimpActionGroup *group);
static const GimpActionEntry windows_actions[] =
@ -94,6 +108,23 @@ windows_actions_setup (GimpActionGroup *group)
windows_actions_display_add (group->gimp->displays, display, group);
}
g_signal_connect_object (global_dock_factory, "dock-added",
G_CALLBACK (windows_actions_dock_added),
group, 0);
g_signal_connect_object (global_dock_factory, "dock-removed",
G_CALLBACK (windows_actions_dock_removed),
group, 0);
for (list = global_dock_factory->open_dialogs;
list;
list = g_list_next (list))
{
GimpDock *dock = list->data;
if (GIMP_IS_DOCK (dock))
windows_actions_dock_added (global_dock_factory, dock, group);
}
}
void
@ -207,3 +238,69 @@ windows_actions_image_notify (GimpDisplay *display,
windows_actions_display_remove (group->gimp->displays, display, group);
}
}
static void
windows_actions_dock_added (GimpDialogFactory *factory,
GimpDock *dock,
GimpActionGroup *group)
{
GtkAction *action;
GimpActionEntry entry;
gchar *action_name = g_strdup_printf ("windows-dock-%04d", dock->ID);
entry.name = action_name;
entry.stock_id = NULL;
entry.label = "";
entry.accelerator = NULL;
entry.tooltip = NULL;
entry.callback = G_CALLBACK (windows_show_dock_cmd_callback);
entry.help_id = NULL;
gimp_action_group_add_actions (group, &entry, 1);
action = gtk_action_group_get_action (GTK_ACTION_GROUP (group),
action_name);
g_object_set_data (G_OBJECT (action), "dock", dock);
g_free (action_name);
g_signal_connect_object (dock, "notify::title",
G_CALLBACK (windows_actions_dock_notify),
group, 0);
if (gtk_window_get_title (GTK_WINDOW (dock)))
windows_actions_dock_notify (dock, NULL, group);
}
static void
windows_actions_dock_removed (GimpDialogFactory *factory,
GimpDock *dock,
GimpActionGroup *group)
{
GtkAction *action;
gchar *action_name = g_strdup_printf ("windows-dock-%04d", dock->ID);
action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), action_name);
if (action)
gtk_action_group_remove_action (GTK_ACTION_GROUP (group), action);
g_free (action_name);
}
static void
windows_actions_dock_notify (GimpDock *dock,
const GParamSpec *pspec,
GimpActionGroup *group)
{
GtkAction *action;
gchar *action_name = g_strdup_printf ("windows-dock-%04d", dock->ID);
action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), action_name);
if (action)
g_object_set (action,
"label", gtk_window_get_title (GTK_WINDOW (dock)),
NULL);
}

View File

@ -51,6 +51,15 @@ windows_show_display_cmd_callback (GtkAction *action,
gtk_window_present (GTK_WINDOW (display->shell));
}
void
windows_show_dock_cmd_callback (GtkAction *action,
gpointer data)
{
GtkWindow *dock = g_object_get_data (G_OBJECT (action), "dock");
gtk_window_present (dock);
}
void
windows_show_toolbox (void)
{

View File

@ -24,6 +24,8 @@ void windows_show_toolbox_cmd_callback (GtkAction *action,
gpointer data);
void windows_show_display_cmd_callback (GtkAction *action,
gpointer data);
void windows_show_dock_cmd_callback (GtkAction *action,
gpointer data);
void windows_show_toolbox (void);

View File

@ -31,22 +31,33 @@
#include "core/gimpviewable.h"
#include "widgets/gimpaction.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpdock.h"
#include "widgets/gimpuimanager.h"
#include "display/gimpdisplay.h"
#include "dialogs/dialogs.h"
#include "windows-menu.h"
static void windows_menu_display_add (GimpContainer *container,
GimpDisplay *display,
GimpUIManager *manager);
static void windows_menu_display_remove (GimpContainer *container,
GimpDisplay *display,
GimpUIManager *manager);
static void windows_menu_image_notify (GimpDisplay *display,
const GParamSpec *unused,
GimpUIManager *manager);
static void windows_menu_display_add (GimpContainer *container,
GimpDisplay *display,
GimpUIManager *manager);
static void windows_menu_display_remove (GimpContainer *container,
GimpDisplay *display,
GimpUIManager *manager);
static void windows_menu_image_notify (GimpDisplay *display,
const GParamSpec *unused,
GimpUIManager *manager);
static void windows_menu_dock_added (GimpDialogFactory *factory,
GimpDock *dock,
GimpUIManager *manager);
static void windows_menu_dock_removed (GimpDialogFactory *factory,
GimpDock *dock,
GimpUIManager *manager);
void
@ -58,6 +69,9 @@ windows_menu_setup (GimpUIManager *manager,
g_return_if_fail (GIMP_IS_UI_MANAGER (manager));
g_return_if_fail (ui_path != NULL);
g_object_set_data (G_OBJECT (manager), "image-menu-ui-path",
(gpointer) ui_path);
g_signal_connect_object (manager->gimp->displays, "add",
G_CALLBACK (windows_menu_display_add),
manager, 0);
@ -65,9 +79,6 @@ windows_menu_setup (GimpUIManager *manager,
G_CALLBACK (windows_menu_display_remove),
manager, 0);
g_object_set_data (G_OBJECT (manager), "image-menu-ui-path",
(gpointer) ui_path);
for (list = GIMP_LIST (manager->gimp->displays)->list;
list;
list = g_list_next (list))
@ -76,6 +87,23 @@ windows_menu_setup (GimpUIManager *manager,
windows_menu_display_add (manager->gimp->displays, display, manager);
}
g_signal_connect_object (global_dock_factory, "dock-added",
G_CALLBACK (windows_menu_dock_added),
manager, 0);
g_signal_connect_object (global_dock_factory, "dock-removed",
G_CALLBACK (windows_menu_dock_removed),
manager, 0);
for (list = global_dock_factory->open_dialogs;
list;
list = g_list_next (list))
{
GimpDock *dock = list->data;
if (GIMP_IS_DOCK (dock))
windows_menu_dock_added (global_dock_factory, dock, manager);
}
}
@ -161,3 +189,54 @@ windows_menu_image_notify (GimpDisplay *display,
windows_menu_display_remove (manager->gimp->displays, display, manager);
}
}
static void
windows_menu_dock_added (GimpDialogFactory *factory,
GimpDock *dock,
GimpUIManager *manager)
{
const gchar *ui_path;
gchar *action_name;
gchar *action_path;
gchar *merge_key;
guint merge_id;
ui_path = g_object_get_data (G_OBJECT (manager), "image-menu-ui-path");
action_name = g_strdup_printf ("windows-dock-%04d", dock->ID);
action_path = g_strdup_printf ("%s/Windows/Docks/Docks", ui_path);
merge_key = g_strdup_printf ("windows-dock-%04d-merge-id", dock->ID);
merge_id = gtk_ui_manager_new_merge_id (GTK_UI_MANAGER (manager));
g_object_set_data (G_OBJECT (manager), merge_key,
GUINT_TO_POINTER (merge_id));
gtk_ui_manager_add_ui (GTK_UI_MANAGER (manager), merge_id,
action_path, action_name, action_name,
GTK_UI_MANAGER_MENUITEM,
FALSE);
g_free (merge_key);
g_free (action_path);
g_free (action_name);
}
static void
windows_menu_dock_removed (GimpDialogFactory *factory,
GimpDock *dock,
GimpUIManager *manager)
{
gchar *merge_key = g_strdup_printf ("windows-dock-%04d-merge-id", dock->ID);
guint merge_id;
merge_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (manager),
merge_key));
if (merge_id)
gtk_ui_manager_remove_ui (GTK_UI_MANAGER (manager), merge_id);
g_object_set_data (G_OBJECT (manager), merge_key, NULL);
g_free (merge_key);
}