[Bf-blender-cvs] [a2baf50242a] master: Cleanup/refactor: Workspace API, boilerplate code, early exit

Julian Eisel noreply at git.blender.org
Tue May 26 20:39:18 CEST 2020


Commit: a2baf50242a315961fc7bc4d202a610442e813ec
Author: Julian Eisel
Date:   Tue May 26 20:32:21 2020 +0200
Branches: master
https://developer.blender.org/rBa2baf50242a315961fc7bc4d202a610442e813ec

Cleanup/refactor: Workspace API, boilerplate code, early exit

* Simplify workspace API a bit
* Comment on behavior of workspace-layout relations where exposed in API
* Remove annoying getters/setters
* Avoid lookups if we can early exit
* A NULL check is removed in `direct_link_workspace()` that I don't see
  a need for. Am not 100% sure though, fingers crossed.

In general these changes should improve readability and make things
easier to reason about.

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

M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/blenloader/intern/versioning_defaults.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/screen/workspace_edit.c
M	source/blender/editors/screen/workspace_layout_edit.c
M	source/blender/makesrna/intern/rna_workspace.c
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 8582996108a..8a6afd8a753 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -84,6 +84,7 @@ void BKE_workspace_active_set(struct WorkSpaceInstanceHook *hook,
 struct WorkSpaceLayout *BKE_workspace_active_layout_get(const struct WorkSpaceInstanceHook *hook)
     GETTER_ATTRS;
 void BKE_workspace_active_layout_set(struct WorkSpaceInstanceHook *hook,
+                                     struct WorkSpace *workspace,
                                      struct WorkSpaceLayout *layout) SETTER_ATTRS;
 struct bScreen *BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook)
     GETTER_ATTRS;
@@ -91,21 +92,14 @@ void BKE_workspace_active_screen_set(struct WorkSpaceInstanceHook *hook,
                                      struct WorkSpace *workspace,
                                      struct bScreen *screen) SETTER_ATTRS;
 
-struct ListBase *BKE_workspace_layouts_get(struct WorkSpace *workspace) GETTER_ATTRS;
-
 const char *BKE_workspace_layout_name_get(const struct WorkSpaceLayout *layout) GETTER_ATTRS;
 void BKE_workspace_layout_name_set(struct WorkSpace *workspace,
                                    struct WorkSpaceLayout *layout,
                                    const char *new_name) ATTR_NONNULL();
 struct bScreen *BKE_workspace_layout_screen_get(const struct WorkSpaceLayout *layout) GETTER_ATTRS;
-void BKE_workspace_layout_screen_set(struct WorkSpaceLayout *layout,
-                                     struct bScreen *screen) SETTER_ATTRS;
 
