Skip to content

Commit 737be9f

Browse files
GUACAMOLE-288: Add Y offset on monitor position.
1 parent 52a2290 commit 737be9f

File tree

4 files changed

+209
-67
lines changed

4 files changed

+209
-67
lines changed

guacamole-common-js/src/main/webapp/modules/Client.js

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ Guacamole.Client = function(tunnel) {
163163
*/
164164
this.offsetX = 0;
165165

166+
/**
167+
* Add optional Y offset on defaut layer draw actions.
168+
*/
169+
this.offsetY = 0;
170+
166171
/**
167172
* Produces an opaque representation of Guacamole.Client state which can be
168173
* later imported through a call to importState(). This object is
@@ -386,6 +391,13 @@ Guacamole.Client = function(tunnel) {
386391
var x = mouseState.x;
387392
var y = mouseState.y;
388393

394+
// The offset is already applied when the state comes from a
395+
// secondary monitor
396+
if (!mouseState.offsedProcessed) {
397+
x += guac_client.offsetX;
398+
y += guac_client.offsetY;
399+
}
400+
389401
// Translate for display units if requested
390402
if (applyDisplayScale) {
391403
x /= display.getScale();
@@ -1099,10 +1111,11 @@ Guacamole.Client = function(tunnel) {
10991111
"arc": function(parameters) {
11001112

11011113
const offsetX = parseInt(parameters[0]) === 0 ? guac_client.offsetX : 0;
1114+
const offsetY = parseInt(parameters[0]) === 0 ? guac_client.offsetY : 0;
11021115

11031116
const layer = getLayer(parseInt(parameters[0]));
11041117
const x = parseInt(parameters[1]) - offsetX;
1105-
const y = parseInt(parameters[2]);
1118+
const y = parseInt(parameters[2]) - offsetY;
11061119
const radius = parseInt(parameters[3]);
11071120
const startAngle = parseFloat(parameters[4]);
11081121
const endAngle = parseFloat(parameters[5]);
@@ -1246,16 +1259,18 @@ Guacamole.Client = function(tunnel) {
12461259

12471260
const srcOffsetX = parseInt(parameters[0]) === 0 ? guac_client.offsetX : 0;
12481261
const dstOffsetX = parseInt(parameters[6]) === 0 ? guac_client.offsetX : 0;
1262+
const srcOffsetY = parseInt(parameters[0]) === 0 ? guac_client.offsetY : 0;
1263+
const dstOffsetY = parseInt(parameters[6]) === 0 ? guac_client.offsetY : 0;
12491264

12501265
const srcL = getLayer(parseInt(parameters[0]));
12511266
const srcX = parseInt(parameters[1]) - srcOffsetX;
1252-
const srcY = parseInt(parameters[2]);
1267+
const srcY = parseInt(parameters[2]) - srcOffsetY;
12531268
const srcWidth = parseInt(parameters[3]);
12541269
const srcHeight = parseInt(parameters[4]);
12551270
const channelMask = parseInt(parameters[5]);
12561271
const dstL = getLayer(parseInt(parameters[6]));
12571272
const dstX = parseInt(parameters[7]) - dstOffsetX;
1258-
const dstY = parseInt(parameters[8]);
1273+
const dstY = parseInt(parameters[8]) - dstOffsetY;
12591274

12601275
display.setChannelMask(dstL, channelMask);
12611276
display.copy(srcL, srcX, srcY, srcWidth, srcHeight,
@@ -1283,12 +1298,13 @@ Guacamole.Client = function(tunnel) {
12831298
"cursor": function(parameters) {
12841299

12851300
const offsetX = parseInt(parameters[2]) === 0 ? guac_client.offsetX : 0;
1301+
const offsetY = parseInt(parameters[2]) === 0 ? guac_client.offsetY : 0;
12861302

12871303
const cursorHotspotX = parseInt(parameters[0]);
12881304
const cursorHotspotY = parseInt(parameters[1]);
12891305
const srcL = getLayer(parseInt(parameters[2]));
12901306
const srcX = parseInt(parameters[3]) - offsetX;
1291-
const srcY = parseInt(parameters[4]);
1307+
const srcY = parseInt(parameters[4]) - offsetY;
12921308
const srcWidth = parseInt(parameters[5]);
12931309
const srcHeight = parseInt(parameters[6]);
12941310

@@ -1300,14 +1316,15 @@ Guacamole.Client = function(tunnel) {
13001316
"curve": function(parameters) {
13011317

13021318
const offsetX = parseInt(parameters[0]) === 0 ? guac_client.offsetX : 0;
1319+
const offsetY = parseInt(parameters[0]) === 0 ? guac_client.offsetY : 0;
13031320

13041321
const layer = getLayer(parseInt(parameters[0]));
13051322
const cp1x = parseInt(parameters[1]);
13061323
const cp1y = parseInt(parameters[2]);
13071324
const cp2x = parseInt(parameters[3]);
13081325
const cp2y = parseInt(parameters[4]);
13091326
const x = parseInt(parameters[5]) - offsetX;
1310-
const y = parseInt(parameters[6]);
1327+
const y = parseInt(parameters[6]) - offsetY;
13111328

13121329
display.curveTo(layer, cp1x, cp1y, cp2x, cp2y, x, y);
13131330

@@ -1438,13 +1455,14 @@ Guacamole.Client = function(tunnel) {
14381455
"img": function(parameters) {
14391456

14401457
const offsetX = parseInt(parameters[2]) === 0 ? guac_client.offsetX : 0;
1458+
const offsetY = parseInt(parameters[2]) === 0 ? guac_client.offsetY : 0;
14411459

14421460
const stream_index = parseInt(parameters[0]);
14431461
const channelMask = parseInt(parameters[1]);
14441462
const layer = getLayer(parseInt(parameters[2]));
14451463
const mimetype = parameters[3];
14461464
const x = parseInt(parameters[4]) - offsetX;
1447-
const y = parseInt(parameters[5]);
1465+
const y = parseInt(parameters[5]) - offsetY;
14481466

14491467
// Create stream
14501468
const stream = streams[stream_index] = new Guacamole.InputStream(guac_client, stream_index);
@@ -1458,11 +1476,12 @@ Guacamole.Client = function(tunnel) {
14581476
"jpeg": function(parameters) {
14591477

14601478
const offsetX = parseInt(parameters[1]) === 0 ? guac_client.offsetX : 0;
1479+
const offsetY = parseInt(parameters[1]) === 0 ? guac_client.offsetY : 0;
14611480

14621481
const channelMask = parseInt(parameters[0]);
14631482
const layer = getLayer(parseInt(parameters[1]));
14641483
const x = parseInt(parameters[2]) - offsetX;
1465-
const y = parseInt(parameters[3]);
1484+
const y = parseInt(parameters[3]) - offsetY;
14661485
const data = parameters[4];
14671486

14681487
display.setChannelMask(layer, channelMask);
@@ -1484,10 +1503,11 @@ Guacamole.Client = function(tunnel) {
14841503
"line": function(parameters) {
14851504

14861505
const offsetX = parseInt(parameters[0]) === 0 ? guac_client.offsetX : 0;
1506+
const offsetY = parseInt(parameters[0]) === 0 ? guac_client.offsetY : 0;
14871507

14881508
const layer = getLayer(parseInt(parameters[0]));
14891509
const x = parseInt(parameters[1]) - offsetX;
1490-
const y = parseInt(parameters[2]);
1510+
const y = parseInt(parameters[2]) - offsetY;
14911511

14921512
display.lineTo(layer, x, y);
14931513

@@ -1507,7 +1527,7 @@ Guacamole.Client = function(tunnel) {
15071527
"mouse" : function handleMouse(parameters) {
15081528

15091529
const x = parseInt(parameters[0]) - guac_client.offsetX;
1510-
const y = parseInt(parameters[1]);
1530+
const y = parseInt(parameters[1]) - guac_client.offsetY;
15111531

15121532
// Display and move software cursor to received coordinates
15131533
display.showCursor(true);
@@ -1600,11 +1620,12 @@ Guacamole.Client = function(tunnel) {
16001620
"png": function(parameters) {
16011621

16021622
const offsetX = parseInt(parameters[1]) === 0 ? guac_client.offsetX : 0;
1623+
const offsetY = parseInt(parameters[1]) === 0 ? guac_client.offsetY : 0;
16031624

16041625
const channelMask = parseInt(parameters[0]);
16051626
const layer = getLayer(parseInt(parameters[1]));
16061627
const x = parseInt(parameters[2]) - offsetX;
1607-
const y = parseInt(parameters[3]);
1628+
const y = parseInt(parameters[3]) - offsetY;
16081629
const data = parameters[4];
16091630

16101631
display.setChannelMask(layer, channelMask);
@@ -1631,10 +1652,11 @@ Guacamole.Client = function(tunnel) {
16311652
"rect": function(parameters) {
16321653

16331654
const offsetX = parseInt(parameters[0]) === 0 ? guac_client.offsetX : 0;
1655+
const offsetY = parseInt(parameters[0]) === 0 ? guac_client.offsetY : 0;
16341656

16351657
const layer = getLayer(parseInt(parameters[0]));
16361658
const x = parseInt(parameters[1]) - offsetX;
1637-
const y = parseInt(parameters[2]);
1659+
const y = parseInt(parameters[2]) - offsetY;
16381660
const w = parseInt(parameters[3]);
16391661
const h = parseInt(parameters[4]);
16401662

@@ -1694,10 +1716,11 @@ Guacamole.Client = function(tunnel) {
16941716
"start": function(parameters) {
16951717

16961718
const offsetX = parseInt(parameters[0]) === 0 ? guac_client.offsetX : 0;
1719+
const offsetY = parseInt(parameters[0]) === 0 ? guac_client.offsetY : 0;
16971720

16981721
const layer = getLayer(parseInt(parameters[0]));
16991722
const x = parseInt(parameters[0]) - offsetX;
1700-
const y = parseInt(parameters[2]);
1723+
const y = parseInt(parameters[2]) - offsetY;
17011724

17021725
display.moveTo(layer, x, y);
17031726

@@ -1740,16 +1763,18 @@ Guacamole.Client = function(tunnel) {
17401763

17411764
const srcOffsetX = parseInt(parameters[0]) === 0 ? guac_client.offsetX : 0;
17421765
const dstOffsetX = parseInt(parameters[6]) === 0 ? guac_client.offsetX : 0;
1766+
const srcOffsetY = parseInt(parameters[0]) === 0 ? guac_client.offsetY : 0;
1767+
const dstOffsetY = parseInt(parameters[6]) === 0 ? guac_client.offsetY : 0;
17431768

17441769
const srcL = getLayer(parseInt(parameters[0]));
17451770
const srcX = parseInt(parameters[1]) - srcOffsetX;
1746-
const srcY = parseInt(parameters[2]);
1771+
const srcY = parseInt(parameters[2]) - srcOffsetY;
17471772
const srcWidth = parseInt(parameters[3]);
17481773
const srcHeight = parseInt(parameters[4]);
17491774
const function_index = parseInt(parameters[5]);
17501775
const dstL = getLayer(parseInt(parameters[6]));
17511776
const dstX = parseInt(parameters[7]) - dstOffsetX;
1752-
const dstY = parseInt(parameters[8]);
1777+
const dstY = parseInt(parameters[8]) - dstOffsetY;
17531778

17541779
/* SRC */
17551780
if (function_index === 0x3)

guacamole/src/main/frontend/src/app/client/directives/guacClient.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,14 +462,17 @@ angular.module('client').directive('guacClient', [function guacClient() {
462462
const pixelDensity = $window.devicePixelRatio || 1;
463463
const width = main.offsetWidth * pixelDensity;
464464
const height = main.offsetHeight * pixelDensity;
465+
const top = window.screenY;
466+
const left = window.screenX;
465467

466468
// Window resized
467469
if (display.getWidth() !== width || display.getHeight() !== height)
468470
guacManageMonitor.sendSize({
469471
width: width,
470472
height: height,
471473
monitorId: 0,
472-
top: 0,
474+
top: top,
475+
left: left,
473476
});
474477

475478
}

guacamole/src/main/frontend/src/app/client/directives/guacClientSecondary.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,23 @@ angular.module('client').directive('guacClientSecondary', [function guacClient()
129129
const pixelDensity = $window.devicePixelRatio ?? 1;
130130
const width = main.offsetWidth * pixelDensity;
131131
const height = main.offsetHeight * pixelDensity;
132-
const top = 0 // TODO: $window.screenY ?? 0;
132+
const top = window.screenY;
133+
const left = window.screenX;
133134

134135
const size = {
135136
width: width,
136137
height: height,
137-
top: top > 0 ? top : 0,
138+
top: top,
139+
left: left,
138140
monitorId: guacManageMonitor.monitorId,
139141
};
140142

141143
// Send resize event to main window
142144
guacManageMonitor.pushBroadcastMessage('size', size);
145+
146+
// Remove scrollbars
147+
document.querySelector('.client-main').style.overflow = 'hidden';
148+
143149
}
144150

145151
// Handle any received clipboard data
@@ -204,6 +210,7 @@ angular.module('client').directive('guacClientSecondary', [function guacClient()
204210
mouseState.right = e.state.right;
205211
mouseState.x = e.state.x + displayOffsetX;
206212
mouseState.y = e.state.y + displayOffsetY;
213+
mouseState.offsedProcessed = true;
207214

208215
// Send mouse state to main window
209216
guacManageMonitor.pushBroadcastMessage('mouseState', mouseState);

0 commit comments

Comments
 (0)