remember and ref the created widgets. Added gimp_ui_manager_ui_popup()

2004-04-22  Michael Natterer  <mitch@gimp.org>

	* app/widgets/gimpuimanager.[ch]: remember and ref the created
	widgets.  Added gimp_ui_manager_ui_popup() which pops up a GtkMenu
	with a custom GimpMenuPositionFunc and a GtkDestroyNotify which is
	called on popdown.

	* app/widgets/gimpmenufactory.c (gimp_menu_factory_finalize):
	don't forget to free the list of managed UIs.

	* app/widgets/gimpdockable.[ch]
	* app/widgets/gimpdockbook.[ch]
	* app/widgets/gimpdocked.[ch]
	* app/widgets/gimpeditor.[ch]: added GimpUIManager stuff parallel
	to the to-be-removed GtkItemFactory stuff.

	* app/widgets/gimpcolormapeditor.c
	* app/widgets/gimpcomponenteditor.c
	* app/widgets/gimpcontainereditor.c
	* app/widgets/gimpcontainergridview.c
	* app/widgets/gimpcontainertreeview.c
	* app/widgets/gimperrorconsole.c
	* app/widgets/gimpgradienteditor.c
	* app/widgets/gimpitemtreeview.c
	* app/widgets/gimppaletteeditor.c
	* app/widgets/gimptooloptionseditor.c: changed accordingly and added
	#if 0'ed code which actually uses all the UI managers.

	* app/display/gimpdisplay.c
	* app/display/gimpdisplayshell.c
	* app/gui/gui-vtable.c: disabled some gimp_ui_manager_update()
	calls because they were invoking toggle and radio callbacks
	which still have the wrong signature.
This commit is contained in:
Michael Natterer 2004-04-22 17:14:22 +00:00 committed by Michael Natterer
parent 505698be0a
commit 1071842535
26 changed files with 623 additions and 96 deletions

View File

@ -1,3 +1,37 @@
2004-04-22 Michael Natterer <mitch@gimp.org>
* app/widgets/gimpuimanager.[ch]: remember and ref the created
widgets. Added gimp_ui_manager_ui_popup() which pops up a GtkMenu
with a custom GimpMenuPositionFunc and a GtkDestroyNotify which is
called on popdown.
* app/widgets/gimpmenufactory.c (gimp_menu_factory_finalize):
don't forget to free the list of managed UIs.
* app/widgets/gimpdockable.[ch]
* app/widgets/gimpdockbook.[ch]
* app/widgets/gimpdocked.[ch]
* app/widgets/gimpeditor.[ch]: added GimpUIManager stuff parallel
to the to-be-removed GtkItemFactory stuff.
* app/widgets/gimpcolormapeditor.c
* app/widgets/gimpcomponenteditor.c
* app/widgets/gimpcontainereditor.c
* app/widgets/gimpcontainergridview.c
* app/widgets/gimpcontainertreeview.c
* app/widgets/gimperrorconsole.c
* app/widgets/gimpgradienteditor.c
* app/widgets/gimpitemtreeview.c
* app/widgets/gimppaletteeditor.c
* app/widgets/gimptooloptionseditor.c: changed accordingly and added
#if 0'ed code which actually uses all the UI managers.
* app/display/gimpdisplay.c
* app/display/gimpdisplayshell.c
* app/gui/gui-vtable.c: disabled some gimp_ui_manager_update()
calls because they were invoking toggle and radio callbacks
which still have the wrong signature.
2004-04-22 Sven Neumann <sven@gimp.org>
* plug-ins/gflare/gflare.c: ported the last plug-in from

View File

