Browse Source

UI: Fix system tray context menu creation

On KDE and Unity some QT events aren't triggered as explicit stated
by QT doc.  This is needed to at least show a fixed Context Menu.

Closes obsproject/obs-studio#1252
Shaolin 7 years ago
parent
commit
823c34f848
2 changed files with 30 additions and 23 deletions
  1. 27 22
      UI/window-basic-main.cpp
  2. 3 1
      UI/window-basic-main.hpp

+ 27 - 22
UI/window-basic-main.cpp

@@ -1690,6 +1690,8 @@ void OBSBasic::OBSInit()
 
 	multiviewProjectorMenu = new QMenu(QTStr("MultiviewProjector"));
 	ui->viewMenu->addMenu(multiviewProjectorMenu);
+	AddProjectorMenuMonitors(multiviewProjectorMenu, this,
+			SLOT(OpenMultiviewProjector()));
 	connect(ui->viewMenu->menuAction(), &QAction::hovered, this,
 			&OBSBasic::UpdateMultiviewProjectorMenu);
 	ui->viewMenu->addAction(QTStr("MultiviewWindowed"),
@@ -6350,6 +6352,22 @@ void OBSBasic::SystemTrayInit()
 	exit = new QAction(QTStr("Exit"),
 			trayIcon.data());
 
+	trayMenu = new QMenu;
+	previewProjector = new QMenu(QTStr("PreviewProjector"));
+	studioProgramProjector = new QMenu(QTStr("StudioProgramProjector"));
+	AddProjectorMenuMonitors(previewProjector, this,
+			SLOT(OpenPreviewProjector()));
+	AddProjectorMenuMonitors(studioProgramProjector, this,
+			SLOT(OpenStudioProgramProjector()));
+	trayMenu->addAction(showHide);
+	trayMenu->addMenu(previewProjector);
+	trayMenu->addMenu(studioProgramProjector);
+	trayMenu->addAction(sysTrayStream);
+	trayMenu->addAction(sysTrayRecord);
+	trayMenu->addAction(sysTrayReplayBuffer);
+	trayMenu->addAction(exit);
+	trayIcon->setContextMenu(trayMenu);
+
 	if (outputHandler && !outputHandler->replayBuffer)
 		sysTrayReplayBuffer->setEnabled(false);
 
@@ -6367,33 +6385,20 @@ void OBSBasic::SystemTrayInit()
 			this, &OBSBasic::ReplayBufferClicked);
 	connect(exit, SIGNAL(triggered()),
 			this, SLOT(close()));
-
-	trayMenu = new QMenu;
 }
 
 void OBSBasic::IconActivated(QSystemTrayIcon::ActivationReason reason)
 {
-	if (reason == QSystemTrayIcon::Trigger) {
+	// Refresh projector list
+	previewProjector->clear();
+	studioProgramProjector->clear();
+	AddProjectorMenuMonitors(previewProjector, this,
+			SLOT(OpenPreviewProjector()));
+	AddProjectorMenuMonitors(studioProgramProjector, this,
+			SLOT(OpenStudioProgramProjector()));
+
+	if (reason == QSystemTrayIcon::Trigger)
 		ToggleShowHide();
-	} else if (reason == QSystemTrayIcon::Context) {
-		QMenu *previewProjector = new QMenu(QTStr("PreviewProjector"));
-		AddProjectorMenuMonitors(previewProjector, this,
-				SLOT(OpenPreviewProjector()));
-		QMenu *studioProgramProjector = new QMenu(
-				QTStr("StudioProgramProjector"));
-		AddProjectorMenuMonitors(studioProgramProjector, this,
-				SLOT(OpenStudioProgramProjector()));
-
-		trayMenu->clear();
-		trayMenu->addAction(showHide);
-		trayMenu->addMenu(previewProjector);
-		trayMenu->addMenu(studioProgramProjector);
-		trayMenu->addAction(sysTrayStream);
-		trayMenu->addAction(sysTrayRecord);
-		trayMenu->addAction(sysTrayReplayBuffer);
-		trayMenu->addAction(exit);
-		trayMenu->popup(QCursor::pos());
-	}
 }
 
 void OBSBasic::SysTrayNotify(const QString &text,

+ 3 - 1
UI/window-basic-main.hpp

@@ -195,8 +195,10 @@ private:
 	QPointer<QAction>         showHide;
 	QPointer<QAction>         exit;
 	QPointer<QMenu>           trayMenu;
+	QPointer<QMenu>           previewProjector;
+	QPointer<QMenu>           studioProgramProjector;
+	QPointer<QMenu>           multiviewProjectorMenu;
 
-	QPointer<QMenu> multiviewProjectorMenu;
 	void          UpdateMultiviewProjectorMenu();
 
 	void          DrawBackdrop(float cx, float cy);