[Bf-blender-cvs] [2a63e062b0e] master: Tests: add --no-window-focus to open window without focus.

Brecht Van Lommel noreply at git.blender.org
Thu Sep 27 12:36:28 CEST 2018


Commit: 2a63e062b0e71c291d57aa155d9462f68fed8535
Author: Brecht Van Lommel
Date:   Tue Apr 10 10:32:56 2018 +0200
Branches: master
https://developer.blender.org/rB2a63e062b0e71c291d57aa155d9462f68fed8535

Tests: add --no-window-focus to open window without focus.

This is useful to run OpenGL tests while continuing to do other tasks
without windows constantly popping up in the foreground.

===================================================================

M	intern/ghost/GHOST_C-api.h
M	intern/ghost/GHOST_ISystem.h
M	intern/ghost/intern/GHOST_C-api.cpp
M	intern/ghost/intern/GHOST_System.cpp
M	intern/ghost/intern/GHOST_System.h
M	intern/ghost/intern/GHOST_SystemCocoa.mm
M	intern/ghost/intern/GHOST_WindowWin32.cpp
M	intern/ghost/intern/GHOST_WindowX11.cpp
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_window.c
M	source/creator/creator_args.c
M	tests/python/opengl_draw_tests.py

===================================================================

diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index 86e64b7eeb0..bc5c67f4bed 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -907,6 +907,11 @@ extern int GHOST_SupportsNativeDialogs(void);
  */
 extern int GHOST_UseNativePixels(void);
 
+/**
+ * Focus window after opening, or put them in the background.
+ */
+extern void GHOST_UseWindowFocus(int use_focus);
+
 /**
  * If window was opened using native pixel size, it returns scaling factor.
  */
diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h
index be2a94bd508..9b017c2da38 100644
--- a/intern/ghost/GHOST_ISystem.h
+++ b/intern/ghost/GHOST_ISystem.h
@@ -306,6 +306,11 @@ public:
 	 */
 	virtual bool useNativePixel(void) = 0;
 
+	/**
+	 * Focus window after opening, or put them in the background.
+	 */
+	virtual void useWindowFocus(const bool use_focus) = 0;
+
 	/***************************************************************************************
 	 * Event management functionality
 	 ***************************************************************************************/
diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp
index 797fb16dd6f..e60a8a9d3f3 100644
--- a/intern/ghost/intern/GHOST_C-api.cpp
+++ b/intern/ghost/intern/GHOST_C-api.cpp
@@ -911,6 +911,12 @@ int GHOST_UseNativePixels(void)
 	return system->useNativePixel();
 }
 
+void GHOST_UseWindowFocus(int use_focus)
+{
+	GHOST_ISystem *system = GHOST_ISystem::getSystem();
+	return system->useWindowFocus(use_focus);
+}
+
 float GHOST_GetNativePixelSize(GHOST_WindowHandle windowhandle)
 {
 	GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;
diff --git a/intern/ghost/intern/GHOST_System.cpp b/intern/ghost/intern/GHOST_System.cpp
index 0629eacc3ff..39f915bb0c2 100644
--- a/intern/ghost/intern/GHOST_System.cpp
+++ b/intern/ghost/intern/GHOST_System.cpp
@@ -48,6 +48,7 @@
 
 GHOST_System::GHOST_System()
     : m_nativePixel(false),
+      m_windowFocus(true),
       m_displayManager(NULL),
       m_timerManager(NULL),
       m_windowManager(NULL),
@@ -390,3 +391,8 @@ bool GHOST_System::useNativePixel(void)
 	m_nativePixel = true;
 	return 1;
 }
+
+void GHOST_System::useWindowFocus(const bool use_focus)
+{
+	m_windowFocus = use_focus;
+}
diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h
index 464d9269f28..ee3c30c35b4 100644
--- a/intern/ghost/intern/GHOST_System.h
+++ b/intern/ghost/intern/GHOST_System.h
@@ -177,6 +177,12 @@ public:
 	bool useNativePixel(void);
 	bool m_nativePixel;
 
