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 | |
46 | struct _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 | |
86 | typedef struct _GtkInspectorLogsClass |
87 | { |
88 | GtkWidgetClass parent; |
89 | } GtkInspectorLogsClass; |
90 | |
91 | G_DEFINE_TYPE (GtkInspectorLogs, gtk_inspector_logs, GTK_TYPE_WIDGET) |
92 | |
93 | static void |
94 | gtk_inspector_logs_init (GtkInspectorLogs *logs) |
95 | { |
96 | gtk_widget_init_template (GTK_WIDGET (logs)); |
97 | } |
98 | |
99 | static void |
100 | dispose (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 | |
110 | static void |
111 | update_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 | |
121 | static void |
122 | flag_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 | |
182 | static void |
183 | gtk_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 | |
228 | void |
229 | gtk_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 | |