diff options
author | Simon Steinbeiss <simon.steinbeiss@elfenbeinturm.at> | 2019-05-11 00:12:01 +0200 |
---|---|---|
committer | Simon Steinbeiss <simon.steinbeiss@elfenbeinturm.at> | 2019-05-13 22:10:28 +0200 |
commit | 38b5353a1b682cb5d88a779e3d46fa24d852db69 (patch) | |
tree | 5ae5364de2fde2c5034c659930193614eccb7f79 /libxfsm | |
parent | baa7a70003751689e837048647722808fa67db6a (diff) | |
download | xfce4-session-38b5353a1b682cb5d88a779e3d46fa24d852db69.tar.gz |
Show saved sessions in settings dialog
Diffstat (limited to 'libxfsm')
-rw-r--r-- | libxfsm/xfsm-util.c | 181 | ||||
-rw-r--r-- | libxfsm/xfsm-util.h | 32 |
2 files changed, 213 insertions, 0 deletions
diff --git a/libxfsm/xfsm-util.c b/libxfsm/xfsm-util.c index 48f77fec..c4189205 100644 --- a/libxfsm/xfsm-util.c +++ b/libxfsm/xfsm-util.c @@ -201,3 +201,184 @@ xfsm_gdk_display_get_fullname (GdkDisplay *display) return g_strdup (buffer); } + +GdkPixbuf * +xfsm_load_session_preview (const gchar *name) +{ + GdkDisplay *display; + GdkPixbuf *pb = NULL; + gchar *display_name; + gchar *filename; + gchar *path; + + /* determine thumb file */ + display = gdk_display_get_default (); + display_name = xfsm_gdk_display_get_fullname (display); + path = g_strconcat ("sessions/thumbs-", display_name, "/", name, ".png", NULL); + filename = xfce_resource_lookup (XFCE_RESOURCE_CACHE, path); + g_free (display_name); + g_free (path); + + if (filename != NULL) + pb = gdk_pixbuf_new_from_file (filename, NULL); + g_free (filename); + + return pb; +} + +XfceRc * +settings_list_sessions_open_rc (void) +{ + XfceRc *rc; + gchar *display_name; + gchar *resource_name; + gchar *session_file; + + display_name = xfsm_gdk_display_get_fullname (gdk_display_get_default ()); + resource_name = g_strconcat ("sessions/xfce4-session-", display_name, NULL); + session_file = xfce_resource_save_location (XFCE_RESOURCE_CACHE, resource_name, TRUE); + g_free (resource_name); + g_free (display_name); + + if (!g_file_test (session_file, G_FILE_TEST_IS_REGULAR)) + { + g_warning ("xfsm_manager_load_session: Something wrong with %s, Does it exist? Permissions issue?", session_file); + return FALSE; + } + + rc = xfce_rc_simple_open (session_file, FALSE); + if (G_UNLIKELY (rc == NULL)) + { + g_warning ("xfsm_manager_load_session: unable to open %s", session_file); + return FALSE; + } + return rc; +} + +GList * +settings_list_sessions (XfceRc *rc) +{ + XfsmSessionInfo *session; + GdkPixbuf *preview_default = NULL; + GList *sessions = NULL; + gchar **groups; + gint n; + + groups = xfce_rc_get_groups (rc); + for (n = 0; groups[n] != NULL; ++n) + { + if (strncmp (groups[n], "Session: ", 9) == 0) + { + xfce_rc_set_group (rc, groups[n]); + session = g_new0 (XfsmSessionInfo, 1); + session->name = g_strdup (groups[n] + 9); + session->atime = xfce_rc_read_int_entry (rc, "LastAccess", 0); + session->preview = xfsm_load_session_preview (session->name); + + if (session->preview == NULL) + { + if (G_UNLIKELY (preview_default == NULL)) + { + preview_default = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), + "xfce4-logo", 64, + GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL); + } + + session->preview = GDK_PIXBUF (g_object_ref (preview_default)); + } + + sessions = g_list_append (sessions, session); + } + } + + if (preview_default != NULL) + g_object_unref (preview_default); + + g_strfreev (groups); + + return sessions; +} + +void +settings_list_sessions_treeview_init (GtkTreeView *treeview) +{ + GtkTreeSelection *selection; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkListStore *model; + + model = gtk_list_store_new (N_COLUMNS, + GDK_TYPE_PIXBUF, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_INT); + + gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (model)); + g_object_unref (G_OBJECT (model)); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE); + column = gtk_tree_view_column_new (); + renderer = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_set_attributes (column, renderer, + "pixbuf", PREVIEW_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + + column = gtk_tree_view_column_new (); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_set_title (column, _("Session")); + gtk_tree_view_column_pack_start (column, renderer, TRUE); + gtk_tree_view_column_set_expand (column, TRUE); + gtk_tree_view_column_set_attributes (column, renderer, + "markup", TITLE_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + + column = gtk_tree_view_column_new (); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_set_alignment (column, 1.0); + gtk_tree_view_column_set_title (column, _("Last accessed")); + gtk_tree_view_column_pack_start (column, renderer, TRUE); + gtk_tree_view_column_set_attributes (column, renderer, + "text", ACCESSED_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); +} + +void +settings_list_sessions_populate (GtkTreeModel *model, + GList *sessions) +{ + XfsmSessionInfo *session; + GtkTreeIter iter; + gchar *accessed; + gchar *title; + GList *lp; + + gtk_list_store_clear (GTK_LIST_STORE (model)); + + for (lp = sessions; lp != NULL; lp = lp->next) + { + session = (XfsmSessionInfo *) lp->data; + + title = g_strdup_printf ("<b>%s</b>", session->name); + accessed = g_strstrip (g_strdup (ctime (&session->atime))); + + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + PREVIEW_COLUMN, session->preview, + NAME_COLUMN, session->name, + TITLE_COLUMN, title, + ACCESSED_COLUMN, accessed, + ATIME_COLUMN, session->atime, + -1); + + g_free (accessed); + g_free (title); + } +} diff --git a/libxfsm/xfsm-util.h b/libxfsm/xfsm-util.h index 9d545fc3..86d76685 100644 --- a/libxfsm/xfsm-util.h +++ b/libxfsm/xfsm-util.h @@ -31,6 +31,28 @@ G_BEGIN_DECLS; +#define DEFAULT_SESSION_NAME "Default" + +typedef struct _XfsmSessionInfo XfsmSessionInfo; + +struct _XfsmSessionInfo +{ + gchar *name; /* name of the session */ + time_t atime; /* last access time */ + GdkPixbuf *preview; /* preview icon (52x42) */ +}; + +enum +{ + PREVIEW_COLUMN, + NAME_COLUMN, + TITLE_COLUMN, + ACCESSED_COLUMN, + ATIME_COLUMN, + N_COLUMNS, +}; + + gboolean xfsm_start_application (gchar **command, gchar **environment, GdkScreen *screen, @@ -49,6 +71,16 @@ XfconfChannel *xfsm_open_config (void); gchar *xfsm_gdk_display_get_fullname (GdkDisplay *display); +GdkPixbuf *xfsm_load_session_preview (const gchar *name); + +XfceRc *settings_list_sessions_open_rc (void); + +GList *settings_list_sessions (XfceRc *rc); + +void settings_list_sessions_treeview_init (GtkTreeView *treeview); + +void settings_list_sessions_populate (GtkTreeModel *model, + GList *sessions); G_END_DECLS; |