diff --git a/src/sysprof/meson.build b/src/sysprof/meson.build index d971be62..1eb06e08 100644 --- a/src/sysprof/meson.build +++ b/src/sysprof/meson.build @@ -1,6 +1,7 @@ sysprof_sources = [ 'main.c', 'sysprof-application.c', + 'sysprof-cpu-info-dialog.c', 'sysprof-files-section.c', 'sysprof-greeter.c', 'sysprof-logs-section.c', diff --git a/src/sysprof/sysprof-cpu-info-dialog.c b/src/sysprof/sysprof-cpu-info-dialog.c new file mode 100644 index 00000000..eabe36e6 --- /dev/null +++ b/src/sysprof/sysprof-cpu-info-dialog.c @@ -0,0 +1,135 @@ +/* sysprof-cpu-info-dialog.c + * + * Copyright 2023 Christian Hergert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "config.h" + +#include "sysprof-cpu-info-dialog.h" + +struct _SysprofCpuInfoDialog +{ + AdwWindow parent_instance; + SysprofDocument *document; +}; + +enum { + PROP_0, + PROP_DOCUMENT, + N_PROPS +}; + +G_DEFINE_FINAL_TYPE (SysprofCpuInfoDialog, sysprof_cpu_info_dialog, ADW_TYPE_WINDOW) + +static GParamSpec *properties [N_PROPS]; + +static void +sysprof_cpu_info_dialog_dispose (GObject *object) +{ + SysprofCpuInfoDialog *self = (SysprofCpuInfoDialog *)object; + + gtk_widget_dispose_template (GTK_WIDGET (self), SYSPROF_TYPE_CPU_INFO_DIALOG); + + g_clear_object (&self->document); + + G_OBJECT_CLASS (sysprof_cpu_info_dialog_parent_class)->dispose (object); +} + +static void +sysprof_cpu_info_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + SysprofCpuInfoDialog *self = SYSPROF_CPU_INFO_DIALOG (object); + + switch (prop_id) + { + case PROP_DOCUMENT: + g_value_set_object (value, sysprof_cpu_info_dialog_get_document (self)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +sysprof_cpu_info_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + SysprofCpuInfoDialog *self = SYSPROF_CPU_INFO_DIALOG (object); + + switch (prop_id) + { + case PROP_DOCUMENT: + sysprof_cpu_info_dialog_set_document (self, g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +sysprof_cpu_info_dialog_class_init (SysprofCpuInfoDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = sysprof_cpu_info_dialog_dispose; + object_class->get_property = sysprof_cpu_info_dialog_get_property; + object_class->set_property = sysprof_cpu_info_dialog_set_property; + + properties [PROP_DOCUMENT] = + g_param_spec_object ("document", NULL, NULL, + SYSPROF_TYPE_DOCUMENT, + (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_properties (object_class, N_PROPS, properties); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/sysprof/sysprof-cpu-info-dialog.ui"); +} + +static void +sysprof_cpu_info_dialog_init (SysprofCpuInfoDialog *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +SysprofDocument * +sysprof_cpu_info_dialog_get_document (SysprofCpuInfoDialog *self) +{ + g_return_val_if_fail (SYSPROF_IS_CPU_INFO_DIALOG (self), NULL); + + return self->document; +} + +void +sysprof_cpu_info_dialog_set_document (SysprofCpuInfoDialog *self, + SysprofDocument *document) +{ + g_return_if_fail (SYSPROF_IS_CPU_INFO_DIALOG (self)); + g_return_if_fail (!document || SYSPROF_IS_DOCUMENT (document)); + + if (g_set_object (&self->document, document)) + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DOCUMENT]); +} + diff --git a/src/sysprof/sysprof-cpu-info-dialog.h b/src/sysprof/sysprof-cpu-info-dialog.h new file mode 100644 index 00000000..5d1b3d1f --- /dev/null +++ b/src/sysprof/sysprof-cpu-info-dialog.h @@ -0,0 +1,37 @@ +/* sysprof-cpu-info-dialog.h + * + * Copyright 2023 Christian Hergert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#pragma once + +#include + +#include + +G_BEGIN_DECLS + +#define SYSPROF_TYPE_CPU_INFO_DIALOG (sysprof_cpu_info_dialog_get_type()) + +G_DECLARE_FINAL_TYPE (SysprofCpuInfoDialog, sysprof_cpu_info_dialog, SYSPROF, CPU_INFO_DIALOG, AdwWindow) + +SysprofDocument *sysprof_cpu_info_dialog_get_document (SysprofCpuInfoDialog *self); +void sysprof_cpu_info_dialog_set_document (SysprofCpuInfoDialog *self, + SysprofDocument *document); + +G_END_DECLS diff --git a/src/sysprof/sysprof-cpu-info-dialog.ui b/src/sysprof/sysprof-cpu-info-dialog.ui new file mode 100644 index 00000000..decb5530 --- /dev/null +++ b/src/sysprof/sysprof-cpu-info-dialog.ui @@ -0,0 +1,121 @@ + + + + + diff --git a/src/sysprof/sysprof-window.c b/src/sysprof/sysprof-window.c index 1e60f4ee..c8981ad8 100644 --- a/src/sysprof/sysprof-window.c +++ b/src/sysprof/sysprof-window.c @@ -24,6 +24,7 @@ #include +#include "sysprof-cpu-info-dialog.h" #include "sysprof-files-section.h" #include "sysprof-greeter.h" #include "sysprof-logs-section.h" @@ -85,6 +86,24 @@ sysprof_window_record_capture_action (GtkWidget *widget, show_greeter (SYSPROF_WINDOW (widget), SYSPROF_GREETER_PAGE_RECORD); } +static void +sysprof_window_show_cpu_info_action (GtkWidget *widget, + const char *action_name, + GVariant *param) +{ + SysprofWindow *self = (SysprofWindow *)widget; + GtkWindow *window; + + g_assert (SYSPROF_IS_WINDOW (self)); + + window = g_object_new (SYSPROF_TYPE_CPU_INFO_DIALOG, + "document", self->document, + "transient-for", self, + NULL); + + gtk_window_present (window); +} + static void sysprof_window_set_document (SysprofWindow *self, SysprofDocument *document) @@ -209,6 +228,7 @@ sysprof_window_class_init (SysprofWindowClass *klass) gtk_widget_class_install_action (widget_class, "win.open-capture", NULL, sysprof_window_open_capture_action); gtk_widget_class_install_action (widget_class, "win.record-capture", NULL, sysprof_window_record_capture_action); + gtk_widget_class_install_action (widget_class, "win.show-cpu-info", NULL, sysprof_window_show_cpu_info_action); g_type_ensure (SYSPROF_TYPE_DOCUMENT); g_type_ensure (SYSPROF_TYPE_FILES_SECTION); diff --git a/src/sysprof/sysprof-window.ui b/src/sysprof/sysprof-window.ui index 3cd9a532..17cb19a0 100644 --- a/src/sysprof/sysprof-window.ui +++ b/src/sysprof/sysprof-window.ui @@ -191,6 +191,12 @@ Save As… +
+ + Show CPU Information… + win.show-cpu-info + +
Preferences diff --git a/src/sysprof/sysprof.gresource.xml b/src/sysprof/sysprof.gresource.xml index 0e49f338..11777e93 100644 --- a/src/sysprof/sysprof.gresource.xml +++ b/src/sysprof/sysprof.gresource.xml @@ -3,6 +3,7 @@ gtk/help-overlay.ui gtk/menus.ui + sysprof-cpu-info-dialog.ui sysprof-files-section.ui sysprof-greeter.ui sysprof-logs-section.ui