Commit: 1ad7359efdd43bf863ac4b4687d09af7af773693
Author: Julian Eisel
Date:   Thu Apr 6 23:32:45 2017 +0200
Branches: workspaces
https://developer.blender.org/rB1ad7359efdd43bf863ac4b4687d09af7af773693

Bundle default workspace user configuration file with Blender

This contains nothing but the old screen-layouts converted into
workspaces (and "Default" layout/workspace is now called "General").

Note that this adds the workspaces.blend directly, no datatoc conversion
is used like for default startup.blend. Mainly for these two reasons:
* Appending only supports regular .blend files
* Regular .blend is much smaller than datatoc one (181kB vs. 1.4MB)

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

A       release/datafiles/workspaces.blend
M       source/blender/editors/screen/workspace_edit.c
M       source/blender/windowmanager/intern/wm_files.c
M       source/creator/CMakeLists.txt

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

diff --git a/release/datafiles/workspaces.blend 
b/release/datafiles/workspaces.blend
new file mode 100644
index 00000000000..27a3e474383
Binary files /dev/null and b/release/datafiles/workspaces.blend differ
diff --git a/source/blender/editors/screen/workspace_edit.c 
b/source/blender/editors/screen/workspace_edit.c
index 387bc89d728..8b6842d80d3 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -23,6 +23,7 @@
  */
 
 #include <stdlib.h>
+#include <string.h>
 
 #include "BLI_utildefines.h"
 #include "BLI_fileops.h"
@@ -180,6 +181,7 @@ bool ED_workspace_change(
        }
 
        screen_new = screen_change_prepare(screen_old, screen_new, bmain, C, 
win);
+       BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new);
 
        if (screen_new) {
                WM_window_set_active_layout(win, workspace_new, layout_new);
@@ -306,28 +308,54 @@ static void WORKSPACE_OT_workspace_delete(wmOperatorType 
*ot)
        ot->exec = workspace_delete_exec;
 }
 
-ATTR_NONNULL(1)
-static WorkspaceConfigFileData *workspace_config_file_read(const Main *bmain, 
ReportList *reports)
+static void workspace_config_file_path_from_folder_id(const Main *bmain, int 
folder_id, char *r_path)
 {
-       char workspace_config_path[FILE_MAX];
-       const char * const cfgdir = BKE_appdir_folder_id(BLENDER_USER_CONFIG, 
NULL);
+       const char *cfgdir = BKE_appdir_folder_id(folder_id, NULL);
 
        if (cfgdir) {
-               BLI_make_file_string(bmain->name, workspace_config_path, 
cfgdir, BLENDER_WORKSPACES_FILE);
+               BLI_make_file_string(bmain->name, r_path, cfgdir, 
BLENDER_WORKSPACES_FILE);
        }
        else {
-               workspace_config_path[0] = '\0';
+               r_path[0] = '\0';
        }
+}
+
+ATTR_NONNULL(1)
+static WorkspaceConfigFileData *workspace_config_file_read(const Main *bmain, 
ReportList *reports)
+{
+       char workspace_config_path[FILE_MAX];
+       bool has_path = false;
 
+       workspace_config_file_path_from_folder_id(bmain, BLENDER_USER_CONFIG, 
workspace_config_path);
        if (BLI_exists(workspace_config_path)) {
-               /* may still return NULL */
-               return 
BKE_blendfile_workspace_config_read(workspace_config_path, reports);
+               has_path = true;
        }
-       else if (reports) {
-               BKE_reportf(reports, RPT_WARNING, "Couldn't find workspace 
configuration file in %s", workspace_config_path);
+       else {
+               workspace_config_file_path_from_folder_id(bmain, 
BLENDER_DATAFILES, workspace_config_path);
+               if (BLI_exists(workspace_config_path)) {
+                       has_path = true;
+               }
        }
 
-       return NULL;
+       return has_path ? 
BKE_blendfile_workspace_config_read(workspace_config_path, reports) : NULL;
+}
+
+static void workspace_append_button(
+        uiLayout *layout, wmOperatorType *ot_append, const WorkSpace 
*workspace, const Main *from_main)
+{
+       const ID *id = BKE_workspace_id_get((WorkSpace *)workspace); /* 
non-const cast, but we really don't modify it... */
+       PointerRNA opptr;
+       char lib_path[FILE_MAX_LIBEXTRA];
+
+       BLI_path_join(
+               lib_path, sizeof(lib_path), from_main->name, 
BKE_idcode_to_name(GS(id->name)), NULL);
+
+       BLI_assert(STREQ(ot_append->idname, "WM_OT_append"));
+       opptr = uiItemFullO_ptr(
+                   layout, ot_append, BKE_workspace_name_get(workspace), 
ICON_NONE, NULL,
+                   WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+       RNA_string_set(&opptr, "directory", lib_path);
+       RNA_string_set(&opptr, "filename", id->name + 2);
 }
 
 ATTR_NONNULL(1, 2)
@@ -338,21 +366,10 @@ static void workspace_config_file_append_buttons(
 
        if (workspace_config) {
                wmOperatorType *ot_append = 
WM_operatortype_find("WM_OT_append", true);
-               PointerRNA opptr;
-               char lib_path[FILE_MAX_LIBEXTRA];
 
                BKE_workspace_iter_begin(workspace, 
workspace_config->workspaces.first)
                {
-                       ID *id = BKE_workspace_id_get(workspace);
-
-                       BLI_path_join(
-                               lib_path, sizeof(lib_path), 
workspace_config->main->name, BKE_idcode_to_name(GS(id->name)), NULL);
-
-                       opptr = uiItemFullO_ptr(
-                                   layout, ot_append, 
BKE_workspace_name_get(workspace), ICON_NONE, NULL,
-                                   WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
-                       RNA_string_set(&opptr, "directory", lib_path);
-                       RNA_string_set(&opptr, "filename", id->name + 2);
+                       workspace_append_button(layout, ot_append, workspace, 
workspace_config->main);
                }
                BKE_workspace_iter_end;
 
diff --git a/source/blender/windowmanager/intern/wm_files.c 
b/source/blender/windowmanager/intern/wm_files.c
index f74f15ecd8e..34f226e8155 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -245,6 +245,7 @@ static void wm_window_match_do(bContext *C, ListBase 
*oldwmlist)
                        bScreen *screen = NULL;
 
                        /* when loading without UI, no matching needed */
+                       /* XXX think we don't handle this correctly yet, it's 
activating workspace from old file */
                        if (!(G.fileflags & G_FILE_NO_UI) && (screen = 
CTX_wm_screen(C))) {
 
                                /* match oldwm to new dbase, only old files */
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index eea45545949..7c8684d0331 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -423,6 +423,12 @@ if(WITH_OPENCOLORIO)
        )
 endif()
 
+# Add default workspaces.blend to build (under [version]/datafiles
+install(
+       FILES ${CMAKE_SOURCE_DIR}/release/datafiles/workspaces.blend
+       DESTINATION ${TARGETDIR_VER}/datafiles
+)
+
 # helpful tip when using make
 if("${CMAKE_GENERATOR}" MATCHES ".*Makefiles.*")
        # message after building.

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to