1/*
2 * Copyright (c) 2018, Red Hat, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#include "config.h"
24#include <glib/gi18n-lib.h>
25
26#include "logs.h"
27#include "window.h"
28
29#include "gtktextview.h"
30#include "gtkmessagedialog.h"
31#include "gtkfilechooserdialog.h"
32#include "gtkcheckbutton.h"
33#include "gtklabel.h"
34#include "gtktooltip.h"
35#include "gtktextiter.h"
36#include "gtkprivate.h"
37#include "gtkroot.h"
38#include "gtkdebug.h"
39#include "gtknative.h"
40#include "gskdebugprivate.h"
41#include "gskrendererprivate.h"
42#include "gtkboxlayout.h"
43
44#include "gdk/gdkdebug.h"
45
46struct _GtkInspectorLogs
47{
48 GtkWidget parent;
49
50 GtkWidget *events;
51 GtkWidget *misc;
52 GtkWidget *dnd;
53 GtkWidget *input;
54 GtkWidget *eventloop;
55 GtkWidget *frames;
56 GtkWidget *settings;
57 GtkWidget *opengl;
58 GtkWidget *vulkan;
59 GtkWidget *selection;
60 GtkWidget *clipboard;
61
62 GtkWidget *renderer;
63 GtkWidget *cairo;
64 GtkWidget *opengl_gsk;
65 GtkWidget *vulkan_gsk;
66 GtkWidget *shaders;
67 GtkWidget *surface;
68 GtkWidget *glyphcache;
69
70 GtkWidget *actions;
71 GtkWidget *builder;
72 GtkWidget *sizes;
73 GtkWidget *icons;
74 GtkWidget *keybindings;
75 GtkWidget *modules;
76 GtkWidget *printing;
77 GtkWidget *tree;
78 GtkWidget *text;
79 GtkWidget *constraints;
80 GtkWidget *layout;
81 GtkWidget *a11y;
82
83 GdkDisplay *display;
84};
85
86typedef struct _GtkInspectorLogsClass
87{
88 GtkWidgetClass parent;
89} GtkInspectorLogsClass;
90
91G_DEFINE_TYPE (GtkInspectorLogs, gtk_inspector_logs, GTK_TYPE_WIDGET)
92
93static void
94gtk_inspector_logs_init (GtkInspectorLogs *logs)
95{
96 gtk_widget_init_template (GTK_WIDGET (logs));
97}
98
99static void
100dispose (GObject *object)
101{
102 GtkWidget *child;
103
104 while ((child = gtk_widget_get_first_child (GTK_WIDGET (object))))
105 gtk_widget_unparent (widget: child);
106
107 G_OBJECT_CLASS (gtk_inspector_logs_parent_class)->dispose (object);
108}
109
110static void
111update_flag (GtkWidget *widget,
112 guint *flags,
113 guint flag)
114{
115 if (gtk_check_button_get_active (GTK_CHECK_BUTTON (widget)))
116 *flags = *flags | flag;
117 else
118 *flags = *flags & ~flag;
119}
120
121static void
122flag_toggled (GtkWidget *button,
123 GtkInspectorLogs *logs)
124{
125 guint flags;
126 GList *toplevels, *l;
127
128 flags = gdk_display_get_debug_flags (display: logs->display);
129 update_flag (widget: logs->events, flags: &flags, flag: GDK_DEBUG_EVENTS);
130 update_flag (widget: logs->misc, flags: &flags, flag: GDK_DEBUG_MISC);
131 update_flag (widget: logs->dnd, flags: &flags, flag: GDK_DEBUG_DND);
132 update_flag (widget: logs->input, flags: &flags, flag: GDK_DEBUG_INPUT);
133 update_flag (widget: logs->eventloop, flags: &flags, flag: GDK_DEBUG_EVENTLOOP);
134 update_flag (widget: logs->frames, flags: &flags, flag: GDK_DEBUG_FRAMES);
135 update_flag (widget: logs->settings, flags: &flags, flag: GDK_DEBUG_SETTINGS);
136 update_flag (widget: logs->opengl, flags: &flags, flag: GDK_DEBUG_OPENGL);
137 update_flag (widget: logs->vulkan, flags: &flags, flag: GDK_DEBUG_VULKAN);
138 update_flag (widget: logs->selection, flags: &flags, flag: GDK_DEBUG_SELECTION);
139 update_flag (widget: logs->clipboard, flags: &flags, flag: GDK_DEBUG_CLIPBOARD);
140 gdk_display_set_debug_flags (display: logs->display, flags);
141
142 flags = gsk_get_debug_flags ();
143 update_flag (widget: logs->renderer, flags: &flags, flag: GSK_DEBUG_RENDERER);
144 update_flag (widget: logs->cairo, flags: &flags, flag: GSK_DEBUG_CAIRO);
145 update_flag (widget: logs->opengl_gsk, flags: &flags, flag: GSK_DEBUG_OPENGL);
146 update_flag (widget: logs->vulkan_gsk, flags: &flags, flag: GSK_DEBUG_VULKAN);
147 update_flag (widget: logs->shaders, flags: &flags, flag: GSK_DEBUG_SHADERS);
148 update_flag (widget: logs->surface, flags: &flags, flag: GSK_DEBUG_SURFACE);
149 update_flag (widget: logs->glyphcache, flags: &flags, flag: GSK_DEBUG_GLYPH_CACHE);
150 gsk_set_debug_flags (flags);
151
152 toplevels = gtk_window_list_toplevels ();
153 for (l = toplevels; l; l = l->next)
154 {
155 GtkWidget *toplevel = l->data;
156
157 if (gtk_root_get_display (self: GTK_ROOT (ptr: toplevel)) == logs->display)
158 {
159 GskRenderer *renderer = gtk_native_get_renderer (self: GTK_NATIVE (ptr: toplevel));
160 if (renderer)
161 gsk_renderer_set_debug_flags (renderer, flags);
162 }
163 }
164 g_list_free (list: toplevels);
165
166 flags = gtk_get_display_debug_flags (display: logs->display);
167 update_flag (widget: logs->actions, flags: &flags, flag: GTK_DEBUG_ACTIONS);
168 update_flag (widget: logs->builder, flags: &flags, flag: GTK_DEBUG_BUILDER);
169 update_flag (widget: logs->sizes, flags: &flags, flag: GTK_DEBUG_SIZE_REQUEST);
170 update_flag (widget: logs->icons, flags: &flags, flag: GTK_DEBUG_ICONTHEME);
171 update_flag (widget: logs->keybindings, flags: &flags, flag: GTK_DEBUG_KEYBINDINGS);
172 update_flag (widget: logs->modules, flags: &flags, flag: GTK_DEBUG_MODULES);
173 update_flag (widget: logs->printing, flags: &flags, flag: GTK_DEBUG_PRINTING);
174 update_flag (widget: logs->tree, flags: &flags, flag: GTK_DEBUG_TREE);
175 update_flag (widget: logs->text, flags: &flags, flag: GTK_DEBUG_TEXT);
176 update_flag (widget: logs->constraints, flags: &flags, flag: GTK_DEBUG_CONSTRAINTS);
177 update_flag (widget: logs->layout, flags: &flags, flag: GTK_DEBUG_LAYOUT);
178 update_flag (widget: logs->a11y, flags: &flags, flag: GTK_DEBUG_A11Y);
179 gtk_set_display_debug_flags (display: logs->display, flags);
180}
181
182static void
183gtk_inspector_logs_class_init (GtkInspectorLogsClass *klass)
184{
185 GObjectClass *object_class = G_OBJECT_CLASS (klass);
186 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
187
188 object_class->dispose = dispose;
189
190 gtk_widget_class_set_template_from_resource (widget_class, resource_name: "/org/gtk/libgtk/inspector/logs.ui");
191 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, events);
192 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, misc);
193 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, dnd);
194 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, input);
195 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, eventloop);
196 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, frames);
197 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, settings);
198 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, opengl);
199 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, vulkan);
200 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, selection);
201 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, clipboard);
202
203 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, renderer);
204 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, cairo);
205 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, opengl_gsk);
206 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, vulkan_gsk);
207 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, shaders);
208 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, surface);
209 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, glyphcache);
210
211 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, actions);
212 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, builder);
213 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, sizes);
214 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, icons);
215 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, keybindings);
216 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, modules);
217 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, printing);
218 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, tree);
219 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, text);
220 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, constraints);
221 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, layout);
222 gtk_widget_class_bind_template_child (widget_class, GtkInspectorLogs, a11y);
223 gtk_widget_class_bind_template_callback (widget_class, flag_toggled);
224
225 gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
226}
227
228void
229gtk_inspector_logs_set_display (GtkInspectorLogs *logs,
230 GdkDisplay *display)
231{
232 logs->display = display;
233}
234
235// vim: set et sw=2 ts=2:
236

source code of gtk/gtk/inspector/logs.c