fix: Use XDG_ACTIVATION_TOKEN in wayland when launched by other app (#43547)
When an electron app is launched by another app ensure that the XDG_ACTIVATION_TOKEN env var is read and used for activation using xdg_activation_v1 protocol. Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Orko Garai <orko@igalia.com>
This commit is contained in:
		
					parent
					
						
							
								523b4cb27a
							
						
					
				
			
			
				commit
				
					
						d025ecfa6b
					
				
			
		
					 2 changed files with 25 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -92,6 +92,11 @@
 | 
			
		|||
#include "shell/browser/ui/cocoa/electron_bundle_mover.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BUILDFLAG(IS_LINUX)
 | 
			
		||||
#include "base/nix/scoped_xdg_activation_token_injector.h"
 | 
			
		||||
#include "base/nix/xdg_util.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
using electron::Browser;
 | 
			
		||||
 | 
			
		||||
namespace gin {
 | 
			
		||||
| 
						 | 
				
			
			@ -411,6 +416,12 @@ bool NotificationCallbackWrapper(
 | 
			
		|||
    base::CommandLine cmd,
 | 
			
		||||
    const base::FilePath& cwd,
 | 
			
		||||
    const std::vector<uint8_t> additional_data) {
 | 
			
		||||
#if BUILDFLAG(IS_LINUX)
 | 
			
		||||
  // Set the global activation token sent as a command line switch by another
 | 
			
		||||
  // electron app instance. This also removes the switch after use to prevent
 | 
			
		||||
  // any side effects of leaving it in the command line after this point.
 | 
			
		||||
  base::nix::ExtractXdgActivationTokenFromCmdLine(cmd);
 | 
			
		||||
#endif
 | 
			
		||||
  // Make sure the callback is called after app gets ready.
 | 
			
		||||
  if (Browser::Get()->is_ready()) {
 | 
			
		||||
    callback.Run(std::move(cmd), cwd, std::move(additional_data));
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,6 +1032,15 @@ bool App::RequestSingleInstanceLock(gin::Arguments* args) {
 | 
			
		|||
      base::BindRepeating(NotificationCallbackWrapper, cb));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BUILDFLAG(IS_LINUX)
 | 
			
		||||
  // Read the xdg-activation token and set it in the command line for the
 | 
			
		||||
  // duration of the notification in order to ensure this is propagated to an
 | 
			
		||||
  // already running electron app instance if it exists.
 | 
			
		||||
  // The activation token received from the launching app is used later when
 | 
			
		||||
  // activating the existing electron app instance window.
 | 
			
		||||
  base::nix::ScopedXdgActivationTokenInjector activation_token_injector(
 | 
			
		||||
      *base::CommandLine::ForCurrentProcess(), *base::Environment::Create());
 | 
			
		||||
#endif
 | 
			
		||||
  switch (process_singleton_->NotifyOtherProcessOrCreate()) {
 | 
			
		||||
    case ProcessSingleton::NotifyResult::PROCESS_NONE:
 | 
			
		||||
      if (content::BrowserThread::IsThreadInitialized(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue