[gtk: 1/8] broadway: Handle browser hidpi scale factor
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk: 1/8] broadway: Handle browser hidpi scale factor
- Date: Fri, 13 Mar 2020 15:10:43 +0000 (UTC)
commit 086a577fd164db2b8530892b6b8eaabee98780b4
Author: Alexander Larsson <alexl redhat com>
Date: Thu Mar 12 11:12:01 2020 +0100
broadway: Handle browser hidpi scale factor
gdk/broadway/broadway-protocol.h | 1 +
gdk/broadway/broadway-server.c | 10 +++++++---
gdk/broadway/broadway-server.h | 3 ++-
gdk/broadway/broadway.js | 28 ++++++++++++++++++++--------
gdk/broadway/broadwayd.c | 3 ++-
gdk/broadway/gdkdisplay-broadway.c | 18 +++++++++++++-----
gdk/broadway/gdkdisplay-broadway.h | 2 +-
gdk/broadway/gdksurface-broadway.c | 14 ++++++++++++++
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);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]