-struct WorkSpaceLayout *BKE_workspace_hook_layout_for_workspace_get(
+struct WorkSpaceLayout *BKE_workspace_active_layout_for_workspace_get(
     const struct WorkSpaceInstanceHook *hook, const struct WorkSpace *workspace) GETTER_ATTRS;
-void BKE_workspace_hook_layout_for_workspace_set(struct WorkSpaceInstanceHook *hook,
-                                                 struct WorkSpace *workspace,
-                                                 struct WorkSpaceLayout *layout) ATTR_NONNULL();
 
 bool BKE_workspace_owner_id_check(const struct WorkSpace *workspace, const char *owner_id)
     ATTR_NONNULL();
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 3a69b95c114..4625fd76293 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -69,17 +69,9 @@ static void workspace_free_data(ID *id)
 static void workspace_foreach_id(ID *id, LibraryForeachIDData *data)
 {
   WorkSpace *workspace = (WorkSpace *)id;
-  ListBase *layouts = BKE_workspace_layouts_get(workspace);
 
-  LISTBASE_FOREACH (WorkSpaceLayout *, layout, layouts) {
-    bScreen *screen = BKE_workspace_layout_screen_get(layout);
-
-    /* CALLBACK_INVOKE expects an actual pointer, not a variable holding the pointer.
-     * However we can't access layout->screen here
-     * since we are outside the workspace project. */
-    BKE_LIB_FOREACHID_PROCESS(data, screen, IDWALK_CB_USER);
-    /* allow callback to set a different screen */
-    BKE_workspace_layout_screen_set(layout, screen);
+  LISTBASE_FOREACH (WorkSpaceLayout *, layout, &workspace->layouts) {
+    BKE_LIB_FOREACHID_PROCESS(data, layout->screen, IDWALK_CB_USER);
   }
 }
 
@@ -228,7 +220,7 @@ WorkSpaceInstanceHook *BKE_workspace_instance_hook_create(const Main *bmain)
 
   /* set an active screen-layout for each possible window/workspace combination */
   for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
-    BKE_workspace_hook_layout_for_workspace_set(hook, workspace, workspace->layouts.first);
+    BKE_workspace_active_layout_set(hook, workspace, workspace->layouts.first);
   }
 
   return hook;
@@ -433,6 +425,10 @@ WorkSpace *BKE_workspace_active_get(WorkSpaceInstanceHook *hook)
 }
 void BKE_workspace_active_set(WorkSpaceInstanceHook *hook, WorkSpace *workspace)
 {
+  if (hook->active == workspace) {
+    return;
+  }
+
   hook->active = workspace;
   if (workspace) {
     WorkSpaceLayout *layout = workspace_relation_get_data_matching_parent(
@@ -443,13 +439,47 @@ void BKE_workspace_active_set(WorkSpaceInstanceHook *hook, WorkSpace *workspace)
   }
 }
 
+/**
+ * Get the layout that is active for \a hook (which is the visible layout for the active workspace
+ * in \a hook).
+ */
 WorkSpaceLayout *BKE_workspace_active_layout_get(const WorkSpaceInstanceHook *hook)
 {
   return hook->act_layout;
 }
-void BKE_workspace_active_layout_set(WorkSpaceInstanceHook *hook, WorkSpaceLayout *layout)
+
+/**
+ * Get the layout to be activated should \a workspace become or be the active workspace in \a hook.
+ */
+WorkSpaceLayout *BKE_workspace_active_layout_for_workspace_get(const WorkSpaceInstanceHook *hook,
+                                                               const WorkSpace *workspace)
+{
+  /* If the workspace is active, the active layout can be returned, no need for a lookup. */
+  if (hook->active == workspace) {
+    return hook->act_layout;
+  }
+
+  /* Inactive workspace */
+  return workspace_relation_get_data_matching_parent(&workspace->hook_layout_relations, hook);
+}
+
+/**
+ * \brief Activate a layout
+ *
+ * Sets \a layout as active for \a workspace when activated through or already active in \a hook.
+ * So when the active workspace of \a hook is \a workspace, \a layout becomes the active layout of
+ * \a hook too. See #BKE_workspace_active_set().
+ *
+ * \a workspace does not need to be active for this.
+ *
+ * WorkSpaceInstanceHook.act_layout should only be modified directly to update the layout pointer.
+ */
+void BKE_workspace_active_layout_set(WorkSpaceInstanceHook *hook,
+                                     WorkSpace *workspace,
+                                     WorkSpaceLayout *layout)
 {
   hook->act_layout = layout;
+  workspace_relation_ensure_updated(&workspace->hook_layout_relations, hook, layout);
 }
 
 bScreen *BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook)
