From b04c79643d4a5c5567362244c5e11d37486e3c9d 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 4c9c750d0..2f17729b9 100644 --- a/js/ui/screenshot.js +++ b/js/ui/screenshot.js @@ -85,8 +85,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, @@ -121,9 +140,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, @@ -134,6 +153,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,