/** * gs_app_row_get_description: * * Return value: PangoMarkup **/ static GString * gs_app_row_get_description (GsAppRow *app_row) { GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); const gchar *tmp = NULL; /* convert the markdown update description into PangoMarkup */ if (priv->show_update && (gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE || gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE_LIVE)) { tmp = gs_app_get_update_details (priv->app); if (tmp != NULL && tmp[0] != '\0') return g_string_new (tmp); } /* if missing summary is set, return it without escaping in order to * correctly show hyperlinks */ if (gs_app_get_state (priv->app) == AS_APP_STATE_UNAVAILABLE) { tmp = gs_app_get_summary_missing (priv->app); if (tmp != NULL && tmp[0] != '\0') return g_string_new (tmp); } /* try all these things in order */ if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) tmp = gs_app_get_description (priv->app); if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) tmp = gs_app_get_summary (priv->app); if (tmp == NULL || (tmp != NULL && tmp[0] == '\0')) tmp = gs_app_get_name (priv->app); if (tmp == NULL) return NULL; return g_string_new (tmp); }
static gboolean app_state_changed_idle (gpointer user_data) { GsFeatureTile *tile = GS_FEATURE_TILE (user_data); AtkObject *accessible; g_autofree gchar *name = NULL; accessible = gtk_widget_get_accessible (GTK_WIDGET (tile)); switch (gs_app_get_state (tile->app)) { case AS_APP_STATE_INSTALLED: case AS_APP_STATE_INSTALLING: case AS_APP_STATE_REMOVING: case AS_APP_STATE_UPDATABLE: case AS_APP_STATE_UPDATABLE_LIVE: name = g_strdup_printf ("%s (%s)", gs_app_get_name (tile->app), _("Installed")); break; case AS_APP_STATE_AVAILABLE: default: name = g_strdup (gs_app_get_name (tile->app)); break; } if (GTK_IS_ACCESSIBLE (accessible)) { atk_object_set_name (accessible, name); atk_object_set_description (accessible, gs_app_get_summary (tile->app)); } g_object_unref (tile); return G_SOURCE_REMOVE; }
static GsApp * gs_plugin_generic_updates_get_os_update (GsPlugin *plugin) { GsApp *app; const gchar *id = "org.gnome.Software.OsUpdate"; g_autoptr(AsIcon) ic = NULL; /* create new */ app = gs_app_new (id); gs_app_add_quirk (app, GS_APP_QUIRK_IS_PROXY); gs_app_set_management_plugin (app, ""); gs_app_set_kind (app, AS_APP_KIND_OS_UPDATE); gs_app_set_state (app, AS_APP_STATE_UPDATABLE_LIVE); gs_app_set_name (app, GS_APP_QUALITY_NORMAL, /* TRANSLATORS: this is a group of updates that are not * packages and are not shown in the main list */ _("OS Updates")); gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, /* TRANSLATORS: this is a longer description of the * "OS Updates" string */ _("Includes performance, stability and security improvements.")); gs_app_set_description (app, GS_APP_QUALITY_NORMAL, gs_app_get_summary (app)); ic = as_icon_new (); as_icon_set_kind (ic, AS_ICON_KIND_STOCK); as_icon_set_name (ic, "software-update-available-symbolic"); gs_app_add_icon (app, ic); return app; }
void gs_app_tile_set_app (GsAppTile *tile, GsApp *app) { GsAppTilePrivate *priv; const gchar *summary; g_return_if_fail (GS_IS_APP_TILE (tile)); g_return_if_fail (GS_IS_APP (app) || app == NULL); priv = gs_app_tile_get_instance_private (tile); gtk_image_clear (GTK_IMAGE (priv->image)); gtk_image_set_pixel_size (GTK_IMAGE (priv->image), 64); if (priv->app) g_signal_handlers_disconnect_by_func (priv->app, app_state_changed, tile); g_clear_object (&priv->app); if (!app) return; priv->app = g_object_ref (app); if (gs_app_get_rating_kind (priv->app) == GS_APP_RATING_KIND_USER) { gs_star_widget_set_rating (GS_STAR_WIDGET (priv->stars), GS_APP_RATING_KIND_USER, gs_app_get_rating (priv->app)); } else { gs_star_widget_set_rating (GS_STAR_WIDGET (priv->stars), GS_APP_RATING_KIND_KUDOS, gs_app_get_kudos_percentage (priv->app)); } gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "content"); g_signal_connect (priv->app, "notify::state", G_CALLBACK (app_state_changed), tile); app_state_changed (priv->app, NULL, tile); gs_image_set_from_pixbuf (GTK_IMAGE (priv->image), gs_app_get_pixbuf (app)); gtk_label_set_label (GTK_LABEL (priv->name), gs_app_get_name (app)); summary = gs_app_get_summary (app); gtk_label_set_label (GTK_LABEL (priv->summary), summary); gtk_widget_set_visible (priv->summary, summary && summary[0]); }
static gboolean app_state_changed_idle (gpointer user_data) { GsPopularTile *tile = GS_POPULAR_TILE (user_data); AtkObject *accessible; GtkWidget *label; gboolean installed; g_autofree gchar *name = NULL; accessible = gtk_widget_get_accessible (GTK_WIDGET (tile)); label = gtk_bin_get_child (GTK_BIN (tile->eventbox)); switch (gs_app_get_state (tile->app)) { case AS_APP_STATE_INSTALLED: case AS_APP_STATE_INSTALLING: case AS_APP_STATE_REMOVING: case AS_APP_STATE_UPDATABLE: case AS_APP_STATE_UPDATABLE_LIVE: installed = TRUE; name = g_strdup_printf ("%s (%s)", gs_app_get_name (tile->app), _("Installed")); /* TRANSLATORS: this is the small blue label on the tile * that tells the user the application is installed */ gtk_label_set_label (GTK_LABEL (label), _("Installed")); break; case AS_APP_STATE_AVAILABLE: default: installed = FALSE; name = g_strdup (gs_app_get_name (tile->app)); break; } gtk_widget_set_visible (tile->eventbox, installed); if (GTK_IS_ACCESSIBLE (accessible)) { atk_object_set_name (accessible, name); atk_object_set_description (accessible, gs_app_get_summary (tile->app)); } g_object_unref (tile); return G_SOURCE_REMOVE; }
/** * gs_plugin_app_install: */ gboolean gs_plugin_app_install (GsPlugin *plugin, GsApp *app, GCancellable *cancellable, GError **error) { AsIcon *icon; gboolean ret = TRUE; gsize kf_length; g_autoptr(GError) error_local = NULL; g_autofree gchar *app_desktop = NULL; g_autofree gchar *epi_desktop = NULL; g_autofree gchar *epi_dir = NULL; g_autofree gchar *epi_icon = NULL; g_autofree gchar *exec = NULL; g_autofree gchar *hash = NULL; g_autofree gchar *id_nonfull = NULL; g_autofree gchar *kf_data = NULL; g_autofree gchar *wmclass = NULL; g_autoptr(GKeyFile) kf = NULL; g_autoptr(GFile) symlink_desktop = NULL; g_autoptr(GFile) symlink_icon = NULL; /* only process web apps */ if (gs_app_get_id_kind (app) != AS_ID_KIND_WEB_APP) return TRUE; /* create the correct directory */ id_nonfull = _gs_app_get_id_nonfull (app); hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, gs_app_get_name (app), -1); epi_dir = g_strdup_printf ("%s/epiphany/app-%s-%s", g_get_user_config_dir (), id_nonfull, hash); g_mkdir_with_parents (epi_dir, 0755); /* symlink icon */ epi_icon = g_build_filename (epi_dir, "app-icon.png", NULL); symlink_icon = g_file_new_for_path (epi_icon); icon = gs_app_get_icon (app); ret = g_file_make_symbolic_link (symlink_icon, as_icon_get_filename (icon), NULL, &error_local); if (!ret) { if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_EXISTS)) { g_debug ("ignoring icon symlink failure: %s", error_local->message); } else { g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "Can't symlink icon: %s", error_local->message); return FALSE; } } /* add desktop file */ wmclass = g_strdup_printf ("%s-%s", id_nonfull, hash); kf = g_key_file_new (); g_key_file_set_string (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, gs_app_get_name (app)); g_key_file_set_string (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, gs_app_get_summary (app)); exec = g_strdup_printf ("epiphany --application-mode --profile=\"%s\" %s", epi_dir, gs_app_get_url (app, AS_URL_KIND_HOMEPAGE)); g_key_file_set_string (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, exec); g_key_file_set_boolean (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY, TRUE); g_key_file_set_boolean (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, FALSE); g_key_file_set_boolean (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, FALSE); g_key_file_set_string (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, G_KEY_FILE_DESKTOP_TYPE_APPLICATION); g_key_file_set_string (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, epi_icon); g_key_file_set_string (kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS, wmclass); /* save keyfile */ kf_data = g_key_file_to_data (kf, &kf_length, error); if (kf_data == NULL) return FALSE; epi_desktop = g_strdup_printf ("%s/%s.desktop", epi_dir, wmclass); if (!g_file_set_contents (epi_desktop, kf_data, kf_length, error)) return FALSE; /* symlink it to somewhere the shell will notice */ app_desktop = g_build_filename (g_get_user_data_dir (), "applications", gs_app_get_id (app), NULL); symlink_desktop = g_file_new_for_path (app_desktop); ret = g_file_make_symbolic_link (symlink_desktop, epi_desktop, NULL, error); if (!ret) return FALSE; /* update state */ gs_app_set_state (app, AS_APP_STATE_INSTALLING); gs_app_set_state (app, AS_APP_STATE_INSTALLED); return TRUE; }
void gs_feature_tile_set_app (GsFeatureTile *tile, GsApp *app) { const gchar *background; const gchar *stroke_color; const gchar *text_color; const gchar *text_shadow; g_autoptr(GString) data = NULL; g_return_if_fail (GS_IS_FEATURE_TILE (tile)); g_return_if_fail (GS_IS_APP (app) || app == NULL); if (tile->app) g_signal_handlers_disconnect_by_func (tile->app, app_state_changed, tile); g_set_object (&tile->app, app); if (!app) return; gtk_stack_set_visible_child_name (GTK_STACK (tile->stack), "content"); g_signal_connect (tile->app, "notify::state", G_CALLBACK (app_state_changed), tile); app_state_changed (tile->app, NULL, tile); gtk_label_set_label (GTK_LABEL (tile->title), gs_app_get_name (app)); gtk_label_set_label (GTK_LABEL (tile->subtitle), gs_app_get_summary (app)); /* check the app has the featured data */ text_color = gs_app_get_metadata_item (app, "Featured::text-color"); if (text_color == NULL) { g_autofree gchar *tmp = NULL; tmp = gs_app_to_string (app); g_warning ("%s has no featured data: %s", gs_app_get_id (app), tmp); return; } background = gs_app_get_metadata_item (app, "Featured::background"); stroke_color = gs_app_get_metadata_item (app, "Featured::stroke-color"); text_shadow = gs_app_get_metadata_item (app, "Featured::text-shadow"); data = g_string_sized_new (1024); g_string_append (data, ".featured-tile {\n"); g_string_append_printf (data, " border-color: %s;\n", stroke_color); if (text_shadow != NULL) g_string_append_printf (data, " text-shadow: %s;\n", text_shadow); g_string_append_printf (data, " color: %s;\n", text_color); g_string_append (data, " -GtkWidget-focus-padding: 0;\n"); g_string_append_printf (data, " outline-color: alpha(%s, 0.75);\n", text_color); g_string_append (data, " outline-style: dashed;\n"); g_string_append (data, " outline-offset: 2px;\n"); g_string_append_printf (data, " background: %s;\n", background); g_string_append (data, "}\n"); g_string_append (data, ".featured-tile:hover {\n"); g_string_append (data, " background: linear-gradient(to bottom,\n"); g_string_append (data, " alpha(#fff,0.16),\n"); g_string_append_printf (data, " alpha(#aaa,0.16)), %s;\n", background); g_string_append (data, "}\n"); gtk_css_provider_load_from_data (tile->provider, data->str, -1, NULL); }