mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 06:00:22 +00:00
inspector: Add a focus overlay
It helps to see what is going on.
This commit is contained in:
parent
e999016273
commit
6b89d8a199
111
gtk/inspector/focusoverlay.c
Normal file
111
gtk/inspector/focusoverlay.c
Normal file
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "focusoverlay.h"
|
||||
|
||||
#include "gtkintl.h"
|
||||
#include "gtkwidget.h"
|
||||
#include "gtkroot.h"
|
||||
#include "gtknative.h"
|
||||
|
||||
struct _GtkFocusOverlay
|
||||
{
|
||||
GtkInspectorOverlay parent_instance;
|
||||
|
||||
GdkRGBA color;
|
||||
};
|
||||
|
||||
struct _GtkFocusOverlayClass
|
||||
{
|
||||
GtkInspectorOverlayClass parent_class;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkFocusOverlay, gtk_focus_overlay, GTK_TYPE_INSPECTOR_OVERLAY)
|
||||
|
||||
static void
|
||||
gtk_focus_overlay_snapshot (GtkInspectorOverlay *overlay,
|
||||
GtkSnapshot *snapshot,
|
||||
GskRenderNode *node,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
GtkFocusOverlay *self = GTK_FOCUS_OVERLAY (overlay);
|
||||
GtkWidget *focus;
|
||||
graphene_rect_t bounds;
|
||||
|
||||
if (!GTK_IS_NATIVE (widget))
|
||||
return;
|
||||
|
||||
focus = gtk_root_get_focus (GTK_ROOT (gtk_widget_get_root (widget)));
|
||||
if (!focus)
|
||||
return;
|
||||
|
||||
if (!gtk_widget_is_ancestor (focus, widget))
|
||||
return;
|
||||
|
||||
if (GTK_WIDGET (gtk_widget_get_native (focus)) != widget)
|
||||
return;
|
||||
|
||||
if (!gtk_widget_compute_bounds (focus, widget, &bounds))
|
||||
return;
|
||||
|
||||
gtk_snapshot_append_color (snapshot, &self->color, &bounds);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_focus_overlay_queue_draw (GtkInspectorOverlay *overlay)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_focus_overlay_class_init (GtkFocusOverlayClass *klass)
|
||||
{
|
||||
GtkInspectorOverlayClass *overlay_class = GTK_INSPECTOR_OVERLAY_CLASS (klass);
|
||||
|
||||
overlay_class->snapshot = gtk_focus_overlay_snapshot;
|
||||
overlay_class->queue_draw = gtk_focus_overlay_queue_draw;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_focus_overlay_init (GtkFocusOverlay *self)
|
||||
{
|
||||
self->color = (GdkRGBA) { 0.5, 0.0, 1.0, 0.2 };
|
||||
}
|
||||
|
||||
GtkInspectorOverlay *
|
||||
gtk_focus_overlay_new (void)
|
||||
{
|
||||
GtkFocusOverlay *self;
|
||||
|
||||
self = g_object_new (GTK_TYPE_FOCUS_OVERLAY, NULL);
|
||||
|
||||
return GTK_INSPECTOR_OVERLAY (self);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_focus_overlay_set_color (GtkFocusOverlay *self,
|
||||
const GdkRGBA *color)
|
||||
{
|
||||
if (gdk_rgba_equal (&self->color, color))
|
||||
return;
|
||||
|
||||
self->color = *color;
|
||||
gtk_inspector_overlay_queue_draw (GTK_INSPECTOR_OVERLAY (self));
|
||||
}
|
36
gtk/inspector/focusoverlay.h
Normal file
36
gtk/inspector/focusoverlay.h
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __GTK_FOCUS_OVERLAY_H__
|
||||
#define __GTK_FOCUS_OVERLAY_H__
|
||||
|
||||
#include "inspectoroverlay.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_FOCUS_OVERLAY (gtk_focus_overlay_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (GtkFocusOverlay, gtk_focus_overlay, GTK, FOCUS_OVERLAY, GtkInspectorOverlay)
|
||||
|
||||
GtkInspectorOverlay * gtk_focus_overlay_new (void);
|
||||
void gtk_focus_overlay_set_color (GtkFocusOverlay *self,
|
||||
const GdkRGBA *color);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_FOCUS_OVERLAY_H__ */
|
@ -6,6 +6,7 @@ inspector_sources = files(
|
||||
'css-editor.c',
|
||||
'css-node-tree.c',
|
||||
'data-list.c',
|
||||
'focusoverlay.c',
|
||||
'fpsoverlay.c',
|
||||
'general.c',
|
||||
'graphdata.c',
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "fpsoverlay.h"
|
||||
#include "updatesoverlay.h"
|
||||
#include "layoutoverlay.h"
|
||||
#include "focusoverlay.h"
|
||||
#include "window.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
@ -81,6 +82,7 @@ struct _GtkInspectorVisualPrivate
|
||||
GtkWidget *baselines_switch;
|
||||
GtkWidget *layout_switch;
|
||||
GtkWidget *resize_switch;
|
||||
GtkWidget *focus_switch;
|
||||
|
||||
GtkWidget *misc_box;
|
||||
GtkWidget *touchscreen_switch;
|
||||
@ -91,6 +93,7 @@ struct _GtkInspectorVisualPrivate
|
||||
GtkInspectorOverlay *fps_overlay;
|
||||
GtkInspectorOverlay *updates_overlay;
|
||||
GtkInspectorOverlay *layout_overlay;
|
||||
GtkInspectorOverlay *focus_overlay;
|
||||
|
||||
GdkDisplay *display;
|
||||
};
|
||||
@ -414,6 +417,41 @@ widget_resize_activate (GtkSwitch *sw)
|
||||
gtk_set_debug_flags (flags);
|
||||
}
|
||||
|
||||
static void
|
||||
focus_activate (GtkSwitch *sw,
|
||||
GParamSpec *pspec,
|
||||
GtkInspectorVisual *vis)
|
||||
{
|
||||
GtkInspectorVisualPrivate *priv = vis->priv;
|
||||
GtkInspectorWindow *iw;
|
||||
gboolean focus;
|
||||
|
||||
focus = gtk_switch_get_active (sw);
|
||||
iw = GTK_INSPECTOR_WINDOW (gtk_widget_get_root (GTK_WIDGET (vis)));
|
||||
if (iw == NULL)
|
||||
return;
|
||||
|
||||
if (focus)
|
||||
{
|
||||
if (priv->focus_overlay == NULL)
|
||||
{
|
||||
priv->focus_overlay = gtk_focus_overlay_new ();
|
||||
gtk_inspector_window_add_overlay (iw, priv->focus_overlay);
|
||||
g_object_unref (priv->focus_overlay);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (priv->focus_overlay != NULL)
|
||||
{
|
||||
gtk_inspector_window_remove_overlay (iw, priv->focus_overlay);
|
||||
priv->focus_overlay = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
redraw_everything ();
|
||||
}
|
||||
|
||||
static void
|
||||
fill_gtk (const gchar *path,
|
||||
GHashTable *t)
|
||||
@ -939,6 +977,11 @@ row_activated (GtkListBox *box,
|
||||
GtkSwitch *sw = GTK_SWITCH (vis->priv->resize_switch);
|
||||
gtk_switch_set_active (sw, !gtk_switch_get_active (sw));
|
||||
}
|
||||
else if (gtk_widget_is_ancestor (vis->priv->focus_switch, GTK_WIDGET (row)))
|
||||
{
|
||||
GtkSwitch *sw = GTK_SWITCH (vis->priv->focus_switch);
|
||||
gtk_switch_set_active (sw, !gtk_switch_get_active (sw));
|
||||
}
|
||||
else if (gtk_widget_is_ancestor (vis->priv->touchscreen_switch, GTK_WIDGET (row)))
|
||||
{
|
||||
GtkSwitch *sw = GTK_SWITCH (vis->priv->touchscreen_switch);
|
||||
@ -1028,6 +1071,8 @@ gtk_inspector_visual_finalize (GObject *object)
|
||||
gtk_inspector_window_remove_overlay (iw, vis->priv->updates_overlay);
|
||||
if (vis->priv->fps_overlay)
|
||||
gtk_inspector_window_remove_overlay (iw, vis->priv->fps_overlay);
|
||||
if (vis->priv->focus_overlay)
|
||||
gtk_inspector_window_remove_overlay (iw, vis->priv->focus_overlay);
|
||||
|
||||
G_OBJECT_CLASS (gtk_inspector_visual_parent_class)->finalize (object);
|
||||
}
|
||||
@ -1104,6 +1149,7 @@ gtk_inspector_visual_class_init (GtkInspectorVisualClass *klass)
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorVisual, baselines_switch);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorVisual, layout_switch);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorVisual, resize_switch);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorVisual, focus_switch);
|
||||
|
||||
gtk_widget_class_bind_template_callback (widget_class, fps_activate);
|
||||
gtk_widget_class_bind_template_callback (widget_class, updates_activate);
|
||||
@ -1112,6 +1158,7 @@ gtk_inspector_visual_class_init (GtkInspectorVisualClass *klass)
|
||||
gtk_widget_class_bind_template_callback (widget_class, baselines_activate);
|
||||
gtk_widget_class_bind_template_callback (widget_class, layout_activate);
|
||||
gtk_widget_class_bind_template_callback (widget_class, widget_resize_activate);
|
||||
gtk_widget_class_bind_template_callback (widget_class, focus_activate);
|
||||
gtk_widget_class_bind_template_callback (widget_class, software_gl_activate);
|
||||
}
|
||||
|
||||
|
@ -529,6 +529,32 @@
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBoxRow">
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="margin">10</property>
|
||||
<property name="spacing">40</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="focus_label">
|
||||
<property name="label" translatable="yes">Show Focus</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">baseline</property>
|
||||
<property name="xalign">0.0</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="focus_switch">
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">baseline</property>
|
||||
<property name="hexpand">1</property>
|
||||
<signal name="notify::active" handler="focus_activate"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
@ -616,6 +642,7 @@
|
||||
<widget name="baselines_label"/>
|
||||
<widget name="layout_label"/>
|
||||
<widget name="resize_label"/>
|
||||
<widget name="focus_label"/>
|
||||
<widget name="touchscreen_label"/>
|
||||
<widget name="software_gl_label"/>
|
||||
</widgets>
|
||||
|
Loading…
Reference in New Issue
Block a user