Commit b1472344 authored by Michael Natterer's avatar Michael Natterer 😴 Committed by Michael Natterer
Browse files

added new function plug_in_proc_def_compare_menu_path() which is a

2004-02-03  Michael Natterer  <mitch@gimp.org>

	* app/plug-in/plug-in-proc.[ch]: added new function
	plug_in_proc_def_compare_menu_path() which is a GCompareDataFunc.
	(uses g_utf8_collate() on the translated menu paths).

	* app/plug-in/plug-ins.c (plug_ins_init): sort gimp->load_procs
	and gimp->save_procs using the new compare function above.
	Fixes bug #133180.

	(plug_ins_locale_domain)
	(plug_ins_help_domain): don't g_return_if_fail() on a NULL
	prog_name but return the default locale and help domains
	of the GIMP itself.

	(plug_ins_proc_def_insert): removed obsolete and broken (not
	locale and UTF-8 aware) code which tried to insert new plug-in
	menu entries in alphabetical order (was unused except for load
	and save procs).

	Unrelated:

	* app/plug-in/plug-in-proc.[ch]: added const qualifiers.

	* app/file/file-open.c
	* app/file/file-save.c
	* tools/pdbgen/pdb/fileops.pdb: changed accordingly (constify
	local variables).

	* app/pdb/fileops_cmds.c: regenerated.
parent 0e993d17
2004-02-03 Michael Natterer <mitch@gimp.org>
* app/plug-in/plug-in-proc.[ch]: added new function
plug_in_proc_def_compare_menu_path() which is a GCompareDataFunc.
(uses g_utf8_collate() on the translated menu paths).
* app/plug-in/plug-ins.c (plug_ins_init): sort gimp->load_procs
and gimp->save_procs using the new compare function above.
Fixes bug #133180.
(plug_ins_locale_domain)
(plug_ins_help_domain): don't g_return_if_fail() on a NULL
prog_name but return the default locale and help domains
of the GIMP itself.
(plug_ins_proc_def_insert): removed obsolete and broken (not
locale and UTF-8 aware) code which tried to insert new plug-in
menu entries in alphabetical order (was unused except for load
and save procs).
Unrelated:
* app/plug-in/plug-in-proc.[ch]: added const qualifiers.
* app/file/file-open.c
* app/file/file-save.c
* tools/pdbgen/pdb/fileops.pdb: changed accordingly (constify
local variables).
* app/pdb/fileops_cmds.c: regenerated.
2004-02-03 Michael Natterer <mitch@gimp.org>
 
