Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/ghost/GHOST_C-api.h5
-rw-r--r--intern/ghost/GHOST_ISystem.h5
-rw-r--r--intern/ghost/intern/GHOST_C-api.cpp6
-rw-r--r--intern/ghost/intern/GHOST_System.cpp6
-rw-r--r--intern/ghost/intern/GHOST_System.h6
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.mm12
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.cpp9
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.cpp10
-rw-r--r--source/blender/windowmanager/WM_api.h1
-rw-r--r--source/blender/windowmanager/intern/wm_window.c14
-rw-r--r--source/creator/creator_args.c11
-rwxr-xr-xtests/python/opengl_draw_tests.py3
12 files changed, 76 insertions, 12 deletions
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
@@ -908,6 +908,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.
*/
extern float GHOST_GetNativePixelSize(GHOST_WindowHandle windowhandle);
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(arg_handle_register_extension), NULL);
BLI_argsAdd(ba, 2, "-r", NULL, CB_EX(arg_handle_register_extension, silent), ba);
diff --git a/tests/python/opengl_draw_tests.py b/tests/python/opengl_draw_tests.py
index ae7f0dabf74..b6c18e289bc 100755
--- a/tests/python/opengl_draw_tests.py
+++ b/tests/python/opengl_draw_tests.py
@@ -36,6 +36,9 @@ if inside_blender:
def render_file(filepath, output_filepath):
command = (
BLENDER,
+ "--no-window-focus",
+ "--window-geometry",
+ "0", "0", "1024", "768",
"-noaudio",
"--factory-startup",
"--enable-autoexec",