+	/**
+	 * Focus window after opening, or put them in the background.
+	 */
+	void useWindowFocus(const bool use_focus);
+	bool m_windowFocus;
+
 	/***************************************************************************************
 	 * Event management functionality
 	 ***************************************************************************************/
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm
index 916da546669..697c0fae809 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -304,11 +304,13 @@ extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG])
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
 {
-	// raise application to front, convenient when starting from the terminal
-	// and important for launching the animation player. we call this after the
-	// application finishes launching, as doing it earlier can make us end up
-	// with a frontmost window but an inactive application
-	[NSApp activateIgnoringOtherApps:YES];
+	if (systemCocoa->m_windowFocus) {
+		// Raise application to front, convenient when starting from the terminal
+		// and important for launching the animation player. we call this after the
+		// application finishes launching, as doing it earlier can make us end up
+		// with a frontmost window but an inactive application.
+		[NSApp activateIgnoringOtherApps:YES];
+	}
 }
 
 - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp
index 92de41a859b..00096c05ee3 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.cpp
+++ b/intern/ghost/intern/GHOST_WindowWin32.cpp
@@ -201,6 +201,11 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system,
 		// Store a pointer to this class in the window structure
 		::SetWindowLongPtr(m_hWnd, GWLP_USERDATA, (LONG_PTR) this);
 
+		if (!m_system->m_windowFocus) {
+			// Lower to bottom and don't activate if we don't want focus
+			::SetWindowPos(m_hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+		}
+
 		// Store the device context
 		m_hDC = ::GetDC(m_hWnd);
 
@@ -214,11 +219,11 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system,
 					nCmdShow = SW_SHOWMAXIMIZED;
 					break;
 				case GHOST_kWindowStateMinimized:
-					nCmdShow = SW_SHOWMINIMIZED;
+					nCmdShow = (m_system->m_windowFocus) ? SW_SHOWMINIMIZED : SW_SHOWMINNOACTIVE;
 					break;
 				case GHOST_kWindowStateNormal:
 				default:
-					nCmdShow = SW_SHOWNORMAL;
+					nCmdShow = (m_system->m_windowFocus) ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE;
 					break;
 			}
 
diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index 623d57705b2..a4ccdef3788 100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -517,7 +517,7 @@ GHOST_WindowX11(GHOST_SystemX11 *system,
 			natom++;
 		}
 
