shell/perf-helper: Port to GTK4
After the preparations in the previous commits, the port is now fairly straight-forward. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2733>
This commit is contained in:
parent
1c5bc35e30
commit
02cd1ecd94
@ -24,7 +24,7 @@ gcr_req = '>= 3.90.0'
|
|||||||
gio_req = '>= 2.56.0'
|
gio_req = '>= 2.56.0'
|
||||||
gi_req = '>= 1.49.1'
|
gi_req = '>= 1.49.1'
|
||||||
gjs_req = '>= 1.73.1'
|
gjs_req = '>= 1.73.1'
|
||||||
gtk_req = '>= 3.15.0'
|
gtk_req = '>= 4.0'
|
||||||
mutter_req = '>= 44.0'
|
mutter_req = '>= 44.0'
|
||||||
polkit_req = '>= 0.100'
|
polkit_req = '>= 0.100'
|
||||||
schemas_req = '>= 42.beta'
|
schemas_req = '>= 42.beta'
|
||||||
@ -78,7 +78,7 @@ gi_dep = dependency('gobject-introspection-1.0', version: gi_req)
|
|||||||
gio_dep = dependency('gio-2.0', version: gio_req)
|
gio_dep = dependency('gio-2.0', version: gio_req)
|
||||||
gio_unix_dep = dependency('gio-unix-2.0', version: gio_req)
|
gio_unix_dep = dependency('gio-unix-2.0', version: gio_req)
|
||||||
gjs_dep = dependency('gjs-1.0', version: gjs_req)
|
gjs_dep = dependency('gjs-1.0', version: gjs_req)
|
||||||
gtk_dep = dependency('gtk+-3.0', version: gtk_req)
|
gtk_dep = dependency('gtk4', version: gtk_req)
|
||||||
libxml_dep = dependency('libxml-2.0')
|
libxml_dep = dependency('libxml-2.0')
|
||||||
clutter_dep = dependency(clutter_pc, version: mutter_req)
|
clutter_dep = dependency(clutter_pc, version: mutter_req)
|
||||||
cogl_dep = dependency(cogl_pc, version: mutter_req)
|
cogl_dep = dependency(cogl_pc, version: mutter_req)
|
||||||
|
@ -71,10 +71,10 @@ struct _PerfHelperWindow {
|
|||||||
G_DEFINE_TYPE (PerfHelperWindow, perf_helper_window, GTK_TYPE_APPLICATION_WINDOW);
|
G_DEFINE_TYPE (PerfHelperWindow, perf_helper_window, GTK_TYPE_APPLICATION_WINDOW);
|
||||||
|
|
||||||
#define PERF_HELPER_TYPE_WINDOW_CONTENT (perf_helper_window_content_get_type ())
|
#define PERF_HELPER_TYPE_WINDOW_CONTENT (perf_helper_window_content_get_type ())
|
||||||
G_DECLARE_FINAL_TYPE (PerfHelperWindowContent, perf_helper_window_content, PERF_HELPER, WINDOW_CONTENT, GtkBox)
|
G_DECLARE_FINAL_TYPE (PerfHelperWindowContent, perf_helper_window_content, PERF_HELPER, WINDOW_CONTENT, GtkWidget)
|
||||||
|
|
||||||
struct _PerfHelperWindowContent {
|
struct _PerfHelperWindowContent {
|
||||||
GtkBox parent;
|
GtkWidget parent;
|
||||||
|
|
||||||
guint redraws : 1;
|
guint redraws : 1;
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ struct _PerfHelperWindowContent {
|
|||||||
gint64 time;
|
gint64 time;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (PerfHelperWindowContent, perf_helper_window_content, GTK_TYPE_BOX);
|
G_DEFINE_TYPE (PerfHelperWindowContent, perf_helper_window_content, GTK_TYPE_WIDGET);
|
||||||
|
|
||||||
static void destroy_windows (PerfHelperApp *app);
|
static void destroy_windows (PerfHelperApp *app);
|
||||||
static void finish_wait_windows (PerfHelperApp *app);
|
static void finish_wait_windows (PerfHelperApp *app);
|
||||||
@ -116,41 +116,41 @@ destroy_windows (PerfHelperApp *app)
|
|||||||
GtkWindow *window;
|
GtkWindow *window;
|
||||||
|
|
||||||
while ((window = gtk_application_get_active_window (gtk_app)))
|
while ((window = gtk_application_get_active_window (gtk_app)))
|
||||||
gtk_widget_destroy (GTK_WIDGET (window));
|
gtk_window_destroy (window);
|
||||||
|
|
||||||
check_finish_wait_windows (app);
|
check_finish_wait_windows (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
on_window_map_event (GtkWidget *toplevel,
|
on_surface_mapped (GObject *object,
|
||||||
GdkEventAny *event,
|
GParamSpec *pspec,
|
||||||
PerfHelperWindow *window)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
window->mapped = TRUE;
|
PerfHelperWindow *window = user_data;
|
||||||
|
|
||||||
return FALSE;
|
window->mapped = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
perf_helper_window_realize (GtkWidget *widget)
|
perf_helper_window_realize (GtkWidget *widget)
|
||||||
{
|
{
|
||||||
GtkWidget *toplevel;
|
GdkSurface *surface;
|
||||||
|
|
||||||
GTK_WIDGET_CLASS (perf_helper_window_parent_class)->realize (widget);
|
GTK_WIDGET_CLASS (perf_helper_window_parent_class)->realize (widget);
|
||||||
|
|
||||||
toplevel = gtk_widget_get_toplevel (widget);
|
surface = gtk_native_get_surface (gtk_widget_get_native (widget));
|
||||||
g_signal_connect_object (toplevel,
|
g_signal_connect_object (surface,
|
||||||
"map-event", G_CALLBACK (on_window_map_event),
|
"notify::mapped", G_CALLBACK (on_surface_mapped),
|
||||||
widget, G_CONNECT_DEFAULT);
|
widget, G_CONNECT_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
perf_helper_window_draw (GtkWidget *widget,
|
perf_helper_window_snapshot (GtkWidget *widget,
|
||||||
cairo_t *cr)
|
GtkSnapshot *snapshot)
|
||||||
{
|
{
|
||||||
PerfHelperWindow *window = PERF_HELPER_WINDOW (widget);
|
PerfHelperWindow *window = PERF_HELPER_WINDOW (widget);
|
||||||
|
|
||||||
GTK_WIDGET_CLASS (perf_helper_window_parent_class)->draw (widget, cr);
|
GTK_WIDGET_CLASS (perf_helper_window_parent_class)->snapshot (widget, snapshot);
|
||||||
|
|
||||||
window->exposed = TRUE;
|
window->exposed = TRUE;
|
||||||
|
|
||||||
@ -159,20 +159,26 @@ perf_helper_window_draw (GtkWidget *widget,
|
|||||||
window->pending = FALSE;
|
window->pending = FALSE;
|
||||||
check_finish_wait_windows (PERF_HELPER_APP (g_application_get_default ()));
|
check_finish_wait_windows (PERF_HELPER_APP (g_application_get_default ()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
#define LINE_WIDTH 10
|
||||||
perf_helper_window_content_draw (GtkWidget *widget,
|
#define MARGIN 40
|
||||||
cairo_t *cr)
|
|
||||||
|
static void
|
||||||
|
perf_helper_window_content_snapshot (GtkWidget *widget,
|
||||||
|
GtkSnapshot *snapshot)
|
||||||
{
|
{
|
||||||
PerfHelperWindowContent *content = PERF_HELPER_WINDOW_CONTENT (widget);
|
PerfHelperWindowContent *content = PERF_HELPER_WINDOW_CONTENT (widget);
|
||||||
GtkWindow *window = GTK_WINDOW (gtk_widget_get_toplevel (widget));
|
GdkRGBA line_color;
|
||||||
cairo_rectangle_int_t allocation;
|
graphene_rect_t bounds;
|
||||||
|
int width, height;
|
||||||
double x_offset, y_offset;
|
double x_offset, y_offset;
|
||||||
|
|
||||||
gtk_widget_get_allocation (widget, &allocation);
|
GTK_WIDGET_CLASS (perf_helper_window_content_parent_class)->snapshot (widget, snapshot);
|
||||||
|
|
||||||
|
gdk_rgba_parse (&line_color, "red");
|
||||||
|
width = gtk_widget_get_width (widget);
|
||||||
|
height = gtk_widget_get_height (widget);
|
||||||
|
|
||||||
/* We draw an arbitrary pattern of red lines near the border of the
|
/* We draw an arbitrary pattern of red lines near the border of the
|
||||||
* window to make it more clear than empty windows if something
|
* window to make it more clear than empty windows if something
|
||||||
@ -190,19 +196,17 @@ perf_helper_window_content_draw (GtkWidget *widget,
|
|||||||
x_offset = y_offset = 0;
|
x_offset = y_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_set_source_rgb (cr, 1, 0, 0);
|
graphene_rect_init (&bounds, MARGIN + x_offset, 0, LINE_WIDTH, height);
|
||||||
cairo_set_line_width (cr, 10);
|
gtk_snapshot_append_color (snapshot, &line_color, &bounds);
|
||||||
cairo_move_to (cr, 0, 40 + y_offset);
|
|
||||||
cairo_line_to (cr, allocation.width, 40 + y_offset);
|
|
||||||
cairo_move_to (cr, 0, allocation.height - 40 + y_offset);
|
|
||||||
cairo_line_to (cr, allocation.width, allocation.height - 40 + y_offset);
|
|
||||||
cairo_move_to (cr, 40 + x_offset, 0);
|
|
||||||
cairo_line_to (cr, 40 + x_offset, allocation.height);
|
|
||||||
cairo_move_to (cr, allocation.width - 40 + x_offset, 0);
|
|
||||||
cairo_line_to (cr, allocation.width - 40 + x_offset, allocation.height);
|
|
||||||
cairo_stroke (cr);
|
|
||||||
|
|
||||||
return FALSE;
|
graphene_rect_init (&bounds, width - MARGIN - LINE_WIDTH + x_offset, 0, LINE_WIDTH, height);
|
||||||
|
gtk_snapshot_append_color (snapshot, &line_color, &bounds);
|
||||||
|
|
||||||
|
graphene_rect_init (&bounds, 0, MARGIN + y_offset, width, LINE_WIDTH);
|
||||||
|
gtk_snapshot_append_color (snapshot, &line_color, &bounds);
|
||||||
|
|
||||||
|
graphene_rect_init (&bounds, 0, height - MARGIN - LINE_WIDTH + y_offset, width, LINE_WIDTH);
|
||||||
|
gtk_snapshot_append_color (snapshot, &line_color, &bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -227,9 +231,7 @@ perf_helper_window_content_new (gboolean redraws) {
|
|||||||
PerfHelperWindowContent *content;
|
PerfHelperWindowContent *content;
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
|
|
||||||
content = g_object_new (PERF_HELPER_TYPE_WINDOW_CONTENT,
|
content = g_object_new (PERF_HELPER_TYPE_WINDOW_CONTENT, NULL);
|
||||||
"visible", TRUE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
content->redraws = redraws;
|
content->redraws = redraws;
|
||||||
|
|
||||||
@ -257,27 +259,23 @@ create_window (PerfHelperApp *app,
|
|||||||
"application", app,
|
"application", app,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (alpha)
|
|
||||||
gtk_widget_set_visual (GTK_WIDGET (window), gdk_screen_get_rgba_visual (gdk_screen_get_default ()));
|
|
||||||
if (maximized)
|
if (maximized)
|
||||||
gtk_window_maximize (GTK_WINDOW (window));
|
gtk_window_maximize (GTK_WINDOW (window));
|
||||||
|
|
||||||
if (text_input)
|
if (text_input)
|
||||||
{
|
{
|
||||||
child = gtk_entry_new ();
|
child = gtk_entry_new ();
|
||||||
gtk_widget_show (child);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (window)),
|
gtk_widget_add_css_class(GTK_WIDGET (window), alpha ? "alpha" : "solid");
|
||||||
alpha ? "alpha" : "solid");
|
|
||||||
child = perf_helper_window_content_new (redraws);
|
child = perf_helper_window_content_new (redraws);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (window), child);
|
gtk_window_set_child (GTK_WINDOW (window), child);
|
||||||
|
|
||||||
gtk_widget_set_size_request (GTK_WIDGET (window), width, height);
|
gtk_widget_set_size_request (GTK_WIDGET (window), width, height);
|
||||||
gtk_widget_show (GTK_WIDGET (window));
|
gtk_window_present (GTK_WINDOW (window));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -368,7 +366,6 @@ perf_helper_app_activate (GApplication *app)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
perf_helper_app_startup (GApplication *app)
|
perf_helper_app_startup (GApplication *app)
|
||||||
{
|
{
|
||||||
@ -377,11 +374,15 @@ perf_helper_app_startup (GApplication *app)
|
|||||||
G_APPLICATION_CLASS (perf_helper_app_parent_class)->startup (app);
|
G_APPLICATION_CLASS (perf_helper_app_parent_class)->startup (app);
|
||||||
|
|
||||||
css_provider = gtk_css_provider_new ();
|
css_provider = gtk_css_provider_new ();
|
||||||
gtk_css_provider_load_from_data (css_provider, application_css, -1, NULL);
|
#if GTK_CHECK_VERSION (4,11,3)
|
||||||
|
gtk_css_provider_load_from_string (css_provider, application_css);
|
||||||
|
#else
|
||||||
|
gtk_css_provider_load_from_data (css_provider, application_css, -1);
|
||||||
|
#endif
|
||||||
|
|
||||||
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
|
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
|
||||||
GTK_STYLE_PROVIDER (css_provider),
|
GTK_STYLE_PROVIDER (css_provider),
|
||||||
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -427,7 +428,7 @@ static void
|
|||||||
perf_helper_window_content_class_init (PerfHelperWindowContentClass *klass) {
|
perf_helper_window_content_class_init (PerfHelperWindowContentClass *klass) {
|
||||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||||
|
|
||||||
widget_class->draw = perf_helper_window_content_draw;
|
widget_class->snapshot = perf_helper_window_content_snapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PerfHelperApp *
|
static PerfHelperApp *
|
||||||
@ -454,7 +455,7 @@ perf_helper_window_class_init (PerfHelperWindowClass *klass)
|
|||||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||||
|
|
||||||
widget_class->realize = perf_helper_window_realize;
|
widget_class->realize = perf_helper_window_realize;
|
||||||
widget_class->draw = perf_helper_window_draw;
|
widget_class->snapshot = perf_helper_window_snapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user