/** * gs_plugin_loader_app_action: **/ gboolean gs_plugin_loader_app_action (GsPluginLoader *plugin_loader, GsApp *app, GsPluginLoaderAction action, GCancellable *cancellable, GError **error) { GsPluginLoaderHelper helper; /* create temp object */ helper.context = g_main_context_new (); helper.loop = g_main_loop_new (helper.context, FALSE); helper.error = error; g_main_context_push_thread_default (helper.context); /* run async method */ gs_plugin_loader_app_action_async (plugin_loader, app, action, cancellable, (GAsyncReadyCallback) gs_plugin_loader_app_action_finish_sync, &helper); g_main_loop_run (helper.loop); g_main_context_pop_thread_default (helper.context); g_main_loop_unref (helper.loop); g_main_context_unref (helper.context); return helper.ret; }
void gs_page_update_app (GsPage *page, GsApp *app, GCancellable *cancellable) { GsPagePrivate *priv = gs_page_get_instance_private (page); GsPageHelper *helper; /* non-firmware applications do not have to be prepared */ helper = g_slice_new0 (GsPageHelper); helper->action = GS_PLUGIN_ACTION_UPDATE; helper->app = g_object_ref (app); helper->page = g_object_ref (page); helper->cancellable = g_object_ref (cancellable); /* tell the user what they have to do */ if (gs_app_get_kind (app) == AS_APP_KIND_FIRMWARE && gs_app_has_quirk (app, AS_APP_QUIRK_NEEDS_USER_ACTION)) { GPtrArray *screenshots = gs_app_get_screenshots (app); if (screenshots->len > 0) { AsScreenshot *ss = g_ptr_array_index (screenshots, 0); if (as_screenshot_get_caption (ss, NULL) != NULL) { gs_page_needs_user_action (helper, ss); return; } } } /* generic fallback */ gs_plugin_loader_app_action_async (priv->plugin_loader, helper->app, helper->action, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, helper->cancellable, gs_page_app_installed_cb, helper); }
void gs_page_install_app (GsPage *page, GsApp *app, GsShellInteraction interaction, GCancellable *cancellable) { GsPagePrivate *priv = gs_page_get_instance_private (page); GsPageHelper *helper; GtkResponseType response; /* probably non-free */ if (gs_app_get_state (app) == AS_APP_STATE_UNAVAILABLE) { response = gs_app_notify_unavailable (app, gs_shell_get_window (priv->shell)); if (response != GTK_RESPONSE_OK) return; } helper = g_slice_new0 (GsPageHelper); helper->action = GS_PLUGIN_ACTION_INSTALL; helper->app = g_object_ref (app); helper->page = g_object_ref (page); helper->cancellable = g_object_ref (cancellable); helper->interaction = interaction; gs_plugin_loader_app_action_async (priv->plugin_loader, app, helper->action, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, helper->cancellable, gs_page_app_installed_cb, helper); }
void gs_page_shortcut_remove (GsPage *page, GsApp *app, GCancellable *cancellable) { GsPagePrivate *priv = gs_page_get_instance_private (page); gs_plugin_loader_app_action_async (priv->plugin_loader, app, GS_PLUGIN_ACTION_REMOVE_SHORTCUT, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, cancellable, gs_page_app_shortcut_removed_cb, NULL); }
void gs_page_launch_app (GsPage *page, GsApp *app, GCancellable *cancellable) { GsPagePrivate *priv = gs_page_get_instance_private (page); gs_plugin_loader_app_action_async (priv->plugin_loader, app, GS_PLUGIN_ACTION_LAUNCH, GS_PLUGIN_FAILURE_FLAGS_USE_EVENTS, cancellable, gs_page_app_launched_cb, NULL); }
static void gs_page_install_authenticate_cb (GtkDialog *dialog, GtkResponseType response_type, GsPageHelper *helper) { GsPagePrivate *priv = gs_page_get_instance_private (helper->page); /* unmap the dialog */ gtk_widget_destroy (GTK_WIDGET (dialog)); if (response_type != GTK_RESPONSE_OK) { gs_page_helper_free (helper); return; } gs_plugin_loader_app_action_async (priv->plugin_loader, helper->app, GS_PLUGIN_ACTION_INSTALL, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, helper->cancellable, gs_page_app_installed_cb, helper); }
static void gs_page_remove_app_response_cb (GtkDialog *dialog, gint response, GsPageHelper *helper) { GsPagePrivate *priv = gs_page_get_instance_private (helper->page); /* unmap the dialog */ gtk_widget_destroy (GTK_WIDGET (dialog)); /* not agreed */ if (response != GTK_RESPONSE_OK) { gs_page_helper_free (helper); return; } g_debug ("remove %s", gs_app_get_id (helper->app)); gs_plugin_loader_app_action_async (priv->plugin_loader, helper->app, helper->action, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, helper->cancellable, gs_page_app_removed_cb, helper); }
void gs_page_remove_app (GsPage *page, GsApp *app, GCancellable *cancellable) { GsPagePrivate *priv = gs_page_get_instance_private (page); GsPageHelper *helper; GtkWidget *dialog; g_autofree gchar *message = NULL; g_autofree gchar *title = NULL; /* pending install */ helper = g_slice_new0 (GsPageHelper); helper->action = GS_PLUGIN_ACTION_REMOVE; helper->app = g_object_ref (app); helper->page = g_object_ref (page); helper->cancellable = g_object_ref (cancellable); if (gs_app_get_state (app) == AS_APP_STATE_QUEUED_FOR_INSTALL) { g_debug ("remove %s", gs_app_get_id (app)); gs_plugin_loader_app_action_async (priv->plugin_loader, app, GS_PLUGIN_ACTION_REMOVE, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, helper->cancellable, gs_page_app_removed_cb, helper); return; } /* use different name and summary */ switch (gs_app_get_kind (app)) { case AS_APP_KIND_SOURCE: /* TRANSLATORS: this is a prompt message, and '%s' is an * source name, e.g. 'GNOME Nightly' */ title = g_strdup_printf (_("Are you sure you want to remove " "the %s source?"), gs_app_get_name (app)); /* TRANSLATORS: longer dialog text */ message = g_strdup_printf (_("All applications from %s will be " "removed, and you will have to " "re-install the source to use them again."), gs_app_get_name (app)); break; default: /* TRANSLATORS: this is a prompt message, and '%s' is an * application summary, e.g. 'GNOME Clocks' */ title = g_strdup_printf (_("Are you sure you want to remove %s?"), gs_app_get_name (app)); /* TRANSLATORS: longer dialog text */ message = g_strdup_printf (_("%s will be removed, and you will " "have to install it to use it again."), gs_app_get_name (app)); break; } /* ask for confirmation */ dialog = gtk_message_dialog_new (gs_shell_get_window (priv->shell), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_CANCEL, "%s", title); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", message); /* TRANSLATORS: this is button text to remove the application */ gtk_dialog_add_button (GTK_DIALOG (dialog), _("Remove"), GTK_RESPONSE_OK); /* handle this async */ g_signal_connect (dialog, "response", G_CALLBACK (gs_page_remove_app_response_cb), helper); gs_shell_modal_dialog_present (priv->shell, GTK_DIALOG (dialog)); }