void
panel_action_button_load_from_mateconf (PanelWidget *panel,
				     gboolean     locked,
				     int          position,
				     gboolean     exactpos,
				     const char  *id)
{
	int          type;
	const char  *key;
	char        *action_type;

	key = panel_mateconf_full_key (PANEL_MATECONF_OBJECTS, id, "action_type");
	action_type = mateconf_client_get_string (panel_mateconf_get_client (), key, NULL);

	if (!mateconf_string_to_enum (panel_action_type_map, action_type, &type)) {
		g_warning ("Unkown action type '%s' from %s", action_type, key);
		g_free (action_type);
		return;
	}

	g_free (action_type);

	/* compatibility: migrate from MATE < 2.13.90 */
	if (type == PANEL_ACTION_SCREENSHOT)
		panel_compatibility_migrate_screenshot_action (panel_mateconf_get_client (),
							       id);
	else
		panel_action_button_load (type, panel, locked,
					  position, exactpos, id, FALSE);
}
void
panel_action_button_load_from_mateconf (PanelWidget *panel,
				     gboolean     locked,
				     int          position,
				     gboolean     exactpos,
				     const char  *id)
{
	int          type;
	const char  *key;
	char        *action_type;

	key = panel_mateconf_full_key (PANEL_MATECONF_OBJECTS, id, "action_type");
	action_type = mateconf_client_get_string (panel_mateconf_get_client (), key, NULL);

	if (!mateconf_string_to_enum (panel_action_type_map, action_type, &type)) {
		g_warning ("Unkown action type '%s' from %s", action_type, key);
		g_free (action_type);
		return;
	}

	g_free (action_type);

	panel_action_button_load (type, panel, locked,
				  position, exactpos, id);
}
/* This is only for backwards compatibility with 2.0.x
 * We load an old-style lock/logout button as an action
 * button but make sure to retain the lock/logout configuration
 * so logging back into 2.0.x still works.
 */
void
panel_action_button_load_compatible (PanelObjectType  object_type,
				     PanelWidget     *panel,
				     gboolean         locked,
				     int              position,
				     gboolean         exactpos,
				     const char      *id)
{
	PanelActionButtonType action_type;

	g_assert (object_type == PANEL_OBJECT_LOGOUT || object_type == PANEL_OBJECT_LOCK);

	action_type = object_type == PANEL_OBJECT_LOGOUT ? PANEL_ACTION_LOGOUT : PANEL_ACTION_LOCK;

	panel_action_button_load (action_type, panel, locked, position, exactpos, id, TRUE);
}
void
panel_action_button_load_from_gsettings (PanelWidget *panel,
				     gboolean     locked,
				     int          position,
				     gboolean     exactpos,
				     const char  *id)
{
	GSettings             *settings;
	PanelActionButtonType  type;
	char                  *path;

	path = g_strdup_printf (PANEL_OBJECT_PATH "%s/", id);
	settings = g_settings_new_with_path (PANEL_OBJECT_SCHEMA, path);

	type = g_settings_get_enum (settings, PANEL_OBJECT_ACTION_TYPE_KEY);

	g_free (path);
	g_object_unref (settings);

	panel_action_button_load (type, panel, locked,
					  position, exactpos, id);
}
static gboolean
panel_object_loader_idle_handler (gpointer dummy)
{
        PanelObjectToLoad *object = NULL;
        PanelToplevel     *toplevel = NULL;
        PanelWidget       *panel_widget;
        GSList            *l;
        char              *iid = NULL;
        PanelObjectType    object_type;
        char              *object_type_detail = NULL;
        gboolean           ret;

        if (!panel_objects_to_load) {
                panel_object_loader_have_idle = FALSE;
                return FALSE;
        }

        for (l = panel_objects_to_load; l; l = l->next) {
                object = l->data;

                toplevel = panel_toplevel_get_by_id (object->toplevel_id);
                if (toplevel)
                        break;
        }

        if (!l) {
                /* All the remaining objects don't have a panel */
                for (l = panel_objects_to_load; l; l = l->next)
                        free_object_to_load (l->data);
                g_slist_free (panel_objects_to_load);
                panel_objects_to_load = NULL;
                panel_object_loader_have_idle = FALSE;

                if (panel_objects_loading == NULL) {
                        /* unhide any potential initially hidden toplevel */
                        panel_object_loader_queue_initial_unhide_toplevels (NULL);
                }

                return FALSE;
        }

        panel_objects_to_load = g_slist_delete_link (panel_objects_to_load, l);
        panel_objects_loading = g_slist_append (panel_objects_loading, object);

        panel_widget = panel_toplevel_get_panel_widget (toplevel);

        iid = g_settings_get_string (object->settings, PANEL_OBJECT_IID_KEY);
        ret = panel_object_iid_to_type (iid, &object_type, &object_type_detail);

        if (!ret) {
                g_printerr ("Object '%s' has an invalid iid ('%s')\n",
                            object->id, iid);
                panel_object_loader_stop_loading (object->id);
                g_free (iid);
                return TRUE;
        }

        g_free (iid);

        switch (object_type) {
        case PANEL_OBJECT_APPLET:
                panel_applet_frame_load (panel_widget,
                                         object->id,
                                         object->settings);
                break;
        case PANEL_OBJECT_MENU:
                panel_menu_button_load (panel_widget,
                                        object->id,
                                        object->settings);
                break;
        case PANEL_OBJECT_LAUNCHER:
                launcher_load (panel_widget,
                               object->id,
                               object->settings);
                break;
        case PANEL_OBJECT_ACTION:
                panel_action_button_load (panel_widget,
                                          object->id,
                                          object->settings,
                                          object_type_detail);
                break;
        case PANEL_OBJECT_MENU_BAR:
                panel_menu_bar_load (panel_widget,
                                     object->id,
                                     object->settings);
                break;
        case PANEL_OBJECT_SEPARATOR:
                panel_separator_load (panel_widget,
                                      object->id,
                                      object->settings);
                break;
        case PANEL_OBJECT_USER_MENU:
                panel_user_menu_load (panel_widget,
                                      object->id,
                                      object->settings);
                break;
        default:
                g_assert_not_reached ();
                break;
        }

        /* We load applets asynchronously, so we specifically don't call
         * panel_object_loader_stop_loading() for this type. */
        if (object_type != PANEL_OBJECT_APPLET)
                panel_object_loader_stop_loading (object->id);

        return TRUE;
}