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)