mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17:41 +00:00
Fixed copyrect: although synchronization was properly established, draw jobs were not properly reserved in the destination layer, so draw operations would NOT block (synchronized on source only), resulting in draw race conditions. In a copy, the destination layer should block until the source layer is ready.
This commit is contained in:
@@ -169,21 +169,29 @@ function Layer(width, height) {
|
||||
|
||||
display.copyRect = function(srcLayer, srcx, srcy, w, h, x, y) {
|
||||
|
||||
function scheduleCopyRect() {
|
||||
reserveJob(function() {
|
||||
function doCopyRect() {
|
||||
if (autosize != 0) fitRect(x, y, w, h);
|
||||
displayContext.drawImage(srcLayer, srcx, srcy, w, h, x, y, w, h);
|
||||
});
|
||||
}
|
||||
|
||||
// If we ARE the source layer, no need to sync.
|
||||
// Syncing would result in deadlock.
|
||||
if (display === srcLayer)
|
||||
scheduleCopyRect();
|
||||
reserveJob(doCopyRect);
|
||||
|
||||
// Otherwise synchronize copy operation with source layer
|
||||
else
|
||||
srcLayer.sync(scheduleCopyRect);
|
||||
else {
|
||||
var update = reserveJob(null);
|
||||
srcLayer.sync(function() {
|
||||
|
||||
update.setHandler(doCopyRect);
|
||||
|
||||
// As this update originally had no handler and may have blocked
|
||||
// other updates, handle any blocked updates.
|
||||
handlePendingUpdates();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user