@@ -462,12 +492,7 @@ void BKE_workspace_active_screen_set(WorkSpaceInstanceHook *hook,
 {
   /* we need to find the WorkspaceLayout that wraps this screen */
   WorkSpaceLayout *layout = BKE_workspace_layout_find(hook->active, screen);
-  BKE_workspace_hook_layout_for_workspace_set(hook, workspace, layout);
-}
-
-ListBase *BKE_workspace_layouts_get(WorkSpace *workspace)
-{
-  return &workspace->layouts;
+  BKE_workspace_active_layout_set(hook, workspace, layout);
 }
 
 const char *BKE_workspace_layout_name_get(const WorkSpaceLayout *layout)
@@ -485,22 +510,5 @@ bScreen *BKE_workspace_layout_screen_get(const WorkSpaceLayout *layout)
 {
   return layout->screen;
 }
-void BKE_workspace_layout_screen_set(WorkSpaceLayout *layout, bScreen *screen)
-{
-  layout->screen = screen;
-}
-
-WorkSpaceLayout *BKE_workspace_hook_layout_for_workspace_get(const WorkSpaceInstanceHook *hook,
-                                                             const WorkSpace *workspace)
-{
-  return workspace_relation_get_data_matching_parent(&workspace->hook_layout_relations, hook);
-}
-void BKE_workspace_hook_layout_for_workspace_set(WorkSpaceInstanceHook *hook,
-                                                 WorkSpace *workspace,
-                                                 WorkSpaceLayout *layout)
-{
-  hook->act_layout = layout;
-  workspace_relation_ensure_updated(&workspace->hook_layout_relations, hook, layout);
-}
 
 /** \} */
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index d90a730e8ed..e532ea17dca 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3579,15 +3579,13 @@ static void direct_link_cachefile(FileData *fd, CacheFile *cache_file)
 
 static void lib_link_workspaces(FileData *fd, Main *bmain, WorkSpace *workspace)
 {
-  ListBase *layouts = BKE_workspace_layouts_get(workspace);
   ID *id = (ID *)workspace;
 
   id_us_ensure_real(id);
 
-  for (WorkSpaceLayout *layout = layouts->first, *layout_next; layout; layout = layout_next) {
+  LISTBASE_FOREACH_MUTABLE (WorkSpaceLayout *, layout, &workspace->layouts) {
     layout->screen = newlibadr(fd, id->lib, layout->screen);
 
-    layout_next = layout->next;
     if (layout->screen) {
       if (ID_IS_LINKED(id)) {
         layout->screen->winid = 0;
@@ -3607,16 +3605,14 @@ static void lib_link_workspaces(FileData *fd, Main *bmain, WorkSpace *workspace)
 
 static void direct_link_workspace(FileData *fd, WorkSpace *workspace, const Main *main)
 {
-  link_list(fd, BKE_workspace_layouts_get(workspace));
+  link_list(fd, &workspace->layouts);
   link_list(fd, &workspace->hook_layout_relations);
   link_list(fd, &workspace->owner_ids);
   link_list(fd, &workspace->tools);
 
   LISTBASE_FOREACH (WorkSpaceDataRelation *, relation, &workspace->hook_layout_relations) {
-
     /* data from window - need to access through global oldnew-map */
     relation->parent = newglobadr(fd, relation->parent);
-
     relation->value = newdataadr(fd, relation->value);
   }
 
@@ -3624,11 +3620,7 @@ static void direct_link_workspace(FileData *fd, WorkSpace *workspace, const Main
    * when reading windows, so have to update windows after/when reading workspaces. */
   for (wmWindowManager *wm = main->wm.first; wm; wm = wm->id.next) {
     LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
-      WorkSpaceLayout *act_layout = newdataadr(
-          fd, BKE_workspace_active_layout_get(win->workspace_hook));
-      if (act_layout) {
-        BKE_workspace_active_layout_set(win->workspace_hook, act_layout);
-      }
+      win->workspace_hook->act_layout = newdataadr(fd, win->workspace_hook->act_layout);
     }
   }
 
@@ -8411,9 +8403,7 @@ void blo_lib_link_restore(Main *oldmain,
 
   for (WorkSpace *workspace = newmain->workspaces.first; workspace;
        workspace = workspace->id.next) {
-    ListBase *layouts = BKE_workspace_layouts_get(workspace);
-
-    LISTBASE_FOREACH (WorkSpaceLayout *, layout, layouts) {
+    LISTBASE_FOREACH (WorkSpaceLayout *, layout, &workspace->layouts) {
       lib_link_workspace_layo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list