[gtk+] [broadway] Handle screen size



commit dd07f534f4af26864a76fc15484564a344e42184
Author: Alexander Larsson <alexl redhat com>
Date:   Thu Apr 7 15:10:39 2011 +0200

    [broadway] Handle screen size
    
    Without this menu placement doesn't work right

 gdk/broadway/broadway.js           |   20 ++++++++++++++++++--
 gdk/broadway/gdkdisplay-broadway.c |    6 ++++++
 gdk/broadway/gdkdisplay-broadway.h |    7 +++++++
 gdk/broadway/gdkeventsource.c      |   11 +++++++++++
 gdk/broadway/gdkprivate-broadway.h |    2 ++
 gdk/broadway/gdkscreen-broadway.c  |   17 +++++++++++++++++
 6 files changed, 61 insertions(+), 2 deletions(-)
---
diff --git a/gdk/broadway/broadway.js b/gdk/broadway/broadway.js
index eba484c..8a40605 100644
--- a/gdk/broadway/broadway.js
+++ b/gdk/broadway/broadway.js
@@ -282,14 +282,14 @@ function browserWindowClosed(win) {
 
     sendInput ("W", [surface.id]);
     for (id in surfaces) {
-	if (surfaces[id].transientToplevel != null && surfaces[id].transientToplevel == surface) {
+	if (surfaces[id].transientToplevel != null && 
+	    surfaces[id].transientToplevel == surface) {
 	    var childSurface = surfaces[id];
 	    sendInput ("W", [childSurface.id]);
 	}
     }
 }
 
-
 function registerWindow(win)
 {
     toplevelWindows.push(win);
@@ -926,6 +926,22 @@ function connect()
 	var ws = new WebSocket(loc, "broadway");
 	ws.onopen = function() {
 	    inputSocket = ws;
+	    
+	    var w, h;
+	    if (useToplevelWindows) {
+		w = window.screen.width;
+		h = window.screen.height;
+	    } else {
+		w = window.innerWidth;
+		h = window.innerHeight;
+		win.onresize = function(ev) { 
+		    var w, h;
+		    w = window.innerWidth;
+		    h = window.innerHeight;
+		    sendInput ("d", [w, h]);
+		};
+	    }
+	    sendInput ("d", [w, h]);
 	};
 	ws.onclose = function() {
 	    inputSocket = null;
diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c
index 44cc326..b39d4e1 100644
--- a/gdk/broadway/gdkdisplay-broadway.c
+++ b/gdk/broadway/gdkdisplay-broadway.c
@@ -265,6 +265,12 @@ parse_input_message (BroadwayInput *input, const char *message)
     msg.delete_notify.id = strtol(p, &p, 10);
     break;
 
+  case 'd':
+    msg.screen_resize_notify.width = strtol (p, &p, 10);
+    p++; /* Skip , */
+    msg.screen_resize_notify.height = strtol (p, &p, 10);
+    break;
+
   default:
     g_printerr ("Unknown input command %s\n", message);
     break;
diff --git a/gdk/broadway/gdkdisplay-broadway.h b/gdk/broadway/gdkdisplay-broadway.h
index d4a87d2..029e88d 100644
--- a/gdk/broadway/gdkdisplay-broadway.h
+++ b/gdk/broadway/gdkdisplay-broadway.h
@@ -98,6 +98,12 @@ typedef struct {
 
 typedef struct {
   BroadwayInputBaseMsg base;
+  int width;
+  int height;
+} BroadwayInputScreenResizeNotify;
+
+typedef struct {
+  BroadwayInputBaseMsg base;
   int id;
 } BroadwayInputDeleteNotify;
 
@@ -111,6 +117,7 @@ typedef union {
   BroadwayInputGrabReply grab_reply;
   BroadwayInputConfigureNotify configure_notify;
   BroadwayInputDeleteNotify delete_notify;
+  BroadwayInputScreenResizeNotify screen_resize_notify;
 } BroadwayInputMsg;
 
 struct _GdkBroadwayDisplay
diff --git a/gdk/broadway/gdkeventsource.c b/gdk/broadway/gdkeventsource.c
index 2e27416..6cefc47 100644
--- a/gdk/broadway/gdkeventsource.c
+++ b/gdk/broadway/gdkeventsource.c
@@ -93,6 +93,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
 				BroadwayInputMsg *message)
 {
   GdkBroadwayDisplay *display_broadway = GDK_BROADWAY_DISPLAY (display);
+  GdkScreen *screen;
   GdkWindow *window;
   GdkEvent *event = NULL;
   GList *node;
@@ -308,6 +309,16 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
       }
     break;
 
+  case 'd':
+    screen = gdk_display_get_default_screen (display);
+    window = gdk_screen_get_root_window (screen);
+    window->width = message->screen_resize_notify.width;
+    window->height = message->screen_resize_notify.height;
+
+    _gdk_window_update_size (window);
+    _gdk_broadway_screen_size_changed (screen, &message->screen_resize_notify);
+    break;
+
   default:
     g_printerr ("Unknown input command %c\n", message->base.type);
     break;
diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h
index 517977b..4956894 100644
--- a/gdk/broadway/gdkprivate-broadway.h
+++ b/gdk/broadway/gdkprivate-broadway.h
@@ -119,6 +119,8 @@ void _gdk_broadway_screen_query_visual_types (GdkScreen * screen,
 					      GdkVisualType **visual_types,
 					      gint           *count);
 GList *_gdk_broadway_screen_list_visuals (GdkScreen *screen);
+void _gdk_broadway_screen_size_changed (GdkScreen *screen, 
+					BroadwayInputScreenResizeNotify *msg);
 
 void _gdk_broadway_events_got_input      (GdkDisplay *display,
 					  BroadwayInputMsg *message);
diff --git a/gdk/broadway/gdkscreen-broadway.c b/gdk/broadway/gdkscreen-broadway.c
index 30f907f..77b7a88 100644
--- a/gdk/broadway/gdkscreen-broadway.c
+++ b/gdk/broadway/gdkscreen-broadway.c
@@ -102,6 +102,23 @@ gdk_broadway_screen_get_root_window (GdkScreen *screen)
   return GDK_BROADWAY_SCREEN (screen)->root_window;
 }
 
+void
+_gdk_broadway_screen_size_changed (GdkScreen *screen, BroadwayInputScreenResizeNotify *msg)
+{
+  GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
+  gint width, height;
+
+  width = gdk_screen_get_width (screen);
+  height = gdk_screen_get_height (screen);
+
+  broadway_screen->width   = msg->width;
+  broadway_screen->height  = msg->height;
+
+  if (width != gdk_screen_get_width (screen) ||
+      height != gdk_screen_get_height (screen))
+    g_signal_emit_by_name (screen, "size-changed");
+}
+
 static void
 gdk_broadway_screen_dispose (GObject *object)
 {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]