diff options
author | Bastien Montagne <bastien@blender.org> | 2020-09-30 15:49:42 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2020-10-02 12:47:34 +0300 |
commit | 6219d0d145d3f2e6bd30be1c91e952e18db44e74 (patch) | |
tree | bef402396e0076094364277403922709f8fc60ce /source/blender/makesdna/DNA_workspace_types.h | |
parent | d74d35e39eaf97a63178c84a6c4e9ab4e0bc384c (diff) |
Fix (unreported) design flow in how workspace's relation data are read from .blend file.
Relying on pointer addresses across different data-blocks is extremely
not recommended (and should be strictly forbidden ideally), in
particular in direct_link step of blend file reading.
- It assumes a specific order in reading of data, which is not ensured
in future, and is in any case a very bad, non explicit, hidden
dependency on behaviors of other parts of the codebase.
- It is intrinsically unsafe (as in, it makes writing bad code and making
mistakes easy, see e.g. fix in rB84b3f6e049b35f9).
- It makes advanced handling of data-blocks harder (thinking about
partial undo code e.g., even though in this specific case it was not
an issue as we do not re-read neither windowmanagers nor worspaces
during undo).
New code uses windows' `winid` instead as 'anchor' to find again proper
workspace hook in windows at read time.
As a bonus, it will also cleanup the list of relations from any invalid
ones (afaict it was never done previously).
Differential Revision: https://developer.blender.org/D9073
Diffstat (limited to 'source/blender/makesdna/DNA_workspace_types.h')
-rw-r--r-- | source/blender/makesdna/DNA_workspace_types.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/source/blender/makesdna/DNA_workspace_types.h b/source/blender/makesdna/DNA_workspace_types.h index 170366881c6..b9ca2598ff3 100644 --- a/source/blender/makesdna/DNA_workspace_types.h +++ b/source/blender/makesdna/DNA_workspace_types.h @@ -160,10 +160,15 @@ typedef struct WorkSpaceDataRelation { struct WorkSpaceDataRelation *next, *prev; /** The data used to identify the relation - * (e.g. to find screen-layout (= value) from/for a hook). */ + * (e.g. to find screen-layout (= value) from/for a hook). + * Note: Now runtime only. */ void *parent; /** The value for this parent-data/workspace relation. */ void *value; + + /** Reference to the actual parent window, wmWindow->winid. Used in read/write code. */ + int parentid; + char _pad_0[4]; } WorkSpaceDataRelation; /** |