diff options
-rw-r--r-- | gdk/broadway/broadway-protocol.h | 1 | ||||
-rw-r--r-- | gdk/broadway/broadway-server.c | 10 | ||||
-rw-r--r-- | gdk/broadway/broadway-server.h | 3 | ||||
-rw-r--r-- | gdk/broadway/broadway.js | 28 | ||||
-rw-r--r-- | gdk/broadway/broadwayd.c | 3 | ||||
-rw-r--r-- | gdk/broadway/gdkdisplay-broadway.c | 18 | ||||
-rw-r--r-- | gdk/broadway/gdkdisplay-broadway.h | 2 | ||||
-rw-r--r-- | gdk/broadway/gdksurface-broadway.c | 14 | ||||
-rw-r--r-- | gsk/broadway/gskbroadwayrenderer.c | 9 |
9 files changed, 66 insertions, 22 deletions
diff --git a/gdk/broadway/broadway-protocol.h b/gdk/broadway/broadway-protocol.h index 3f73f13771..436d60da49 100644 --- a/gdk/broadway/broadway-protocol.h +++ b/gdk/broadway/broadway-protocol.h @@ -165,6 +165,7 @@ typedef struct { BroadwayInputBaseMsg base; guint32 width; guint32 height; + guint32 scale; } BroadwayInputScreenResizeNotify; typedef struct { diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c index 24fd7bf51c..f7a380ec26 100644 --- a/gdk/broadway/broadway-server.c +++ b/gdk/broadway/broadway-server.c @@ -67,8 +67,7 @@ struct _BroadwayServer { guint32 next_texture_id; GHashTable *textures; - guint32 screen_width; - guint32 screen_height; + guint32 screen_scale; gint32 mouse_in_surface_id; int last_x, last_y; /* in root coords */ @@ -273,6 +272,7 @@ broadway_server_init (BroadwayServer *server) root->visible = TRUE; server->root = root; + server->screen_scale = 1; g_hash_table_insert (server->surface_id_hash, GINT_TO_POINTER (root->id), @@ -428,6 +428,7 @@ update_event_state (BroadwayServer *server, case BROADWAY_EVENT_SCREEN_SIZE_CHANGED: server->root->width = message->screen_resize_notify.width; server->root->height = message->screen_resize_notify.height; + server->screen_scale = message->screen_resize_notify.scale; break; default: @@ -722,6 +723,7 @@ parse_input_message (BroadwayInput *input, const unsigned char *message) case BROADWAY_EVENT_SCREEN_SIZE_CHANGED: msg.screen_resize_notify.width = ntohl (*p++); msg.screen_resize_notify.height = ntohl (*p++); + msg.screen_resize_notify.scale = ntohl (*p++); break; default: @@ -958,10 +960,12 @@ broadway_server_get_next_serial (BroadwayServer *server) void broadway_server_get_screen_size (BroadwayServer *server, guint32 *width, - guint32 *height) + guint32 *height, + guint32 *scale) { *width = server->root->width; *height = server->root->height; + *scale = server->screen_scale; } static void diff --git a/gdk/broadway/broadway-server.h b/gdk/broadway/broadway-server.h index f11e9e872d..10181c3d79 100644 --- a/gdk/broadway/broadway-server.h +++ b/gdk/broadway/broadway-server.h @@ -64,7 +64,8 @@ void broadway_server_roundtrip (BroadwayServer * guint32 tag); void broadway_server_get_screen_size (BroadwayServer *server, guint32 *width, - guint32 *height); + guint32 *height, + guint32 *scale); guint32 broadway_server_get_next_serial (BroadwayServer *server); guint32 broadway_server_get_last_seen_time (BroadwayServer *server); gboolean broadway_server_lookahead_event (BroadwayServer *server, diff --git a/gdk/broadway/broadway.js b/gdk/broadway/broadway.js index ba2fdcd727..793aa56bea 100644 --- a/gdk/broadway/broadway.js +++ b/gdk/broadway/broadway.js @@ -3184,20 +3184,32 @@ function setupDocument(document) } } +function sendScreenSizeChanged() { + var w, h, s; + w = window.innerWidth; + h = window.innerHeight; + s = Math.round(window.devicePixelRatio); + sendInput (BROADWAY_EVENT_SCREEN_SIZE_CHANGED, [w, h, s]); +} + function start() { setupDocument(document); - var w, h; - w = window.innerWidth; - h = window.innerHeight; window.onresize = function(ev) { - var w, h; - w = window.innerWidth; - h = window.innerHeight; - sendInput (BROADWAY_EVENT_SCREEN_SIZE_CHANGED, [w, h]); + sendScreenSizeChanged(); }; - sendInput (BROADWAY_EVENT_SCREEN_SIZE_CHANGED, [w, h]); + window.matchMedia('screen and (min-resolution: 2dppx)'). + addListener(function(e) { + if (e.matches) { + /* devicePixelRatio >= 2 */ + sendScreenSizeChanged(); + } else { + /* devicePixelRatio < 2 */ + sendScreenSizeChanged(); + } + }); + sendScreenSizeChanged(); } function connect() diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c index 54d97c5ec1..d65e69c4ce 100644 --- a/gdk/broadway/broadwayd.c +++ b/gdk/broadway/broadwayd.c @@ -513,7 +513,8 @@ incoming_client (GSocketService *service, ev.base.time = broadway_server_get_last_seen_time (server); broadway_server_get_screen_size (server, &ev.screen_resize_notify.width, - &ev.screen_resize_notify.height); + &ev.screen_resize_notify.height, + &ev.screen_resize_notify.scale); broadway_events_got_input (&ev, client->id); diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c index 3beefc4636..db7428719f 100644 --- a/gdk/broadway/gdkdisplay-broadway.c +++ b/gdk/broadway/gdkdisplay-broadway.c @@ -63,6 +63,10 @@ gdk_broadway_display_init (GdkBroadwayDisplay *display) NULL); gdk_monitor_set_manufacturer (display->monitor, "browser"); gdk_monitor_set_model (display->monitor, "0"); + display->scale_factor = 1; + gdk_monitor_set_size (display->monitor, 1024, 768); + gdk_monitor_set_physical_size (display->monitor, 1024 * 25.4 / 96, 768 * 25.4 / 96); + gdk_monitor_set_scale_factor (display->monitor, 1); } static void @@ -80,16 +84,21 @@ _gdk_broadway_display_size_changed (GdkDisplay *display, { GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display); GdkMonitor *monitor; - GdkRectangle size; + GdkRectangle current_size; GList *toplevels, *l; monitor = broadway_display->monitor; - gdk_monitor_get_geometry (monitor, &size); + gdk_monitor_get_geometry (monitor, ¤t_size); - if (msg->width == size.width && msg->height == size.height) + if (msg->width == current_size.width && + msg->height == current_size.height && + msg->scale == broadway_display->scale_factor) return; + broadway_display->scale_factor = msg->scale; + gdk_monitor_set_size (monitor, msg->width, msg->height); + gdk_monitor_set_scale_factor (monitor, msg->scale); gdk_monitor_set_physical_size (monitor, msg->width * 25.4 / 96, msg->height * 25.4 / 96); toplevels = broadway_display->toplevels; @@ -101,8 +110,7 @@ _gdk_broadway_display_size_changed (GdkDisplay *display, gdk_broadway_surface_move_resize (GDK_SURFACE (toplevel), 0, 0, msg->width, msg->height); - } -} + }} static GdkDevice * create_core_pointer (GdkDisplay *display) diff --git a/gdk/broadway/gdkdisplay-broadway.h b/gdk/broadway/gdkdisplay-broadway.h index a8d6819c82..b8e11168ef 100644 --- a/gdk/broadway/gdkdisplay-broadway.h +++ b/gdk/broadway/gdkdisplay-broadway.h @@ -50,10 +50,10 @@ struct _GdkBroadwayDisplay GdkKeymap *keymap; GdkBroadwayServer *server; - gpointer move_resize_data; GdkMonitor *monitor; + int scale_factor; GHashTable *texture_cache; diff --git a/gdk/broadway/gdksurface-broadway.c b/gdk/broadway/gdksurface-broadway.c index ed377a3ca3..0193f499b2 100644 --- a/gdk/broadway/gdksurface-broadway.c +++ b/gdk/broadway/gdksurface-broadway.c @@ -386,6 +386,19 @@ gdk_broadway_surface_hide (GdkSurface *surface) _gdk_surface_clear_update_area (surface); } +static gint +gdk_broadway_surface_get_scale_factor (GdkSurface *surface) +{ + GdkBroadwayDisplay *broadway_display; + + if (GDK_SURFACE_DESTROYED (surface)) + return 1; + + broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface)); + + return broadway_display->scale_factor; +} + static void gdk_broadway_surface_move_resize_internal (GdkSurface *surface, gboolean with_move, @@ -1249,6 +1262,7 @@ gdk_broadway_surface_class_init (GdkBroadwaySurfaceClass *klass) impl_class->begin_move_drag = gdk_broadway_surface_begin_move_drag; impl_class->destroy_notify = gdk_broadway_surface_destroy_notify; impl_class->drag_begin = _gdk_broadway_surface_drag_begin; + impl_class->get_scale_factor = gdk_broadway_surface_get_scale_factor; } #define LAST_PROP 1 diff --git a/gsk/broadway/gskbroadwayrenderer.c b/gsk/broadway/gskbroadwayrenderer.c index 1dbfc9c11c..cb46f92bc2 100644 --- a/gsk/broadway/gskbroadwayrenderer.c +++ b/gsk/broadway/gskbroadwayrenderer.c @@ -477,6 +477,7 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer, float offset_y) { GdkDisplay *display = gdk_surface_get_display (gsk_renderer_get_surface (renderer)); + GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display); GskBroadwayRenderer *self = GSK_BROADWAY_RENDERER (renderer); GArray *nodes = self->nodes; @@ -753,9 +754,11 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer, int y = floorf (node->bounds.origin.y); int width = ceil (node->bounds.origin.x + node->bounds.size.width) - x; int height = ceil (node->bounds.origin.y + node->bounds.size.height) - y; + int scale = broadway_display->scale_factor; - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width * scale, height * scale); cr = cairo_create (surface); + cairo_scale (cr, scale, scale); cairo_translate (cr, -x, -y); gsk_render_node_draw (node, cr); cairo_destroy (cr); @@ -766,8 +769,8 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer, texture_id = gdk_broadway_display_ensure_texture (display, texture); add_float (nodes, x - offset_x); add_float (nodes, y - offset_y); - add_float (nodes, gdk_texture_get_width (texture)); - add_float (nodes, gdk_texture_get_height (texture)); + add_float (nodes, width); + add_float (nodes, height); add_uint32 (nodes, texture_id); } } |