summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2021-06-20 15:29:42 +0000
committerJens Georg <mail@jensge.org>2021-06-20 15:29:42 +0000
commitc251ddcd03331ecba8702658be8023fb32743a85 (patch)
tree960102049f73c25b6cb5ca998d70d9ca3315b6d3
parent41981fff1ac4e068acd679f4ef0551807db07f6d (diff)
downloadgssdp-c251ddcd03331ecba8702658be8023fb32743a85.tar.gz
Port sniffer to GTK4
-rw-r--r--.gitlab-ci.yml4
-rw-r--r--meson.build2
-rw-r--r--tools/gssdp-device-sniffer.gresource.xml3
-rw-r--r--tools/main-window.c125
-rw-r--r--tools/main-window.ui449
-rw-r--r--tools/meson.build3
6 files changed, 235 insertions, 351 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5930c19..b0fad7e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -61,9 +61,9 @@ check-merge-request:
.gssdp.fedora@common:
variables:
- BASE_TAG: '2021-05-22.0'
+ BASE_TAG: '2021-06-19.0'
FDO_UPSTREAM_REPO: GNOME/gssdp
- FDO_DISTRIBUTION_PACKAGES: 'clang clang-analyzer gcovr git libasan libubsan python3-gobject python3-pip xmlto'
+ FDO_DISTRIBUTION_PACKAGES: 'clang clang-analyzer gcovr git libasan libubsan python3-gobject python3-pip xmlto gtk4-devel'
FDO_DISTRIBUTION_EXEC: |
dnf install -y 'dnf-command(builddep)' &&
dnf builddep -y gssdp --setopt=install_weak_deps=False &&
diff --git a/meson.build b/meson.build
index e043070..2683c70 100644
--- a/meson.build
+++ b/meson.build
@@ -75,7 +75,7 @@ subdir('libgssdp')
subdir('tests')
if get_option('sniffer')
- gtk = dependency('gtk+-3.0', version : '>= 3.12')
+ gtk = dependency('gtk4', version : '>= 4')
subdir('tools')
endif
diff --git a/tools/gssdp-device-sniffer.gresource.xml b/tools/gssdp-device-sniffer.gresource.xml
index 6a9d0a3..0b957e4 100644
--- a/tools/gssdp-device-sniffer.gresource.xml
+++ b/tools/gssdp-device-sniffer.gresource.xml
@@ -3,4 +3,7 @@
<gresource prefix="/org/gupnp/GSSDP">
<file preprocess="xml-stripblanks" alias="MainWindow.ui">main-window.ui</file>
</gresource>
+ <gresource prefix="/org/gupnp">
+ <file preprocess="xml-stripblanks" alias="Logo.svg">images/gupnp-logo-short.svg</file>
+ </gresource>
</gresources>
diff --git a/tools/main-window.c b/tools/main-window.c
index 80e6d03..36a0d67 100644
--- a/tools/main-window.c
+++ b/tools/main-window.c
@@ -12,6 +12,8 @@
#include <libsoup/soup.h>
+#define LOGO_RESOURCE "/org/gupnp/Logo.svg"
+
typedef enum
{
PACKET_STORE_COLUMN_TIME,
@@ -52,7 +54,7 @@ struct _GSSDPDeviceSnifferMainWindow {
// Bound child widgets
GtkWidget *packet_treeview;
GtkWidget *packet_textview;
- GtkWidget *capture_button_image;
+ GtkWidget *capture_button;
GtkWidget *device_treeview;
GtkWidget *details_scrolled;
GMenuModel *sniffer_context_menu;
@@ -114,9 +116,7 @@ main_window_set_property (GObject *object,
? "media-playback-stop-symbolic"
: "media-playback-start-symbolic";
- gtk_image_set_from_icon_name (GTK_IMAGE (self->capture_button_image),
- icon_name,
- GTK_ICON_SIZE_BUTTON);
+ gtk_button_set_icon_name(GTK_BUTTON (self->capture_button), icon_name);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -229,8 +229,8 @@ on_ssdp_message (GSSDPClient *ssdp_client,
return;
if (gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (self->searchbar))) {
- const char *filter =
- gtk_entry_get_text (GTK_ENTRY (self->address_filter));
+ const char *filter = gtk_editable_get_text (
+ GTK_EDITABLE (self->address_filter));
if (filter != NULL && strcmp (filter, from_ip) != 0)
return;
}
@@ -453,7 +453,7 @@ gssdp_device_sniffer_main_window_class_init (
gtk_widget_class_bind_template_child (widget_class,
GSSDPDeviceSnifferMainWindow,
- capture_button_image);
+ capture_button);
gtk_widget_class_bind_template_child (widget_class,
GSSDPDeviceSnifferMainWindow,
@@ -531,23 +531,18 @@ on_realize (GtkWidget *self, gpointer user_data)
{
double w;
double h;
-#if GTK_CHECK_VERSION(3, 22, 0)
- {
- GdkWindow *window = gtk_widget_get_window (self);
- GdkDisplay *display = gdk_display_get_default ();
- GdkMonitor *monitor =
- gdk_display_get_monitor_at_window (display, window);
- GdkRectangle rectangle;
-
- gdk_monitor_get_geometry (monitor, &rectangle);
- w = rectangle.width * 0.75;
- h = rectangle.height * 0.75;
- }
-#else
- w = gdk_screen_width () * 0.75;
- h = gdk_screen_height () * 0.75;
-#endif
+ GtkNative *native = gtk_widget_get_native (self);
+ GdkSurface *surface = gtk_native_get_surface (native);
+ GdkDisplayManager *mgr = gdk_display_manager_get ();
+ GdkDisplay *display = gdk_display_manager_get_default_display (mgr);
+ GdkMonitor *monitor =
+ gdk_display_get_monitor_at_surface (display, surface);
+ GdkRectangle rectangle;
+
+ gdk_monitor_get_geometry (monitor, &rectangle);
+ w = rectangle.width * 0.75;
+ h = rectangle.height * 0.75;
int window_width = CLAMP ((int) w, 10, 1000);
int window_height = CLAMP ((int) h, 10, 800);
@@ -672,7 +667,11 @@ static void
on_about (GSimpleAction *action, GVariant *parameter, gpointer user_data)
{
const char *AUTHORS[] = { "Zeeshan Ali (Khattak) <zeeshanak@gnome.org>",
+ "Jens Georg <mail@jensge.org>",
NULL };
+
+ GdkTexture *logo = gdk_texture_new_from_resource (LOGO_RESOURCE);
+
gtk_show_about_dialog (
GTK_WINDOW (user_data),
"copyright",
@@ -688,7 +687,10 @@ on_about (GSimpleAction *action, GVariant *parameter, gpointer user_data)
"translator-credits",
"license-type",
GTK_LICENSE_LGPL_2_1,
+ "logo", logo,
NULL);
+
+ g_object_unref (logo);
}
static void
@@ -712,7 +714,7 @@ on_set_address_filter (GSimpleAction *action,
PACKET_STORE_COLUMN_IP,
&ip_filter,
-1);
- gtk_entry_set_text (GTK_ENTRY (self->address_filter), ip_filter);
+ gtk_editable_set_text (GTK_EDITABLE (self->address_filter), ip_filter);
g_free (ip_filter);
gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (self->searchbar), TRUE);
@@ -726,46 +728,43 @@ static GActionEntry actions[] = { { "clear-capture", on_clear_capture },
on_set_address_filter } };
static void
-do_popup_menu (GSSDPDeviceSnifferMainWindow *self, GdkEventButton *event)
-{
- gtk_menu_popup_at_pointer (GTK_MENU (self->context_menu),
- (event != NULL) ? (GdkEvent *) event
- : gtk_get_current_event ());
-}
-
-static gboolean
-on_popup_menu (GtkWidget *widget, gpointer user_data)
+on_button_release (GtkGesture *click,
+ int n_press,
+ gdouble x,
+ gdouble y,
+ gpointer user_data)
{
GSSDPDeviceSnifferMainWindow *self =
GSSDP_DEVICE_SNIFFER_MAIN_WINDOW (user_data);
- do_popup_menu (self, NULL);
+ GdkEventSequence *sequence = gtk_gesture_single_get_current_sequence (
+ GTK_GESTURE_SINGLE (click));
- return TRUE;
-}
+ GdkEvent *event = gtk_gesture_get_last_event (click, sequence);
-static gboolean
-on_button_release (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
-{
- GSSDPDeviceSnifferMainWindow *self =
- GSSDP_DEVICE_SNIFFER_MAIN_WINDOW (user_data);
+ if (n_press != 1) {
+ return;
+ }
+
+ if (!gdk_event_triggers_context_menu (event)) {
+ return;
+ }
- GtkTreeSelection *selection;
+ gtk_gesture_set_sequence_state (GTK_GESTURE (click), sequence,
+ GTK_EVENT_SEQUENCE_CLAIMED);
GtkTreeModel *model;
GtkTreeIter iter;
- if (event->type != GDK_BUTTON_RELEASE || event->button != 3) {
- return FALSE;
- }
- selection = gtk_tree_view_get_selection (
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (
GTK_TREE_VIEW (self->packet_treeview));
+
if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
- return FALSE;
+ return;
}
- do_popup_menu (self, event);
-
- return TRUE;
+ GdkRectangle rect = { x, y, 1, 1 };
+ gtk_popover_set_pointing_to (GTK_POPOVER (self->context_menu), &rect);
+ gtk_popover_popup (GTK_POPOVER (self->context_menu));
}
static void
@@ -774,9 +773,20 @@ gssdp_device_sniffer_main_window_init (GSSDPDeviceSnifferMainWindow *self)
gtk_widget_init_template (GTK_WIDGET (self));
self->context_menu =
- gtk_menu_new_from_model (self->sniffer_context_menu);
-
- gtk_menu_attach_to_widget(GTK_MENU (self->context_menu), self->packet_treeview, NULL);
+ gtk_popover_menu_new_from_model (self->sniffer_context_menu);
+ gtk_widget_set_parent (self->context_menu, self->packet_treeview);
+ gtk_popover_set_position (GTK_POPOVER (self->context_menu),
+ GTK_POS_BOTTOM);
+ gtk_popover_set_has_arrow (GTK_POPOVER (self->context_menu), FALSE);
+ gtk_widget_set_halign (self->context_menu, GTK_ALIGN_START);
+
+ GtkGesture *click = gtk_gesture_click_new ();
+ gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (click),
+ "packet-treeview-click");
+ gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (click), 3);
+ gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (click), TRUE);
+ gtk_widget_add_controller (self->packet_treeview,
+ GTK_EVENT_CONTROLLER (click));
g_signal_connect (G_OBJECT (self),
"realize",
@@ -790,13 +800,8 @@ gssdp_device_sniffer_main_window_init (GSSDPDeviceSnifferMainWindow *self)
G_CALLBACK (on_packet_selected),
self);
- g_signal_connect (G_OBJECT (self->packet_treeview),
- "popup-menu",
- G_CALLBACK (on_popup_menu),
- self);
-
- g_signal_connect (G_OBJECT (self->packet_treeview),
- "button-release-event",
+ g_signal_connect (G_OBJECT (click),
+ "pressed",
G_CALLBACK (on_button_release),
self);
diff --git a/tools/main-window.ui b/tools/main-window.ui
index 605a04d..0929f6a 100644
--- a/tools/main-window.ui
+++ b/tools/main-window.ui
@@ -1,34 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.2 -->
<interface>
- <requires lib="gtk+" version="3.20"/>
+ <requires lib="gtk" version="4.0"/>
<object class="GtkListStore" id="device_store">
<columns>
- <!-- column-name uid -->
<column type="gchararray"/>
- <!-- column-name first-seen -->
<column type="gchararray"/>
- <!-- column-name device-type -->
<column type="gchararray"/>
- <!-- column-name location -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkListStore" id="packet_store">
<columns>
- <!-- column-name time -->
<column type="gchararray"/>
- <!-- column-name source-address -->
<column type="gchararray"/>
- <!-- column-name interface -->
<column type="gchararray"/>
- <!-- column-name type -->
<column type="gchararray"/>
- <!-- column-name information -->
<column type="gchararray"/>
- <!-- column-name SoupMessageHeader1 -->
<column type="SoupMessageHeaders"/>
- <!-- column-name GDateTime1 -->
<column type="GDateTime"/>
</columns>
</object>
@@ -47,8 +35,8 @@
</section>
</menu>
<template class="GSSDPDeviceSnifferMainWindow" parent="GtkApplicationWindow">
- <property name="can_focus">False</property>
- <property name="can_focus">False</property>
+ <property name="can_focus">0</property>
+ <property name="can_focus">0</property>
<child>
<menu id="sniffer_context_menu">
<section>
@@ -61,374 +49,261 @@
</child>
<child type="titlebar">
<object class="GtkHeaderBar">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="show_close_button">True</property>
+ <property name="can_focus">0</property>
<child>
<object class="GtkBox">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can_focus">0</property>
<property name="spacing">6</property>
<child>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <property name="receives_default">1</property>
<property name="tooltip_text" translatable="yes">Clear packet capture</property>
<property name="action_name">win.clear-capture</property>
- <child>
- <object class="GtkImage">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">edit-clear-all-symbolic</property>
- </object>
- </child>
+ <property name="icon_name">edit-clear-all-symbolic</property>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
</child>
<child>
- <object class="GtkToggleButton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <object class="GtkToggleButton" id="capture_button">
+ <property name="receives_default">1</property>
<property name="tooltip_text" translatable="yes">Toggle packet capture</property>
- <property name="active">True</property>
+ <property name="active">1</property>
<property name="action_name">win.toggle-capture</property>
- <child>
- <object class="GtkImage" id="capture_button_image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">media-playback-stop-symbolic</property>
- </object>
- </child>
+ <property name="icon_name">media-playback-stop-symbolic</property>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
</child>
<child>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <property name="receives_default">1</property>
<property name="tooltip_text" translatable="yes">Trigger a rescan of the network</property>
<property name="action_name">win.trigger-rescan</property>
- <child>
- <object class="GtkImage">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">view-refresh-symbolic</property>
- </object>
- </child>
+ <property name="icon_name">view-refresh-symbolic</property>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
- <packing>
- <property name="position">1</property>
- </packing>
</child>
<child type="title">
<object class="GtkStackSwitcher">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can_focus">0</property>
<property name="halign">center</property>
- <property name="icon_size">0</property>
<property name="stack">stack1</property>
</object>
</child>
- <child>
+ <child type="end">
<object class="GtkToggleButton" id="searchbutton">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <property name="receives_default">1</property>
<property name="tooltip_text" translatable="yes">Enable content filter</property>
- <property name="active">False</property>
- <child>
- <object class="GtkImage">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">system-search-symbolic</property>
- </object>
- </child>
+ <property name="icon_name">system-search-symbolic</property>
</object>
- <packing>
- <property name="pack_type">end</property>
- <property name="position">1</property>
- </packing>
</child>
- <child>
+ <child type="end">
<object class="GtkMenuButton" id="window-menu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <property name="receives_default">1</property>
<property name="menu-model">sniffer-window-menu</property>
- <child>
- <object class="GtkImage">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">open-menu-symbolic</property>
- </object>
- </child>
+ <property name="icon-name">open-menu-symbolic</property>
</object>
- <packing>
- <property name="pack_type">end</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
</child>
<child>
<object class="GtkStack" id="stack1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can_focus">0</property>
<child>
- <object class="GtkBox" id="vbox">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="border_width">6</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkSearchBar" id="searchbar">
- <property name="visible">True</property>
- <property name="show_close_button">True</property>
- <property name="search-mode-enabled">True</property>
+ <object class="GtkStackPage">
+ <property name="title" translatable="yes">Packets</property>
+ <property name="child">
+ <object class="GtkBox" id="vbox">
+ <property name="can_focus">0</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkSearchEntry" id="address_filter">
- <property name="visible">True</property>
- <property name="max-width-chars">40</property>
- </object>
+ <object class="GtkSearchBar" id="searchbar">
+ <property name="show_close_button">1</property>
+ <property name="search-mode-enabled">1</property>
+ <property name="child">
+ <object class="GtkSearchEntry" id="address_filter">
+ <property name="max-width-chars">40</property>
+ </object>
+ </property>
+ </object>
</child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="packet-scrolledwindow">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="shadow_type">in</property>
<child>
- <object class="GtkTreeView" id="packet_treeview">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="model">packet_store</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection"/>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Time</property>
+ <object class="GtkScrolledWindow" id="packet-scrolledwindow">
+ <property name="vexpand">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="packet_treeview">
+ <property name="model">packet_store</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="markup">0</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Time</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="markup">0</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Source Address</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="markup">1</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Source Address</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="markup">1</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Interface</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="markup">2</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Interface</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="markup">2</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Packet Type</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="markup">3</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Packet Type</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="markup">3</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Packet Information</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="markup">4</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Packet Information</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="markup">4</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
</object>
- </child>
+ </property>
</object>
</child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="details_scrolled">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="shadow_type">in</property>
<child>
- <object class="GtkTextView" id="packet_textview">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="monospace">True</property>
+ <object class="GtkScrolledWindow" id="details_scrolled">
+ <property name="vexpand">1</property>
+ <property name="child">
+ <object class="GtkTextView" id="packet_textview">
+ <property name="editable">0</property>
+ <property name="monospace">1</property>
+ </object>
+ </property>
</object>
</child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
+ <child type="end">
<object class="GtkBox">
<property name="orientation">horizontal</property>
<property name="spacing">6</property>
<property name="visible">True</property>
- <child>
+ <child type="start">
<object class="GtkLabel" id="info_label">
<property name="label"></property>
<property name="visible">True</property>
<property name="halign">start</property>
+ <property name="hexpand">true</property>
<property name="valign">center</property>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
</child>
- <child>
+ <child type="end">
<object class="GtkLabel" id="counter_label">
<property name="label"></property>
<property name="visible">True</property>
<property name="halign">end</property>
+ <property name="hexpand">true</property>
<property name="valign">center</property>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
</child>
+ </object>
+ </property>
</object>
- <packing>
- <property name="name">page0</property>
- <property name="title" translatable="yes">Packets</property>
- </packing>
</child>
<child>
- <object class="GtkScrolledWindow" id="device-details-scrolledwindow">
- <property name="name">Bar</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="margin_top">6</property>
- <property name="margin_bottom">6</property>
- <property name="shadow_type">in</property>
- <child>
- <object class="GtkTreeView" id="device_treeview">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="model">device_store</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection"/>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Unique Identifier</property>
+ <object class="GtkStackPage">
+ <property name="title" translatable="yes">Device history</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="device-details-scrolledwindow">
+ <property name="name">Bar</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
+ <property name="child">
+ <object class="GtkTreeView" id="device_treeview">
+ <property name="model">device_store</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Unique Identifier</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">First Notify</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">First Notify</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Device Type</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="text">2</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Device Type</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="text">2</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Location</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="text">3</attribute>
- </attributes>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Location</property>
+ <child>
+ <object class="GtkCellRendererText"/>
+ <attributes>
+ <attribute name="text">3</attribute>
+ </attributes>
+ </child>
+ </object>
</child>
</object>
- </child>
+ </property>
</object>
- </child>
+ </property>
</object>
- <packing>
- <property name="name">page1</property>
- <property name="title" translatable="yes">Device history</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
</child>
- </template>
+ </template>
</interface>
diff --git a/tools/meson.build b/tools/meson.build
index 59c5e74..3de758c 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -1,6 +1,7 @@
resource = gnome.compile_resources(
'org.gupnp.GSSDP.DeviceSniffer',
- 'gssdp-device-sniffer.gresource.xml'
+ 'gssdp-device-sniffer.gresource.xml',
+ source_dir: [meson.current_source_dir(), meson.source_root() / 'doc']
)
sniffer = executable(