diff --git a/panel/controls.c b/panel/controls.c index 6d439498c215af649a3856ecfe42563bdaf63877..1168fa3e58c259b194dbe64b91dd26752c71f8a2 100644 --- a/panel/controls.c +++ b/panel/controls.c @@ -542,11 +542,28 @@ sort_control_func (gpointer a, gpointer b, gpointer data) return g_utf8_collate (ca->caption, cb->caption); } +static ControlInfo * +create_control_info (ControlClassInfo *info) +{ + ControlInfo *ci; + + ci = g_new0 (ControlInfo, 1); + + ci->name = g_strdup (info->name); + ci->caption = g_strdup (info->caption); + ci->icon = info->icon != NULL ? g_object_ref (info->icon) : NULL; + + ci->can_be_added = !(info->unique && info->refcount > 0); + + return ci; +} + /* for add-controls-dialog.c */ GSList * get_control_info_list (void) { GSList *li, *infolist = NULL; + ControlInfo *launcherinfo; /* good place to remove plugins that are not in use and were * uninstalled after the panel was started */ @@ -555,23 +572,22 @@ get_control_info_list (void) /* update module list */ add_plugin_classes (); - for (li = control_class_info_list; li; li = li->next) + launcherinfo = + create_control_info ((ControlClassInfo*)control_class_info_list->data); + + for (li = control_class_info_list->next; li; li = li->next) { ControlClassInfo *info = li->data; - ControlInfo *ci; - ci = g_new0 (ControlInfo, 1); + infolist = g_slist_prepend (infolist, create_control_info (info)); + } - ci->name = g_strdup (info->name); - ci->caption = g_strdup (info->caption); - ci->icon = info->icon != NULL ? g_object_ref (info->icon) : NULL; + /* sort alphabetically, but keep launcher at the top */ + infolist = g_slist_sort (infolist, (GCompareDataFunc) sort_control_func); - ci->can_be_added = !(info->unique && info->refcount > 0); - - infolist = g_slist_prepend (infolist, ci); - } - - return g_slist_sort (infolist, (GCompareDataFunc) sort_control_func); + infolist = g_slist_prepend (infolist, launcherinfo); + + return infolist; } void