From 05d929cd8a3af8d17a3896062323a610b770be21 Mon Sep 17 00:00:00 2001 From: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com> Date: Wed, 2 Feb 2022 16:39:57 -0500 Subject: [PATCH] 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 --- resources/icons/window_black_24dp.svg | 8 +++++ src/constant/JamiStrings.qml | 1 + src/mainview/components/CallActionBar.qml | 16 +++++++--- src/mainview/components/CallOverlay.qml | 32 ++++++++++++------- .../components/CallViewContextMenu.qml | 31 ++++++++++++++---- src/mainview/components/SelectScreen.qml | 12 ++++--- src/mainview/js/selectscreenwindowcreation.js | 3 +- 7 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 resources/icons/window_black_24dp.svg diff --git a/resources/icons/window_black_24dp.svg b/resources/icons/window_black_24dp.svg new file mode 100644 index 000000000..37db909fc --- /dev/null +++ b/resources/icons/window_black_24dp.svg @@ -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> diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml index 8080aca88..4c5d17df6 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 e6a08e16b..4ef3937e6 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 46a4abd63..d24ddddb0 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 openShareScreenArea() { - if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) { - AvAdapter.muteCamera = root.isVideoMuted + function openShareWindow() { + AvAdapter.muteCamera = !sharingActive && root.isVideoMuted + AvAdapter.getListWindows() + if (AvAdapter.windowsNames.length >= 1) { + SelectScreenWindowCreation.createSelectScreenWindowObject() + SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, true) } + } + + function openShareScreenArea() { + 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 baf4565c2..355fe9b8a 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<GeneralMenuItem> 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 332c3c174..377cb0350 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 6be4c2b3d..1ae7394d4 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 -- GitLab