From 9473c2607941b1e5032b01f1cb580fdf935e5729 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 24 Feb 2012 10:17:12 +0100 Subject: Add a spice-controller-dump testing tool By default, start a controller listener. If ran with --menu, start a foreign-menu listener. --- gtk/controller/Makefile.am | 5 +- gtk/controller/dump.c | 117 +++++++++++++++++++++++++++++++++++++++++++++ gtk/controller/test.c | 21 ++++++-- 3 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 gtk/controller/dump.c diff --git a/gtk/controller/Makefile.am b/gtk/controller/Makefile.am index 20f1a48..916309e 100644 --- a/gtk/controller/Makefile.am +++ b/gtk/controller/Makefile.am @@ -20,7 +20,7 @@ AM_VALAFLAGS = \ $(NULL) lib_LTLIBRARIES = libspice-controller.la -noinst_PROGRAMS = test-controller +noinst_PROGRAMS = test-controller spice-controller-dump BUILT_SOURCES = controller.vala.stamp @@ -60,6 +60,9 @@ libspice_controllerinclude_HEADERS = \ test_controller_SOURCES = test.c test_controller_LDADD = libspice-controller.la +spice_controller_dump_SOURCES = dump.c +spice_controller_dump_LDADD = libspice-controller.la + controller.vala.stamp: $(libspice_controller_la_VALASOURCES) custom.vapi @if test -z "$(VALAC)"; then \ echo "" ; \ diff --git a/gtk/controller/dump.c b/gtk/controller/dump.c new file mode 100644 index 0000000..6541dec --- /dev/null +++ b/gtk/controller/dump.c @@ -0,0 +1,117 @@ +/* Copyright (C) 2011 Red Hat, Inc. */ + +/* 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 . */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#include +#include +#include +#include +#include +#endif + +#include "spice-controller.h" + +SpiceCtrlController *ctrl = NULL; +SpiceCtrlForeignMenu *menu = NULL; +GMainLoop *loop = NULL; + +void signaled (GObject *gobject, const gchar *signal_name) +{ + g_message ("signaled: %s", signal_name); +} + +void notified (GObject *gobject, GParamSpec *pspec, + gpointer user_data) +{ + GValue value = { 0, }; + GValue strvalue = { 0, }; + + g_return_if_fail (gobject != NULL); + g_return_if_fail (pspec != NULL); + + g_value_init (&value, pspec->value_type); + g_value_init (&strvalue, G_TYPE_STRING); + g_object_get_property (gobject, pspec->name, &value); + + if (pspec->value_type == G_TYPE_STRV) { + gchar** p = (gchar **)g_value_get_boxed (&value); + g_message ("notify::%s == ", pspec->name); + while (*p) + g_message ("%s", *p++); + } else if (G_TYPE_IS_OBJECT(pspec->value_type)) { + GObject *o = g_value_get_object (&value); + g_message ("notify::%s == %s", pspec->name, o ? G_OBJECT_TYPE_NAME (o) : "null"); + } else { + g_value_transform (&value, &strvalue); + g_message ("notify::%s = %s", pspec->name, g_value_get_string (&strvalue)); + } + + g_value_unset (&value); + g_value_unset (&strvalue); +} + +void connect_signals (gpointer obj) +{ + guint i, n_ids = 0; + guint *ids = NULL; + GType type = G_OBJECT_TYPE (obj); + + ids = g_signal_list_ids (type, &n_ids); + for (i = 0; i < n_ids; i++) { + const gchar *name = g_signal_name (ids[i]); + g_signal_connect (obj, name, G_CALLBACK (signaled), (gpointer)name); + } +} + +int main (int argc, char *argv[]) +{ + g_type_init (); + loop = g_main_loop_new (NULL, FALSE); + + if (argc > 1 && g_str_equal(argv[1], "--menu")) { + menu = spice_ctrl_foreign_menu_new (); + g_signal_connect (menu, "notify", G_CALLBACK (notified), NULL); + connect_signals (menu); + + spice_ctrl_foreign_menu_listen (menu, NULL, NULL, NULL); + } else { + ctrl = spice_ctrl_controller_new (); + g_signal_connect (ctrl, "notify", G_CALLBACK (notified), NULL); + connect_signals (ctrl); + + spice_ctrl_controller_listen (ctrl, NULL, NULL, NULL); + } + + g_main_loop_run (loop); + + if (ctrl != NULL) + g_object_unref (ctrl); + if (menu != NULL) + g_object_unref (menu); + + return 0; +} + diff --git a/gtk/controller/test.c b/gtk/controller/test.c index e43d299..3f3eb55 100644 --- a/gtk/controller/test.c +++ b/gtk/controller/test.c @@ -174,9 +174,9 @@ void notified (GObject *gobject, GParamSpec *pspec, g_message ("notify::%s == ", pspec->name); while (*p) g_message ("%s", *p++); - } else if (pspec->value_type == G_TYPE_OBJECT) { + } else if (G_TYPE_IS_OBJECT(pspec->value_type)) { GObject *o = g_value_get_object (&value); - g_message ("notify::%s == %s", pspec->name, G_OBJECT_TYPE_NAME (o)); + g_message ("notify::%s == %s", pspec->name, o ? G_OBJECT_TYPE_NAME (o) : "null"); } else { g_value_transform (&value, &strvalue); g_message ("notify::%s = %s", pspec->name, g_value_get_string (&strvalue)); @@ -186,6 +186,19 @@ void notified (GObject *gobject, GParamSpec *pspec, g_value_unset (&strvalue); } +void connect_signals (gpointer obj) +{ + guint i, n_ids = 0; + guint *ids = NULL; + GType type = G_OBJECT_TYPE (obj); + + ids = g_signal_list_ids (type, &n_ids); + for (i = 0; i < n_ids; i++) { + const gchar *name = g_signal_name (ids[i]); + g_signal_connect (obj, name, G_CALLBACK (signaled), (gpointer)name); + } +} + int main (int argc, char *argv[]) { int spicec_pid = (argc > 1 ? atoi (argv[1]) : 0); @@ -199,9 +212,7 @@ int main (int argc, char *argv[]) ctrl = spice_ctrl_controller_new (); loop = g_main_loop_new (NULL, FALSE); g_signal_connect (ctrl, "notify", G_CALLBACK (notified), NULL); - g_signal_connect (ctrl, "show", G_CALLBACK (signaled), "show"); - g_signal_connect (ctrl, "hide", G_CALLBACK (signaled), "hide"); - g_signal_connect (ctrl, "do_connect", G_CALLBACK (signaled), "do_connect"); + connect_signals (ctrl); #ifdef WIN32 snprintf (pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME, spicec_pid); -- cgit v1.2.3