diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index 8e30189b36..c7c726f3a9 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -26,9 +26,14 @@ #include "gtkswitch.h" #include "gtklistbox.h" #include "gtkprivate.h" +#include "gtksizegroup.h" +#include "gtkimage.h" +#include "gtkadjustment.h" +#include "gtkbox.h" #ifdef GDK_WINDOWING_X11 #include "x11/gdkx.h" +#include #endif #ifdef GDK_WINDOWING_WIN32 @@ -41,18 +46,22 @@ #ifdef GDK_WINDOWING_WAYLAND #include "wayland/gdkwayland.h" +#include #endif #ifdef GDK_WINDOWING_BROADWAY #include "broadway/gdkbroadway.h" #endif - struct _GtkInspectorGeneralPrivate { + GtkWidget *version_box; + GtkWidget *env_box; + GtkWidget *gl_box; GtkWidget *gtk_version; GtkWidget *gdk_backend; - + GtkWidget *gl_version; + GtkWidget *gl_vendor; GtkWidget *prefix; GtkWidget *xdg_data_home; GtkWidget *xdg_data_dirs; @@ -60,9 +69,11 @@ struct _GtkInspectorGeneralPrivate GtkWidget *gtk_exe_prefix; GtkWidget *gtk_data_prefix; GtkWidget *gsettings_schema_dir; + GtkSizeGroup *labels; + GtkAdjustment *focus_adjustment; }; -G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorGeneral, gtk_inspector_general, GTK_TYPE_BOX) +G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorGeneral, gtk_inspector_general, GTK_TYPE_SCROLLED_WINDOW) static void init_version (GtkInspectorGeneral *gen) @@ -103,6 +114,115 @@ init_version (GtkInspectorGeneral *gen) gtk_label_set_text (GTK_LABEL (gen->priv->gdk_backend), backend); } +static void +append_extension_row (GtkInspectorGeneral *gen, + const gchar *ext, + gboolean have_ext) +{ + GtkWidget *row, *box, *label, *check; + + row = gtk_list_box_row_new (); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 40); + g_object_set (box, "margin", 10, NULL); + gtk_container_add (GTK_CONTAINER (row), box); + label = gtk_label_new (ext); + gtk_widget_set_halign (label, GTK_ALIGN_START); + gtk_widget_set_valign (label, GTK_ALIGN_BASELINE); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); + check = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU); + gtk_widget_set_halign (check, GTK_ALIGN_END); + gtk_widget_set_valign (check, GTK_ALIGN_BASELINE); + gtk_widget_set_opacity (check, have_ext ? 1.0 : 0.0); + gtk_box_pack_start (GTK_BOX (box), check, TRUE, TRUE, 0); + gtk_widget_show_all (row); + gtk_list_box_insert (GTK_LIST_BOX (gen->priv->gl_box), row, -1); + + gtk_size_group_add_widget (GTK_SIZE_GROUP (gen->priv->labels), label); +} + +#ifdef GDK_WINDOWING_X11 +static void +append_glx_extension_row (GtkInspectorGeneral *gen, + Display *dpy, + const gchar *ext) +{ + append_extension_row (gen, ext, epoxy_has_glx_extension (dpy, 0, ext)); +} +#endif + +#ifdef GDK_WINDOWING_WAYLAND +static void +append_egl_extension_row (GtkInspectorGeneral *gen, + EGLDisplay *dpy, + const gchar *ext) +{ + append_extension_row (gen, ext, epoxy_has_egl_extension (dpy, ext)); +} +#endif + +static void +init_gl (GtkInspectorGeneral *gen) +{ + GdkDisplay *display; + gchar *version; + + display = gdk_display_get_default (); + +#ifdef GDK_WINDOWING_X11 + if (GDK_IS_X11_DISPLAY (display)) + { + Display *dpy = GDK_DISPLAY_XDISPLAY (display); + int error_base, event_base; + + if (!glXQueryExtension (dpy, &error_base, &event_base)) + return; + + version = g_strconcat ("GLX ", glXGetClientString (dpy, GLX_VERSION), NULL); + gtk_label_set_text (GTK_LABEL (gen->priv->gl_version), version); + g_free (version); + gtk_label_set_text (GTK_LABEL (gen->priv->gl_vendor), glXGetClientString (dpy, GLX_VENDOR)); + + append_glx_extension_row (gen, dpy, "GLX_ARB_create_context_profile"); + append_glx_extension_row (gen, dpy, "GLX_SGI_swap_control"); + append_glx_extension_row (gen, dpy, "GLX_EXT_texture_from_pixmap"); + append_glx_extension_row (gen, dpy, "GLX_SGI_video_sync"); + append_glx_extension_row (gen, dpy, "GLX_EXT_buffer_age"); + append_glx_extension_row (gen, dpy, "GLX_OML_sync_control"); + append_glx_extension_row (gen, dpy, "GLX_ARB_multisample"); + append_glx_extension_row (gen, dpy, "GLX_EXT_visual_rating"); + } + else +#endif +#ifdef GDK_WINDOWING_WAYLAND + if (GDK_IS_WAYLAND_DISPLAY (display)) + { + EGLDisplay *dpy; + EGLint major, minor; + + dpy = eglGetDisplay ((EGLNativeDisplayType)gdk_wayland_display_get_wl_display (display)); + + if (!eglInitialize (dpy, &major, &minor)) + return; + + version = g_strconcat ("EGL ", eglQueryString (dpy, EGL_VERSION), NULL); + gtk_label_set_text (GTK_LABEL (gen->priv->gl_version), version); + g_free (version); + gtk_label_set_text (GTK_LABEL (gen->priv->gl_vendor), eglQueryString (dpy, EGL_VENDOR)); + + append_egl_extension_row (gen, dpy, "EGL_KHR_create_context"); + append_egl_extension_row (gen, dpy, "EGL_EXT_buffer_age"); + append_egl_extension_row (gen, dpy, "EGL_EXT_swap_buffers_with_damage"); + append_egl_extension_row (gen, dpy, "EGL_KHR_surfaceless_context"); + } + else +#endif + { + gtk_label_set_text (GTK_LABEL (gen->priv->gl_version), _("None")); + gtk_label_set_text (GTK_LABEL (gen->priv->gl_vendor), _("None")); + } +} + static void set_monospace_font (GtkWidget *w) { @@ -154,17 +274,88 @@ gtk_inspector_general_init (GtkInspectorGeneral *gen) gen->priv = gtk_inspector_general_get_instance_private (gen); gtk_widget_init_template (GTK_WIDGET (gen)); init_version (gen); + init_gl (gen); init_env (gen); } +static gboolean +keynav_failed (GtkWidget *widget, GtkDirectionType direction, GtkInspectorGeneral *gen) +{ + GtkWidget *next; + gdouble value, lower, upper, page; + + if (direction == GTK_DIR_DOWN && + widget == gen->priv->version_box) + next = gen->priv->env_box; + else if (direction == GTK_DIR_DOWN && + widget == gen->priv->env_box) + next = gen->priv->gl_box; + else if (direction == GTK_DIR_UP && + widget == gen->priv->env_box) + next = gen->priv->version_box; + else if (direction == GTK_DIR_UP && + widget == gen->priv->gl_box) + next = gen->priv->env_box; + else + next = NULL; + + if (next) + { + gtk_widget_child_focus (next, direction); + return TRUE; + } + + value = gtk_adjustment_get_value (gen->priv->focus_adjustment); + lower = gtk_adjustment_get_lower (gen->priv->focus_adjustment); + upper = gtk_adjustment_get_upper (gen->priv->focus_adjustment); + page = gtk_adjustment_get_page_size (gen->priv->focus_adjustment); + + if (direction == GTK_DIR_UP && value > lower) + { + gtk_adjustment_set_value (gen->priv->focus_adjustment, lower); + return TRUE; + } + else if (direction == GTK_DIR_DOWN && value < upper - page) + { + gtk_adjustment_set_value (gen->priv->focus_adjustment, upper - page); + return TRUE; + } + + return FALSE; +} + +static void +gtk_inspector_general_constructed (GObject *object) +{ + GtkInspectorGeneral *gen = GTK_INSPECTOR_GENERAL (object); + + G_OBJECT_CLASS (gtk_inspector_general_parent_class)->constructed (object); + + gen->priv->focus_adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gen)); + gtk_container_set_focus_vadjustment (GTK_CONTAINER (gtk_bin_get_child (GTK_BIN (gen))), + gen->priv->focus_adjustment); + + g_signal_connect (gen->priv->version_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); + g_signal_connect (gen->priv->env_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); + g_signal_connect (gen->priv->gl_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); +} + static void gtk_inspector_general_class_init (GtkInspectorGeneralClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + object_class->constructed = gtk_inspector_general_constructed; + gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/general.ui"); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, version_box); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, env_box); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gl_box); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gtk_version); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gdk_backend); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gl_version); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gl_vendor); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, prefix); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, xdg_data_home); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, xdg_data_dirs); @@ -172,6 +363,7 @@ gtk_inspector_general_class_init (GtkInspectorGeneralClass *klass) gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gtk_exe_prefix); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gtk_data_prefix); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, gsettings_schema_dir); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, labels); } // vim: set et sw=2 ts=2: diff --git a/gtk/inspector/general.h b/gtk/inspector/general.h index c83c04ba9f..e397f3512e 100644 --- a/gtk/inspector/general.h +++ b/gtk/inspector/general.h @@ -18,7 +18,7 @@ #ifndef _GTK_INSPECTOR_GENERAL_H_ #define _GTK_INSPECTOR_GENERAL_H_ -#include +#include #define GTK_TYPE_INSPECTOR_GENERAL (gtk_inspector_general_get_type()) #define GTK_INSPECTOR_GENERAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_INSPECTOR_GENERAL, GtkInspectorGeneral)) @@ -32,13 +32,13 @@ typedef struct _GtkInspectorGeneralPrivate GtkInspectorGeneralPrivate; typedef struct _GtkInspectorGeneral { - GtkBox parent; + GtkScrolledWindow parent; GtkInspectorGeneralPrivate *priv; } GtkInspectorGeneral; typedef struct _GtkInspectorGeneralClass { - GtkBoxClass parent; + GtkScrolledWindowClass parent; } GtkInspectorGeneralClass; G_BEGIN_DECLS diff --git a/gtk/inspector/general.ui b/gtk/inspector/general.ui index f755c90a51..2ff6cb85c2 100644 --- a/gtk/inspector/general.ui +++ b/gtk/inspector/general.ui @@ -1,338 +1,427 @@ -