[gtk+] broadway: Support TCP displays
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] broadway: Support TCP displays
- Date: Thu, 13 Jun 2013 17:27:09 +0000 (UTC)
commit e2da2259ad99e53644bebe26b12bac367d510e31
Author: Tarnyko <tarnyko tarnyko net>
Date: Thu Jun 13 18:55:40 2013 +0200
broadway: Support TCP displays
gdk/broadway/broadwayd.c | 63 +++++++++++++++++++++++++----------
gdk/broadway/gdkbroadway-server.c | 52 ++++++++++++++++++++++++-----
gdk/broadway/gdkbroadway-server.h | 2 +-
gdk/broadway/gdkdisplay-broadway.c | 13 +-------
4 files changed, 90 insertions(+), 40 deletions(-)
---
diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c
index cd6a888..9dad486 100644
--- a/gdk/broadway/broadwayd.c
+++ b/gdk/broadway/broadwayd.c
@@ -437,12 +437,14 @@ main (int argc, char *argv[])
GError *error = NULL;
GOptionContext *context;
GMainLoop *loop;
+ GInetAddress *inet;
GSocketAddress *address;
GSocketService *listener;
- char *path, *base;
+ char *path, *basename;
char *http_address = NULL;
int http_port = 0;
- int display = 1;
+ char *display;
+ int port = 0;
const GOptionEntry entries[] = {
{ "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" },
{ "address", 'a', 0, G_OPTION_ARG_STRING, &http_address, "Ip address to bind to ", "ADDRESS" },
@@ -457,6 +459,7 @@ main (int argc, char *argv[])
exit (1);
}
+ display = NULL;
if (argc > 1)
{
if (*argv[1] != ':')
@@ -464,16 +467,49 @@ main (int argc, char *argv[])
g_printerr ("Usage broadwayd [:DISPLAY]\n");
exit (1);
}
- display = strtol(argv[1]+1, NULL, 10);
- if (display == 0)
- {
- g_printerr ("Failed to parse display num %s\n", argv[1]);
- exit (1);
- }
+ display = argv[1];
+ }
+
+ if (display == NULL)
+ {
+#ifdef G_OS_UNIX
+ display = ":0";
+#else
+ display = ":tcp"
+#endif
+ }
+
+ if (g_str_has_prefix (display, ":tcp"))
+ {
+ port = strtol (display + strlen (":tcp"), NULL, 10);
+
+ inet = g_inet_address_new_from_string ("127.0.0.1");
+ g_print ("Listening on 127.0.0.1:%d\n", port + 9090);
+ address = g_inet_socket_address_new (inet, port + 9090);
+ g_object_unref (inet);
+ }
+#ifdef G_OS_UNIX
+ else if (display[0] == ':' && g_ascii_isdigit(display[1]))
+ {
+ port = strtol (display + strlen (":"), NULL, 10);
+ basename = g_strdup_printf ("broadway%d.socket", port + 1);
+ path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
+ g_free (basename);
+
+ g_print ("Listening on %s\n", path);
+ address = g_unix_socket_address_new_with_type (path, -1,
+ G_UNIX_SOCKET_ADDRESS_ABSTRACT);
+ g_free (path);
+ }
+#endif
+ else
+ {
+ g_printerr ("Failed to parse display %s\n", display);
+ exit (1);
}
if (http_port == 0)
- http_port = 8080 + (display - 1);
+ http_port = 8080 + port;
server = broadway_server_new (http_address, http_port, &error);
if (server == NULL)
@@ -482,14 +518,6 @@ main (int argc, char *argv[])
return 1;
}
- base = g_strdup_printf ("broadway%d.socket", display);
- path = g_build_filename (g_get_user_runtime_dir (), base, NULL);
- g_free (base);
- g_print ("Listening on %s\n", path);
- address = g_unix_socket_address_new_with_type (path, -1,
- G_UNIX_SOCKET_ADDRESS_ABSTRACT);
- g_free (path);
-
listener = g_socket_service_new ();
if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener),
address,
@@ -503,7 +531,6 @@ main (int argc, char *argv[])
return 1;
}
g_object_unref (address);
-
g_signal_connect (listener, "incoming", G_CALLBACK (incoming_client), NULL);
g_socket_service_start (G_SOCKET_SERVICE (listener));
diff --git a/gdk/broadway/gdkbroadway-server.c b/gdk/broadway/gdkbroadway-server.c
index 92d4e60..04565e0 100644
--- a/gdk/broadway/gdkbroadway-server.c
+++ b/gdk/broadway/gdkbroadway-server.c
@@ -20,6 +20,7 @@
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
+#include "gdkintl.h"
typedef struct BroadwayInput BroadwayInput;
@@ -81,31 +82,64 @@ _gdk_broadway_server_get_next_serial (GdkBroadwayServer *server)
}
GdkBroadwayServer *
-_gdk_broadway_server_new (int port, GError **error)
+_gdk_broadway_server_new (const char *display, GError **error)
{
GdkBroadwayServer *server;
char *basename;
GSocketClient *client;
GSocketConnection *connection;
+ GInetAddress *inet;
GSocketAddress *address;
GPollableInputStream *pollable;
GInputStream *in;
GSource *source;
char *path;
+ char *local_socket_type = NULL;
+ int port;
- basename = g_strdup_printf ("broadway%d.socket", port);
- path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
- g_free (basename);
+ if (display == NULL)
+ {
+#ifdef G_OS_UNIX
+ display = ":0";
+#else
+ display = ":tcp"
+#endif
+ }
- address = g_unix_socket_address_new_with_type (path, -1,
- G_UNIX_SOCKET_ADDRESS_ABSTRACT);
- g_free (path);
+ if (g_str_has_prefix (display, ":tcp"))
+ {
+ port = 9090 + strtol (display + strlen (":tcp"), NULL, 10);
+
+ inet = g_inet_address_new_from_string ("127.0.0.1");
+ address = g_inet_socket_address_new (inet, port);
+ g_object_unref (inet);
+ }
+#ifdef G_OS_UNIX
+ else if (display[0] == ':' && g_ascii_isdigit(display[1]))
+ {
+ port = strtol (display + strlen (":"), NULL, 10);
+ basename = g_strdup_printf ("broadway%d.socket", port + 1);
+ path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
+ g_free (basename);
+
+ address = g_unix_socket_address_new_with_type (path, -1,
+ G_UNIX_SOCKET_ADDRESS_ABSTRACT);
+ g_free (path);
+ }
+#endif
+ else
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("broadway display type not supported '%s'"), display);
+ return NULL;
+ }
+
+ g_free (local_socket_type);
client = g_socket_client_new ();
- error = NULL;
connection = g_socket_client_connect (client, G_SOCKET_CONNECTABLE (address), NULL, error);
-
+
g_object_unref (address);
g_object_unref (client);
diff --git a/gdk/broadway/gdkbroadway-server.h b/gdk/broadway/gdkbroadway-server.h
index 6c63ede..2b93a85 100644
--- a/gdk/broadway/gdkbroadway-server.h
+++ b/gdk/broadway/gdkbroadway-server.h
@@ -14,7 +14,7 @@ typedef struct _GdkBroadwayServerClass GdkBroadwayServerClass;
#define GDK_IS_BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_SERVER))
#define GDK_BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_SERVER,
GdkBroadwayServerClass))
-GdkBroadwayServer *_gdk_broadway_server_new (int port,
+GdkBroadwayServer *_gdk_broadway_server_new (const char *display,
GError **error);
void _gdk_broadway_server_flush (GdkBroadwayServer *server);
void _gdk_broadway_server_sync (GdkBroadwayServer *server);
diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c
index e3d4426..70d5edf 100644
--- a/gdk/broadway/gdkdisplay-broadway.c
+++ b/gdk/broadway/gdkdisplay-broadway.c
@@ -121,7 +121,6 @@ _gdk_broadway_display_open (const gchar *display_name)
{
GdkDisplay *display;
GdkBroadwayDisplay *broadway_display;
- int port;
display = g_object_new (GDK_TYPE_BROADWAY_DISPLAY, NULL);
broadway_display = GDK_BROADWAY_DISPLAY (display);
@@ -150,17 +149,7 @@ _gdk_broadway_display_open (const gchar *display_name)
if (display_name == NULL)
display_name = g_getenv ("BROADWAY_DISPLAY");
- port = 0;
- if (display_name != NULL)
- {
- if (*display_name == ':')
- display_name++;
- port = strtol(display_name, NULL, 10);
- }
- if (port == 0)
- port = 1;
-
- broadway_display->server = _gdk_broadway_server_new (port, NULL);
+ broadway_display->server = _gdk_broadway_server_new (display_name, NULL);
if (broadway_display->server == NULL)
{
g_printerr ("Unable to init server\n");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]