From ed44ddd816d3bcd9be2e2097e1087dcdbf9b91e1 Mon Sep 17 00:00:00 2001 From: Alexander Kuznetsov Date: Fri, 16 Mar 2012 17:37:45 +0000 Subject: Patch by Psy-Fi + my minor changes Adds conformation on exit for windows. Needs to be enabled in user perf. Tried to edit blender.exe.manifest for more modern dialog look, but didn't work out. --- intern/ghost/GHOST_C-api.h | 8 ++++++++ intern/ghost/GHOST_ISystem.h | 6 +++++- intern/ghost/intern/GHOST_C-api.cpp | 6 ++++++ intern/ghost/intern/GHOST_System.cpp | 6 ++++++ intern/ghost/intern/GHOST_System.h | 7 +++++++ intern/ghost/intern/GHOST_SystemWin32.cpp | 6 ++++++ intern/ghost/intern/GHOST_SystemWin32.h | 8 +++++++- release/scripts/startup/bl_ui/space_userpref.py | 3 +++ source/blender/makesdna/DNA_userdef_types.h | 1 + source/blender/makesrna/intern/rna_userdef.c | 5 +++++ source/blender/windowmanager/intern/wm_window.c | 17 +++++++++++++++++ 11 files changed, 71 insertions(+), 2 deletions(-) diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index a22b6bc371c..3add5ccb60a 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -842,6 +842,14 @@ extern void GHOST_putClipboard(GHOST_TInt8 *buffer, int selection); */ extern int GHOST_toggleConsole(int action); + +/** + * Confirms quitting he program when there is just one window left open + * in the application + */ +extern int GHOST_confirmQuit(GHOST_WindowHandle windowhandle); + + #ifdef __cplusplus } #endif diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h index eeee8c0477b..890917f9822 100644 --- a/intern/ghost/GHOST_ISystem.h +++ b/intern/ghost/GHOST_ISystem.h @@ -392,7 +392,11 @@ public: */ virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0; - + /** + * Confirms quitting he program when there is just one window left open + * in the application + */ + virtual int confirmQuit(GHOST_IWindow * window) const = 0; protected: /** * Initialize the system. diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index 6edfc4287ae..8442f82d886 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -865,3 +865,9 @@ int GHOST_toggleConsole(int action) GHOST_ISystem* system = GHOST_ISystem::getSystem(); return system->toggleConsole(action); } + + +int GHOST_confirmQuit(GHOST_WindowHandle windowhandle){ + GHOST_ISystem* system = GHOST_ISystem::getSystem(); + return system->confirmQuit((GHOST_IWindow*) windowhandle); +} diff --git a/intern/ghost/intern/GHOST_System.cpp b/intern/ghost/intern/GHOST_System.cpp index 944ade3f22b..974f66c666a 100644 --- a/intern/ghost/intern/GHOST_System.cpp +++ b/intern/ghost/intern/GHOST_System.cpp @@ -366,3 +366,9 @@ GHOST_TSuccess GHOST_System::createFullScreenWindow(GHOST_Window** window, const } return success; } + + +int GHOST_System::confirmQuit(GHOST_IWindow * window) const +{ + return 1; +} diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h index de474fe07a5..15a7cf1fdd9 100644 --- a/intern/ghost/intern/GHOST_System.h +++ b/intern/ghost/intern/GHOST_System.h @@ -297,6 +297,13 @@ public: */ virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0; + /** + * Confirms quitting he program when there is just one window left open + * in the application + */ + virtual int confirmQuit(GHOST_IWindow * window) const; + + protected: /** diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index f4b39d01d9e..1ccca4bc6ba 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -1356,3 +1356,9 @@ int GHOST_SystemWin32::toggleConsole(int action) return m_consoleStatus; } + +int GHOST_SystemWin32::confirmQuit(GHOST_IWindow * window) const +{ + return (MessageBox(window ? ((GHOST_WindowWin32*)window)->getHWND() : 0, "Some changes have not been saved.\nDo you really want to quit ?", + "Exit Blender", MB_OKCANCEL | MB_ICONWARNING | MB_TOPMOST) == IDOK); +} \ No newline at end of file diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 43387f68349..bc2044e549d 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -200,7 +200,13 @@ public: * @return Indication whether the event was handled. */ static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,GHOST_IWindow* window, int mouseX, int mouseY, void* data); - + +/** + * Confirms quitting he program when there is just one window left open + * in the application + */ + virtual int confirmQuit(GHOST_IWindow * window) const; + protected: /** * Initializes the system. diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 9d947f6fb40..81f67bffd62 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -244,6 +244,9 @@ class USERPREF_PT_interface(Panel): col.prop(view, "show_splash") + if os.name == 'nt': + col.prop(view, "quit_dialog") + class USERPREF_PT_edit(Panel): bl_space_type = 'USER_PREFERENCES' diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 2243eb357fc..e014e18d07b 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -510,6 +510,7 @@ extern UserDef U; /* from blenkernel blender.c */ #define USER_SPLASH_DISABLE (1 << 27) #define USER_HIDE_RECENT (1 << 28) #define USER_SHOW_THUMBNAILS (1 << 29) +#define USER_QUIT_PROMPT (1 << 30) /* Auto-Keying mode */ /* AUTOKEY_ON is a bitflag */ diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 3673d21a9e6..7af1dfa9da9 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -2369,6 +2369,11 @@ static void rna_def_userdef_view(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Sub Level Menu Open Delay", "Time delay in 1/10 seconds before automatically opening sub level menus"); + prop = RNA_def_property(srna, "quit_dialog", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_QUIT_PROMPT); + RNA_def_property_ui_text(prop, "Prompt Quit", + "Asks for confirmation when quitting through the window close button"); + /* Toolbox click-hold delay */ prop = RNA_def_property(srna, "open_left_mouse_delay", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "tb_leftmouse"); diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 7893ac2f639..4ccebf7a4ff 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -250,8 +250,25 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig) /* this is event from ghost, or exit-blender op */ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win) { + wmWindow *tmpwin; bScreen *screen= win->screen; + /* first check if we have any non-temp remaining windows */ + if((U.uiflag & USER_QUIT_PROMPT) && !wm->file_saved){ + if(wm->windows.first) { + for(tmpwin = wm->windows.first; tmpwin; tmpwin = tmpwin->next){ + if(tmpwin == win) + continue; + if(tmpwin->screen->temp == 0) + break; + } + if(tmpwin == NULL){ + if(!GHOST_confirmQuit(win->ghostwin)) + return; + } + } + } + BLI_remlink(&wm->windows, win); wm_draw_window_clear(win); -- cgit v1.2.3