@@ -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 )
0 commit comments