From 03db14c2d62317166081d32c3da015fa56951cc9 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 25 Feb 2016 00:17:09 -0500 Subject: [PATCH] inspector: Show some basic device information Add information about seats and their associated devices in the General tab. --- gtk/inspector/general.c | 166 +++++++++++++++++++++++++++++++++++++++ gtk/inspector/general.ui | 15 ++++ 2 files changed, 181 insertions(+) diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index a260becfb5..1b065693de 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -59,6 +59,7 @@ struct _GtkInspectorGeneralPrivate GtkWidget *env_box; GtkWidget *x_box; GtkWidget *gl_box; + GtkWidget *device_box; GtkWidget *gtk_version; GtkWidget *gdk_backend; GtkWidget *gl_version; @@ -342,6 +343,164 @@ init_display (GtkInspectorGeneral *gen) } } +static void +add_device (GtkInspectorGeneral *gen, + GdkDevice *device) +{ + GtkWidget *box; + GtkWidget *label; + GtkWidget *row; + char *text; + GString *str; + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 40); + g_object_set (box, + "margin", 10, + "margin-start", 20, + NULL); + + text = g_strdup_printf ("%s", gdk_device_get_name (device)); + label = gtk_label_new (text); + 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); + g_free (text); + + str = g_string_new (""); + switch (gdk_device_get_source (device)) + { + case GDK_SOURCE_MOUSE: + g_string_append (str, "Mouse"); + break; + case GDK_SOURCE_PEN: + g_string_append (str, "Pen"); + break; + case GDK_SOURCE_ERASER: + g_string_append (str, "Eraser"); + break; + case GDK_SOURCE_CURSOR: + g_string_append (str, "Cursor"); + break; + case GDK_SOURCE_KEYBOARD: + g_string_append (str, "Keyboard"); + break; + case GDK_SOURCE_TOUCHSCREEN: + g_string_append (str, "Touchscreen"); + break; + case GDK_SOURCE_TOUCHPAD: + g_string_append (str, "Touchpad"); + break; + default: + g_string_append (str, "Unknown"); + break; + } + + if (gdk_device_get_mode (device) == GDK_MODE_DISABLED) + g_string_append (str, ", disabled"); + + label = gtk_label_new (str->str); + gtk_label_set_selectable (GTK_LABEL (label), TRUE); + gtk_widget_set_halign (label, GTK_ALIGN_END); + 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, TRUE, TRUE, 0); + g_string_free (str, TRUE); + + row = gtk_list_box_row_new (); + gtk_container_add (GTK_CONTAINER (row), box); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); + gtk_widget_show_all (row); + + gtk_list_box_insert (GTK_LIST_BOX (gen->priv->device_box), row, -1); +} + +static void +add_seat (GtkInspectorGeneral *gen, + GdkSeat *seat, + int num) +{ + GtkWidget *box; + GtkWidget *label; + GtkWidget *row; + GdkSeatCapabilities capabilities; + struct { + GdkSeatCapabilities cap; + const char *name; + } caps[] = { + { GDK_SEAT_CAPABILITY_POINTER, "Pointer" }, + { GDK_SEAT_CAPABILITY_TOUCH, "Touch" }, + { GDK_SEAT_CAPABILITY_TABLET_STYLUS, "Tablet" }, + { GDK_SEAT_CAPABILITY_KEYBOARD, "Keyboard" }, + { 0, NULL } + }; + GString *str; + char *text; + int i; + GList *list, *l; + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 40); + g_object_set (box, "margin", 10, NULL); + + text = g_strdup_printf ("Seat %d", num); + label = gtk_label_new (text); + 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); + g_free (text); + + str = g_string_new (""); + capabilities = gdk_seat_get_capabilities (seat); + for (i = 0; caps[i].cap != 0; i++) + { + if (capabilities & caps[i].cap) + { + if (str->len > 0) + g_string_append (str, ", "); + g_string_append (str, caps[i].name); + } + } + + label = gtk_label_new (str->str); + gtk_label_set_selectable (GTK_LABEL (label), TRUE); + gtk_widget_set_halign (label, GTK_ALIGN_END); + 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, TRUE, TRUE, 0); + g_string_free (str, TRUE); + + row = gtk_list_box_row_new (); + gtk_container_add (GTK_CONTAINER (row), box); + gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE); + gtk_widget_show_all (row); + + gtk_list_box_insert (GTK_LIST_BOX (gen->priv->device_box), row, -1); + + list = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_ALL); + + for (l = list; l; l = l->next) + add_device (gen, GDK_DEVICE (l->data)); + + g_list_free (list); +} + +static void +init_device (GtkInspectorGeneral *gen) +{ + GdkDisplay *display; + GList *list, *l; + int i; + + display = gdk_display_get_default (); + list = gdk_display_list_seats (display); + + for (l = list, i = 0; l; l = l->next, i++) + add_seat (gen, GDK_SEAT (l->data), i); + + g_list_free (list); +} + static void gtk_inspector_general_init (GtkInspectorGeneral *gen) { @@ -350,6 +509,7 @@ gtk_inspector_general_init (GtkInspectorGeneral *gen) init_version (gen); init_env (gen); init_display (gen); + init_device (gen); init_gl (gen); } @@ -365,6 +525,10 @@ keynav_failed (GtkWidget *widget, GtkDirectionType direction, GtkInspectorGenera next = gen->priv->x_box; else if (direction == GTK_DIR_DOWN && widget == gen->priv->x_box) next = gen->priv->gl_box; + else if (direction == GTK_DIR_DOWN && widget == gen->priv->gl_box) + next = gen->priv->device_box; + else if (direction == GTK_DIR_UP && widget == gen->priv->device_box) + next = gen->priv->gl_box; else if (direction == GTK_DIR_UP && widget == gen->priv->gl_box) next = gen->priv->x_box; else if (direction == GTK_DIR_UP && widget == gen->priv->x_box) @@ -414,6 +578,7 @@ gtk_inspector_general_constructed (GObject *object) g_signal_connect (gen->priv->env_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); g_signal_connect (gen->priv->x_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); g_signal_connect (gen->priv->gl_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); + g_signal_connect (gen->priv->device_box, "keynav-failed", G_CALLBACK (keynav_failed), gen); } static void @@ -444,6 +609,7 @@ gtk_inspector_general_class_init (GtkInspectorGeneralClass *klass) gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, x_display); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, x_composited); gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, x_rgba); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorGeneral, device_box); } // vim: set et sw=2 ts=2: diff --git a/gtk/inspector/general.ui b/gtk/inspector/general.ui index e1a2bca4be..114e5134fa 100644 --- a/gtk/inspector/general.ui +++ b/gtk/inspector/general.ui @@ -547,6 +547,20 @@ + + + + True + center + + + True + none + + + + + @@ -576,6 +590,7 @@ +