1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-04-21 21:52:03 +02:00

call: add window share button

This adds a windows sharing button in addition to the sharing options.
This button is only available for linux systems and must be enabled
for others (MacOS, Windows) once their windows sharing are functional.

Change-Id: If378a23bc504fd3813382e84a41d914448707616
GitLab: #668
This commit is contained in:
Aline Gondim Santos 2022-02-02 16:39:57 -05:00
parent 403edf4cba
commit 05d929cd8a
7 changed files with 76 additions and 27 deletions

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<path d="M20.5,0.8h-17C2,0.8,0.8,2,0.8,3.5v17c0,1.5,1.2,2.7,2.7,2.7h17c1.5,0,2.7-1.2,2.7-2.7v-17C23.2,2,22,0.8,20.5,0.8z
M3.5,2.2h17c0.7,0,1.3,0.6,1.3,1.3v0.1H2.2V3.5C2.2,2.8,2.8,2.2,3.5,2.2z M7.7,21.8H3.5c-0.7,0-1.3-0.6-1.3-1.3V5h5.5h1.4h12.7
v15.5c0,0.7-0.6,1.3-1.3,1.3H9.1H7.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 639 B

View file

@ -256,6 +256,7 @@ Item {
property string exitFullScreen: qsTr("Exit full screen") property string exitFullScreen: qsTr("Exit full screen")
property string fullScreen: qsTr("View full screen") property string fullScreen: qsTr("View full screen")
property string shareScreen: qsTr("Share screen") property string shareScreen: qsTr("Share screen")
property string shareWindow: qsTr("Share window")
property string stopSharing: qsTr("Stop sharing screen or file") property string stopSharing: qsTr("Stop sharing screen or file")
property string shareScreenArea: qsTr("Share screen area") property string shareScreenArea: qsTr("Share screen area")
property string shareFile: qsTr("Share file") property string shareFile: qsTr("Share file")

View file

@ -45,6 +45,7 @@ Control {
signal resumePauseCallClicked signal resumePauseCallClicked
signal showInputPanelClicked signal showInputPanelClicked
signal shareScreenClicked signal shareScreenClicked
signal shareWindowClicked
signal stopSharingClicked signal stopSharingClicked
signal shareScreenAreaClicked signal shareScreenAreaClicked
signal shareFileClicked signal shareFileClicked
@ -118,6 +119,10 @@ Control {
Component.onCompleted: { Component.onCompleted: {
shareModel.append({"Name": JamiStrings.shareScreen, shareModel.append({"Name": JamiStrings.shareScreen,
"IconSource": JamiResources.laptop_black_24dp_svg}) "IconSource": JamiResources.laptop_black_24dp_svg})
if (Qt.platform.os == "linux") {
shareModel.append({"Name": JamiStrings.shareWindow,
"IconSource" : JamiResources.window_black_24dp_svg})
}
shareModel.append({"Name": JamiStrings.shareScreenArea, shareModel.append({"Name": JamiStrings.shareScreenArea,
"IconSource" : JamiResources.share_area_black_24dp_svg}) "IconSource" : JamiResources.share_area_black_24dp_svg})
shareModel.append({"Name": JamiStrings.shareFile, shareModel.append({"Name": JamiStrings.shareFile,
@ -129,6 +134,9 @@ Control {
case JamiStrings.shareScreen: case JamiStrings.shareScreen:
shareScreenClicked() shareScreenClicked()
break break
case JamiStrings.shareWindow:
shareWindowClicked()
break
case JamiStrings.shareScreenArea: case JamiStrings.shareScreenArea:
shareScreenAreaClicked() shareScreenAreaClicked()
break break
@ -258,17 +266,17 @@ Control {
Action { Action {
id: shareAction id: shareAction
onTriggered: { onTriggered: {
if (AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE) if (sharingActive)
root.stopSharingClicked() root.stopSharingClicked()
else else
root.shareScreenClicked() root.shareScreenClicked()
} }
icon.source: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ? icon.source: sharingActive ?
JamiResources.share_stop_black_24dp_svg : JamiResources.share_stop_black_24dp_svg :
JamiResources.share_screen_black_24dp_svg JamiResources.share_screen_black_24dp_svg
icon.color: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ? icon.color: sharingActive ?
"red" : "white" "red" : "white"
text: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ? text: sharingActive ?
JamiStrings.stopSharing : JamiStrings.stopSharing :
JamiStrings.shareScreen JamiStrings.shareScreen
property real size: 34 property real size: 34

View file

@ -47,6 +47,7 @@ Item {
property bool isConferenceCall property bool isConferenceCall
property bool isGrid property bool isGrid
property bool localHandRaised property bool localHandRaised
property bool sharingActive: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE
signal chatButtonClicked signal chatButtonClicked
signal fullScreenClicked signal fullScreenClicked
@ -130,9 +131,7 @@ Item {
mode: JamiFileDialog.Mode.OpenFile mode: JamiFileDialog.Mode.OpenFile
onAccepted: { onAccepted: {
if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
AvAdapter.muteCamera = root.isVideoMuted
}
AvAdapter.shareFile(jamiFileDialog.file) AvAdapter.shareFile(jamiFileDialog.file)
} }
} }
@ -157,22 +156,26 @@ Item {
} }
function openShareScreen() { function openShareScreen() {
if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
AvAdapter.muteCamera = root.isVideoMuted if (Qt.application.screens.length === 1) {
}
AvAdapter.getListWindows()
if (Qt.application.screens.length + AvAdapter.windowsNames.length === 1) {
AvAdapter.shareEntireScreen(0) AvAdapter.shareEntireScreen(0)
} else { } else {
SelectScreenWindowCreation.createSelectScreenWindowObject() SelectScreenWindowCreation.createSelectScreenWindowObject()
SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId) SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, false)
}
}
function openShareWindow() {
AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
AvAdapter.getListWindows()
if (AvAdapter.windowsNames.length >= 1) {
SelectScreenWindowCreation.createSelectScreenWindowObject()
SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, true)
} }
} }
function openShareScreenArea() { function openShareScreenArea() {
if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
AvAdapter.muteCamera = root.isVideoMuted
}
if (Qt.platform.os !== "windows") { if (Qt.platform.os !== "windows") {
AvAdapter.shareScreenArea(0, 0, 0, 0) AvAdapter.shareScreenArea(0, 0, 0, 0)
} else { } else {
@ -206,6 +209,7 @@ Item {
function onResumePauseCallClicked() { CallAdapter.holdThisCallToggle() } function onResumePauseCallClicked() { CallAdapter.holdThisCallToggle() }
function onShowInputPanelClicked() { sipInputPanel.open() } function onShowInputPanelClicked() { sipInputPanel.open() }
function onShareScreenClicked() { openShareScreen() } function onShareScreenClicked() { openShareScreen() }
function onShareWindowClicked() { openShareWindow() }
function onStopSharingClicked() { AvAdapter.stopSharing() } function onStopSharingClicked() { AvAdapter.stopSharing() }
function onShareScreenAreaClicked() { openShareScreenArea() } function onShareScreenAreaClicked() { openShareScreenArea() }
function onRecordCallClicked() { recordClicked() } function onRecordCallClicked() { recordClicked() }
@ -225,5 +229,9 @@ Item {
onTransferCallButtonClicked: openContactPicker(ContactList.TRANSFER) onTransferCallButtonClicked: openContactPicker(ContactList.TRANSFER)
onPluginItemClicked: openPluginsMenu() onPluginItemClicked: openPluginsMenu()
onRecordCallClicked: root.recordClicked() onRecordCallClicked: root.recordClicked()
onOpenSelectionWindow: {
SelectScreenWindowCreation.createSelectScreenWindowObject()
SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, windowSelection)
}
} }
} }

View file

@ -26,7 +26,6 @@ import net.jami.Constants 1.1
import "../../commoncomponents" import "../../commoncomponents"
import "../../commoncomponents/contextmenu" import "../../commoncomponents/contextmenu"
import "../js/selectscreenwindowcreation.js" as SelectScreenWindowCreation
import "../js/screenrubberbandcreation.js" as ScreenRubberBandCreation import "../js/screenrubberbandcreation.js" as ScreenRubberBandCreation
ContextMenuAutoLoader { ContextMenuAutoLoader {
@ -37,9 +36,12 @@ ContextMenuAutoLoader {
property bool isVideoMuted: false property bool isVideoMuted: false
property bool isRecording: false property bool isRecording: false
property bool windowSelection: false
signal pluginItemClicked signal pluginItemClicked
signal transferCallButtonClicked signal transferCallButtonClicked
signal recordCallClicked signal recordCallClicked
signal openSelectionWindow
property list<GeneralMenuItem> menuItems: [ property list<GeneralMenuItem> menuItems: [
GeneralMenuItem { GeneralMenuItem {
@ -101,7 +103,7 @@ ContextMenuAutoLoader {
GeneralMenuItem { GeneralMenuItem {
id: stopSharing id: stopSharing
canTrigger: (AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE) canTrigger: sharingActive
&& !isSIP && !isVideoMuted && !isSIP && !isVideoMuted
itemName: JamiStrings.stopSharing itemName: JamiStrings.stopSharing
iconSource: JamiResources.share_stop_black_24dp_svg iconSource: JamiResources.share_stop_black_24dp_svg
@ -119,12 +121,29 @@ ContextMenuAutoLoader {
if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) {
AvAdapter.muteCamera = root.isVideoMuted AvAdapter.muteCamera = root.isVideoMuted
} }
AvAdapter.getListWindows() if (Qt.application.screens.length === 1) {
if (Qt.application.screens.length + AvAdapter.windowsNames().length === 1) {
AvAdapter.shareEntireScreen(0) AvAdapter.shareEntireScreen(0)
} else { } else {
SelectScreenWindowCreation.createSelectScreenWindowObject() windowSelection = false
SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId) openSelectionWindow()
}
}
},
GeneralMenuItem {
id: shareWindow
canTrigger: Qt.platform.os === "linux" && CurrentAccount.videoEnabled_Video && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY
&& !isSIP
itemName: JamiStrings.shareWindow
iconSource: JamiResources.window_black_24dp_svg
onClicked: {
if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) {
AvAdapter.muteCamera = root.isVideoMuted
}
AvAdapter.getListWindows()
if (AvAdapter.windowsNames.length >= 1) {
windowSelection = true
openSelectionWindow()
} }
} }
}, },

View file

@ -37,6 +37,8 @@ Window {
property int minWidth: 650 property int minWidth: 650
property int minHeight: 500 property int minHeight: 500
property bool window: false
property int selectedScreenNumber: -1 property int selectedScreenNumber: -1
property bool selectAllScreens: false property bool selectAllScreens: false
property string currentPreview: "" property string currentPreview: ""
@ -68,7 +70,7 @@ Window {
calculateRepeaterModel() calculateRepeaterModel()
screenInfo.model = screens.length screenInfo.model = screens.length
screenInfo2.model = screens.length screenInfo2.model = screens.length
windowsText.visible = screens.length > Qt.application.screens.length windowsText.visible = root.window
} }
minimumWidth: minWidth minimumWidth: minWidth
minimumHeight: minHeight minimumHeight: minHeight
@ -118,6 +120,7 @@ Window {
text: JamiStrings.screens text: JamiStrings.screens
verticalAlignment: Text.AlignBottom verticalAlignment: Text.AlignBottom
color: JamiTheme.textColor color: JamiTheme.textColor
visible: !root.window
} }
Repeater { Repeater {
@ -135,7 +138,7 @@ Window {
height: 3 * width / 4 height: 3 * width / 4
border.color: selectedScreenNumber === index ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor border.color: selectedScreenNumber === index ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor
visible: JamiStrings.selectScreen !== screens[index] && index < Qt.application.screens.length visible: !root.window && JamiStrings.selectScreen !== screens[index] && index < Qt.application.screens.length
Text { Text {
id: screenName id: screenName
@ -210,7 +213,7 @@ Window {
border.color: selectAllScreens ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor border.color: selectAllScreens ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor
visible: Qt.application.screens.length > 1 visible: !root.window && Qt.application.screens.length > 1
Text { Text {
id: screenNameAll id: screenNameAll
@ -269,6 +272,7 @@ Window {
text: JamiStrings.windows text: JamiStrings.windows
verticalAlignment: Text.AlignBottom verticalAlignment: Text.AlignBottom
color: JamiTheme.textColor color: JamiTheme.textColor
visible: root.window
} }
Repeater { Repeater {
@ -286,7 +290,7 @@ Window {
height: 3 * width / 4 height: 3 * width / 4
border.color: selectedScreenNumber === index ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor border.color: selectedScreenNumber === index ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor
visible: JamiStrings.selectScreen !== screens[index] && index >= Qt.application.screens.length visible: root.window && JamiStrings.selectScreen !== screens[index] && index >= Qt.application.screens.length
Text { Text {
id: screenName2 id: screenName2

View file

@ -43,9 +43,10 @@ function finishCreation() {
selectScreenWindowObject.onClosing.connect(destroySelectScreenWindow) selectScreenWindowObject.onClosing.connect(destroySelectScreenWindow)
} }
function showSelectScreenWindow(previewId) { function showSelectScreenWindow(previewId, window) {
console.log("previewId", previewId) console.log("previewId", previewId)
selectScreenWindowObject.currentPreview = previewId selectScreenWindowObject.currentPreview = previewId
selectScreenWindowObject.window = window
selectScreenWindowObject.show() selectScreenWindowObject.show()
var screen = selectScreenWindowObject.screen var screen = selectScreenWindowObject.screen