@ -512,7 +512,9 @@ gimp_display_flush_whenever (GimpDisplay *gdisp,
GimpContext *user_context;
gimp_item_factory_update (shell->menubar_factory, shell);
#if 0
gimp_ui_manager_update (shell->menubar_manager, shell);
#endif
user_context = gimp_get_user_context (gdisp->gimage->gimp);

View File

@ -512,7 +512,9 @@ gimp_display_flush_whenever (GimpDisplay *gdisp,
GimpContext *user_context;
gimp_item_factory_update (shell->menubar_factory, shell);
#if 0
gimp_ui_manager_update (shell->menubar_manager, shell);
#endif
user_context = gimp_get_user_context (gdisp->gimage->gimp);

View File

@ -486,7 +486,9 @@ gimp_display_shell_real_scaled (GimpDisplayShell *shell)
/* update the <Image>/View/Zoom menu */
gimp_item_factory_update (shell->menubar_factory, shell);
#if 0
gimp_ui_manager_update (shell->menubar_manager, shell);
#endif
user_context = gimp_get_user_context (shell->gdisp->gimage->gimp);
@ -672,12 +674,32 @@ gimp_display_shell_new (GimpDisplay *gdisp,
if (shell->options->show_menubar)
gtk_widget_show (menubar);
/* make sure we can activate accels even if the menubar is invisible
* (see http://bugzilla.gnome.org/show_bug.cgi?id=137151)
*/
g_signal_connect (menubar, "can-activate-accel",
G_CALLBACK (gtk_true),
NULL);
/* active display callback */
g_signal_connect (menubar, "button_press_event",
G_CALLBACK (gimp_display_shell_events),
shell);
g_signal_connect (menubar, "button_release_event",
G_CALLBACK (gimp_display_shell_events),
shell);
g_signal_connect (menubar, "key_press_event",
G_CALLBACK (gimp_display_shell_events),
shell);
#if 0
menubar = gimp_ui_manager_ui_create (shell->menubar_manager,
"/image-menubar");
menubar = gimp_ui_manager_ui_get (shell->menubar_manager,
"/image-menubar");
gtk_ui_manager_ensure_update (GTK_UI_MANAGER (shell->menubar_manager));
gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
gtk_widget_show (menubar);
#endif
if (shell->options->show_menubar)
gtk_widget_show (menubar);
/* make sure we can activate accels even if the menubar is invisible
* (see http://bugzilla.gnome.org/show_bug.cgi?id=137151)
@ -696,6 +718,7 @@ gimp_display_shell_new (GimpDisplay *gdisp,
g_signal_connect (menubar, "key_press_event",
G_CALLBACK (gimp_display_shell_events),
shell);
#endif
/* another vbox for everything except the statusbar */
disp_vbox = gtk_vbox_new (FALSE, 1);

View File

@ -199,8 +199,11 @@ gui_display_new (GimpImage *gimage,
gimp_context_set_display (gimp_get_user_context (gimage->gimp), gdisp);
gimp_item_factory_update (shell->menubar_factory, shell);
#if 0
gimp_ui_manager_update (shell->menubar_manager, shell);
#else
gimp_item_factory_update (shell->menubar_factory, shell);
#endif
return GIMP_OBJECT (gdisp);
}

View File

@ -56,6 +56,7 @@
#include "gimphelp-ids.h"
#include "gimpitemfactory.h"
#include "gimpmenufactory.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gui/color-notebook.h"
@ -753,10 +754,20 @@ gimp_colormap_preview_button_press (GtkWidget *widget,
case 3:
gimp_colormap_editor_set_index (editor, col);
#if 0
gimp_ui_manager_update (GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->popup_data);
gimp_ui_manager_ui_popup (GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->ui_identifier,
GIMP_EDITOR (editor)->ui_manager,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#else
gimp_item_factory_popup_with_data (GIMP_EDITOR (editor)->item_factory,
GIMP_EDITOR (editor)->item_factory_data,
GIMP_EDITOR (editor)->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
return TRUE;
default:

View File

@ -36,6 +36,7 @@
#include "gimpitemfactory.h"
#include "gimpmenufactory.h"
#include "gimppreviewrendererimage.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gimp-intl.h"
@ -520,10 +521,20 @@ gimp_component_editor_button_press (GtkWidget *widget,
break;
case 3:
#if 0
gimp_ui_manager_update (GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->popup_data);
gimp_ui_manager_ui_popup (GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->ui_identifier,
GIMP_EDITOR (editor)->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#else
gimp_item_factory_popup_with_data (GIMP_EDITOR (editor)->item_factory,
GIMP_EDITOR (editor)->item_factory_data,
GIMP_EDITOR (editor)->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
break;
default:

View File

@ -38,6 +38,7 @@
#include "gimpitemfactory.h"
#include "gimpmenufactory.h"
#include "gimppreviewrenderer.h"
#include "gimpuimanager.h"
static void gimp_container_editor_class_init (GimpContainerEditorClass *klass);
@ -66,7 +67,9 @@ static void gimp_container_editor_set_context (GimpDocked *docke
GimpContext *context,
GimpContext *prev_context);
static GimpItemFactory * gimp_container_editor_get_menu (GimpDocked *docked,
gpointer *item_factory_data);
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_identifier);
static GtkVBoxClass *parent_class = NULL;
@ -263,11 +266,25 @@ gimp_container_editor_real_context_item (GimpContainerEditor *editor,
{
GimpEditor *gimp_editor = GIMP_EDITOR (editor->view);
#if 0
if (gimp_editor->ui_manager)
{
gimp_ui_manager_update (gimp_editor->ui_manager,
gimp_editor->popup_data);
gimp_ui_manager_ui_popup (gimp_editor->ui_manager,
gimp_editor->ui_identifier,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
return;
}
#else
if (gimp_editor->item_factory)
gimp_item_factory_popup_with_data (gimp_editor->item_factory,
gimp_editor->item_factory_data,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
}
}
@ -294,11 +311,13 @@ gimp_container_editor_set_context (GimpDocked *docked,
}
static GimpItemFactory *
gimp_container_editor_get_menu (GimpDocked *docked,
gpointer *item_factory_data)
gimp_container_editor_get_menu (GimpDocked *docked,
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_identifier)
{
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (docked);
return gimp_docked_get_menu (GIMP_DOCKED (editor->view),
item_factory_data);
return gimp_docked_get_menu (GIMP_DOCKED (editor->view), popup_data,
manager, ui_identifier);
}

View File

@ -37,6 +37,7 @@
#include "gimpitemfactory.h"
#include "gimppreview.h"
#include "gimppreviewrenderer.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gtkhwrapbox.h"
@ -376,15 +377,34 @@ gimp_container_grid_view_popup_menu (GtkWidget *widget)
GimpContainerGridView *grid_view = GIMP_CONTAINER_GRID_VIEW (widget);
GimpEditor *editor = GIMP_EDITOR (widget);
if (editor->item_factory && grid_view->selected_item)
if (grid_view->selected_item)
{
gimp_item_factory_popup_with_data (editor->item_factory,
editor->item_factory_data,
GTK_WIDGET (editor),
gimp_container_grid_view_menu_position,
grid_view->selected_item,
NULL);
return TRUE;
#if 0
if (editor->ui_manager)
{
gimp_ui_manager_update (editor->ui_manager,
editor->popup_data);
gimp_ui_manager_ui_popup (editor->ui_manager,
editor->ui_identifier,
editor->popup_data,
GTK_WIDGET (editor),
gimp_container_grid_view_menu_position,
grid_view->selected_item,
NULL);
return TRUE;
}
#else
if (editor->item_factory)
{
gimp_item_factory_popup_with_data (editor->item_factory,
editor->popup_data,
GTK_WIDGET (editor),
gimp_container_grid_view_menu_position,
grid_view->selected_item,
NULL);
return TRUE;
}
#endif
}
return FALSE;

View File

@ -40,6 +40,7 @@
#include "gimpdnd.h"
#include "gimpitemfactory.h"
#include "gimppreviewrenderer.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
@ -353,16 +354,34 @@ gimp_container_tree_view_popup_menu (GtkWidget *widget)
tree_view = GIMP_CONTAINER_TREE_VIEW (widget);
editor = GIMP_EDITOR (widget);
if (editor->item_factory &&
gtk_tree_selection_get_selected (tree_view->selection, NULL, NULL))
if (gtk_tree_selection_get_selected (tree_view->selection, NULL, NULL))
{
gimp_item_factory_popup_with_data (editor->item_factory,
editor->item_factory_data,
GTK_WIDGET (editor),
gimp_container_tree_view_menu_position,
editor,
NULL);
return TRUE;
#if 0
if (editor->ui_manager)
{
gimp_ui_manager_update (editor->ui_manager,
editor->popup_data);
gimp_ui_manager_ui_popup (editor->ui_manager,
editor->ui_identifier,
editor->popup_data,
GTK_WIDGET (editor),
gimp_container_tree_view_menu_position,
editor,
NULL);
return TRUE;
}
#endif
if (editor->item_factory)
{
gimp_item_factory_popup_with_data (editor->item_factory,
editor->popup_data,
GTK_WIDGET (editor),
gimp_container_tree_view_menu_position,
editor,
NULL);
return TRUE;
}
}
return FALSE;

View File

@ -36,6 +36,7 @@
#include "gimpdockbook.h"
#include "gimpdocked.h"
#include "gimpitemfactory.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gimp-intl.h"
@ -802,15 +803,19 @@ gimp_dockable_set_context (GimpDockable *dockable,
}
GimpItemFactory *
gimp_dockable_get_menu (GimpDockable *dockable,
gpointer *item_factory_data)
gimp_dockable_get_menu (GimpDockable *dockable,
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_identifier)
{
g_return_val_if_fail (GIMP_IS_DOCKABLE (dockable), NULL);
g_return_val_if_fail (item_factory_data != NULL, NULL);
g_return_val_if_fail (popup_data != NULL, NULL);
g_return_val_if_fail (manager != NULL, NULL);
g_return_val_if_fail (ui_identifier != NULL, NULL);
if (GTK_BIN (dockable)->child)
return gimp_docked_get_menu (GIMP_DOCKED (GTK_BIN (dockable)->child),
item_factory_data);
popup_data, manager, ui_identifier);
return NULL;
}
@ -900,13 +905,28 @@ static void
gimp_dockable_menu_end (GimpDockable *dockable)
{
GimpItemFactory *dialog_item_factory;
gpointer dialog_item_factory_data;
gpointer dialog_popup_data;
GimpUIManager *dialog_ui_manager;
const gchar *dialog_ui_identifier;
dialog_item_factory = gimp_dockable_get_menu (dockable,
&dialog_item_factory_data);
&dialog_popup_data,
&dialog_ui_manager,
&dialog_ui_identifier);
#if 0
if (dialog_ui_manager)
{
GtkWidget *child_menu_widget;
child_menu_widget = gimp_ui_manager_ui_get (dialog_ui_manager,
dialog_ui_identifier);
gtk_menu_detach (GTK_MENU (child_menu_widget));
}
#else
if (dialog_item_factory)
gtk_menu_detach (GTK_MENU (GTK_ITEM_FACTORY (dialog_item_factory)->widget));
#endif
/* release gimp_dockable_show_menu()'s references */
g_object_set_data (G_OBJECT (dockable), GIMP_DOCKABLE_DETACH_REF_KEY, NULL);
@ -917,17 +937,81 @@ static gboolean
gimp_dockable_show_menu (GimpDockable *dockable)
{
GimpItemFactory *dockbook_item_factory;
GimpUIManager *dockbook_ui_manager;
GimpItemFactory *dialog_item_factory;
gpointer dialog_item_factory_data;
gpointer dialog_popup_data;
GimpUIManager *dialog_ui_manager;
const gchar *dialog_ui_identifier;
dockbook_item_factory = dockable->dockbook->item_factory;
dockbook_ui_manager = dockable->dockbook->ui_manager;
if (! dockbook_item_factory)
return FALSE;
dialog_item_factory = gimp_dockable_get_menu (dockable,
&dialog_item_factory_data);
&dialog_popup_data,
&dialog_ui_manager,
&dialog_ui_identifier);
#if 0
if (dialog_ui_manager)
{
GtkAction *parent_menu_action;
GtkAction *child_menu_action;
GtkWidget *parent_menu_widget;
GtkWidget *child_menu_widget;
const gchar *label;
parent_menu_action =
gtk_ui_manager_get_action (GTK_UI_MANAGER (dockbook_ui_manager),
"/dockable-popup/dockable-menu");
child_menu_action =
gtk_ui_manager_get_action (GTK_UI_MANAGER (dialog_ui_manager),
dialog_ui_identifier);
g_object_get (child_menu_action,
"label", &label,
NULL);
g_object_set (parent_menu_action,
"label", label,
"stock-id", dockable->stock_id,
"visible", TRUE,
NULL);
parent_menu_widget =
gtk_ui_manager_get_widget (GTK_UI_MANAGER (dockbook_ui_manager),
"/dockable-popup/dockable-menu");
child_menu_widget =
gimp_ui_manager_ui_get (dialog_ui_manager,
dialog_ui_identifier);
if (! GTK_IS_MENU (child_menu_widget))
{
g_warning ("%s: child_menu_widget (%p) is not a GtkMenu",
G_STRFUNC, child_menu_widget);
return FALSE;
}
gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent_menu_widget),
child_menu_widget);
gimp_ui_manager_update (dialog_ui_manager, dialog_popup_data);
}
else
{
GtkAction *parent_menu_action;
parent_menu_action =
gtk_ui_manager_get_action (GTK_UI_MANAGER (dockbook_ui_manager),
"/dockable-popup/dockable-menu");
g_object_set (parent_menu_action, "visible", FALSE, NULL);
}
#else
if (dialog_item_factory)
{
GtkWidget *dialog_menu_widget;
@ -952,14 +1036,15 @@ gimp_dockable_show_menu (GimpDockable *dockable)
gtk_menu_item_set_submenu (GTK_MENU_ITEM (dialog_menu_widget),
GTK_ITEM_FACTORY (dialog_item_factory)->widget);
gimp_item_factory_update (dialog_item_factory,
dialog_item_factory_data);
gimp_ui_manager_update (dialog_ui_manager, dialog_popup_data);
gimp_item_factory_update (dialog_item_factory, dialog_popup_data);
}
else
{
gimp_item_factory_set_visible (GTK_ITEM_FACTORY (dockbook_item_factory),
"/dialog-menu", FALSE);
}
#endif
/* an item factory callback may destroy both dockable and dockbook,
* so reference them for gimp_dockable_menu_end()
@ -969,12 +1054,22 @@ gimp_dockable_show_menu (GimpDockable *dockable)
g_object_ref (dockable->dockbook),
g_object_unref);
#if 0
gimp_ui_manager_update (dockbook_ui_manager, dockable);
gimp_ui_manager_ui_popup (dockbook_ui_manager, "/dockable-popup",
dockable,
GTK_WIDGET (dockable),
gimp_dockable_menu_position, dockable,
(GtkDestroyNotify) gimp_dockable_menu_end);
#else
gimp_item_factory_popup_with_data (dockbook_item_factory,
dockable,
GTK_WIDGET (dockable),
gimp_dockable_menu_position,
dockable,
(GtkDestroyNotify) gimp_dockable_menu_end);
#endif
return TRUE;
}

View File

@ -80,7 +80,12 @@ GtkWidget * gimp_dockable_get_tab_widget (GimpDockable *dockable,
void gimp_dockable_set_context (GimpDockable *dockable,
GimpContext *context);
GimpItemFactory * gimp_dockable_get_menu (GimpDockable *dockable,
gpointer *item_factory_data);
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_identifier);
GimpUIManager * gimp_dockable_get_manager (GimpDockable *dockable,
gpointer *manager_data,
const gchar **ui_identifier);
void gimp_dockable_detach (GimpDockable *dockable);

View File

@ -201,6 +201,7 @@ gimp_dockbook_init (GimpDockbook *dockbook)
{
dockbook->dock = NULL;
dockbook->item_factory = NULL;
dockbook->ui_manager = NULL;
gtk_notebook_popup_enable (GTK_NOTEBOOK (dockbook));
gtk_notebook_set_scrollable (GTK_NOTEBOOK (dockbook), TRUE);
@ -222,6 +223,12 @@ gimp_dockbook_finalize (GObject *object)
dockbook->item_factory = NULL;
}
if (dockbook->ui_manager)
{
g_object_unref (dockbook->ui_manager);
dockbook->ui_manager = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -321,6 +328,11 @@ gimp_dockbook_new (GimpMenuFactory *menu_factory)
dockbook,
FALSE);
dockbook->ui_manager = gimp_menu_factory_manager_new (menu_factory,
"<Dialogs>",
dockbook,
FALSE);
gimp_help_connect (GTK_WIDGET (dockbook), gimp_dockbook_help_func,
GIMP_HELP_DOCK, dockbook);

View File

@ -42,6 +42,7 @@ struct _GimpDockbook
GimpDock *dock;
GimpItemFactory *item_factory;
GimpUIManager *ui_manager;
};
struct _GimpDockbookClass

View File

@ -144,33 +144,22 @@ gimp_docked_get_preview (GimpDocked *docked,
}
GimpItemFactory *
gimp_docked_get_menu (GimpDocked *docked,
gpointer *item_factory_data)
gimp_docked_get_menu (GimpDocked *docked,
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_identifier)
{
GimpDockedInterface *docked_iface;
g_return_val_if_fail (GIMP_IS_DOCKED (docked), NULL);
g_return_val_if_fail (item_factory_data != NULL, NULL);
g_return_val_if_fail (popup_data != NULL, NULL);
g_return_val_if_fail (manager != NULL, NULL);
g_return_val_if_fail (ui_identifier != NULL, NULL);
docked_iface = GIMP_DOCKED_GET_INTERFACE (docked);
#if 0
g_print ("gimp_docked_get_menu: docked = %p\n"
"iface->set_aux_info = %p\n"
"iface->get_aux_info = %p\n"
"iface->get_preview = %p\n"
"iface->set_context = %p\n"
"iface->get_menu = %p\n\n",
docked,
docked_iface->set_aux_info,
docked_iface->get_aux_info,
docked_iface->get_preview,
docked_iface->set_context,
docked_iface->get_menu);
#endif
if (docked_iface->get_menu)
return docked_iface->get_menu (docked, item_factory_data);
return docked_iface->get_menu (docked, popup_data, manager, ui_identifier);
return NULL;
}

View File

@ -45,7 +45,9 @@ struct _GimpDockedInterface
GimpContext *context,
GtkIconSize size);
GimpItemFactory * (* get_menu) (GimpDocked *docked,
gpointer *item_factory_data);
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_identifier);
gchar * (* get_title) (GimpDocked *docked);
void (* set_context) (GimpDocked *docked,
@ -66,7 +68,9 @@ GtkWidget * gimp_docked_get_preview (GimpDocked *docked,
GimpContext *context,
GtkIconSize size);
GimpItemFactory * gimp_docked_get_menu (GimpDocked *docked,
gpointer *item_factory_data);
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_idenfier);
gchar * gimp_docked_get_title (GimpDocked *docked);
void gimp_docked_set_context (GimpDocked *docked,

View File

@ -48,7 +48,9 @@ static void gimp_editor_style_set (GtkWidget *widget,
GtkStyle *prev_style);
static GimpItemFactory * gimp_editor_get_menu (GimpDocked *docked,
gpointer *item_factory_data);
gpointer *popup_data,
GimpUIManager **manager,
const gchar **ui_identifier);
static GtkIconSize gimp_editor_ensure_button_box (GimpEditor *editor);
@ -135,11 +137,12 @@ gimp_editor_class_init (GimpEditorClass *klass)
static void
gimp_editor_init (GimpEditor *editor)
{
editor->menu_factory = NULL;
editor->item_factory = NULL;
editor->ui_manager = NULL;
editor->item_factory_data = NULL;
editor->button_box = NULL;
editor->menu_factory = NULL;
editor->item_factory = NULL;
editor->ui_manager = NULL;
editor->ui_identifier = NULL;
editor->popup_data = NULL;
editor->button_box = NULL;
}
static void
@ -165,6 +168,12 @@ gimp_editor_destroy (GtkObject *object)
editor->ui_manager = NULL;
}
if (editor->ui_identifier)
{
g_free (editor->ui_identifier);
editor->ui_identifier = NULL;
}
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
@ -187,12 +196,16 @@ gimp_editor_style_set (GtkWidget *widget,
}
static GimpItemFactory *
gimp_editor_get_menu (GimpDocked *docked,
gpointer *item_factory_data)
gimp_editor_get_menu (GimpDocked *docked,
gpointer *popup_data,
GimpUIManager **ui_manager,
const gchar **ui_identifier)
{
GimpEditor *editor = GIMP_EDITOR (docked);
*item_factory_data = editor->item_factory_data;
*ui_manager = editor->ui_manager;
*ui_identifier = editor->ui_identifier;
*popup_data = editor->popup_data;
return editor->item_factory;
}
@ -228,8 +241,6 @@ gimp_editor_create_menu (GimpEditor *editor,
GTK_TYPE_MENU,
callback_data,
FALSE);
editor->item_factory_data = callback_data;
if (editor->ui_manager)
g_object_unref (editor->ui_manager);
@ -237,6 +248,13 @@ gimp_editor_create_menu (GimpEditor *editor,
menu_identifier,
callback_data,
FALSE);
if (editor->ui_identifier)
g_free (editor->ui_identifier);
editor->ui_identifier = g_strdup (ui_identifier);
editor->popup_data = callback_data;
}
GtkWidget *

View File

@ -43,7 +43,8 @@ struct _GimpEditor
GimpMenuFactory *menu_factory;
GimpItemFactory *item_factory;
GimpUIManager *ui_manager;
gpointer item_factory_data;
gchar *ui_identifier;
gpointer popup_data;
GtkWidget *button_box;
};

View File

@ -60,6 +60,7 @@
#include "gimphelp-ids.h"
#include "gimpitemfactory.h"
#include "gimpmenufactory.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gimp-intl.h"
@ -304,10 +305,20 @@ gimp_error_console_button_press (GtkWidget *widget,
{
GimpEditor *editor = GIMP_EDITOR (console);
#if 0
gimp_ui_manager_update (editor->ui_manager,
editor->popup_data);
gimp_ui_manager_ui_popup (editor->ui_manager,
editor->ui_identifier,
editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#else
gimp_item_factory_popup_with_data (editor->item_factory,
editor->item_factory_data,
editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
return TRUE;
}

View File

@ -72,6 +72,7 @@
#include "gimpitemfactory.h"
#include "gimppreview.h"
#include "gimppreviewrenderergradient.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gui/color-notebook.h"
@ -711,10 +712,20 @@ preview_events (GtkWidget *widget,
{
GimpEditor *gimp_editor = GIMP_EDITOR (editor);
#if 0
gimp_ui_manager_update (gimp_editor->ui_manager,
gimp_editor->popup_data);
gimp_ui_manager_ui_pupup (gimp_editor->ui_manager,
gimp_editor->ui_identifier,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#else
gimp_item_factory_popup_with_data (gimp_editor->item_factory,
gimp_editor->item_factory_data,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
}
break;
@ -1151,10 +1162,20 @@ control_button_press (GimpGradientEditor *editor,
{
GimpEditor *gimp_editor = GIMP_EDITOR (editor);
#if 0
gimp_ui_manager_update (gimp_editor->ui_manager,
gimp_editor->popup_data);
gimp_ui_manager_ui_pupup (gimp_editor->ui_manager,
gimp_editor->ui_identifier,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#else
gimp_item_factory_popup_with_data (gimp_editor->item_factory,
gimp_editor->item_factory_data,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
return;
}

View File

@ -50,6 +50,7 @@
#include "gimplayertreeview.h"
#include "gimpmenufactory.h"
#include "gimppreviewrenderer.h"
#include "gimpuimanager.h"
#include "gimpvectorstreeview.h"
#include "gimpwidgets-utils.h"
@ -893,11 +894,24 @@ gimp_item_tree_view_context_item (GimpContainerView *view,
editor = GIMP_EDITOR (view);
#if 0
if (editor->ui_manager)
{
gimp_ui_manager_update (editor->ui_manager,
editor->popup_data);
gimp_ui_manager_ui_popup (editor->ui_manager,
editor->ui_identifier,
editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
}
#else
if (editor->item_factory)
gimp_item_factory_popup_with_data (editor->item_factory,
editor->item_factory_data,
editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
}
static gboolean

View File

@ -100,6 +100,7 @@ gimp_menu_factory_finalize (GObject *object)
for (list = factory->registered_menus; list; list = g_list_next (list))
{
GimpMenuFactoryEntry *entry = list->data;
GList *uis;
g_free (entry->identifier);
g_free (entry->title);
@ -108,6 +109,17 @@ gimp_menu_factory_finalize (GObject *object)
g_list_foreach (entry->action_groups, (GFunc) g_free, NULL);
g_list_free (entry->action_groups);
for (uis = entry->managed_uis; uis; uis = g_list_next (uis))
{
GimpUIManagerUIEntry *ui_entry = uis->data;
g_free (ui_entry->identifier);
g_free (ui_entry->basename);
g_free (ui_entry);
}
g_list_free (entry->managed_uis);
g_free (entry);
}
@ -262,6 +274,8 @@ gimp_menu_factory_manager_register (GimpMenuFactory *factory,
ui_entry->identifier = g_strdup (ui_identifier);
ui_entry->basename = g_strdup (ui_basename);
ui_entry->merge_id = 0;
ui_entry->widget = NULL;
entry->managed_uis = g_list_prepend (entry->managed_uis,
ui_entry);

View File

@ -47,6 +47,7 @@
#include "gimppaletteeditor.h"
#include "gimppreview.h"
#include "gimpsessioninfo.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gui/color-notebook.h"
@ -585,10 +586,20 @@ palette_editor_eventbox_button_press (GtkWidget *widget,
{
GimpEditor *gimp_editor = GIMP_EDITOR (editor);
#if 0
gimp_ui_manager_update (gimp_editor->ui_manager,
gimp_editor->popup_data);
gimp_ui_manager_ui_popup (gimp_editor->ui_manager,
gimp_editor->ui_identifier,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#else
gimp_item_factory_popup_with_data (gimp_editor->item_factory,
gimp_editor->item_factory_data,
gimp_editor->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
#endif
}
return TRUE;

View File

@ -42,6 +42,7 @@
#include "gimppreviewrenderer.h"
#include "gimppropwidgets.h"
#include "gimptooloptionseditor.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gimp-intl.h"
@ -317,15 +318,25 @@ gimp_tool_options_editor_menu_popup (GimpToolOptionsEditor *editor,
GtkWidget *button,
const gchar *path)
{
GtkItemFactory *item_factory;
GtkWidget *menu;
GimpEditor *gimp_editor = GIMP_EDITOR (editor);
GtkWidget *menu;
item_factory = GTK_ITEM_FACTORY (GIMP_EDITOR (editor)->item_factory);
#if 0
gimp_ui_manager_update (gimp_editor->ui_manager,
gimp_editor->popup_data);
gimp_ui_manager_ui_popup (gimp_editor->ui_manager,
gimp_editor->ui_identifier,
gimp_editor->popup_data,
GTK_WIDGET (button),
foo, foo, foo);
#else
gimp_item_factory_update (gimp_editor->item_factory,
gimp_editor->popup_data);
#endif
gimp_item_factory_update (GIMP_EDITOR (editor)->item_factory,
GIMP_EDITOR (editor)->item_factory_data);
menu = gtk_item_factory_get_widget (item_factory, path);
menu =
gtk_item_factory_get_widget (GTK_ITEM_FACTORY (gimp_editor->item_factory),
path);
if (menu)
gtk_menu_popup (GTK_MENU (menu), NULL, NULL,

View File

@ -124,6 +124,10 @@ gimp_ui_manager_finalize (GObject *object)
g_free (entry->identifier);
g_free (entry->basename);
if (entry->widget)
g_object_unref (entry->widget);
g_free (entry);
}
@ -224,10 +228,11 @@ gimp_ui_manager_ui_register (GimpUIManager *manager,
entry->identifier = g_strdup (identifier);
entry->basename = g_strdup (basename);
entry->merge_id = 0;
entry->widget = NULL;
manager->registered_uis = g_list_prepend (manager->registered_uis, entry);
#if 0
{
gchar *filename;
GError *error = NULL;
@ -250,12 +255,11 @@ gimp_ui_manager_ui_register (GimpUIManager *manager,
g_clear_error (&error);
}
}
#endif
}
GtkWidget *
gimp_ui_manager_ui_create (GimpUIManager *manager,
const gchar *identifier)
gimp_ui_manager_ui_get (GimpUIManager *manager,
const gchar *identifier)
{
GList *list;
@ -294,8 +298,17 @@ gimp_ui_manager_ui_create (GimpUIManager *manager,
}
}
return gtk_ui_manager_get_widget (GTK_UI_MANAGER (manager),
entry->identifier);
if (! entry->widget)
{
entry->widget =
gtk_ui_manager_get_widget (GTK_UI_MANAGER (manager),
entry->identifier);
if (entry->widget)
g_object_ref (entry->widget);
}
return entry->widget;
}
}
@ -304,3 +317,157 @@ gimp_ui_manager_ui_create (GimpUIManager *manager,
return NULL;
}
static void
gimp_ui_manager_menu_position (GtkMenu *menu,
gint *x,
gint *y,
gpointer data)
{
GdkScreen *screen;
GtkRequisition requisition;
GdkRectangle rect;
gint monitor;
gint pointer_x;
gint pointer_y;
g_return_if_fail (GTK_IS_MENU (menu));
g_return_if_fail (x != NULL);
g_return_if_fail (y != NULL);
g_return_if_fail (GTK_IS_WIDGET (data));
gdk_display_get_pointer (gtk_widget_get_display (GTK_WIDGET (data)),
&screen, &pointer_x, &pointer_y, NULL);
monitor = gdk_screen_get_monitor_at_point (screen, pointer_x, pointer_y);
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
gtk_menu_set_screen (menu, screen);
gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
if (gtk_widget_get_direction (GTK_WIDGET (menu)) == GTK_TEXT_DIR_RTL)
{
*x = pointer_x - 2 - requisition.width;
if (*x < rect.x)
*x = pointer_x + 2;
}
else
{
*x = pointer_x + 2;
if (*x + requisition.width > rect.x + rect.width)
*x = pointer_x - 2 - requisition.width;
}
*y = pointer_y + 2;
if (*y + requisition.height > rect.y + rect.height)
*y = pointer_y - 2 - requisition.height;
if (*x < rect.x) *x = rect.x;
if (*y < rect.y) *y = rect.y;
}
typedef struct
{
guint x;
guint y;
} MenuPos;
static void
gimp_ui_manager_menu_pos (GtkMenu *menu,
gint *x,
gint *y,
gboolean *push_in,
gpointer data)
{
MenuPos *menu_pos = data;
*x = menu_pos->x;
*y = menu_pos->y;
}
static void
gimp_ui_manager_delete_popup_data (GtkObject *object,
GimpUIManager *manager)
{
g_signal_handlers_disconnect_by_func (object,
gimp_ui_manager_delete_popup_data,
manager);
g_object_set_data (G_OBJECT (manager), "popup-data", NULL);
}
void
gimp_ui_manager_ui_popup (GimpUIManager *manager,
const gchar *ui_path,
gpointer popup_data,
GtkWidget *parent,
GimpMenuPositionFunc position_func,
gpointer position_data,
GtkDestroyNotify popdown_func)
{
GtkWidget *widget;
GdkEvent *current_event;
gint x, y;
guint button;
guint32 activate_time;
MenuPos *menu_pos;
g_return_if_fail (GIMP_IS_UI_MANAGER (manager));
g_return_if_fail (ui_path != NULL);
g_return_if_fail (parent == NULL || GTK_IS_WIDGET (parent));
widget = gimp_ui_manager_ui_get (manager, ui_path);
g_return_if_fail (GTK_IS_MENU (widget));
if (! position_func)
{
position_func = gimp_ui_manager_menu_position;
position_data = parent;
}
(* position_func) (GTK_MENU (widget), &x, &y, position_data);
current_event = gtk_get_current_event ();
if (current_event && current_event->type == GDK_BUTTON_PRESS)
{
GdkEventButton *bevent = (GdkEventButton *) current_event;
button = bevent->button;
activate_time = bevent->time;
}
else
{
button = 0;
activate_time = 0;
}
menu_pos = g_object_get_data (G_OBJECT (widget), "menu-pos");
if (! menu_pos)
{
menu_pos = g_new0 (MenuPos, 1);
g_object_set_data_full (G_OBJECT (widget), "menu-pos", menu_pos, g_free);
}
menu_pos->x = x;
menu_pos->y = y;
if (popup_data != NULL)
{
g_object_set_data_full (G_OBJECT (manager), "popup-data",
popup_data, popdown_func);
g_signal_connect (widget, "selection-done",
G_CALLBACK (gimp_ui_manager_delete_popup_data),
manager);
}
gtk_menu_popup (GTK_MENU (widget),
NULL, NULL,
gimp_ui_manager_menu_pos, menu_pos,
button, activate_time);
}

View File

@ -29,9 +29,10 @@ typedef struct _GimpUIManagerUIEntry GimpUIManagerUIEntry;
struct _GimpUIManagerUIEntry
{
gchar *identifier;
gchar *basename;
guint merge_id;
gchar *identifier;
gchar *basename;
guint merge_id;
GtkWidget *widget;
};
@ -68,8 +69,16 @@ void gimp_ui_manager_update (GimpUIManager *manager,
void gimp_ui_manager_ui_register (GimpUIManager *manager,
const gchar *identifier,
const gchar *basename);
GtkWidget * gimp_ui_manager_ui_create (GimpUIManager *manager,
GtkWidget * gimp_ui_manager_ui_get (GimpUIManager *manager,
const gchar *identifier);
void gimp_ui_manager_ui_popup (GimpUIManager *manager,
const gchar *ui_path,
gpointer popup_data,
GtkWidget *parent,
GimpMenuPositionFunc position_func,
gpointer position_data,
GtkDestroyNotify popdown_func);
#endif /* __GIMP_UI_MANAGER_H__ */