From 17b91ddf706b64531f236c6efdedfdd7e711db46 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Tue, 28 Jan 2025 12:33:50 -0800 Subject: [PATCH] sysprof/greeter: load/save recording template for persistence This sets things up to save the state to disk if the greeter suceeded at creating a profiler instance so that it may be used again on the next run. Additionally, when loading the greeter it attempts to load from disk the saved state. We may want to extend this in the future to allow using sysprof-cli with a recording template instead of command line options. --- src/sysprof/sysprof-greeter.c | 49 +++++++++++++++++++++++++++++++--- src/sysprof/sysprof-greeter.ui | 6 +++-- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/sysprof/sysprof-greeter.c b/src/sysprof/sysprof-greeter.c index f72f2317..6dd975b1 100644 --- a/src/sysprof/sysprof-greeter.c +++ b/src/sysprof/sysprof-greeter.c @@ -41,6 +41,7 @@ struct _SysprofGreeter AdwWindow parent_instance; GtkStringList *envvars; + SysprofRecordingTemplate *recording_template; AdwViewStack *view_stack; GtkListBox *sidebar_list_box; @@ -60,10 +61,35 @@ struct _SysprofGreeter AdwComboRow *sample_user_stack_size; AdwExpanderRow *user_stacks; GtkLabel *user_stacks_caption; - SysprofRecordingTemplate *recording_template; }; -G_DEFINE_FINAL_TYPE (SysprofGreeter, sysprof_greeter, ADW_TYPE_WINDOW) +static GFile * +get_state_file (void) +{ + return g_file_new_build_filename (g_get_user_data_dir (), APP_ID_S, "recording-template.json", NULL); +} + +static GObject * +sysprof_greeter_get_internal_child (GtkBuildable *buildable, + GtkBuilder *builder, + const char *name) +{ + SysprofGreeter *self = SYSPROF_GREETER (buildable); + + if (g_strcmp0 (name, "template") == 0) + return G_OBJECT (self->recording_template); + + return NULL; +} + +static void +buildable_iface_init (GtkBuildableIface *iface) +{ + iface->get_internal_child = sysprof_greeter_get_internal_child; +} + +G_DEFINE_FINAL_TYPE_WITH_CODE (SysprofGreeter, sysprof_greeter, ADW_TYPE_WINDOW, + G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, buildable_iface_init)) #define STRV_INIT(...) (const char * const[]){__VA_ARGS__,NULL} @@ -179,6 +205,8 @@ sysprof_greeter_create_profiler (SysprofGreeter *self, GError **error) { g_autoptr(SysprofProfiler) profiler = NULL; + g_autoptr(GFile) state_file = NULL; + g_autoptr(GFile) dir = NULL; GtkStringObject *strobj; const char *str; @@ -193,6 +221,17 @@ sysprof_greeter_create_profiler (SysprofGreeter *self, if (!(profiler = sysprof_recording_template_apply (self->recording_template, error))) return NULL; + state_file = get_state_file (); + dir = g_file_get_parent (state_file); + + if (!g_file_query_exists (dir, NULL)) + { + const char *path = g_file_peek_path (dir); + g_mkdir_with_parents (path, 0750); + } + + sysprof_recording_template_save (self->recording_template, state_file, NULL); + return g_steal_pointer (&profiler); } @@ -487,6 +526,7 @@ sysprof_greeter_dispose (GObject *object) gtk_widget_dispose_template (GTK_WIDGET (self), SYSPROF_TYPE_GREETER); g_clear_object (&self->envvars); + g_clear_object (&self->recording_template); G_OBJECT_CLASS (sysprof_greeter_parent_class)->dispose (object); } @@ -513,7 +553,6 @@ sysprof_greeter_class_init (SysprofGreeterClass *klass) gtk_widget_class_bind_template_child (widget_class, SysprofGreeter, record_system_bus); gtk_widget_class_bind_template_child (widget_class, SysprofGreeter, record_system_logs); gtk_widget_class_bind_template_child (widget_class, SysprofGreeter, record_to_memory); - gtk_widget_class_bind_template_child (widget_class, SysprofGreeter, recording_template); gtk_widget_class_bind_template_child (widget_class, SysprofGreeter, sample_javascript_stacks); gtk_widget_class_bind_template_child (widget_class, SysprofGreeter, sample_native_stacks); gtk_widget_class_bind_template_child (widget_class, SysprofGreeter, sample_user_stack_size); @@ -541,8 +580,12 @@ static void sysprof_greeter_init (SysprofGreeter *self) { g_autoptr(GListModel) power_profiles = sysprof_power_profiles_new (); + g_autoptr(GFile) state_file = get_state_file (); GtkListBoxRow *row; + if (!(self->recording_template = sysprof_recording_template_new_from_file (state_file, NULL))) + self->recording_template = sysprof_recording_template_new (); + gtk_widget_init_template (GTK_WIDGET (self)); adw_combo_row_set_model (self->power_combo, power_profiles); diff --git a/src/sysprof/sysprof-greeter.ui b/src/sysprof/sysprof-greeter.ui index 6b6ed1b9..cc91087c 100644 --- a/src/sysprof/sysprof-greeter.ui +++ b/src/sysprof/sysprof-greeter.ui @@ -666,6 +666,10 @@ + + + +
@@ -695,8 +699,6 @@
- -