app, libgimp, plug-ins: a lot of cleanup in GimpResourceSelect* code.

- Removing useless or redundant code.
- Simplifying various logics.
- Using GimpResource directly in temporary PDB procedures, not resource names.
- Better cleanup of the core resource chooser when the plug-in dialog quits (we
  need it to ask core to close also any visible resource chooser dialog).
- Replace the "Close" button by more common OK/Cancel. In particular, the
  GimpPdbDialog now properly keeps track of the initial object and when hitting
  "Cancel" (or Escape key), this initial object is set back.
- Clean up some of the comments, especially when the code is self explanatory.

There is still much more to clean and improve, but it's a first welcome step.
This commit is contained in:
Jehan 2023-08-16 23:53:33 +02:00
parent 19a005ad0f
commit b578fd8cf1
13 changed files with 160 additions and 336 deletions

View File

@ -278,7 +278,7 @@ gimp_brush_select_run_callback (GimpPdbDialog *dialog,
dialog->caller_context,
NULL, error,
dialog->callback_name,
G_TYPE_STRING, gimp_object_get_name (object),
GIMP_TYPE_RESOURCE, object,
G_TYPE_DOUBLE, gimp_context_get_opacity (dialog->context) * 100.0,
G_TYPE_INT, GIMP_BRUSH_SELECT (dialog)->spacing,
GIMP_TYPE_LAYER_MODE, gimp_context_get_paint_mode (dialog->context),

View File

@ -106,7 +106,7 @@ gimp_font_select_run_callback (GimpPdbDialog *dialog,
dialog->caller_context,
NULL, error,
dialog->callback_name,
G_TYPE_STRING, gimp_object_get_name (object),
G_TYPE_BOOLEAN, closing,
GIMP_TYPE_RESOURCE, object,
G_TYPE_BOOLEAN, closing,
G_TYPE_NONE);
}

View File

@ -183,7 +183,7 @@ gimp_gradient_select_run_callback (GimpPdbDialog *dialog,
dialog->caller_context,
NULL, error,
dialog->callback_name,
G_TYPE_STRING, gimp_object_get_name (object),
GIMP_TYPE_RESOURCE, object,
G_TYPE_INT, array->length / sizeof (gdouble),
GIMP_TYPE_FLOAT_ARRAY, array->data,
G_TYPE_BOOLEAN, closing,

View File

@ -109,8 +109,8 @@ gimp_palette_select_run_callback (GimpPdbDialog *dialog,
dialog->caller_context,
NULL, error,
dialog->callback_name,
G_TYPE_STRING, gimp_object_get_name (object),
G_TYPE_INT, gimp_palette_get_n_colors (palette),
G_TYPE_BOOLEAN, closing,
GIMP_TYPE_RESOURCE, object,
G_TYPE_INT, gimp_palette_get_n_colors (palette),
G_TYPE_BOOLEAN, closing,
G_TYPE_NONE);
}

View File