-		if (m_system->m_atom.WM_TAKE_FOCUS) {
+		if (m_system->m_atom.WM_TAKE_FOCUS && m_system->m_windowFocus) {
 			atoms[natom] = m_system->m_atom.WM_TAKE_FOCUS;
 			natom++;
 		}
@@ -532,7 +532,7 @@ GHOST_WindowX11(GHOST_SystemX11 *system,
 	{
 		XWMHints *xwmhints = XAllocWMHints();
 		xwmhints->initial_state = NormalState;
-		xwmhints->input = True;
+		xwmhints->input = (m_system->m_windowFocus) ? True : False;
 		xwmhints->flags = InputHint | StateHint;
 		XSetWMHints(display, m_window, xwmhints);
 		XFree(xwmhints);
@@ -586,11 +586,15 @@ GHOST_WindowX11(GHOST_SystemX11 *system,
 
 	setTitle(title);
 
-	if (exclusive) {
+	if (exclusive && system->m_windowFocus) {
 		XMapRaised(m_display, m_window);
 	}
 	else {
 		XMapWindow(m_display, m_window);
+
+		if (!system->m_windowFocus) {
+			XLowerWindow(m_display, m_window);
+		}
 	}
 	GHOST_PRINT("Mapped window\n");
 
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 33e918b25e5..2ff416c0ba6 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -78,6 +78,7 @@ const char *WM_init_state_app_template_get(void);
 void		WM_init_state_size_set		(int stax, int stay, int sizx, int sizy);
 void		WM_init_state_fullscreen_set(void);
 void		WM_init_state_normal_set(void);
+void		WM_init_window_focus_set(bool do_it);
 void		WM_init_native_pixels(bool do_it);
 
 void		WM_init				(struct bContext *C, int argc, const char **argv);
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index d74657d0c15..04a236e5d66 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -102,8 +102,9 @@ static struct WMInitStruct {
 	int windowstate;
 	WinOverrideFlag override_flag;
 
+	bool window_focus;
 	bool native_pixels;
-} wm_init_state = {0, 0, 0, 0, GHOST_kWindowStateNormal, 0, true};
+} wm_init_state = {0, 0, 0, 0, GHOST_kWindowStateNormal, 0, true, true};
 
 /* ******** win open & close ************ */
 
@@ -624,7 +625,9 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, const char *title, wm
 
 #ifndef __APPLE__
 		/* set the state here, so minimized state comes up correct on windows */
-		GHOST_SetWindowState(ghostwin, (GHOST_TWindowState)win->windowstate);
+		if (wm_init_state.window_focus) {
+			GHOST_SetWindowState(ghostwin, (GHOST_TWindowState)win->windowstate);
+		}
 #endif
 		/* until screens get drawn, make it nice gray */
 		glClearColor(0.55, 0.55, 0.55, 0.0);
@@ -1546,6 +1549,8 @@ void wm_ghost_init(bContext *C)
 		if (wm_init_state.native_pixels) {
 			GHOST_UseNativePixels();
 		}
+
+		GHOST_UseWindowFocus(wm_init_state.window_focus);
 	}
 }
 
@@ -1832,6 +1837,11 @@ void WM_init_state_normal_set(void)
 	wm_init_state.override_flag |= WIN_OVERRIDE_WINSTATE;
 }
 
+void WM_init_window_focus_set(bool do_it)
+{
+	wm_init_state.window_focus = do_it;
+}
+
 void WM_init_native_pixels(bool do_it)
 {
 	wm_init_state.native_pixels = do_it;
diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c
index acb03efb895..f8fe57b05a2 100644
--- a/source/creator/creator_args.c
+++ b/source/creator/creator_args.c
@@ -514,6 +514,7 @@ static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), vo
 	BLI_argsPrintArgDoc(ba, "--window-geometry");
 	BLI_argsPrintArgDoc(ba, "--start-console");
 	BLI_argsPrintArgDoc(ba, "--no-native-pixels");
+	BLI_argsPrintArgDoc(ba, "--no-window-focus");
 
 
 	printf("\n");
@@ -1134,6 +1135,15 @@ static int arg_handle_without_borders(int UNUSED(argc), const char **UNUSED(argv
 	return 0;
 }
 
+static const char arg_handle_no_window_focus_doc[] =
+"\n\tOpen behind other windows and without taking focus."
+;
+static int arg_handle_no_window_focus(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
+{
+	WM_init_window_focus_set(false);
+	return 0;
+}
+
 extern bool wm_start_with_console; /* wm_init_exit.c */
 
 static const char arg_handle_start_with_console_doc[] =
@@ -2072,6 +2082,7 @@ void main_args_setup(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
 	BLI_argsAdd(ba, 2, "-p", "--window-geometry", CB(arg_handle_window_geometry), NULL);
 	BLI_argsAdd(ba, 2, "-w", "--window-border", CB(arg_handle_with_borders), NULL);
 	BLI_argsAdd(ba, 2, "-W", "--window-fullscreen", CB(arg_handle_without_borders), NULL);
+	BLI_argsAdd(ba, 2, NULL, "--no-window-focus", CB(arg_handle_no_window_focus), NULL);
 	BLI_argsAdd(ba, 2, "-con", "--start-console", CB(arg_handle_start_with_console), NULL);
 	BLI_argsAdd(ba, 2, "-R", NULL, CB(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list