diff --git a/resources/icons/window_black_24dp.svg b/resources/icons/window_black_24dp.svg new file mode 100644 index 00000000..37db909f --- /dev/null +++ b/resources/icons/window_black_24dp.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml index 8080aca8..4c5d17df 100644 --- a/src/constant/JamiStrings.qml +++ b/src/constant/JamiStrings.qml @@ -256,6 +256,7 @@ Item { property string exitFullScreen: qsTr("Exit full screen") property string fullScreen: qsTr("View full screen") property string shareScreen: qsTr("Share screen") + property string shareWindow: qsTr("Share window") property string stopSharing: qsTr("Stop sharing screen or file") property string shareScreenArea: qsTr("Share screen area") property string shareFile: qsTr("Share file") diff --git a/src/mainview/components/CallActionBar.qml b/src/mainview/components/CallActionBar.qml index e6a08e16..4ef3937e 100644 --- a/src/mainview/components/CallActionBar.qml +++ b/src/mainview/components/CallActionBar.qml @@ -45,6 +45,7 @@ Control { signal resumePauseCallClicked signal showInputPanelClicked signal shareScreenClicked + signal shareWindowClicked signal stopSharingClicked signal shareScreenAreaClicked signal shareFileClicked @@ -118,6 +119,10 @@ Control { Component.onCompleted: { shareModel.append({"Name": JamiStrings.shareScreen, "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, "IconSource" : JamiResources.share_area_black_24dp_svg}) shareModel.append({"Name": JamiStrings.shareFile, @@ -129,6 +134,9 @@ Control { case JamiStrings.shareScreen: shareScreenClicked() break + case JamiStrings.shareWindow: + shareWindowClicked() + break case JamiStrings.shareScreenArea: shareScreenAreaClicked() break @@ -258,17 +266,17 @@ Control { Action { id: shareAction onTriggered: { - if (AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE) + if (sharingActive) root.stopSharingClicked() else 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_screen_black_24dp_svg - icon.color: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ? + icon.color: sharingActive ? "red" : "white" - text: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ? + text: sharingActive ? JamiStrings.stopSharing : JamiStrings.shareScreen property real size: 34 diff --git a/src/mainview/components/CallOverlay.qml b/src/mainview/components/CallOverlay.qml index 46a4abd6..d24ddddb 100644 --- a/src/mainview/components/CallOverlay.qml +++ b/src/mainview/components/CallOverlay.qml @@ -47,6 +47,7 @@ Item { property bool isConferenceCall property bool isGrid property bool localHandRaised + property bool sharingActive: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE signal chatButtonClicked signal fullScreenClicked @@ -130,9 +131,7 @@ Item { mode: JamiFileDialog.Mode.OpenFile onAccepted: { - if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { - AvAdapter.muteCamera = root.isVideoMuted - } + AvAdapter.muteCamera = !sharingActive && root.isVideoMuted AvAdapter.shareFile(jamiFileDialog.file) } } @@ -157,22 +156,26 @@ Item { } function openShareScreen() { - if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { - AvAdapter.muteCamera = root.isVideoMuted - } - AvAdapter.getListWindows() - if (Qt.application.screens.length + AvAdapter.windowsNames.length === 1) { + AvAdapter.muteCamera = !sharingActive && root.isVideoMuted + if (Qt.application.screens.length === 1) { AvAdapter.shareEntireScreen(0) } else { 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() { - if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { - AvAdapter.muteCamera = root.isVideoMuted - } + AvAdapter.muteCamera = !sharingActive && root.isVideoMuted if (Qt.platform.os !== "windows") { AvAdapter.shareScreenArea(0, 0, 0, 0) } else { @@ -206,6 +209,7 @@ Item { function onResumePauseCallClicked() { CallAdapter.holdThisCallToggle() } function onShowInputPanelClicked() { sipInputPanel.open() } function onShareScreenClicked() { openShareScreen() } + function onShareWindowClicked() { openShareWindow() } function onStopSharingClicked() { AvAdapter.stopSharing() } function onShareScreenAreaClicked() { openShareScreenArea() } function onRecordCallClicked() { recordClicked() } @@ -225,5 +229,9 @@ Item { onTransferCallButtonClicked: openContactPicker(ContactList.TRANSFER) onPluginItemClicked: openPluginsMenu() onRecordCallClicked: root.recordClicked() + onOpenSelectionWindow: { + SelectScreenWindowCreation.createSelectScreenWindowObject() + SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, windowSelection) + } } } diff --git a/src/mainview/components/CallViewContextMenu.qml b/src/mainview/components/CallViewContextMenu.qml index baf4565c..355fe9b8 100644 --- a/src/mainview/components/CallViewContextMenu.qml +++ b/src/mainview/components/CallViewContextMenu.qml @@ -26,7 +26,6 @@ import net.jami.Constants 1.1 import "../../commoncomponents" import "../../commoncomponents/contextmenu" -import "../js/selectscreenwindowcreation.js" as SelectScreenWindowCreation import "../js/screenrubberbandcreation.js" as ScreenRubberBandCreation ContextMenuAutoLoader { @@ -37,9 +36,12 @@ ContextMenuAutoLoader { property bool isVideoMuted: false property bool isRecording: false + property bool windowSelection: false + signal pluginItemClicked signal transferCallButtonClicked signal recordCallClicked + signal openSelectionWindow property list menuItems: [ GeneralMenuItem { @@ -101,7 +103,7 @@ ContextMenuAutoLoader { GeneralMenuItem { id: stopSharing - canTrigger: (AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE) + canTrigger: sharingActive && !isSIP && !isVideoMuted itemName: JamiStrings.stopSharing iconSource: JamiResources.share_stop_black_24dp_svg @@ -119,12 +121,29 @@ ContextMenuAutoLoader { if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { AvAdapter.muteCamera = root.isVideoMuted } - AvAdapter.getListWindows() - if (Qt.application.screens.length + AvAdapter.windowsNames().length === 1) { + if (Qt.application.screens.length === 1) { AvAdapter.shareEntireScreen(0) } else { - SelectScreenWindowCreation.createSelectScreenWindowObject() - SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId) + windowSelection = false + 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() } } }, diff --git a/src/mainview/components/SelectScreen.qml b/src/mainview/components/SelectScreen.qml index 332c3c17..377cb035 100644 --- a/src/mainview/components/SelectScreen.qml +++ b/src/mainview/components/SelectScreen.qml @@ -37,6 +37,8 @@ Window { property int minWidth: 650 property int minHeight: 500 + property bool window: false + property int selectedScreenNumber: -1 property bool selectAllScreens: false property string currentPreview: "" @@ -68,7 +70,7 @@ Window { calculateRepeaterModel() screenInfo.model = screens.length screenInfo2.model = screens.length - windowsText.visible = screens.length > Qt.application.screens.length + windowsText.visible = root.window } minimumWidth: minWidth minimumHeight: minHeight @@ -118,6 +120,7 @@ Window { text: JamiStrings.screens verticalAlignment: Text.AlignBottom color: JamiTheme.textColor + visible: !root.window } Repeater { @@ -135,7 +138,7 @@ Window { height: 3 * width / 4 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 { id: screenName @@ -210,7 +213,7 @@ Window { border.color: selectAllScreens ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor - visible: Qt.application.screens.length > 1 + visible: !root.window && Qt.application.screens.length > 1 Text { id: screenNameAll @@ -269,6 +272,7 @@ Window { text: JamiStrings.windows verticalAlignment: Text.AlignBottom color: JamiTheme.textColor + visible: root.window } Repeater { @@ -286,7 +290,7 @@ Window { height: 3 * width / 4 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 { id: screenName2 diff --git a/src/mainview/js/selectscreenwindowcreation.js b/src/mainview/js/selectscreenwindowcreation.js index 6be4c2b3..1ae7394d 100644 --- a/src/mainview/js/selectscreenwindowcreation.js +++ b/src/mainview/js/selectscreenwindowcreation.js @@ -43,9 +43,10 @@ function finishCreation() { selectScreenWindowObject.onClosing.connect(destroySelectScreenWindow) } -function showSelectScreenWindow(previewId) { +function showSelectScreenWindow(previewId, window) { console.log("previewId", previewId) selectScreenWindowObject.currentPreview = previewId + selectScreenWindowObject.window = window selectScreenWindowObject.show() var screen = selectScreenWindowObject.screen