* plug-ins/script-fu/scripts/*.scm: applied patch from Kevin
......@@ -67,12 +67,12 @@ file_open_image (Gimp *gimp,
GimpPDBStatusType *status,
GError **error)
{
ProcRecord *proc;
Argument *args;
Argument *return_vals;
gint gimage_id;
gint i;
gchar *filename;
const ProcRecord *proc;
Argument *args;
Argument *return_vals;
gint gimage_id;
gint i;
gchar *filename;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (status != NULL, NULL);
......
......@@ -93,7 +93,7 @@ file_save_as (GimpImage *gimage,
gboolean set_image_clean,
GError **error)
{
ProcRecord *proc;
const ProcRecord *proc;
Argument *args;
Argument *return_vals;
GimpPDBStatusType status;
......
......@@ -85,7 +85,7 @@ file_load_invoker (Gimp *gimp,
Argument *new_args;
Argument *return_vals;
PlugInProcDef *file_proc;
ProcRecord *proc;
const ProcRecord *proc;
gchar *uri;
gint i;
......@@ -170,7 +170,7 @@ file_save_invoker (Gimp *gimp,
Argument *new_args;
Argument *return_vals;
PlugInProcDef *file_proc;
ProcRecord *proc;
const ProcRecord *proc;
gchar *uri;
gint i;
......
......@@ -20,11 +20,18 @@
#include <glib-object.h>
#include "libgimpbase/gimpbase.h"
#include "plug-in-types.h"
#include "core/gimp.h"
#include "plug-in.h"
#include "plug-ins.h"
#include "plug-in-proc.h"
#include "gimp-intl.h"
PlugInProcDef *
plug_in_proc_def_new (void)
......@@ -76,8 +83,8 @@ plug_in_proc_def_free (PlugInProcDef *proc_def)
g_free (proc_def);
}
ProcRecord *
plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
const ProcRecord *
plug_in_proc_def_get_proc (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -85,7 +92,7 @@ plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
}
const gchar *
plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
plug_in_proc_def_get_progname (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -106,8 +113,8 @@ plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
}
gchar *
plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
const gchar *help_domain)
plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain)
{
gchar *help_id;
gchar *p;
......@@ -132,3 +139,48 @@ plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
return help_id;
}
gint
plug_in_proc_def_compare_menu_path (gconstpointer a,
gconstpointer b,
gpointer user_data)
{
Gimp *gimp = GIMP (user_data);
const PlugInProcDef *proc_def_a = a;
const PlugInProcDef *proc_def_b = b;
if (proc_def_a->menu_path && proc_def_b->menu_path)
{
const gchar *progname_a;
const gchar *progname_b;
const gchar *domain_a;
const gchar *domain_b;
gchar *menu_path_a;
gchar *menu_path_b;
gint retval;
progname_a = plug_in_proc_def_get_progname (proc_def_a);
progname_b = plug_in_proc_def_get_progname (proc_def_b);
domain_a = plug_ins_locale_domain (gimp, progname_a, NULL);
domain_b = plug_ins_locale_domain (gimp, progname_b, NULL);
menu_path_a = gimp_strip_uline (dgettext (domain_a,
proc_def_a->menu_path));
menu_path_b = gimp_strip_uline (dgettext (domain_b,
proc_def_b->menu_path));
retval = g_utf8_collate (menu_path_a, menu_path_b);
g_free (menu_path_a);
g_free (menu_path_b);
return retval;
}
else if (proc_def_a->menu_path)
return 1;
else if (proc_def_b->menu_path)
return -1;
return 0;
}
......@@ -42,13 +42,17 @@ struct _PlugInProcDef
};
PlugInProcDef * plug_in_proc_def_new (void);
void plug_in_proc_def_free (PlugInProcDef *proc_def);
PlugInProcDef * plug_in_proc_def_new (void);
void plug_in_proc_def_free (PlugInProcDef *proc_def);
ProcRecord * plug_in_proc_def_get_proc (PlugInProcDef *proc_def);
const gchar * plug_in_proc_def_get_progname (PlugInProcDef *proc_def);
gchar * plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
const gchar *help_domain);
const ProcRecord * plug_in_proc_def_get_proc (const PlugInProcDef *proc_def);
const gchar * plug_in_proc_def_get_progname (const PlugInProcDef *proc_def);
gchar * plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain);
gint plug_in_proc_def_compare_menu_path (gconstpointer a,
gconstpointer b,
gpointer user_data);
#endif /* __PLUG_IN_PROC_H__ */
......@@ -235,9 +235,13 @@ plug_ins_init (Gimp *gimp,
/* add the plug-in procs to the procedure database */
plug_ins_add_to_db (gimp);
/* restore file procs order */
gimp->load_procs = g_slist_reverse (gimp->load_procs);
gimp->save_procs = g_slist_reverse (gimp->save_procs);
/* sort file procs */
gimp->load_procs = g_slist_sort_with_data (gimp->load_procs,
plug_in_proc_def_compare_menu_path,
gimp);
gimp->save_procs = g_slist_sort_with_data (gimp->save_procs,
plug_in_proc_def_compare_menu_path,
gimp);
/* create help_path and locale_domain lists */
for (tmp = gimp->plug_in_defs; tmp; tmp = g_slist_next (tmp))
......@@ -629,11 +633,14 @@ plug_ins_locale_domain (Gimp *gimp,
GSList *list;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (prog_name != NULL, NULL);
if (domain_path)
*domain_path = gimp_locale_directory ();
/* A NULL prog_name is GIMP itself, return the default domain */
if (! prog_name)
return NULL;
for (list = gimp->plug_in_locale_domains; list; list = g_slist_next (list))
{
PlugInLocaleDomainDef *def = list->data;
......@@ -658,11 +665,14 @@ plug_ins_help_domain (Gimp *gimp,
GSList *list;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (prog_name != NULL, NULL);
if (domain_uri)
*domain_uri = NULL;
/* A NULL prog_name is GIMP itself, return the default domain */
if (! prog_name)
return NULL;
for (list = gimp->plug_in_help_domains; list; list = g_slist_next (list))
{
PlugInHelpDomainDef *def = list->data;
......@@ -956,7 +966,6 @@ plug_ins_proc_def_insert (Gimp *gimp,
PlugInProcDef *proc_def)
{
GSList *list;
GSList *prev = NULL;
for (list = gimp->plug_in_proc_defs; list; list = g_slist_next (list))
{
......@@ -979,28 +988,9 @@ plug_ins_proc_def_insert (Gimp *gimp,
return tmp_proc_def;
}
else if (! proc_def->menu_path ||
(tmp_proc_def->menu_path &&
(strcmp (proc_def->menu_path, tmp_proc_def->menu_path) < 0)))
{
GSList *new;
new = g_slist_alloc ();
new->data = proc_def;
new->next = list;
if (prev)
prev->next = new;
else
gimp->plug_in_proc_defs = new;
return NULL;
}
prev = list;
}
gimp->plug_in_proc_defs = g_slist_append (gimp->plug_in_proc_defs, proc_def);
gimp->plug_in_proc_defs = g_slist_prepend (gimp->plug_in_proc_defs, proc_def);
return NULL;
}
......@@ -20,11 +20,18 @@
#include <glib-object.h>
#include "libgimpbase/gimpbase.h"
#include "plug-in-types.h"
#include "core/gimp.h"
#include "plug-in.h"
#include "plug-ins.h"
#include "plug-in-proc.h"
#include "gimp-intl.h"
PlugInProcDef *
plug_in_proc_def_new (void)
......@@ -76,8 +83,8 @@ plug_in_proc_def_free (PlugInProcDef *proc_def)
g_free (proc_def);
}
ProcRecord *
plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
const ProcRecord *
plug_in_proc_def_get_proc (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -85,7 +92,7 @@ plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
}
const gchar *
plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
plug_in_proc_def_get_progname (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -106,8 +113,8 @@ plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
}
gchar *
plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
const gchar *help_domain)
plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain)
{
gchar *help_id;
gchar *p;
......@@ -132,3 +139,48 @@ plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
return help_id;
}
gint
plug_in_proc_def_compare_menu_path (gconstpointer a,
gconstpointer b,
gpointer user_data)
{
Gimp *gimp = GIMP (user_data);
const PlugInProcDef *proc_def_a = a;
const PlugInProcDef *proc_def_b = b;
if (proc_def_a->menu_path && proc_def_b->menu_path)
{
const gchar *progname_a;
const gchar *progname_b;
const gchar *domain_a;
const gchar *domain_b;
gchar *menu_path_a;
gchar *menu_path_b;
gint retval;
progname_a = plug_in_proc_def_get_progname (proc_def_a);
progname_b = plug_in_proc_def_get_progname (proc_def_b);
domain_a = plug_ins_locale_domain (gimp, progname_a, NULL);
domain_b = plug_ins_locale_domain (gimp, progname_b, NULL);
menu_path_a = gimp_strip_uline (dgettext (domain_a,
proc_def_a->menu_path));
menu_path_b = gimp_strip_uline (dgettext (domain_b,
proc_def_b->menu_path));
retval = g_utf8_collate (menu_path_a, menu_path_b);
g_free (menu_path_a);
g_free (menu_path_b);
return retval;
}
else if (proc_def_a->menu_path)
return 1;
else if (proc_def_b->menu_path)
return -1;
return 0;
}
......@@ -42,13 +42,17 @@ struct _PlugInProcDef
};
PlugInProcDef * plug_in_proc_def_new (void);
void plug_in_proc_def_free (PlugInProcDef *proc_def);
PlugInProcDef * plug_in_proc_def_new (void);
void plug_in_proc_def_free (PlugInProcDef *proc_def);
ProcRecord * plug_in_proc_def_get_proc (PlugInProcDef *proc_def);
const gchar * plug_in_proc_def_get_progname (PlugInProcDef *proc_def);
gchar * plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
const gchar *help_domain);
const ProcRecord * plug_in_proc_def_get_proc (const PlugInProcDef *proc_def);
const gchar * plug_in_proc_def_get_progname (const PlugInProcDef *proc_def);
gchar * plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain);
gint plug_in_proc_def_compare_menu_path (gconstpointer a,
gconstpointer b,
gpointer user_data);
#endif /* __PLUG_IN_PROC_H__ */
......@@ -20,11 +20,18 @@
#include <glib-object.h>
#include "libgimpbase/gimpbase.h"
#include "plug-in-types.h"
#include "core/gimp.h"
#include "plug-in.h"
#include "plug-ins.h"
#include "plug-in-proc.h"
#include "gimp-intl.h"
PlugInProcDef *
plug_in_proc_def_new (void)
......@@ -76,8 +83,8 @@ plug_in_proc_def_free (PlugInProcDef *proc_def)
g_free (proc_def);
}
ProcRecord *
plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
const ProcRecord *
plug_in_proc_def_get_proc (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -85,7 +92,7 @@ plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
}
const gchar *
plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
plug_in_proc_def_get_progname (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -106,8 +113,8 @@ plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
}
gchar *
plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
const gchar *help_domain)
plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain)
{
gchar *help_id;
gchar *p;
......@@ -132,3 +139,48 @@ plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
return help_id;
}
gint
plug_in_proc_def_compare_menu_path (gconstpointer a,
gconstpointer b,
gpointer user_data)
{
Gimp *gimp = GIMP (user_data);
const PlugInProcDef *proc_def_a = a;
const PlugInProcDef *proc_def_b = b;
if (proc_def_a->menu_path && proc_def_b->menu_path)
{
const gchar *progname_a;
const gchar *progname_b;
const gchar *domain_a;
const gchar *domain_b;
gchar *menu_path_a;
gchar *menu_path_b;
gint retval;
progname_a = plug_in_proc_def_get_progname (proc_def_a);
progname_b = plug_in_proc_def_get_progname (proc_def_b);
domain_a = plug_ins_locale_domain (gimp, progname_a, NULL);
domain_b = plug_ins_locale_domain (gimp, progname_b, NULL);
menu_path_a = gimp_strip_uline (dgettext (domain_a,
proc_def_a->menu_path));
menu_path_b = gimp_strip_uline (dgettext (domain_b,
proc_def_b->menu_path));
retval = g_utf8_collate (menu_path_a, menu_path_b);
g_free (menu_path_a);
g_free (menu_path_b);
return retval;
}
else if (proc_def_a->menu_path)
return 1;
else if (proc_def_b->menu_path)
return -1;
return 0;
}
......@@ -42,13 +42,17 @@ struct _PlugInProcDef
};
PlugInProcDef * plug_in_proc_def_new (void);
void plug_in_proc_def_free (PlugInProcDef *proc_def);
PlugInProcDef * plug_in_proc_def_new (void);
void plug_in_proc_def_free (PlugInProcDef *proc_def);
ProcRecord * plug_in_proc_def_get_proc (PlugInProcDef *proc_def);
const gchar * plug_in_proc_def_get_progname (PlugInProcDef *proc_def);
gchar * plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
const gchar *help_domain);
const ProcRecord * plug_in_proc_def_get_proc (const PlugInProcDef *proc_def);
const gchar * plug_in_proc_def_get_progname (const PlugInProcDef *proc_def);
gchar * plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain);
gint plug_in_proc_def_compare_menu_path (gconstpointer a,
gconstpointer b,
gpointer user_data);
#endif /* __PLUG_IN_PROC_H__ */
......@@ -20,11 +20,18 @@
#include <glib-object.h>
#include "libgimpbase/gimpbase.h"
#include "plug-in-types.h"
#include "core/gimp.h"
#include "plug-in.h"
#include "plug-ins.h"
#include "plug-in-proc.h"
#include "gimp-intl.h"
PlugInProcDef *
plug_in_proc_def_new (void)
......@@ -76,8 +83,8 @@ plug_in_proc_def_free (PlugInProcDef *proc_def)
g_free (proc_def);
}
ProcRecord *
plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
const ProcRecord *
plug_in_proc_def_get_proc (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -85,7 +92,7 @@ plug_in_proc_def_get_proc (PlugInProcDef *proc_def)
}
const gchar *
plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
plug_in_proc_def_get_progname (const PlugInProcDef *proc_def)
{
g_return_val_if_fail (proc_def != NULL, NULL);
......@@ -106,8 +113,8 @@ plug_in_proc_def_get_progname (PlugInProcDef *proc_def)
}
gchar *
plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
const gchar *help_domain)
plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
const gchar *help_domain)
{
gchar *help_id;
gchar *p;
......@@ -132,3 +139,48 @@ plug_in_proc_def_get_help_id (PlugInProcDef *proc_def,
return help_id;
}
gint
plug_in_proc_def_compare_menu_path (gconstpointer a,
gconstpointer b,
gpointer user_data)
{
Gimp *gimp = GIMP (user_data);
const PlugInProcDef *proc_def_a = a;
const PlugInProcDef *proc_def_b = b;
if (proc_def_a->menu_path && proc_def_b->menu_path)
{
const gchar *progname_a;
const gchar *progname_b;
const gchar *domain_a;
const gchar *domain_b;
gchar *menu_path_a;
gchar *menu_path_b;
gint retval;
progname_a = plug_in_proc_def_get_progname (proc_def_a);
progname_b = plug_in_proc_def_get_progname (proc_def_b);
domain_a = plug_ins_locale_domain (gimp, progname_a, NULL);
domain_b = plug_ins_locale_domain (gimp, progname_b, NULL);
menu_path_a = gimp_strip_uline (dgettext (domain_a,
proc_def_a->menu_path));
menu_path_b = gimp_strip_uline (dgettext (domain_b,
proc_def_b->menu_path));
retval = g_utf8_collate (menu_path_a, menu_path_b);
g_free (menu_path_a);
g_free (menu_path_b);
return retval;
}
else if (proc_def_a->menu_path)
return 1;
else if (proc_def_b->menu_path)
return -1;