[gtk+] [broadway] Handle screen size
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] [broadway] Handle screen size
- Date: Thu, 7 Apr 2011 19:21:11 +0000 (UTC)
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]