plug-ins: Port file-icns/file-ico to GimpProcedureDialog

Note that the widgets are still made
with GTK directly. The primary goal of this
initial port is to remove the last usage of
gimp_export_dialog_new (). Future work
will be needed as currently we can not
automatically generate widgets from
array parameters.
This commit is contained in:
Alx Sa 2024-07-19 02:29:38 +00:00
parent 6b611a4802
commit 85c0d0d600
8 changed files with 213 additions and 167 deletions

View File

@ -35,35 +35,40 @@
#include "libgimp/stdplugins-intl.h"
GtkWidget * icns_dialog_new (IcnsSaveInfo *info);
GtkWidget * icns_dialog_new (IcnsSaveInfo *info,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config);
static gboolean icns_save_dialog (IcnsSaveInfo *info,
GimpImage *image);
static gboolean icns_save_dialog (IcnsSaveInfo *info,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config);
void icns_dialog_add_icon (GtkWidget *dialog,
GimpDrawable *layer,
gint layer_num,
gint duplicates[]);
void icns_dialog_add_icon (GtkWidget *dialog,
GimpDrawable *layer,
gint layer_num,
gint duplicates[]);
static GtkWidget * icns_preview_new (GimpDrawable *layer);
static GtkWidget * icns_preview_new (GimpDrawable *layer);
static GtkWidget * icns_create_icon_item (GtkWidget *icon_preview,
GimpDrawable *layer,
gint layer_num,
IcnsSaveInfo *info,
gint duplicates[]);
static GtkWidget * icns_create_icon_item (GtkWidget *icon_preview,
GimpDrawable *layer,
gint layer_num,
IcnsSaveInfo *info,
gint duplicates[]);
static gint icns_find_type (gint width,
gint height);
static gboolean icns_check_dimensions (gint width,
gint height);
static gboolean icns_check_compat (GtkWidget *dialog,
IcnsSaveInfo *info);
static gint icns_find_type (gint width,
gint height);
static gboolean icns_check_dimensions (gint width,
gint height);
static gboolean icns_check_compat (GtkWidget *dialog,
IcnsSaveInfo *info);
GimpPDBStatusType icns_export_image (GFile *file,
IcnsSaveInfo *info,
GimpImage *image,
GError **error);
GimpPDBStatusType icns_export_image (GFile *file,
IcnsSaveInfo *info,
GimpImage *image,
GError **error);
static void icns_save_info_free (IcnsSaveInfo *info);
@ -279,7 +284,10 @@ icns_check_compat (GtkWidget *dialog,
}
GtkWidget *
icns_dialog_new (IcnsSaveInfo *info)
icns_dialog_new (IcnsSaveInfo *info,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config)
{
GtkWidget *dialog;
GtkWidget *main_vbox;
@ -289,15 +297,14 @@ icns_dialog_new (IcnsSaveInfo *info)
GtkWidget *flowbox;
GtkWidget *warning;
dialog = gimp_export_dialog_new (_("Apple Icon Image"),
PLUG_IN_BINARY,
"plug-in-icns-export");
dialog = gimp_export_procedure_dialog_new (GIMP_EXPORT_PROCEDURE (procedure),
config, image);
g_object_set_data (G_OBJECT (dialog), "save_info", info);
main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
gtk_box_pack_start (GTK_BOX (gimp_export_dialog_get_content_area (dialog)),
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
main_vbox, TRUE, TRUE, 0);
gtk_widget_show (main_vbox);
@ -340,14 +347,16 @@ icns_dialog_new (IcnsSaveInfo *info)
}
static gboolean
icns_save_dialog (IcnsSaveInfo *info,
GimpImage *image)
icns_save_dialog (IcnsSaveInfo *info,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config)
{
GtkWidget *dialog;
GList *iter;
gint i;
gint j;
gint response;
gboolean response;
gint duplicates[ICNS_TYPE_NUM];
gint ordered[12] =
{12, 16, 18, 24, 32, 36, 48, 64, 128, 256, 512, 1024};
@ -357,7 +366,7 @@ icns_save_dialog (IcnsSaveInfo *info,
for (i = 0; i < ICNS_TYPE_NUM; i++)
duplicates[i] = 0;
dialog = icns_dialog_new (info);
dialog = icns_dialog_new (info, image, procedure, config);
/* Add icons in order, smallest to largest */
for (i = 0; i < 12; i++)
@ -394,13 +403,13 @@ icns_save_dialog (IcnsSaveInfo *info,
200 + (info->num_icons > 4 ?
250 : info->num_icons * 60));
gtk_widget_show (dialog);
gtk_widget_set_visible (dialog, TRUE);
response = gimp_dialog_run (GIMP_DIALOG (dialog));
response = gimp_procedure_dialog_run (GIMP_PROCEDURE_DIALOG (dialog));
gtk_widget_destroy (dialog);
return (response == GTK_RESPONSE_OK);
return response;
}
GimpPDBStatusType
@ -553,10 +562,12 @@ icns_save_info_free (IcnsSaveInfo *info)
}
GimpPDBStatusType
icns_save_image (GFile *file,
GimpImage *image,
gint32 run_mode,
GError **error)
icns_save_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
GError **error)
{
IcnsSaveInfo info;
GList *iter;
@ -591,7 +602,7 @@ icns_save_image (GFile *file,
if (run_mode == GIMP_RUN_INTERACTIVE)
{
/* Allow user to override default values */
if (! icns_save_dialog (&info, image))
if (! icns_save_dialog (&info, image, procedure, config))
return GIMP_PDB_CANCEL;
}
else if (run_mode == GIMP_RUN_NONINTERACTIVE)

View File

@ -22,9 +22,11 @@
#define __ICNS_EXPORT_H__
GimpPDBStatusType icns_save_image (GFile *file,
GimpImage *image,
gint32 run_mode,
GError **error);
GimpPDBStatusType icns_save_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
GError **error);
#endif /* __ICNS_EXPORT_H__ */

View File

@ -185,6 +185,8 @@ icns_create_procedure (GimpPlugIn *plug_in,
"Brion Vibber <brion@pobox.com>",
"2004");
gimp_file_procedure_set_format_name (GIMP_FILE_PROCEDURE (procedure),
"Apple Icon Image");
gimp_file_procedure_set_mime_types (GIMP_FILE_PROCEDURE (procedure),
"image/x-icns");
gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
@ -278,7 +280,7 @@ icns_export (GimpProcedure *procedure,
gegl_init (NULL, NULL);
status = icns_save_image (file, image, run_mode, &error);
status = icns_save_image (file, image, procedure, config, run_mode, &error);
return gimp_procedure_new_return_values (procedure, status, error);
}

View File

@ -45,9 +45,12 @@ static void ico_dialog_ani_update_iart (GtkEntry *entry,
GtkWidget *
ico_dialog_new (IcoSaveInfo *info,
AniFileHeader *ani_header,
AniSaveInfo *ani_info)
ico_dialog_new (GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
IcoSaveInfo *info,
AniFileHeader *ani_header,
AniSaveInfo *ani_info)
{
GtkWidget *dialog;
GtkWidget *main_vbox;
@ -57,11 +60,8 @@ ico_dialog_new (IcoSaveInfo *info,
GtkWidget *viewport;
GtkWidget *warning;
dialog = gimp_export_dialog_new (ani_header ?
_("Windows Animated Cursor") : info->is_cursor ?
_("Windows Cursor") : _("Windows Icon"),
PLUG_IN_BINARY,
"plug-in-winicon");
dialog = gimp_export_procedure_dialog_new (GIMP_EXPORT_PROCEDURE (procedure),
config, image);
/* We store an array that holds each icon's requested bit depth
with the dialog. It's queried when the dialog is closed so the
@ -80,7 +80,7 @@ ico_dialog_new (IcoSaveInfo *info,
main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
gtk_box_pack_start (GTK_BOX (gimp_export_dialog_get_content_area (dialog)),
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
main_vbox, TRUE, TRUE, 0);
gtk_widget_show (main_vbox);

View File

@ -22,11 +22,14 @@
#define __ICO_DIALOG_H__
GtkWidget * ico_dialog_new (IcoSaveInfo *info,
AniFileHeader *ani_header,
AniSaveInfo *ani_info);
void ico_dialog_add_icon (GtkWidget *dialog,
GimpDrawable *layer,
gint layer_num);
GtkWidget * ico_dialog_new (GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
IcoSaveInfo *info,
AniFileHeader *ani_header,
AniSaveInfo *ani_info);
void ico_dialog_add_icon (GtkWidget *dialog,
GimpDrawable *layer,
gint layer_num);
#endif /* __ICO_DIALOG_H__ */

View File

@ -40,12 +40,12 @@
#include "libgimp/stdplugins-intl.h"
static gint ico_write_int8 (FILE *fp,
guint8 *data,
gint count);
static gint ico_write_int16 (FILE *fp,
static gint ico_write_int8 (FILE *fp,
guint8 *data,
gint count);
static gint ico_write_int16 (FILE *fp,
guint16 *data,
gint count);
gint count);
static gint ico_write_int32 (FILE *fp,
guint32 *data,
gint count);
@ -64,35 +64,37 @@ static void ico_set_byte_in_data (guint8 *data,
gint byte_num,
gint byte_val);
static gint ico_get_layer_num_colors (GimpLayer *layer,
gboolean *uses_alpha_levels);
static void ico_image_get_reduced_buf (GimpDrawable *layer,
gint bpp,
gint *num_colors,
guchar **cmap_out,
guchar **buf_out);
static gint ico_get_layer_num_colors (GimpLayer *layer,
gboolean *uses_alpha_levels);
static void ico_image_get_reduced_buf (GimpDrawable *layer,
gint bpp,
gint *num_colors,
guchar **cmap_out,
guchar **buf_out);
static gboolean ico_save_init (GimpImage *image,
gint32 run_mode,
IcoSaveInfo *info,
gint n_hot_spot_x,
gint32 *hot_spot_x,
gint n_hot_spot_y,
gint32 *hot_spot_y,
GError **error);
static gboolean ico_save_init (GimpImage *image,
gint32 run_mode,
IcoSaveInfo *info,
gint n_hot_spot_x,
gint32 *hot_spot_x,
gint n_hot_spot_y,
gint32 *hot_spot_y,
GError **error);
static GimpPDBStatusType
shared_save_image (GFile *file,
FILE *fp_ani,
GimpImage *image,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
gint32 file_offset,
gint icon_index,
GError **error,
IcoSaveInfo *info);
shared_save_image (GFile *file,
FILE *fp_ani,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
gint32 file_offset,
gint icon_index,
GError **error,
IcoSaveInfo *info);
static gint
@ -306,19 +308,22 @@ ico_save_init (GimpImage *image,
static gboolean
ico_save_dialog (GimpImage *image,
IcoSaveInfo *info,
AniFileHeader *ani_header,
AniSaveInfo *ani_info)
ico_save_dialog (GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
IcoSaveInfo *info,
AniFileHeader *ani_header,
AniSaveInfo *ani_info)
{
GtkWidget *dialog;
GList *iter;
gint i;
gint response;
gboolean response;
gimp_ui_init (PLUG_IN_BINARY);
dialog = ico_dialog_new (info, ani_header, ani_info);
dialog = ico_dialog_new (image, procedure, config, info, ani_header,
ani_info);
for (iter = info->layers, i = 0;
iter;
iter = g_list_next (iter), i++)
@ -360,13 +365,13 @@ ico_save_dialog (GimpImage *image,
200 + (info->num_icons > 4 ?
500 : info->num_icons * 120));
gtk_widget_show (dialog);
gtk_widget_set_visible (dialog, TRUE);
response = gimp_dialog_run (GIMP_DIALOG (dialog));
response = gimp_procedure_dialog_run (GIMP_PROCEDURE_DIALOG (dialog));
gtk_widget_destroy (dialog);
return (response == GTK_RESPONSE_OK);
return response;
}
static void
@ -1178,10 +1183,12 @@ ico_save_info_free (IcoSaveInfo *info)
}
GimpPDBStatusType
ico_export_image (GFile *file,
GimpImage *image,
gint32 run_mode,
GError **error)
ico_export_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
GError **error)
{
IcoSaveInfo info;
@ -1190,20 +1197,23 @@ ico_export_image (GFile *file,
info.is_cursor = FALSE;
return shared_save_image (file, NULL, image, run_mode,
return shared_save_image (file, NULL, image, procedure,
config, run_mode,
0, NULL, 0, NULL,
0, 0, error, &info);
}
GimpPDBStatusType
cur_export_image (GFile *file,
GimpImage *image,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
GError **error)
cur_export_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
GError **error)
{
IcoSaveInfo info;
@ -1212,7 +1222,8 @@ cur_export_image (GFile *file,
info.is_cursor = TRUE;
return shared_save_image (file, NULL, image, run_mode,
return shared_save_image (file, NULL, image, procedure,
config, run_mode,
n_hot_spot_x, hot_spot_x,
n_hot_spot_y, hot_spot_y,
0, 0, error, &info);
@ -1220,16 +1231,18 @@ cur_export_image (GFile *file,
/* Ported from James Huang's ani.c code, under the GPL v3 license */
GimpPDBStatusType
ani_export_image (GFile *file,
GimpImage *image,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
AniFileHeader *header,
AniSaveInfo *ani_info,
GError **error)
ani_export_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
AniFileHeader *header,
AniSaveInfo *ani_info,
GError **error)
{
FILE *fp;
gint32 i;
@ -1320,7 +1333,7 @@ ani_export_image (GFile *file,
if (run_mode == GIMP_RUN_INTERACTIVE)
{
if (! ico_save_dialog (image, &info,
if (! ico_save_dialog (image, procedure, config, &info,
header, ani_info))
return GIMP_PDB_CANCEL;
@ -1423,7 +1436,8 @@ ani_export_image (GFile *file,
ofs_size_icon = ftell (fp);
fwrite (&size, sizeof (size), 1, fp);
offset = ftell (fp);
status = shared_save_image (file, fp, image, run_mode,
status = shared_save_image (file, fp, image, procedure,
config, run_mode,
n_hot_spot_x, hot_spot_x,
n_hot_spot_y, hot_spot_y,
offset, i, error, &info);
@ -1494,18 +1508,20 @@ ani_export_image (GFile *file,
}
GimpPDBStatusType
shared_save_image (GFile *file,
FILE *fp_ani,
GimpImage *image,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
gint32 file_offset,
gint icon_index,
GError **error,
IcoSaveInfo *info)
shared_save_image (GFile *file,
FILE *fp_ani,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
gint32 file_offset,
gint icon_index,
GError **error,
IcoSaveInfo *info)
{
FILE *fp;
GList *iter;
@ -1533,7 +1549,7 @@ shared_save_image (GFile *file,
if (run_mode == GIMP_RUN_INTERACTIVE && ! fp_ani)
{
/* Allow user to override default values */
if ( !ico_save_dialog (image, info,
if (! ico_save_dialog (image, procedure, config, info,
NULL, NULL))
return GIMP_PDB_CANCEL;
}

View File

@ -22,33 +22,39 @@
#define __ICO_EXPORT_H__
GimpPDBStatusType ico_export_image (GFile *file,
GimpImage *image,
gint32 run_mode,
GError **error);
GimpPDBStatusType ico_export_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
GError **error);
GimpPDBStatusType cur_export_image (GFile *file,
GimpImage *image,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
GError **error);
GimpPDBStatusType cur_export_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
GError **error);
GimpPDBStatusType ani_export_image (GFile *file,
GimpImage *image,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
AniFileHeader *header,
AniSaveInfo *ani_info,
GError **error);
GimpPDBStatusType ani_export_image (GFile *file,
GimpImage *image,
GimpProcedure *procedure,
GimpProcedureConfig *config,
gint32 run_mode,
gint *n_hot_spot_x,
gint32 **hot_spot_x,
gint *n_hot_spot_y,
gint32 **hot_spot_y,
AniFileHeader *header,
AniSaveInfo *ani_info,
GError **error);
gboolean ico_cmap_contains_black (const guchar *cmap,
gint num_colors);
gboolean ico_cmap_contains_black (const guchar *cmap,
gint num_colors);
#endif /* __ICO_EXPORT_H__ */

View File

@ -301,6 +301,8 @@ ico_create_procedure (GimpPlugIn *plug_in,
"Christian Kreibich <christian@whoop.org>",
"2002");
gimp_file_procedure_set_format_name (GIMP_FILE_PROCEDURE (procedure),
"Microsoft Windows icon");
gimp_file_procedure_set_mime_types (GIMP_FILE_PROCEDURE (procedure),
"image/x-ico");
gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
@ -328,6 +330,8 @@ ico_create_procedure (GimpPlugIn *plug_in,
"Nikc M.",
"2002-2022");
gimp_file_procedure_set_format_name (GIMP_FILE_PROCEDURE (procedure),
"Microsoft Windows cursor");
gimp_file_procedure_set_mime_types (GIMP_FILE_PROCEDURE (procedure),
"image/vnd.microsoft.icon");
gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
@ -375,6 +379,8 @@ ico_create_procedure (GimpPlugIn *plug_in,
"James Huang, Alex S.",
"2007-2022");
gimp_file_procedure_set_format_name (GIMP_FILE_PROCEDURE (procedure),
"Microsoft Windows animated cursor");
gimp_file_procedure_set_mime_types (GIMP_FILE_PROCEDURE (procedure),
"application/x-navi-animation");
gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
@ -578,7 +584,7 @@ ico_export (GimpProcedure *procedure,
gegl_init (NULL, NULL);
status = ico_export_image (file, image, run_mode, &error);
status = ico_export_image (file, image, procedure, config, run_mode, &error);
return gimp_procedure_new_return_values (procedure, status, error);
}
@ -608,7 +614,7 @@ cur_export (GimpProcedure *procedure,
"hot-spot-y", &hot_spot_y,
NULL);
status = cur_export_image (file, image, run_mode,
status = cur_export_image (file, image, procedure, config, run_mode,
&n_hot_spot_x, &hot_spot_x,
&n_hot_spot_y, &hot_spot_y,
&error);
@ -670,7 +676,7 @@ ani_export (GimpProcedure *procedure,
ani_info.inam = inam;
ani_info.iart = iart;
status = ani_export_image (file, image, run_mode,
status = ani_export_image (file, image, procedure, config, run_mode,
&n_hot_spot_x, &hot_spot_x,
&n_hot_spot_y, &hot_spot_y,
&header, &ani_info, &error);