From 2c08b404ffb50d9e7c724d2c6121cf75a5f3188b Mon Sep 17 00:00:00 2001 From: varunrmallya Date: Mon, 24 Mar 2025 16:56:34 +0000 Subject: [PATCH] sysprof/greeter: use GtkFileDialog to select debug directories --- src/sysprof/sysprof-greeter.c | 119 +++++++++++++++-------- src/sysprof/sysprof-greeter.ui | 21 +--- src/sysprof/sysprof-recording-template.c | 1 + 3 files changed, 85 insertions(+), 56 deletions(-) diff --git a/src/sysprof/sysprof-greeter.c b/src/sysprof/sysprof-greeter.c index dc48c2d1..97df02cd 100644 --- a/src/sysprof/sysprof-greeter.c +++ b/src/sysprof/sysprof-greeter.c @@ -171,26 +171,6 @@ failure: sysprof_entry_popover_set_message (popover, errstr); } -static void -on_debug_dir_entry_changed_cb (SysprofGreeter *self, - SysprofEntryPopover *popover) -{ - const char *errstr = NULL; - gboolean valid = FALSE; - const char *text; - - g_assert (SYSPROF_IS_GREETER (self)); - g_assert (SYSPROF_IS_ENTRY_POPOVER (popover)); - - text = sysprof_entry_popover_get_text (popover); - - if (!(valid = g_file_test (text, G_FILE_TEST_IS_DIR))) - errstr = _("Directory does not exist"); - - sysprof_entry_popover_set_ready (popover, valid); - sysprof_entry_popover_set_message (popover, errstr); -} - static void on_env_entry_activate_cb (SysprofGreeter *self, const char *text, @@ -204,19 +184,6 @@ on_env_entry_activate_cb (SysprofGreeter *self, sysprof_entry_popover_set_text (popover, ""); } -static void -on_debug_dir_entry_activate_cb (SysprofGreeter *self, - const char *text, - SysprofEntryPopover *popover) -{ - g_assert (SYSPROF_IS_GREETER (self)); - g_assert (SYSPROF_IS_ENTRY_POPOVER (popover)); - g_assert (GTK_IS_STRING_LIST (self->debugdirs)); - - gtk_string_list_append (self->debugdirs, text); - sysprof_entry_popover_set_text (popover, ""); -} - static void sysprof_greeter_record_cb (GObject *object, GAsyncResult *result, @@ -264,7 +231,7 @@ sysprof_greeter_create_profiler (SysprofGreeter *self, { g_autoptr(GStrvBuilder) envvars_builder = NULL; g_auto(GStrv) envvars_list = NULL; - + envvars_builder = g_strv_builder_new (); for (guint i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (self->envvars)); i++) @@ -383,6 +350,45 @@ sysprof_greeter_choose_file_for_record_cb (GObject *object, sysprof_greeter_record_cb, g_object_ref (self)); } + else + { + AdwDialog *alert_dialog; + + alert_dialog = adw_alert_dialog_new (_("Must Capture to Local File"), NULL); + adw_alert_dialog_format_body (ADW_ALERT_DIALOG (alert_dialog), + _("You must choose a local file to capture using Sysprof")); + adw_alert_dialog_add_responses (ADW_ALERT_DIALOG (alert_dialog), + "close", _("Close"), + NULL); + adw_alert_dialog_set_close_response (ADW_ALERT_DIALOG (alert_dialog), "cancel"); + adw_alert_dialog_choose (ADW_ALERT_DIALOG (alert_dialog), GTK_WIDGET (self), + NULL, (GAsyncReadyCallback) sysprof_greeter_choose_file_for_record_cb, self); + } + } +} + +static void +sysprof_greeter_choose_folder_for_debug_dir (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GtkFileDialog *dialog = (GtkFileDialog *)object; + g_autoptr(SysprofGreeter) self = user_data; + g_autoptr(GError) error = NULL; + g_autoptr(GFile) file = NULL; + + g_assert (GTK_IS_FILE_DIALOG (dialog)); + g_assert (G_IS_ASYNC_RESULT (result)); + g_assert (SYSPROF_IS_GREETER (self)); + g_assert (GTK_IS_STRING_LIST (self->debugdirs)); + + if ((file = gtk_file_dialog_select_folder_finish (dialog, result, &error))) + { + if (g_file_is_native (file)) + { + const char *path = g_file_peek_path (file); + gtk_string_list_append (self->debugdirs, path); + } else { GtkWidget *message; @@ -390,8 +396,8 @@ sysprof_greeter_choose_file_for_record_cb (GObject *object, G_GNUC_BEGIN_IGNORE_DEPRECATIONS message = adw_message_dialog_new (NULL, - _("Must Capture to Local File"), - _("You must choose a local file to capture using Sysprof")); + _("Must Select Local Folder"), + _("You must choose a local folder to add as a debug directory")); adw_message_dialog_add_response (ADW_MESSAGE_DIALOG (message), "close", _("Close")); gtk_window_present (GTK_WINDOW (message)); @@ -400,6 +406,27 @@ sysprof_greeter_choose_file_for_record_cb (GObject *object, } } +static void +sysprof_greeter_select_debug_directory (GtkWidget *widget, + const char *action_name, + GVariant *param) +{ + SysprofGreeter *self = (SysprofGreeter *)widget; + g_autoptr(GtkFileDialog) dialog = NULL; + + g_assert (SYSPROF_IS_GREETER (self)); + + dialog = gtk_file_dialog_new (); + gtk_file_dialog_set_title (dialog, _("Add debug directory")); + gtk_file_dialog_set_accept_label (dialog, _("Add _Directory")); + gtk_file_dialog_set_modal (dialog, TRUE); + gtk_file_dialog_select_folder (dialog, + GTK_WINDOW (self), + NULL, + sysprof_greeter_choose_folder_for_debug_dir, + g_object_ref (self)); +} + static void sysprof_greeter_record_to_file_action (GtkWidget *widget, const char *action_name, @@ -719,10 +746,9 @@ sysprof_greeter_class_init (SysprofGreeterClass *klass) gtk_widget_class_bind_template_callback (widget_class, get_file_path); gtk_widget_class_bind_template_callback (widget_class, on_env_entry_activate_cb); gtk_widget_class_bind_template_callback (widget_class, on_env_entry_changed_cb); - gtk_widget_class_bind_template_callback (widget_class, on_debug_dir_entry_changed_cb); - gtk_widget_class_bind_template_callback (widget_class, on_debug_dir_entry_activate_cb); gtk_widget_class_bind_template_callback (widget_class, translate_power_profile); + gtk_widget_class_install_action (widget_class, "system.select-debug-directory", NULL, sysprof_greeter_select_debug_directory); gtk_widget_class_install_action (widget_class, "win.record-to-memory", NULL, sysprof_greeter_record_to_memory_action); gtk_widget_class_install_action (widget_class, "win.record-to-file", NULL, sysprof_greeter_record_to_file_action); gtk_widget_class_install_action (widget_class, "win.select-file", NULL, sysprof_greeter_select_file_action); @@ -751,6 +777,7 @@ sysprof_greeter_init (SysprofGreeter *self) G_CALLBACK (on_env_items_changed_cb), self, G_CONNECT_SWAPPED); + on_env_items_changed_cb (self, 0, 0, 0, G_LIST_MODEL (self->envvars)); g_signal_connect_object (self->debugdirs, @@ -758,6 +785,7 @@ sysprof_greeter_init (SysprofGreeter *self) G_CALLBACK (on_debug_dir_items_changed_cb), self, G_CONNECT_SWAPPED); + on_debug_dir_items_changed_cb (self, 0, 0, 0, G_LIST_MODEL (self->debugdirs)); gtk_list_box_bind_model (self->sidebar_list_box, @@ -784,7 +812,20 @@ sysprof_greeter_init (SysprofGreeter *self) if (environ) { for (guint i = 0; environ[i]; i++) - gtk_string_list_append (self->envvars, environ[i]); + gtk_string_list_append (self->envvars, environ[i]); + } + } + + if (self->recording_template) + { + g_auto(GStrv) debug_directory_list = NULL; + g_object_get (self->recording_template, + "debugdirs", &debug_directory_list, + NULL); + if (debug_directory_list) + { + for (guint i = 0; debug_directory_list[i]; i++) + gtk_string_list_append (self->debugdirs, debug_directory_list[i]); } } diff --git a/src/sysprof/sysprof-greeter.ui b/src/sysprof/sysprof-greeter.ui index 5af1dcc5..d27e6280 100644 --- a/src/sysprof/sysprof-greeter.ui +++ b/src/sysprof/sysprof-greeter.ui @@ -651,29 +651,16 @@ - + - up 12 center - - - Add _Directory - true - - - - - Add Directory - _Add - 400 - - - - + Add _Directory + true + system.select-debug-directory diff --git a/src/sysprof/sysprof-recording-template.c b/src/sysprof/sysprof-recording-template.c index 8b93b684..be517346 100644 --- a/src/sysprof/sysprof-recording-template.c +++ b/src/sysprof/sysprof-recording-template.c @@ -509,6 +509,7 @@ sysprof_recording_template_init (SysprofRecordingTemplate *self) self->command_line = g_strdup (""); self->cwd = g_strdup(""); self->environ = g_strdupv((char * []) { NULL }); + self->debugdirs = g_strdupv((char * []) { NULL }); self->stack_size = DEFAULT_STACK_SIZE; }