From ba6a2cae9c368da5e5a0ccc0bd6f50cba9c0c2d1 Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 16 Jun 2014 20:28:17 +0200 Subject: [PATCH] screenshot: Scale and unscale the area for HiDpi displays https://bugzilla.gnome.org/show_bug.cgi?id=731738 --- js/ui/screenshot.js | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js index 80c3c1ddf..1c5812a2a 100644 --- a/js/ui/screenshot.js +++ b/js/ui/screenshot.js @@ -84,8 +84,27 @@ const ScreenshotService = new Lang.Class({ invocation.return_value(retval); }, + _scaleArea: function(x, y, width, height) { + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + x *= scaleFactor; + y *= scaleFactor; + width *= scaleFactor; + height *= scaleFactor; + return [x, y, width, height]; + }, + + _unscaleArea: function(x, y, width, height) { + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + x /= scaleFactor; + y /= scaleFactor; + width /= scaleFactor; + height /= scaleFactor; + return [x, y, width, height]; + }, + ScreenshotAreaAsync : function (params, invocation) { let [x, y, width, height, flash, filename, callback] = params; + [x, y, width, height] = this._scaleArea(x, y, width, height); if (!this._checkArea(x, y, width, height)) { invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, @@ -120,9 +139,9 @@ const ScreenshotService = new Lang.Class({ selectArea.connect('finished', Lang.bind(this, function(selectArea, areaRectangle) { if (areaRectangle) { - let retval = GLib.Variant.new('(iiii)', - [areaRectangle.x, areaRectangle.y, - areaRectangle.width, areaRectangle.height]); + let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y, + areaRectangle.width, areaRectangle.height); + let retval = GLib.Variant.new('(iiii)', retRectangle); invocation.return_value(retval); } else { invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, @@ -133,6 +152,7 @@ const ScreenshotService = new Lang.Class({ FlashAreaAsync: function(params, invocation) { let [x, y, width, height] = params; + [x, y, width, height] = this._scaleArea(x, y, width, height); if (!this._checkArea(x, y, width, height)) { invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,