diff --git a/src/net/java/sip/communicator/impl/gui/main/call/DesktopSharingFrame.java b/src/net/java/sip/communicator/impl/gui/main/call/DesktopSharingFrame.java index 4b47835a5..2cc12bec1 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/DesktopSharingFrame.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/DesktopSharingFrame.java @@ -522,12 +522,9 @@ public void actionPerformed(ActionEvent e) sharingRegionHeight = sharingRegion.getHeight() + cropY; int y = location.y - cropY; - DisplayMode dm = sharingRegion - .getGraphicsConfiguration() - .getDevice() - .getDisplayMode(); - int maxWidth = dm.getWidth() - x; - int maxHeight = dm.getHeight() - y; + Rectangle rectangle = ScreenInformation.getScreenBounds(); + int maxWidth = rectangle.width - x; + int maxHeight = rectangle.height - y; // Checks that the region sharing does not go outside the // right border of the current screen. if(sharingRegionWidth > maxWidth) @@ -541,18 +538,23 @@ public void actionPerformed(ActionEvent e) sharingRegionHeight = maxHeight; } - // Moves and resizes the sharing region to corresponds to - // the true shared region. - //sharingRegion.setBounds(x, y, sharingRegionWidth, sharingRegionHeight); - frame.dispose(); if (call != null) CallManager.enableRegionDesktopSharing( - call, x, y, sharingRegionWidth, sharingRegionHeight); + call, + x, + y, + sharingRegionWidth, + sharingRegionHeight); else CallManager.createRegionDesktopSharing( - protocolProvider, contact, x, y, sharingRegionWidth, sharingRegionHeight); + protocolProvider, + contact, + x, + y, + sharingRegionWidth, + sharingRegionHeight); } }); } diff --git a/src/net/java/sip/communicator/impl/neomedia/VideoMediaStreamImpl.java b/src/net/java/sip/communicator/impl/neomedia/VideoMediaStreamImpl.java index ad582fc6f..f18071783 100644 --- a/src/net/java/sip/communicator/impl/neomedia/VideoMediaStreamImpl.java +++ b/src/net/java/sip/communicator/impl/neomedia/VideoMediaStreamImpl.java @@ -1088,9 +1088,13 @@ public void movePartialDesktopStreaming(int x, int y) ds = ds2.getWrappedDataSource(); } + // Makes the screen detection with a point inside a real screen: + // (x and y > 0). + int tmpX = (x < 0)? 0: x; + int tmpY = (y < 0)? 0: y; ScreenDevice screen = NeomediaActivator.getMediaServiceImpl().getScreenForPoint( - new Point(x, y)); + new Point(tmpX, tmpY)); ScreenDevice currentScreen = screen; if(screen == null) diff --git a/src/net/java/sip/communicator/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java b/src/net/java/sip/communicator/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java index 3095e5b41..af3d28f27 100644 --- a/src/net/java/sip/communicator/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java +++ b/src/net/java/sip/communicator/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java @@ -8,8 +8,12 @@ import javax.media.*; import javax.media.control.*; +import javax.media.protocol.*; import net.java.sip.communicator.impl.neomedia.jmfext.media.protocol.*; +import net.java.sip.communicator.impl.neomedia.protocol.*; + +import net.sf.fmj.media.protocol.*; /** * Implements CaptureDevice and DataSource for the purposes of @@ -21,12 +25,20 @@ */ public class DataSource extends AbstractVideoPullBufferCaptureDevice + implements MuteDataSource, + SourceCloneable { /** * Stream created. */ private ImageStream stream = null; + /** + * The cloneable representation of this DataSource. + */ + private CloneableCaptureDevicePullBufferDataSource cloneableDataSource + = null; + /** * Initializes a new DataSource instance. */ @@ -111,4 +123,46 @@ protected AbstractPullBufferStream createStream( this.stream = stream; return stream; } + + /** + * Determines whether this DataSource is mute. + * + * An image / desktop sharing does not send any + * sounds. Thus it is always mute (returns always true). + * + * @return true since this DataSource is always mute. + */ + public boolean isMute() + { + return true; + } + + /** + * Sets the mute state of this DataSource. + * + * Does not change anything, since image / + * desktop sharing does not send any sounds. Thus it is always mute. + * + * @param mute true to mute this DataSource; otherwise, + * false + */ + public void setMute(boolean mute) + { + } + + /** + * Based on JMF testing, the clone is in the same state as the original + * (opened and connected if the original is), but at the beginning of the + * media, not whatever position the original is. + */ + public javax.media.protocol.DataSource createClone() + { + if(this.cloneableDataSource == null) + { + this.cloneableDataSource + = new CloneableCaptureDevicePullBufferDataSource(this); + } + + return this.cloneableDataSource.createClone(); + } } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java index dde9b31a2..6a3323048 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java @@ -293,8 +293,7 @@ public boolean isPartialStreaming(Call call) * @param x new x coordinate origin * @param y new y coordinate origin */ - public void movePartialDesktopStreaming(Call call, int x, - int y) + public void movePartialDesktopStreaming(Call call, int x, int y) { CallJabberImpl callImpl = (CallJabberImpl)call; VideoMediaStream videoStream = (VideoMediaStream)