@ -124,7 +124,7 @@ gimp_pattern_select_run_callback (GimpPdbDialog *dialog,
dialog->caller_context,
NULL, error,
dialog->callback_name,
G_TYPE_STRING, gimp_object_get_name (object),
GIMP_TYPE_RESOURCE, object,
G_TYPE_INT, gimp_temp_buf_get_width (pattern->mask),
G_TYPE_INT, gimp_temp_buf_get_height (pattern->mask),
G_TYPE_INT, babl_format_get_bytes_per_pixel (gimp_temp_buf_get_format (pattern->mask)),

View File

@ -138,7 +138,9 @@ static void
gimp_pdb_dialog_init (GimpPdbDialog *dialog)
{
gtk_dialog_add_button (GTK_DIALOG (dialog),
_("_Close"), GTK_RESPONSE_CLOSE);
_("_OK"), GTK_RESPONSE_OK);
gtk_dialog_add_button (GTK_DIALOG (dialog),
_("_Cancel"), GTK_RESPONSE_CANCEL);
}
static void
@ -163,8 +165,6 @@ gimp_pdb_dialog_constructed (GObject *object)
gimp_context_set_by_type (dialog->context, dialog->select_type,
dialog->initial_object);
dialog->initial_object = NULL;
signal_name = gimp_context_type_to_signal_name (dialog->select_type);
g_signal_connect_object (dialog->context, signal_name,
@ -187,6 +187,7 @@ gimp_pdb_dialog_dispose (GObject *object)
g_clear_object (&dialog->pdb);
g_clear_object (&dialog->caller_context);
g_clear_object (&dialog->context);
g_clear_object (&dialog->initial_object);
g_clear_pointer (&dialog->callback_name, g_free);
@ -218,8 +219,7 @@ gimp_pdb_dialog_set_property (GObject *object,
break;
case PROP_INITIAL_OBJECT:
/* don't ref, see constructor */
dialog->initial_object = g_value_get_object (value);
dialog->initial_object = g_value_dup_object (value);
break;
case PROP_CALLBACK_NAME:
@ -244,9 +244,12 @@ gimp_pdb_dialog_response (GtkDialog *gtk_dialog,
{
GimpPdbDialog *dialog = GIMP_PDB_DIALOG (gtk_dialog);
if (response_id != GTK_RESPONSE_OK)
gimp_context_set_by_type (dialog->context, dialog->select_type,
dialog->initial_object);
gimp_pdb_dialog_run_callback (&dialog, TRUE);
if (dialog)
gtk_widget_destroy (GTK_WIDGET (dialog));
gtk_widget_destroy (GTK_WIDGET (dialog));
}
void

View File

@ -814,7 +814,6 @@ EXPORTS
gimp_resource_is_pattern
gimp_resource_is_valid
gimp_resource_rename
gimp_resource_select_destroy
gimp_resource_select_new
gimp_resource_select_set
gimp_save_procedure_get_support_comment

View File

@ -20,27 +20,9 @@
#include "gimp.h"
/* Data bounced back and forth to/from core and libgimp,
* and here from the temp PDB procedure to the idle func.
* But it is opaque to core, passed and returned unaltered.
*
* Not all fields are meaningful in each direction or transfer.
* !!! We don't pass resource to core in this struct,
* only from the temp callback to the idle func.
*
* Lifetime is as long as the remote dialog is open.
* Closing the chooser dialog frees the adaption struct.
*/
typedef struct
{
/* This portion is passed to and from idle. */
guint idle_id;
gint resource_id;
GType resource_type;
gboolean closing;
/* This portion is passed to and from core, and to idle. */
gchar *temp_PDB_callback_name;
GType resource_type;
GimpResourceChoosedCallback callback;
gpointer owner_data;
GDestroyNotify data_destroy;
@ -49,12 +31,12 @@ typedef struct
/* local */
static void gimp_resource_data_free (GimpResourceAdaption *adaption);
static void gimp_resource_data_free (GimpResourceAdaption *adaption);
static GimpValueArray * gimp_temp_resource_run (GimpProcedure *procedure,
GimpProcedureConfig *config,
gpointer run_data);
static gboolean gimp_temp_resource_idle (GimpResourceAdaption *adaption);
static GimpValueArray * gimp_temp_resource_run (GimpProcedure *procedure,
GimpProcedureConfig *config,
gpointer run_data);
static gboolean gimp_resource_select_remove_after_run (const gchar *procedure_name);
/* public */
@ -131,11 +113,10 @@ static void
create_callback_PDB_procedure_params (GimpProcedure *procedure,
GType resource_type)
{
GIMP_PROC_ARG_STRING (procedure, "resource-name",
"Resource name",
"The resource name",
NULL,
G_PARAM_READWRITE);
GIMP_PROC_ARG_RESOURCE (procedure, "resource",
"Resource",
"The resource",
G_PARAM_READWRITE);
/* Create args for the extra, superfluous args that core is passing.*/
if (g_type_is_a (resource_type, GIMP_TYPE_FONT))
@ -247,7 +228,7 @@ static gboolean
popup_remote_chooser (const gchar *title,
GBytes *parent_handle,
GimpResource *resource,
gchar *temp_PDB_callback_name,
const gchar *temp_PDB_callback_name,
GType resource_type)
{
gboolean result = FALSE;
@ -284,52 +265,19 @@ popup_remote_chooser (const gchar *title,
return result;
}
/*Does nothing, quietly, when the remote dialog is not open. */
static void
close_remote_chooser (gchar *temp_PDB_callback_name,
GType resource_type)
{
if (g_type_is_a (resource_type, GIMP_TYPE_FONT))
{
gimp_fonts_close_popup (temp_PDB_callback_name);
}
else if (g_type_is_a (resource_type, GIMP_TYPE_GRADIENT))
{
gimp_gradients_close_popup (temp_PDB_callback_name);
}
else if (g_type_is_a (resource_type, GIMP_TYPE_BRUSH))
{
gimp_brushes_close_popup (temp_PDB_callback_name);
}
else if (g_type_is_a (resource_type, GIMP_TYPE_PALETTE))
{
gimp_palettes_close_popup (temp_PDB_callback_name);
}
else if (g_type_is_a (resource_type, GIMP_TYPE_PATTERN))
{
gimp_patterns_close_popup (temp_PDB_callback_name);
}
else
{
g_warning ("%s: unhandled resource type", G_STRFUNC);
}
}
/**
* gimp_resource_select_new:
* @title: Title of the resource selection dialog.
* @resource: The resource to set as the initial choice.
* @resource_type: The type of the subclass of resource.
* @callback: (scope notified): The callback function to call when a user chooses a resource.
* @title: Title of the resource selection dialog.
* @resource: The resource to set as the initial choice.
* @resource_type: The type of the subclass of [class@Resource].
* @callback: (scope notified): The callback function to call when the user chooses a resource.
* @owner_data: (closure callback): The run_data given to @callback.
* @data_destroy: (destroy owner_data): The destroy function for @owner_data.
*
* Invoke a resource chooser dialog which may call @callback with the chosen
* resource and owner's @data.
* @resource and @owner_data.
*
* A proxy to a remote dialog in core, which knows the model i.e. installed resources.
*
* Generic on type of #GimpResource subclass passed in @resource_type.
* A proxy to a remote dialog in core, which knows the installed resources.
*
* Returns: (transfer none): the name of a temporary PDB procedure. The
* string belongs to the resource selection dialog and will be
@ -349,23 +297,18 @@ gimp_resource_select_new (const gchar *title,
gchar *temp_PDB_callback_name;
GimpResourceAdaption *adaption;
g_debug ("%s", G_STRFUNC);
g_return_val_if_fail (resource != NULL, NULL);
g_return_val_if_fail (callback != NULL, NULL);
g_return_val_if_fail (resource_type != 0, NULL);
g_return_val_if_fail (g_type_is_a (resource_type, GIMP_TYPE_RESOURCE), NULL);
temp_PDB_callback_name = gimp_pdb_temp_procedure_name (gimp_get_pdb ());
adaption = g_slice_new0 (GimpResourceAdaption);
adaption->temp_PDB_callback_name = temp_PDB_callback_name;
adaption->callback = callback;
adaption->owner_data = owner_data;
adaption->data_destroy = data_destroy;
adaption->resource_type = resource_type;
/* !!! Only part of the adaption has been initialized. */
adaption->callback = callback;
adaption->owner_data = owner_data;
adaption->data_destroy = data_destroy;
adaption->resource_type = resource_type;
procedure = gimp_procedure_new (plug_in,
temp_PDB_callback_name,
@ -378,13 +321,14 @@ gimp_resource_select_new (const gchar *title,
gimp_plug_in_add_temp_procedure (plug_in, procedure);
g_object_unref (procedure);
g_free (temp_PDB_callback_name);
if (popup_remote_chooser (title, parent_handle, resource, temp_PDB_callback_name, resource_type))
if (popup_remote_chooser (title, parent_handle, resource, gimp_procedure_get_name (procedure), resource_type))
{
/* Allow callbacks to be watched */
gimp_plug_in_extension_enable (plug_in);
return temp_PDB_callback_name;
return gimp_procedure_get_name (procedure);
}
else
{
@ -395,78 +339,42 @@ gimp_resource_select_new (const gchar *title,
}
void
gimp_resource_select_destroy (const gchar *temp_PDB_callback_name)
{
GimpPlugIn *plug_in = gimp_get_plug_in ();
g_return_if_fail (temp_PDB_callback_name != NULL);
gimp_plug_in_remove_temp_procedure (plug_in, temp_PDB_callback_name);
}
/* Set currently selected resource in remote chooser.
/* gimp_resource_select_set:
* @callback_name: a callback name as returned by [func@resource_select_new].
* @resource: a [class@Resource] of type @resource_type.
*
* Calls a PDB procedure.
*
* Note core is still using string name of resource,
* so pdb/groups/<foo>_select.pdb, <foo>_set_popup must have type string.
* Set currently selected resource in remote chooser.
*/
void
gimp_resource_select_set (const gchar *temp_pdb_callback,
GimpResource *resource,
GType resource_type)
gimp_resource_select_set (const gchar *callback_name,
GimpResource *resource)
{
GType resource_type;
g_return_if_fail (resource != NULL);
resource_type = G_TYPE_FROM_INSTANCE (resource);
g_return_if_fail (g_type_is_a (resource_type, GIMP_TYPE_RESOURCE));
if (g_type_is_a (resource_type, GIMP_TYPE_FONT))
{
gimp_fonts_set_popup (temp_pdb_callback, GIMP_FONT (resource));
}
gimp_fonts_set_popup (callback_name, GIMP_FONT (resource));
else if (g_type_is_a (resource_type, GIMP_TYPE_GRADIENT))
{
gimp_gradients_set_popup (temp_pdb_callback, GIMP_GRADIENT (resource));
}
gimp_gradients_set_popup (callback_name, GIMP_GRADIENT (resource));
else if (g_type_is_a (resource_type, GIMP_TYPE_BRUSH))
{
gimp_brushes_set_popup (temp_pdb_callback, GIMP_BRUSH (resource));
}
gimp_brushes_set_popup (callback_name, GIMP_BRUSH (resource));
else if (g_type_is_a (resource_type, GIMP_TYPE_PALETTE))
{
gimp_palettes_set_popup (temp_pdb_callback, GIMP_PALETTE (resource));
}
gimp_palettes_set_popup (callback_name, GIMP_PALETTE (resource));
else if (g_type_is_a (resource_type, GIMP_TYPE_PATTERN))
{
gimp_patterns_set_popup (temp_pdb_callback, GIMP_PATTERN (resource));
}
gimp_patterns_set_popup (callback_name, GIMP_PATTERN (resource));
else
{
g_warning ("%s: unhandled resource type", G_STRFUNC);
}
g_return_if_reached ();
}
/* private functions */
/* Free a GimpResourceAdaption struct.
* A GimpResourceAdaption and this func are passed to a GimpProcedure
* and this func is called back when the procedure is removed.
*
* This can be called for the exception: failed to open remote dialog.
*
* Each allocated field must be safely freed (not assuming it is valid pointer.)
*/
static void
gimp_resource_data_free (GimpResourceAdaption *adaption)
{
if (adaption->idle_id)
g_source_remove (adaption->idle_id);
if (adaption->temp_PDB_callback_name)
{
close_remote_chooser (adaption->temp_PDB_callback_name,
adaption->resource_type);
g_free (adaption->temp_PDB_callback_name);
}
if (adaption->data_destroy)
adaption->data_destroy (adaption->owner_data);
@ -482,48 +390,33 @@ gimp_temp_resource_run (GimpProcedure *procedure,
gpointer run_data)
{
GimpResourceAdaption *adaption = run_data;
gchar *resource_name;
GimpResource *resource;
gboolean closing;
g_object_get (config,
"resource-name", &resource_name,
"closing", &adaption->closing,
"resource", &resource,
"closing", &closing,
NULL);
resource = gimp_resource_get_by_name (adaption->resource_type,
resource_name);
if (adaption->callback)
adaption->callback (resource, closing,
adaption->owner_data);
adaption->resource_id = gimp_resource_get_id (resource);
if (closing)
g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
(GSourceFunc) gimp_resource_select_remove_after_run,
g_strdup (gimp_procedure_get_name (procedure)),
g_free);
if (! adaption->idle_id)
adaption->idle_id = g_idle_add ((GSourceFunc) gimp_temp_resource_idle,
adaption);
g_free (resource_name);
g_object_unref (resource);
return gimp_procedure_new_return_values (procedure, GIMP_PDB_SUCCESS, NULL);
}
static gboolean
gimp_temp_resource_idle (GimpResourceAdaption *adaption)
gimp_resource_select_remove_after_run (const gchar *procedure_name)
{
adaption->idle_id = 0;
if (adaption->callback)
adaption->callback (gimp_resource_get_by_id (adaption->resource_id),
adaption->closing,
adaption->owner_data);
adaption->resource_id = 0;
if (adaption->closing)
{
gchar *temp_PDB_callback_name = adaption->temp_PDB_callback_name;
adaption->temp_PDB_callback_name = NULL;
gimp_resource_select_destroy (temp_PDB_callback_name);
g_free (temp_PDB_callback_name);
}
gimp_plug_in_remove_temp_procedure (gimp_get_plug_in (), procedure_name);
return G_SOURCE_REMOVE;
}

View File

@ -45,11 +45,8 @@ const gchar * gimp_resource_select_new (const gchar *title
gpointer owner_data,
GDestroyNotify data_destroy);
void gimp_resource_select_destroy (const gchar *temp_pdb_callback);
void gimp_resource_select_set (const gchar *temp_pdb_callback,
GimpResource *resource,
GType resource_type);
void gimp_resource_select_set (const gchar *callback_name,
GimpResource *resource);
G_END_DECLS

View File

@ -94,44 +94,42 @@ typedef struct
{
GimpResource *resource;
gchar *title;
const gchar *temp_callback_from_remote_dialog;
gchar *callback;
GtkWidget *interior_widget;
} GimpResourceSelectButtonPrivate;
/* local function prototypes */
static void gimp_resource_select_button_dispose (GObject *object);
static void gimp_resource_select_button_finalize (GObject *object);
static void gimp_resource_select_button_dispose (GObject *object);
static void gimp_resource_select_button_finalize (GObject *object);
static void gimp_resource_select_button_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_resource_select_button_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static void gimp_resource_select_button_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_resource_select_button_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static void gimp_resource_select_button_clicked (GimpResourceSelectButton *self);
static void gimp_resource_select_button_clicked (GimpResourceSelectButton *self);
static void gimp_resource_select_button_callback (GimpResource *resource,
gboolean dialog_closing,
gpointer user_data);
static void gimp_resource_select_button_callback (GimpResource *resource,
gboolean dialog_closing,
gpointer user_data);
static void gimp_resource_select_drag_data_received (GimpResourceSelectButton *self,
GdkDragContext *context,
gint x,
gint y,
GtkSelectionData *selection,
guint info,
guint time);
static void gimp_resource_select_drag_data_received (GimpResourceSelectButton *self,
GdkDragContext *context,
gint x,
gint y,
GtkSelectionData *selection,
guint info,
guint time);
static void gimp_resource_select_button_set_remote_dialog (GimpResourceSelectButton *self,
GimpResource *resource);
static void gimp_resource_select_button_draw_interior (GimpResourceSelectButton *self,
GimpResource *resource);
static guint resource_button_signals[LAST_SIGNAL] = { 0 };
static GParamSpec *resource_button_props[N_PROPS] = { NULL, };
@ -157,7 +155,7 @@ gimp_resource_select_button_class_init (GimpResourceSelectButtonClass *klass)
*
* The title to be used for the resource selection popup dialog.
*
* Since: 2.4
* Since: 3.0
*/
resource_button_props[PROP_TITLE] =
g_param_spec_string ("title",
@ -172,7 +170,7 @@ gimp_resource_select_button_class_init (GimpResourceSelectButtonClass *klass)
*
* The currently selected resource.
*
* Since: 2.4
* Since: 3.0
*/
resource_button_props[PROP_RESOURCE] =
gimp_param_spec_resource ("resource",
@ -192,7 +190,7 @@ gimp_resource_select_button_class_init (GimpResourceSelectButtonClass *klass)
*
* The ::resource-set signal is emitted when the user selects a resource.
*
* Since: 2.4
* Since: 3.0
*/
resource_button_signals[RESOURCE_SET] =
g_signal_new ("resource-set",
@ -217,7 +215,32 @@ gimp_resource_select_button_init (GimpResourceSelectButton *self)
static void
gimp_resource_select_button_dispose (GObject *self)
{
gimp_resource_select_button_close_popup (GIMP_RESOURCE_SELECT_BUTTON (self));
GimpResourceSelectButtonPrivate *priv;
GimpResourceSelectButtonClass *klass;
priv = gimp_resource_select_button_get_instance_private (GIMP_RESOURCE_SELECT_BUTTON (self));
klass = GIMP_RESOURCE_SELECT_BUTTON_GET_CLASS (self);
if (priv->callback)
{
GType resource_type = klass->resource_type;
if (resource_type == GIMP_TYPE_FONT)
gimp_fonts_close_popup (priv->callback);
else if (resource_type == GIMP_TYPE_GRADIENT)
gimp_gradients_close_popup (priv->callback);
else if (resource_type == GIMP_TYPE_BRUSH)
gimp_brushes_close_popup (priv->callback);
else if (resource_type == GIMP_TYPE_PALETTE)
gimp_palettes_close_popup (priv->callback);
else if (resource_type == GIMP_TYPE_PATTERN)
gimp_patterns_close_popup (priv->callback);
else
g_warning ("%s: unhandled resource type", G_STRFUNC);
gimp_plug_in_remove_temp_procedure (gimp_get_plug_in (), priv->callback);
g_clear_pointer (&priv->callback, g_free);
}
G_OBJECT_CLASS (gimp_resource_select_button_parent_class)->dispose (self);
}
@ -235,10 +258,10 @@ gimp_resource_select_button_finalize (GObject *object)
/**
* gimp_resource_select_button_set_drag_target:
* @self: A #GimpResourceSelectButton
* @self: A [class@ResourceSelectButton]
* @drag_region_widget: An interior widget to be a droppable region
* and emit "drag-data-received" signal
* @drag_target: The drag target to accept
* @drag_target: The drag target to accept
*
* Called by a subclass init to specialize the instance.
*
@ -272,7 +295,7 @@ gimp_resource_select_button_set_drag_target (GimpResourceSelectButton *self,
/**
* gimp_resource_select_button_set_clickable:
* @self: A #GimpResourceSelectButton
* @self: A [class@ResourceSelectButton]
* @widget: An interior widget that emits "clicked" signal
*
* Called by a subclass init to specialize the instance.
@ -304,9 +327,8 @@ gimp_resource_select_button_set_clickable (GimpResourceSelectButton *self,
* Gets the currently selected resource.
*
* Returns: (transfer none): an internal copy of the resource which must not be freed.
* You should ref and unref it when you want to own the resource.
*
* Since: 2.4
* Since: 3.0
*/
GimpResource *
gimp_resource_select_button_get_resource (GimpResourceSelectButton *self)
@ -328,7 +350,7 @@ gimp_resource_select_button_get_resource (GimpResourceSelectButton *self)
* Sets the currently selected resource.
* This will select the resource in both the button and any chooser popup.
*
* Since: 2.4
* Since: 3.0
*/
void
gimp_resource_select_button_set_resource (GimpResourceSelectButton *self,
@ -341,7 +363,7 @@ gimp_resource_select_button_set_resource (GimpResourceSelectButton *self,
priv = gimp_resource_select_button_get_instance_private (self);
if (priv->temp_callback_from_remote_dialog)
if (priv->callback)
{
/* A popup chooser dialog is already shown.
* Call its setter to change the selection there
@ -358,31 +380,6 @@ gimp_resource_select_button_set_resource (GimpResourceSelectButton *self,
}
/* Calls the virtual method of a similar name, which subclasses must override.
*
* resource: The instance to be drawn.
*
* A subclass knows how to draw its interior.
* Called by super when the view is invalidated (needs to be redrawn.)
* Not public.
*/
static void
gimp_resource_select_button_draw_interior (GimpResourceSelectButton *self,
GimpResource *resource)
{
GimpResourceSelectButtonClass *klass;
g_return_if_fail (GIMP_IS_RESOURCE_SELECT_BUTTON (self));
g_return_if_fail (GIMP_IS_RESOURCE (resource));
klass = GIMP_RESOURCE_SELECT_BUTTON_GET_CLASS (self);
g_return_if_fail (klass->draw_interior != NULL);
klass->draw_interior (self);
}
/* private functions */
static void
@ -395,19 +392,13 @@ gimp_resource_select_button_set_remote_dialog (GimpResourceSelectButton *self,
g_return_if_fail (GIMP_IS_RESOURCE_SELECT_BUTTON (self));
g_return_if_fail (resource != NULL);
priv = gimp_resource_select_button_get_instance_private (self);
priv = gimp_resource_select_button_get_instance_private (self);
klass = GIMP_RESOURCE_SELECT_BUTTON_GET_CLASS (self);
g_return_if_fail (klass->resource_type != G_TYPE_INVALID);
g_return_if_fail (klass->resource_type == G_TYPE_FROM_INSTANCE (resource));
/* The ultimate remote setter is e.g. gimp_fonts_set_popup, a PDB procedure.
*
* !!! Use the passed resource, not priv->resource.
* Expect a callback which will change priv->resource.
*/
gimp_resource_select_set (priv->temp_callback_from_remote_dialog,
resource,
klass->resource_type);
gimp_resource_select_set (priv->callback, resource);
}
static void
@ -479,18 +470,13 @@ gimp_resource_select_button_callback (GimpResource *resource,
priv->resource = resource;
/* Feedback user choice of resource into the look of the widget interior.
* Call virtual method overridden by subclass.
*/
gimp_resource_select_button_draw_interior (self, priv->resource);
GIMP_RESOURCE_SELECT_BUTTON_GET_CLASS (self)->draw_interior (self);
if (dialog_closing)
priv->temp_callback_from_remote_dialog = NULL;
g_clear_pointer (&priv->callback, g_free);
g_signal_emit (self, resource_button_signals[RESOURCE_SET], 0,
resource, dialog_closing);
g_object_notify_by_pspec (G_OBJECT (self),
resource_button_props[PROP_RESOURCE]);
g_signal_emit (self, resource_button_signals[RESOURCE_SET], 0, resource, dialog_closing);
g_object_notify_by_pspec (G_OBJECT (self), resource_button_props[PROP_RESOURCE]);
}
static void
@ -499,7 +485,7 @@ gimp_resource_select_button_clicked (GimpResourceSelectButton *self)
GimpResourceSelectButtonPrivate *priv = gimp_resource_select_button_get_instance_private (self);
GimpResourceSelectButtonClass *klass = GIMP_RESOURCE_SELECT_BUTTON_GET_CLASS (self);
if (priv->temp_callback_from_remote_dialog)
if (priv->callback)
{
/* Popup already created. Calling setter raises the popup. */
gimp_resource_select_button_set_remote_dialog (self, priv->resource);
@ -512,15 +498,14 @@ gimp_resource_select_button_clicked (GimpResourceSelectButton *self)
if (GIMP_IS_DIALOG (toplevel))
handle = gimp_dialog_get_native_handle (GIMP_DIALOG (toplevel));
/* Call GimpResourceSelect which dispatches on resource_type. */
priv->temp_callback_from_remote_dialog =
gimp_resource_select_new (priv->title,
handle,
priv->resource,
klass->resource_type,
gimp_resource_select_button_callback,
self,
NULL); /* No func to free data. */
priv->callback = g_strdup (gimp_resource_select_new (priv->title,
handle,
priv->resource,
klass->resource_type,
gimp_resource_select_button_callback,
self,
NULL));
gimp_resource_select_button_set_remote_dialog (self, priv->resource);
}
}
@ -575,33 +560,3 @@ gimp_resource_select_drag_data_received (GimpResourceSelectButton *self,
g_free (str);
}
/**
* gimp_resource_select_button_close_popup:
* @self: A #GimpResourceSelectButton
*
* Closes the popup resource chooser dialog associated with @self.
*
* FUTURE: Possibly obsolete this by making it private,
* since only called by script-fu-interface.c.
* Might be needed if we allow plugins to implement their own dialogs.
*
* Since: 2.4
*/
void
gimp_resource_select_button_close_popup (GimpResourceSelectButton *self)
{
GimpResourceSelectButtonPrivate *priv;
g_return_if_fail (GIMP_IS_RESOURCE_SELECT_BUTTON (self));
priv = gimp_resource_select_button_get_instance_private (self);
if (priv->temp_callback_from_remote_dialog)
{
gimp_resource_select_destroy (priv->temp_callback_from_remote_dialog);
priv->temp_callback_from_remote_dialog = NULL;
}
/* Else already closed. */
}

View File

@ -26,9 +26,7 @@
G_BEGIN_DECLS
#define GIMP_TYPE_RESOURCE_SELECT_BUTTON (gimp_resource_select_button_get_type ())
G_DECLARE_DERIVABLE_TYPE (GimpResourceSelectButton,
gimp_resource_select_button,
GIMP, RESOURCE_SELECT_BUTTON, GtkBox)
G_DECLARE_DERIVABLE_TYPE (GimpResourceSelectButton, gimp_resource_select_button, GIMP, RESOURCE_SELECT_BUTTON, GtkBox)
struct _GimpResourceSelectButtonClass
{
@ -46,18 +44,17 @@ struct _GimpResourceSelectButtonClass
gpointer padding[8];
};
GimpResource *gimp_resource_select_button_get_resource (GimpResourceSelectButton *self);
void gimp_resource_select_button_set_resource (GimpResourceSelectButton *self,
GimpResource *resource);
GimpResource * gimp_resource_select_button_get_resource (GimpResourceSelectButton *self);
void gimp_resource_select_button_set_resource (GimpResourceSelectButton *self,
GimpResource *resource);
/* API from below, used by subclasses e.g. GimpBrushSelectButton */
void gimp_resource_select_button_set_drag_target (GimpResourceSelectButton *self,
GtkWidget *drag_region_widget,
const GtkTargetEntry *drag_target);
void gimp_resource_select_button_set_clickable (GimpResourceSelectButton *self,
GtkWidget *widget);
void gimp_resource_select_button_close_popup (GimpResourceSelectButton *self);
void gimp_resource_select_button_set_drag_target (GimpResourceSelectButton *self,
GtkWidget *drag_region_widget,
const GtkTargetEntry *drag_target);
void gimp_resource_select_button_set_clickable (GimpResourceSelectButton *self,
GtkWidget *widget);
G_END_DECLS

View File

@ -64,7 +64,6 @@ EXPORTS
gimp_prop_chooser_gradient_new
gimp_prop_chooser_palette_new
gimp_prop_chooser_pattern_new
gimp_resource_select_button_close_popup
gimp_resource_select_button_get_resource
gimp_resource_select_button_get_type
gimp_resource_select_button_set_clickable

View File

@ -646,29 +646,10 @@ script_fu_resource_widget (const gchar *title,
static void
script_fu_interface_quit (SFScript *script)
{
gint i;
g_return_if_fail (script != NULL);
g_return_if_fail (sf_interface != NULL);
g_free (sf_interface->title);
for (i = 0; i < script->n_args; i++)
switch (script->args[i].type)
{
case SF_FONT:
case SF_PALETTE:
case SF_PATTERN:
case SF_GRADIENT:
case SF_BRUSH:
gimp_resource_select_button_close_popup
(GIMP_RESOURCE_SELECT_BUTTON (sf_interface->widgets[i]));
break;
default:
break;
}
g_free (sf_interface->widgets);
g_free (sf_interface->last_command);