Blender V5.0
rna_wm.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstdlib>
10
11#include "DNA_scene_types.h"
13
15
16#include "BLT_translation.hh"
17
18#include "BKE_screen.hh"
19
20#include "RNA_define.hh"
21#include "RNA_enum_types.hh"
22
23#include "rna_internal.hh"
24
25#include "WM_api.hh"
26#include "WM_keymap.hh"
27#include "WM_types.hh"
28
29#ifdef RNA_RUNTIME
30
31# include "DNA_userdef_types.h"
32
33# include "BLI_math_vector.h"
34# include "BLI_string.h"
35# include "BLI_string_utf8.h"
36
37# include "BKE_keyconfig.h"
38# include "BKE_main.hh"
39# include "BKE_report.hh"
40# include "BKE_wm_runtime.hh"
41# include "BKE_workspace.hh"
42
43# include "wm_event_system.hh"
44
45static const EnumPropertyItem event_mouse_type_items[] = {
46 {LEFTMOUSE, "LEFTMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Left"), ""},
47 {MIDDLEMOUSE, "MIDDLEMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Middle"), ""},
48 {RIGHTMOUSE, "RIGHTMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Right"), ""},
49 {BUTTON4MOUSE, "BUTTON4MOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button4"), ""},
50 {BUTTON5MOUSE, "BUTTON5MOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button5"), ""},
51 {BUTTON6MOUSE, "BUTTON6MOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button6"), ""},
52 {BUTTON7MOUSE, "BUTTON7MOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button7"), ""},
54 {TABLET_STYLUS, "PEN", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Pen"), ""},
55 {TABLET_ERASER, "ERASER", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Eraser"), ""},
57 {MOUSEMOVE, "MOUSEMOVE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Move"), ""},
58 {MOUSEPAN, "TRACKPADPAN", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Mouse/Trackpad Pan"), ""},
59 {MOUSEZOOM, "TRACKPADZOOM", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Mouse/Trackpad Zoom"), ""},
61 "MOUSEROTATE",
62 0,
63 CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Mouse/Trackpad Rotate"),
64 ""},
66 "MOUSESMARTZOOM",
67 0,
68 CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Mouse/Trackpad Smart Zoom"),
69 ""},
71 {WHEELUPMOUSE, "WHEELUPMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Wheel Up"), ""},
72 {WHEELDOWNMOUSE, "WHEELDOWNMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Wheel Down"), ""},
73 {WHEELINMOUSE, "WHEELINMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Wheel In"), ""},
74 {WHEELOUTMOUSE, "WHEELOUTMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Wheel Out"), ""},
75 {WHEELLEFTMOUSE, "WHEELLEFTMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Wheel Left"), ""},
76 {WHEELRIGHTMOUSE, "WHEELRIGHTMOUSE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Wheel Right"), ""},
77 {0, nullptr, 0, nullptr, nullptr},
78};
79
80static const EnumPropertyItem event_timer_type_items[] = {
81 {TIMER, "TIMER", 0, "Timer", ""},
82 {TIMER0, "TIMER0", 0, "Timer 0", ""},
83 {TIMER1, "TIMER1", 0, "Timer 1", ""},
84 {TIMER2, "TIMER2", 0, "Timer 2", ""},
85 {TIMERJOBS, "TIMER_JOBS", 0, "Timer Jobs", ""},
86 {TIMERAUTOSAVE, "TIMER_AUTOSAVE", 0, "Timer Autosave", ""},
87 {TIMERREPORT, "TIMER_REPORT", 0, "Timer Report", ""},
88 {TIMERREGION, "TIMERREGION", 0, "Timer Region", ""},
89 {0, nullptr, 0, nullptr, nullptr},
90};
91
92static const EnumPropertyItem event_textinput_type_items[] = {
93 {KM_TEXTINPUT, "TEXTINPUT", 0, "Text Input", ""},
94 {0, nullptr, 0, nullptr, nullptr},
95};
96
97static const EnumPropertyItem event_ndof_type_items[] = {
98 {NDOF_MOTION, "NDOF_MOTION", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Motion"), ""},
99 /* buttons on all 3dconnexion devices */
100 {NDOF_BUTTON_MENU, "NDOF_BUTTON_MENU", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Menu"), ""},
101 {NDOF_BUTTON_FIT, "NDOF_BUTTON_FIT", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Fit"), ""},
102 /* view buttons */
103 {NDOF_BUTTON_TOP, "NDOF_BUTTON_TOP", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Top"), ""},
104 {NDOF_BUTTON_BOTTOM, "NDOF_BUTTON_BOTTOM", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Bottom"), ""},
105 {NDOF_BUTTON_LEFT, "NDOF_BUTTON_LEFT", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Left"), ""},
106 {NDOF_BUTTON_RIGHT, "NDOF_BUTTON_RIGHT", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Right"), ""},
107 {NDOF_BUTTON_FRONT, "NDOF_BUTTON_FRONT", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Front"), ""},
108 {NDOF_BUTTON_BACK, "NDOF_BUTTON_BACK", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Back"), ""},
109 /* more views */
111 "NDOF_BUTTON_ISO1",
112 0,
113 CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Isometric 1"),
114 ""},
116 "NDOF_BUTTON_ISO2",
117 0,
118 CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Isometric 2"),
119 ""},
120 /* 90 degree rotations */
122 "NDOF_BUTTON_ROLL_CW",
123 0,
125 ""},
127 "NDOF_BUTTON_ROLL_CCW",
128 0,
130 ""},
132 "NDOF_BUTTON_SPIN_CW",
133 0,
135 ""},
137 "NDOF_BUTTON_SPIN_CCW",
138 0,
140 ""},
142 "NDOF_BUTTON_TILT_CW",
143 0,
145 ""},
147 "NDOF_BUTTON_TILT_CCW",
148 0,
150 ""},
151 /* device control */
152 {NDOF_BUTTON_ROTATE, "NDOF_BUTTON_ROTATE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Rotate"), ""},
154 "NDOF_BUTTON_PANZOOM",
155 0,
157 ""},
159 "NDOF_BUTTON_DOMINANT",
160 0,
162 ""},
163 {NDOF_BUTTON_PLUS, "NDOF_BUTTON_PLUS", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Plus"), ""},
164 {NDOF_BUTTON_MINUS, "NDOF_BUTTON_MINUS", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Minus"), ""},
165 /* View buttons. */
166 {NDOF_BUTTON_V1, "NDOF_BUTTON_V1", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "View 1"), ""},
167 {NDOF_BUTTON_V2, "NDOF_BUTTON_V2", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "View 2"), ""},
168 {NDOF_BUTTON_V3, "NDOF_BUTTON_V3", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "View 3"), ""},
169 /* general-purpose buttons */
170 {NDOF_BUTTON_1, "NDOF_BUTTON_1", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 1"), ""},
171 {NDOF_BUTTON_2, "NDOF_BUTTON_2", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 2"), ""},
172 {NDOF_BUTTON_3, "NDOF_BUTTON_3", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 3"), ""},
173 {NDOF_BUTTON_4, "NDOF_BUTTON_4", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 4"), ""},
174 {NDOF_BUTTON_5, "NDOF_BUTTON_5", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 5"), ""},
175 {NDOF_BUTTON_6, "NDOF_BUTTON_6", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 6"), ""},
176 {NDOF_BUTTON_7, "NDOF_BUTTON_7", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 7"), ""},
177 {NDOF_BUTTON_8, "NDOF_BUTTON_8", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 8"), ""},
178 {NDOF_BUTTON_9, "NDOF_BUTTON_9", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 9"), ""},
179 {NDOF_BUTTON_10, "NDOF_BUTTON_10", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 10"), ""},
180 {NDOF_BUTTON_11, "NDOF_BUTTON_11", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 11"), ""},
181 {NDOF_BUTTON_12, "NDOF_BUTTON_12", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Button 12"), ""},
182# if 0 /* Never used (converted to keyboard events by GHOST). */
183 /* keyboard emulation */
184 {NDOF_BUTTON_ESC, "NDOF_BUTTON_ESC", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Esc")},
185 {NDOF_BUTTON_ENTER, "NDOF_BUTTON_ENTER", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Enter")},
186 {NDOF_BUTTON_DELETE, "NDOF_BUTTON_DELETE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Delete")},
187 {NDOF_BUTTON_TAB, "NDOF_BUTTON_TAB", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Tab")},
188 {NDOF_BUTTON_SPACE, "NDOF_BUTTON_SPACE", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Space")},
189 {NDOF_BUTTON_ALT, "NDOF_BUTTON_ALT", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Alt")},
190 {NDOF_BUTTON_SHIFT, "NDOF_BUTTON_SHIFT", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Shift")},
191 {NDOF_BUTTON_CTRL, "NDOF_BUTTON_CTRL", 0, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Ctrl")},
192# endif
193 {0, nullptr, 0, nullptr, nullptr},
194};
195#endif /* RNA_RUNTIME */
196
207 {WM_JOB_TYPE_RENDER, "RENDER", 0, "Regular rendering", ""},
208 {WM_JOB_TYPE_RENDER_PREVIEW, "RENDER_PREVIEW", 0, "Rendering previews", ""},
209 {WM_JOB_TYPE_OBJECT_BAKE, "OBJECT_BAKE", 0, "Object Baking", ""},
210 {WM_JOB_TYPE_COMPOSITE, "COMPOSITE", 0, "Compositing", ""},
211 {WM_JOB_TYPE_SHADER_COMPILATION, "SHADER_COMPILATION", 0, "Shader compilation", ""},
212 {0, nullptr, 0, nullptr, nullptr},
213};
214
216 /* - Note we abuse 'tooltip' message here to store a 'compact' form of some (too) long names.
217 * - Intentionally excluded: #CAPSLOCKKEY, #UNKNOWNKEY.
218 */
219 {0, "NONE", 0, "", ""},
220 {LEFTMOUSE, "LEFTMOUSE", 0, "Left Mouse", "LMB"},
221 {MIDDLEMOUSE, "MIDDLEMOUSE", 0, "Middle Mouse", "MMB"},
222 {RIGHTMOUSE, "RIGHTMOUSE", 0, "Right Mouse", "RMB"},
223 {BUTTON4MOUSE, "BUTTON4MOUSE", 0, "Button4 Mouse", "MB4"},
224 {BUTTON5MOUSE, "BUTTON5MOUSE", 0, "Button5 Mouse", "MB5"},
225 {BUTTON6MOUSE, "BUTTON6MOUSE", 0, "Button6 Mouse", "MB6"},
226 {BUTTON7MOUSE, "BUTTON7MOUSE", 0, "Button7 Mouse", "MB7"},
228 {TABLET_STYLUS, "PEN", 0, "Pen", ""},
229 {TABLET_ERASER, "ERASER", 0, "Eraser", ""},
231 {MOUSEMOVE, "MOUSEMOVE", 0, "Mouse Move", "MsMov"},
232 {INBETWEEN_MOUSEMOVE, "INBETWEEN_MOUSEMOVE", 0, "In-between Move", "MsSubMov"},
233 {MOUSEPAN, "TRACKPADPAN", 0, "Mouse/Trackpad Pan", "MsPan"},
234 {MOUSEZOOM, "TRACKPADZOOM", 0, "Mouse/Trackpad Zoom", "MsZoom"},
235 {MOUSEROTATE, "MOUSEROTATE", 0, "Mouse/Trackpad Rotate", "MsRot"},
236 {MOUSESMARTZOOM, "MOUSESMARTZOOM", 0, "Mouse/Trackpad Smart Zoom", "MsSmartZoom"},
238 {WHEELUPMOUSE, "WHEELUPMOUSE", 0, "Wheel Up", "WhUp"},
239 {WHEELDOWNMOUSE, "WHEELDOWNMOUSE", 0, "Wheel Down", "WhDown"},
240 {WHEELINMOUSE, "WHEELINMOUSE", 0, "Wheel In", "WhIn"},
241 {WHEELOUTMOUSE, "WHEELOUTMOUSE", 0, "Wheel Out", "WhOut"},
242 {WHEELLEFTMOUSE, "WHEELLEFTMOUSE", 0, "Wheel Left", "WhLeft"},
243 {WHEELRIGHTMOUSE, "WHEELRIGHTMOUSE", 0, "Wheel Right", "WhRight"},
245 {EVT_AKEY, "A", 0, "A", ""},
246 {EVT_BKEY, "B", 0, "B", ""},
247 {EVT_CKEY, "C", 0, "C", ""},
248 {EVT_DKEY, "D", 0, "D", ""},
249 {EVT_EKEY, "E", 0, "E", ""},
250 {EVT_FKEY, "F", 0, "F", ""},
251 {EVT_GKEY, "G", 0, "G", ""},
252 {EVT_HKEY, "H", 0, "H", ""},
253 {EVT_IKEY, "I", 0, "I", ""},
254 {EVT_JKEY, "J", 0, "J", ""},
255 {EVT_KKEY, "K", 0, "K", ""},
256 {EVT_LKEY, "L", 0, "L", ""},
257 {EVT_MKEY, "M", 0, "M", ""},
258 {EVT_NKEY, "N", 0, "N", ""},
259 {EVT_OKEY, "O", 0, "O", ""},
260 {EVT_PKEY, "P", 0, "P", ""},
261 {EVT_QKEY, "Q", 0, "Q", ""},
262 {EVT_RKEY, "R", 0, "R", ""},
263 {EVT_SKEY, "S", 0, "S", ""},
264 {EVT_TKEY, "T", 0, "T", ""},
265 {EVT_UKEY, "U", 0, "U", ""},
266 {EVT_VKEY, "V", 0, "V", ""},
267 {EVT_WKEY, "W", 0, "W", ""},
268 {EVT_XKEY, "X", 0, "X", ""},
269 {EVT_YKEY, "Y", 0, "Y", ""},
270 {EVT_ZKEY, "Z", 0, "Z", ""},
272 {EVT_ZEROKEY, "ZERO", 0, "0", ""},
273 {EVT_ONEKEY, "ONE", 0, "1", ""},
274 {EVT_TWOKEY, "TWO", 0, "2", ""},
275 {EVT_THREEKEY, "THREE", 0, "3", ""},
276 {EVT_FOURKEY, "FOUR", 0, "4", ""},
277 {EVT_FIVEKEY, "FIVE", 0, "5", ""},
278 {EVT_SIXKEY, "SIX", 0, "6", ""},
279 {EVT_SEVENKEY, "SEVEN", 0, "7", ""},
280 {EVT_EIGHTKEY, "EIGHT", 0, "8", ""},
281 {EVT_NINEKEY, "NINE", 0, "9", ""},
283 {EVT_LEFTCTRLKEY, "LEFT_CTRL", 0, "Left Ctrl", "CtrlL"},
284 {EVT_LEFTALTKEY, "LEFT_ALT", 0, "Left Alt", "AltL"},
285 {EVT_LEFTSHIFTKEY, "LEFT_SHIFT", 0, "Left Shift", "ShiftL"},
286 {EVT_RIGHTALTKEY, "RIGHT_ALT", 0, "Right Alt", "AltR"},
287 {EVT_RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Right Ctrl", "CtrlR"},
288 {EVT_RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Right Shift", "ShiftR"},
290 {EVT_OSKEY, "OSKEY", 0, "OS Key", "Cmd"},
291 {EVT_HYPER, "HYPER", 0, "Hyper", "Hyp"},
292 {EVT_APPKEY, "APP", 0, "Application", "App"},
293 {EVT_GRLESSKEY, "GRLESS", 0, "Grless", ""},
294 {EVT_ESCKEY, "ESC", 0, "Esc", ""},
295 {EVT_TABKEY, "TAB", 0, "Tab", ""},
296 {EVT_RETKEY, "RET", 0, "Return", "Enter"},
297 {EVT_SPACEKEY, "SPACE", 0, "Space Bar", "Spacebar"},
298 {EVT_LINEFEEDKEY, "LINE_FEED", 0, "Line Feed", ""},
299 {EVT_BACKSPACEKEY, "BACK_SPACE", 0, "Backspace", "BkSpace"},
300 {EVT_DELKEY, "DEL", 0, "Delete", "Del"},
301 {EVT_SEMICOLONKEY, "SEMI_COLON", 0, ";", ""},
302 {EVT_PERIODKEY, "PERIOD", 0, ".", ""},
303 {EVT_COMMAKEY, "COMMA", 0, ",", ""},
304 {EVT_QUOTEKEY, "QUOTE", 0, "\"", ""},
305 {EVT_ACCENTGRAVEKEY, "ACCENT_GRAVE", 0, "`", ""},
306 {EVT_MINUSKEY, "MINUS", 0, "-", ""},
307 {EVT_PLUSKEY, "PLUS", 0, "+", ""},
308 {EVT_SLASHKEY, "SLASH", 0, "/", ""},
309 {EVT_BACKSLASHKEY, "BACK_SLASH", 0, "\\", ""},
310 {EVT_EQUALKEY, "EQUAL", 0, "=", ""},
311 {EVT_LEFTBRACKETKEY, "LEFT_BRACKET", 0, "[", ""},
312 {EVT_RIGHTBRACKETKEY, "RIGHT_BRACKET", 0, "]", ""},
313 {EVT_LEFTARROWKEY, "LEFT_ARROW", 0, "Left Arrow", BLI_STR_UTF8_LEFTWARDS_ARROW},
314 {EVT_DOWNARROWKEY, "DOWN_ARROW", 0, "Down Arrow", BLI_STR_UTF8_DOWNWARDS_ARROW},
315 {EVT_RIGHTARROWKEY, "RIGHT_ARROW", 0, "Right Arrow", BLI_STR_UTF8_RIGHTWARDS_ARROW},
316 {EVT_UPARROWKEY, "UP_ARROW", 0, "Up Arrow", BLI_STR_UTF8_UPWARDS_ARROW},
317 {EVT_PAD2, "NUMPAD_2", 0, "Numpad 2", "Pad2"},
318 {EVT_PAD4, "NUMPAD_4", 0, "Numpad 4", "Pad4"},
319 {EVT_PAD6, "NUMPAD_6", 0, "Numpad 6", "Pad6"},
320 {EVT_PAD8, "NUMPAD_8", 0, "Numpad 8", "Pad8"},
321 {EVT_PAD1, "NUMPAD_1", 0, "Numpad 1", "Pad1"},
322 {EVT_PAD3, "NUMPAD_3", 0, "Numpad 3", "Pad3"},
323 {EVT_PAD5, "NUMPAD_5", 0, "Numpad 5", "Pad5"},
324 {EVT_PAD7, "NUMPAD_7", 0, "Numpad 7", "Pad7"},
325 {EVT_PAD9, "NUMPAD_9", 0, "Numpad 9", "Pad9"},
326 {EVT_PADPERIOD, "NUMPAD_PERIOD", 0, "Numpad .", "Pad."},
327 {EVT_PADSLASHKEY, "NUMPAD_SLASH", 0, "Numpad /", "Pad/"},
328 {EVT_PADASTERKEY, "NUMPAD_ASTERIX", 0, "Numpad *", "Pad*"},
329 {EVT_PAD0, "NUMPAD_0", 0, "Numpad 0", "Pad0"},
330 {EVT_PADMINUS, "NUMPAD_MINUS", 0, "Numpad -", "Pad-"},
331 {EVT_PADENTER, "NUMPAD_ENTER", 0, "Numpad Enter", "PadEnter"},
332 {EVT_PADPLUSKEY, "NUMPAD_PLUS", 0, "Numpad +", "Pad+"},
333 {EVT_F1KEY, "F1", 0, "F1", ""},
334 {EVT_F2KEY, "F2", 0, "F2", ""},
335 {EVT_F3KEY, "F3", 0, "F3", ""},
336 {EVT_F4KEY, "F4", 0, "F4", ""},
337 {EVT_F5KEY, "F5", 0, "F5", ""},
338 {EVT_F6KEY, "F6", 0, "F6", ""},
339 {EVT_F7KEY, "F7", 0, "F7", ""},
340 {EVT_F8KEY, "F8", 0, "F8", ""},
341 {EVT_F9KEY, "F9", 0, "F9", ""},
342 {EVT_F10KEY, "F10", 0, "F10", ""},
343 {EVT_F11KEY, "F11", 0, "F11", ""},
344 {EVT_F12KEY, "F12", 0, "F12", ""},
345 {EVT_F13KEY, "F13", 0, "F13", ""},
346 {EVT_F14KEY, "F14", 0, "F14", ""},
347 {EVT_F15KEY, "F15", 0, "F15", ""},
348 {EVT_F16KEY, "F16", 0, "F16", ""},
349 {EVT_F17KEY, "F17", 0, "F17", ""},
350 {EVT_F18KEY, "F18", 0, "F18", ""},
351 {EVT_F19KEY, "F19", 0, "F19", ""},
352 {EVT_F20KEY, "F20", 0, "F20", ""},
353 {EVT_F21KEY, "F21", 0, "F21", ""},
354 {EVT_F22KEY, "F22", 0, "F22", ""},
355 {EVT_F23KEY, "F23", 0, "F23", ""},
356 {EVT_F24KEY, "F24", 0, "F24", ""},
357 {EVT_PAUSEKEY, "PAUSE", 0, "Pause", ""},
358 {EVT_INSERTKEY, "INSERT", 0, "Insert", "Ins"},
359 {EVT_HOMEKEY, "HOME", 0, "Home", ""},
360 {EVT_PAGEUPKEY, "PAGE_UP", 0, "Page Up", "PgUp"},
361 {EVT_PAGEDOWNKEY, "PAGE_DOWN", 0, "Page Down", "PgDown"},
362 {EVT_ENDKEY, "END", 0, "End", ""},
365 "MEDIA_PLAY",
366 0,
367 "Media Play/Pause",
369 {EVT_MEDIASTOP, "MEDIA_STOP", 0, "Media Stop", BLI_STR_UTF8_BLACK_SQUARE_FOR_STOP},
371 "MEDIA_FIRST",
372 0,
373 "Media First",
376 "MEDIA_LAST",
377 0,
378 "Media Last",
381 {KM_TEXTINPUT, "TEXTINPUT", 0, "Text Input", "TxtIn"},
383 {WINDEACTIVATE, "WINDOW_DEACTIVATE", 0, "Window Deactivate", ""},
384 {TIMER, "TIMER", 0, "Timer", "Tmr"},
385 {TIMER0, "TIMER0", 0, "Timer 0", "Tmr0"},
386 {TIMER1, "TIMER1", 0, "Timer 1", "Tmr1"},
387 {TIMER2, "TIMER2", 0, "Timer 2", "Tmr2"},
388 {TIMERJOBS, "TIMER_JOBS", 0, "Timer Jobs", "TmrJob"},
389 {TIMERAUTOSAVE, "TIMER_AUTOSAVE", 0, "Timer Autosave", "TmrSave"},
390 {TIMERREPORT, "TIMER_REPORT", 0, "Timer Report", "TmrReport"},
391 {TIMERREGION, "TIMERREGION", 0, "Timer Region", "TmrReg"},
393 {NDOF_MOTION, "NDOF_MOTION", 0, "NDOF Motion", "NdofMov"},
394 /* buttons on all 3dconnexion devices */
395 {NDOF_BUTTON_MENU, "NDOF_BUTTON_MENU", 0, "NDOF Menu", "NdofMenu"},
396 {NDOF_BUTTON_FIT, "NDOF_BUTTON_FIT", 0, "NDOF Fit", "NdofFit"},
397 /* view buttons */
398 {NDOF_BUTTON_TOP, "NDOF_BUTTON_TOP", 0, "NDOF Top", "Ndof" BLI_STR_UTF8_UPWARDS_ARROW},
400 "NDOF_BUTTON_BOTTOM",
401 0,
402 "NDOF Bottom",
404 {NDOF_BUTTON_LEFT, "NDOF_BUTTON_LEFT", 0, "NDOF Left", "Ndof" BLI_STR_UTF8_LEFTWARDS_ARROW},
406 "NDOF_BUTTON_RIGHT",
407 0,
408 "NDOF Right",
410 {NDOF_BUTTON_FRONT, "NDOF_BUTTON_FRONT", 0, "NDOF Front", "NdofFront"},
411 {NDOF_BUTTON_BACK, "NDOF_BUTTON_BACK", 0, "NDOF Back", "NdofBack"},
412 /* more views */
413 {NDOF_BUTTON_ISO1, "NDOF_BUTTON_ISO1", 0, "NDOF Isometric 1", "NdofIso1"},
414 {NDOF_BUTTON_ISO2, "NDOF_BUTTON_ISO2", 0, "NDOF Isometric 2", "NdofIso2"},
415 /* 90 degree rotations */
416 {NDOF_BUTTON_ROLL_CW, "NDOF_BUTTON_ROLL_CW", 0, "NDOF Roll CW", "NdofRCW"},
417 {NDOF_BUTTON_ROLL_CCW, "NDOF_BUTTON_ROLL_CCW", 0, "NDOF Roll CCW", "NdofRCCW"},
418 {NDOF_BUTTON_SPIN_CW, "NDOF_BUTTON_SPIN_CW", 0, "NDOF Spin CW", "NdofSCW"},
419 {NDOF_BUTTON_SPIN_CCW, "NDOF_BUTTON_SPIN_CCW", 0, "NDOF Spin CCW", "NdofSCCW"},
420 {NDOF_BUTTON_TILT_CW, "NDOF_BUTTON_TILT_CW", 0, "NDOF Tilt CW", "NdofTCW"},
421 {NDOF_BUTTON_TILT_CCW, "NDOF_BUTTON_TILT_CCW", 0, "NDOF Tilt CCW", "NdofTCCW"},
422 /* device control */
423 {NDOF_BUTTON_ROTATE, "NDOF_BUTTON_ROTATE", 0, "NDOF Rotate", "NdofRot"},
424 {NDOF_BUTTON_PANZOOM, "NDOF_BUTTON_PANZOOM", 0, "NDOF Pan/Zoom", "NdofPanZoom"},
425 {NDOF_BUTTON_DOMINANT, "NDOF_BUTTON_DOMINANT", 0, "NDOF Dominant", "NdofDom"},
426 {NDOF_BUTTON_PLUS, "NDOF_BUTTON_PLUS", 0, "NDOF Plus", "Ndof+"},
427 {NDOF_BUTTON_MINUS, "NDOF_BUTTON_MINUS", 0, "NDOF Minus", "Ndof-"},
428#if 0 /* Never used (converted to keyboard events by GHOST). */
429 /* keyboard emulation */
430 {NDOF_BUTTON_ESC, "NDOF_BUTTON_ESC", 0, "NDOF Esc", "NdofEsc"},
431 {NDOF_BUTTON_ALT, "NDOF_BUTTON_ALT", 0, "NDOF Alt", "NdofAlt"},
432 {NDOF_BUTTON_SHIFT, "NDOF_BUTTON_SHIFT", 0, "NDOF Shift", "NdofShift"},
433 {NDOF_BUTTON_CTRL, "NDOF_BUTTON_CTRL", 0, "NDOF Ctrl", "NdofCtrl"},
434#endif
435 /* View buttons. */
436 {NDOF_BUTTON_V1, "NDOF_BUTTON_V1", 0, "NDOF View 1", "NdofView1"},
437 {NDOF_BUTTON_V2, "NDOF_BUTTON_V2", 0, "NDOF View 2", "NdofView2"},
438 {NDOF_BUTTON_V3, "NDOF_BUTTON_V3", 0, "NDOF View 3", "NdofView3"},
439 {NDOF_BUTTON_SAVE_V1, "NDOF_BUTTON_SAVE_V1", 0, "NDOF Save View 1", "NdofSaveView1"},
440 {NDOF_BUTTON_SAVE_V2, "NDOF_BUTTON_SAVE_V2", 0, "NDOF Save View 2", "NdofSaveView2"},
441 {NDOF_BUTTON_SAVE_V3, "NDOF_BUTTON_SAVE_V3", 0, "NDOF Save View 3", "NdofSaveView3"},
442 /* general-purpose buttons */
443 {NDOF_BUTTON_1, "NDOF_BUTTON_1", 0, "NDOF Button 1", "NdofB1"},
444 {NDOF_BUTTON_2, "NDOF_BUTTON_2", 0, "NDOF Button 2", "NdofB2"},
445 {NDOF_BUTTON_3, "NDOF_BUTTON_3", 0, "NDOF Button 3", "NdofB3"},
446 {NDOF_BUTTON_4, "NDOF_BUTTON_4", 0, "NDOF Button 4", "NdofB4"},
447 {NDOF_BUTTON_5, "NDOF_BUTTON_5", 0, "NDOF Button 5", "NdofB5"},
448 {NDOF_BUTTON_6, "NDOF_BUTTON_6", 0, "NDOF Button 6", "NdofB6"},
449 {NDOF_BUTTON_7, "NDOF_BUTTON_7", 0, "NDOF Button 7", "NdofB7"},
450 {NDOF_BUTTON_8, "NDOF_BUTTON_8", 0, "NDOF Button 8", "NdofB8"},
451 {NDOF_BUTTON_9, "NDOF_BUTTON_9", 0, "NDOF Button 9", "NdofB9"},
452 {NDOF_BUTTON_10, "NDOF_BUTTON_10", 0, "NDOF Button 10", "NdofB10"},
453 {NDOF_BUTTON_11, "NDOF_BUTTON_11", 0, "NDOF Button 11", "NdofB11"},
454 {NDOF_BUTTON_12, "NDOF_BUTTON_12", 0, "NDOF Button 12", "NdofB12"},
455
456 /* Action Zones. */
457 {EVT_ACTIONZONE_AREA, "ACTIONZONE_AREA", 0, "ActionZone Area", "AZone Area"},
458 {EVT_ACTIONZONE_REGION, "ACTIONZONE_REGION", 0, "ActionZone Region", "AZone Region"},
460 "ACTIONZONE_FULLSCREEN",
461 0,
462 "ActionZone Fullscreen",
463 "AZone FullScr"},
464 /* xr */
465 {EVT_XR_ACTION, "XR_ACTION", 0, "XR Action", ""},
466 {0, nullptr, 0, nullptr, nullptr},
467};
468
478 {KM_ANY, "ANY", 0, "Any", ""},
479 {KM_PRESS, "PRESS", 0, "Press", ""},
480 {KM_RELEASE, "RELEASE", 0, "Release", ""},
481 {KM_CLICK, "CLICK", 0, "Click", ""},
482 {KM_DBL_CLICK, "DOUBLE_CLICK", 0, "Double Click", ""},
483 {KM_PRESS_DRAG, "CLICK_DRAG", 0, "Drag", ""},
484 /* Used for NDOF and trackpad events. */
485 {KM_NOTHING, "NOTHING", 0, "Nothing", ""},
486 {0, nullptr, 0, nullptr, nullptr},
487};
488
490 {KM_ANY, "ANY", 0, "Any", ""},
491 {KM_DIRECTION_N, "NORTH", 0, "North", ""},
492 {KM_DIRECTION_NE, "NORTH_EAST", 0, "North-East", ""},
493 {KM_DIRECTION_E, "EAST", 0, "East", ""},
494 {KM_DIRECTION_SE, "SOUTH_EAST", 0, "South-East", ""},
495 {KM_DIRECTION_S, "SOUTH", 0, "South", ""},
496 {KM_DIRECTION_SW, "SOUTH_WEST", 0, "South-West", ""},
497 {KM_DIRECTION_W, "WEST", 0, "West", ""},
498 {KM_DIRECTION_NW, "NORTH_WEST", 0, "North-West", ""},
499 {0, nullptr, 0, nullptr, nullptr},
500};
501
506 {P_STARTING, "STARTING", 0, "Starting", ""},
507 {P_IN_PROGRESS, "IN_PROGRESS", 0, "In progress", ""},
508 {P_FINISHING, "FINISHING", 0, "Finishing", ""},
509 {0, nullptr, 0, nullptr, nullptr},
510};
511
513 {0, "NONE", 0, "", ""},
514 {0, nullptr, 0, nullptr, nullptr},
515};
516
517/* Mask event types used in keymap items. */
519 {EVT_TYPE_MASK_KEYBOARD_MODIFIER, "KEYBOARD_MODIFIER", 0, "Keyboard Modifier", ""},
520 {EVT_TYPE_MASK_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""},
521 {EVT_TYPE_MASK_MOUSE_WHEEL, "MOUSE_WHEEL", 0, "Mouse Wheel", ""},
522 {EVT_TYPE_MASK_MOUSE_GESTURE, "MOUSE_GESTURE", 0, "Mouse Gesture", ""},
523 {EVT_TYPE_MASK_MOUSE_BUTTON, "MOUSE_BUTTON", 0, "Mouse Button", ""},
524 {EVT_TYPE_MASK_MOUSE, "MOUSE", 0, "Mouse", ""},
525 {EVT_TYPE_MASK_NDOF, "NDOF", 0, "NDOF", ""},
526 {EVT_TYPE_MASK_ACTIONZONE, "ACTIONZONE", 0, "Action Zone", ""},
527 {0, nullptr, 0, nullptr, nullptr},
528};
529
530#if 0
531static const EnumPropertyItem keymap_modifiers_items[] = {
532 {KM_ANY, "ANY", 0, "Any", ""},
533 {0, "NONE", 0, "None", ""},
534 {KM_MOD_HELD, "HELD", 0, "Held", ""},
535 {0, nullptr, 0, nullptr, nullptr},
536};
537#endif
538
541 "REGISTER",
542 0,
543 "Register",
544 "Display in the info window and support the redo toolbar panel"},
546 "UNDO",
547 0,
548 "Undo",
549 "Push an undo event when the operator returns `FINISHED` (needed for operator redo, "
550 "mandatory if the operator modifies Blender data)"},
552 "UNDO_GROUPED",
553 0,
554 "Grouped Undo",
555 "Push a single undo event for repeated instances of this operator"},
556 {OPTYPE_BLOCKING, "BLOCKING", 0, "Blocking", "Block anything else from using the cursor"},
557 {OPTYPE_MACRO, "MACRO", 0, "Macro", "Use to check if an operator is a macro"},
559 "GRAB_CURSOR",
560 0,
561 "Grab Pointer",
562 "Use so the operator grabs the mouse focus, enables wrapping when continuous grab "
563 "is enabled"},
564 {OPTYPE_GRAB_CURSOR_X, "GRAB_CURSOR_X", 0, "Grab Pointer X", "Grab, only warping the X axis"},
565 {OPTYPE_GRAB_CURSOR_Y, "GRAB_CURSOR_Y", 0, "Grab Pointer Y", "Grab, only warping the Y axis"},
567 "DEPENDS_ON_CURSOR",
568 0,
569 "Depends on Cursor",
570 "The initial cursor location is used, "
571 "when running from a menus or buttons the user is prompted to place the cursor "
572 "before beginning the operation"},
573 {OPTYPE_PRESET, "PRESET", 0, "Preset", "Display a preset button with the operators settings"},
574 {OPTYPE_INTERNAL, "INTERNAL", 0, "Internal", "Removes the operator from search results"},
576 "MODAL_PRIORITY",
577 0,
578 "Modal Priority",
579 "Handle events before other modal operators without this option. Use with caution, do not "
580 "modify data that other modal operators assume is unchanged during their operation."},
581 {0, nullptr, 0, nullptr, nullptr},
582};
583
586 "RUNNING_MODAL",
587 0,
588 "Running Modal",
589 "Keep the operator running with blender"},
591 "CANCELLED",
592 0,
593 "Cancelled",
594 "The operator exited without doing anything, so no undo entry should be pushed"},
596 "FINISHED",
597 0,
598 "Finished",
599 "The operator exited after completing its action"},
600 /* used as a flag */
601 {OPERATOR_PASS_THROUGH, "PASS_THROUGH", 0, "Pass Through", "Do nothing and pass the event on"},
602 {OPERATOR_INTERFACE, "INTERFACE", 0, "Interface", "Handled but not executed (popup menus)"},
603 {0, nullptr, 0, nullptr, nullptr},
604};
605
608 "ADVANCED",
609 0,
610 "Advanced",
611 "The property is advanced so UI is suggested to hide it"},
612 {0, nullptr, 0, nullptr, nullptr},
613};
614
615/* flag/enum */
617 {RPT_DEBUG, "DEBUG", 0, "Debug", ""},
618 {RPT_INFO, "INFO", 0, "Info", ""},
619 {RPT_OPERATOR, "OPERATOR", 0, "Operator", ""},
620 {RPT_PROPERTY, "PROPERTY", 0, "Property", ""},
621 {RPT_WARNING, "WARNING", 0, "Warning", ""},
622 {RPT_ERROR, "ERROR", 0, "Error", ""},
623 {RPT_ERROR_INVALID_INPUT, "ERROR_INVALID_INPUT", 0, "Invalid Input", ""},
624 {RPT_ERROR_INVALID_CONTEXT, "ERROR_INVALID_CONTEXT", 0, "Invalid Context", ""},
625 {RPT_ERROR_OUT_OF_MEMORY, "ERROR_OUT_OF_MEMORY", 0, "Out of Memory", ""},
626 {0, nullptr, 0, nullptr, nullptr},
627};
628
629#ifdef RNA_RUNTIME
630
631# include "BLI_string_utils.hh"
632
633# include "WM_api.hh"
634
635# include "DNA_ID.h"
636# include "DNA_workspace_types.h"
637
638# include "BKE_global.hh"
639
640# include "ED_screen.hh"
641
642# include "UI_interface.hh"
643
644# include "MEM_guardedalloc.h"
645
646# ifdef WITH_PYTHON
647# include "BPY_extern.hh"
648# endif
649
650static wmOperator *rna_OperatorProperties_find_operator(PointerRNA *ptr)
651{
652 if (ptr->owner_id == nullptr || GS(ptr->owner_id->name) != ID_WM) {
653 return nullptr;
654 }
655
656 wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
657
658 IDProperty *properties = (IDProperty *)ptr->data;
659 for (wmOperator *op = static_cast<wmOperator *>(wm->runtime->operators.last); op; op = op->prev)
660 {
661 if (op->properties == properties) {
662 return op;
663 }
664 }
665
666 return nullptr;
667}
668
669static StructRNA *rna_OperatorProperties_refine(PointerRNA *ptr)
670{
671 wmOperator *op = rna_OperatorProperties_find_operator(ptr);
672
673 if (op) {
674 return op->type->srna;
675 }
676 else {
677 return ptr->type;
678 }
679}
680
681static IDProperty **rna_OperatorProperties_idprops(PointerRNA *ptr)
682{
683 return (IDProperty **)&ptr->data;
684}
685
686static void rna_Operator_name_get(PointerRNA *ptr, char *value)
687{
688 wmOperator *op = (wmOperator *)ptr->data;
689 strcpy(value, op->type->name);
690}
691
692static int rna_Operator_name_length(PointerRNA *ptr)
693{
694 wmOperator *op = (wmOperator *)ptr->data;
695 return strlen(op->type->name);
696}
697
698static bool rna_Operator_has_reports_get(PointerRNA *ptr)
699{
700 wmOperator *op = (wmOperator *)ptr->data;
701 return (op->reports && op->reports->list.first);
702}
703
704static PointerRNA rna_Operator_layout_get(PointerRNA *ptr)
705{
706 /* Operator owner is not inherited, layout is owned by WM. */
707 wmOperator *op = (wmOperator *)ptr->data;
708 return RNA_pointer_create_discrete(nullptr, &RNA_UILayout, op->layout);
709}
710
711static PointerRNA rna_Operator_options_get(PointerRNA *ptr)
712{
713 return RNA_pointer_create_with_parent(*ptr, &RNA_OperatorOptions, ptr->data);
714}
715
716static PointerRNA rna_Operator_properties_get(PointerRNA *ptr)
717{
718 wmOperator *op = (wmOperator *)ptr->data;
719
722 result.owner_id = (ptr->owner_id) ? ptr->owner_id : result.owner_id;
723 result.data = op->properties;
724 return result;
725}
726
727static PointerRNA rna_OperatorMacro_properties_get(PointerRNA *ptr)
728{
729 wmOperatorTypeMacro *otmacro = (wmOperatorTypeMacro *)ptr->data;
730 wmOperatorType *ot = WM_operatortype_find(otmacro->idname, true);
731
734 result.owner_id = (ptr->owner_id) ? ptr->owner_id : result.owner_id;
735 result.data = otmacro->properties;
736 return result;
737}
738
739static void rna_Event_ascii_get(PointerRNA *ptr, char *value)
740{
741 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
742 value[0] = WM_event_utf8_to_ascii(event);
743 value[1] = '\0';
744}
745
746static int rna_Event_ascii_length(PointerRNA *ptr)
747{
748 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
749 return WM_event_utf8_to_ascii(event) ? 1 : 0;
750}
751
752static void rna_Event_unicode_get(PointerRNA *ptr, char *value)
753{
754 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
755 size_t len = 0;
756
757 if (event->utf8_buf[0]) {
758 if (BLI_str_utf8_as_unicode_step_or_error(event->utf8_buf, sizeof(event->utf8_buf), &len) !=
760 memcpy(value, event->utf8_buf, len);
761 }
762
763 value[len] = '\0';
764}
765
766static int rna_Event_unicode_length(PointerRNA *ptr)
767{
768 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
769 int len = 0;
770 if (event->utf8_buf[0]) {
771 len = BLI_str_utf8_size_or_error(event->utf8_buf);
772 if (len == -1) {
773 /* Even though this is documented as always being a valid UTF8 sequence,
774 * assert instead of returning a negative length if it is. */
776 len = 0;
777 }
778 }
779 return len;
780}
781
782static bool rna_Event_is_repeat_get(PointerRNA *ptr)
783{
784 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
785 return (event->flag & WM_EVENT_IS_REPEAT) != 0;
786}
787
788static bool rna_Event_is_consecutive_get(PointerRNA *ptr)
789{
790 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
791 return (event->flag & WM_EVENT_IS_CONSECUTIVE) != 0;
792}
793
794static float rna_Event_pressure_get(PointerRNA *ptr)
795{
796 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
797 return WM_event_tablet_data(event, nullptr, nullptr);
798}
799
800static bool rna_Event_is_tablet_get(PointerRNA *ptr)
801{
802 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
803 return WM_event_is_tablet(event);
804}
805
806static void rna_Event_tilt_get(PointerRNA *ptr, float *values)
807{
808 wmEvent *event = static_cast<wmEvent *>(ptr->data);
809 WM_event_tablet_data(event, nullptr, values);
810}
811
812static void rna_NDOFMotionEventData_translation_get(PointerRNA *ptr, float *values)
813{
814# ifdef WITH_INPUT_NDOF
815 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
816 copy_v3_v3(values, WM_event_ndof_translation_get(ndof));
817# else
819 ARRAY_SET_ITEMS(values, 0, 0, 0);
820# endif
821}
822
823static void rna_NDOFMotionEventData_rotation_get(PointerRNA *ptr, float *values)
824{
825# ifdef WITH_INPUT_NDOF
826 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
827 copy_v3_v3(values, WM_event_ndof_rotation_get(ndof));
828# else
830 ARRAY_SET_ITEMS(values, 0, 0, 0);
831# endif
832}
833
834static float rna_NDOFMotionEventData_time_delta_get(PointerRNA *ptr)
835{
836# ifdef WITH_INPUT_NDOF
837 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
838 return ndof.time_delta;
839# else
841 return 0.0f;
842# endif
843}
844
845static int rna_NDOFMotionEventData_progress_get(PointerRNA *ptr)
846{
847# ifdef WITH_INPUT_NDOF
848 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
849 return int(ndof.progress);
850# else
852 return 0;
853# endif
854}
855
856static PointerRNA rna_Event_ndof_motion_get(PointerRNA *ptr)
857{
858# ifdef WITH_INPUT_NDOF
859 wmEvent *event = static_cast<wmEvent *>(ptr->data);
860 if (event->custom == EVT_DATA_NDOF_MOTION) {
861 wmNDOFMotionData *ndof = static_cast<wmNDOFMotionData *>(event->customdata);
862 return RNA_pointer_create_with_parent(*ptr, &RNA_NDOFMotionEventData, ndof);
863 }
864# else
866# endif
867 return PointerRNA_NULL;
868}
869
870static PointerRNA rna_Event_xr_get(PointerRNA *ptr)
871{
872# ifdef WITH_XR_OPENXR
873 wmEvent *event = static_cast<wmEvent *>(ptr->data);
874 wmXrActionData *actiondata = static_cast<wmXrActionData *>(
875 WM_event_is_xr(event) ? event->customdata : nullptr);
876 return RNA_pointer_create_with_parent(*ptr, &RNA_XrEventData, actiondata);
877# else
879 return PointerRNA_NULL;
880# endif
881}
882
883static PointerRNA rna_PopupMenu_layout_get(PointerRNA *ptr)
884{
885 uiPopupMenu *pup = static_cast<uiPopupMenu *>(ptr->data);
886 uiLayout *layout = UI_popup_menu_layout(pup);
887
888 PointerRNA rptr = RNA_pointer_create_discrete(ptr->owner_id, &RNA_UILayout, layout);
889 return rptr;
890}
891
892static PointerRNA rna_PopoverMenu_layout_get(PointerRNA *ptr)
893{
894 uiPopover *pup = static_cast<uiPopover *>(ptr->data);
895 uiLayout *layout = UI_popover_layout(pup);
896
897 PointerRNA rptr = RNA_pointer_create_discrete(ptr->owner_id, &RNA_UILayout, layout);
898 return rptr;
899}
900
901static PointerRNA rna_PieMenu_layout_get(PointerRNA *ptr)
902{
903 uiPieMenu *pie = static_cast<uiPieMenu *>(ptr->data);
904 uiLayout *layout = UI_pie_menu_layout(pie);
905
906 PointerRNA rptr = RNA_pointer_create_discrete(ptr->owner_id, &RNA_UILayout, layout);
907 return rptr;
908}
909
910static void rna_Window_scene_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
911{
912 wmWindow *win = static_cast<wmWindow *>(ptr->data);
913
914 if (value.data == nullptr) {
915 return;
916 }
917
918 win->new_scene = static_cast<Scene *>(value.data);
919}
920
921static void rna_Window_scene_update(bContext *C, PointerRNA *ptr)
922{
923 Main *bmain = CTX_data_main(C);
924 wmWindow *win = static_cast<wmWindow *>(ptr->data);
925
926 /* Exception: must use context so notifier gets to the right window. */
927 if (win->new_scene) {
928# ifdef WITH_PYTHON
930# endif
931
932 WM_window_set_active_scene(bmain, C, win, win->new_scene);
933
934# ifdef WITH_PYTHON
936# endif
937
940
941 if (G.debug & G_DEBUG) {
942 printf("scene set %p\n", win->new_scene);
943 }
944
945 win->new_scene = nullptr;
946 }
947}
948
949static PointerRNA rna_Window_workspace_get(PointerRNA *ptr)
950{
951 wmWindow *win = static_cast<wmWindow *>(ptr->data);
953 reinterpret_cast<ID *>(BKE_workspace_active_get(win->workspace_hook)));
954}
955
956static void rna_Window_workspace_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
957{
958 wmWindow *win = (wmWindow *)ptr->data;
959
960 /* disallow ID-browsing away from temp screens */
961 if (WM_window_is_temp_screen(win)) {
962 return;
963 }
964 if (value.data == nullptr) {
965 return;
966 }
967
968 /* exception: can't set workspaces inside of area/region handlers */
969 win->workspace_hook->temp_workspace_store = static_cast<WorkSpace *>(value.data);
970}
971
972static void rna_Window_workspace_update(bContext *C, PointerRNA *ptr)
973{
974 wmWindow *win = static_cast<wmWindow *>(ptr->data);
975 WorkSpace *new_workspace = win->workspace_hook->temp_workspace_store;
976
977 /* exception: can't set screens inside of area/region handlers,
978 * and must use context so notifier gets to the right window */
979 if (new_workspace) {
981 WM_event_add_notifier_ex(wm, win, NC_SCREEN | ND_WORKSPACE_SET, new_workspace);
983 win->workspace_hook->temp_workspace_store = nullptr;
984 }
985}
986
987PointerRNA rna_Window_screen_get(PointerRNA *ptr)
988{
989 wmWindow *win = static_cast<wmWindow *>(ptr->data);
991 reinterpret_cast<ID *>(BKE_workspace_active_screen_get(win->workspace_hook)));
992}
993
994static void rna_Window_screen_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
995{
996 wmWindow *win = static_cast<wmWindow *>(ptr->data);
998 WorkSpaceLayout *layout_new;
1000
1001 /* disallow ID-browsing away from temp screens */
1002 if (screen->temp) {
1003 return;
1004 }
1005 if (value.data == nullptr) {
1006 return;
1007 }
1008
1009 /* exception: can't set screens inside of area/region handlers */
1010 layout_new = static_cast<WorkSpaceLayout *>(
1011 BKE_workspace_layout_find(workspace, static_cast<bScreen *>(value.data)));
1012 win->workspace_hook->temp_layout_store = layout_new;
1013}
1014
1015static bool rna_Window_screen_assign_poll(PointerRNA * /*ptr*/, PointerRNA value)
1016{
1017 bScreen *screen = (bScreen *)value.owner_id;
1018 return !screen->temp;
1019}
1020
1021static void rna_workspace_screen_update(bContext *C, PointerRNA *ptr)
1022{
1023 wmWindow *win = static_cast<wmWindow *>(ptr->data);
1025
1026 /* exception: can't set screens inside of area/region handlers,
1027 * and must use context so notifier gets to the right window */
1028 if (layout_new) {
1030 WM_event_add_notifier_ex(wm, win, NC_SCREEN | ND_LAYOUTBROWSE, layout_new);
1031 win->workspace_hook->temp_layout_store = nullptr;
1032 }
1033}
1034
1035static PointerRNA rna_Window_view_layer_get(PointerRNA *ptr)
1036{
1037 wmWindow *win = static_cast<wmWindow *>(ptr->data);
1038 Scene *scene = WM_window_get_active_scene(win);
1039 ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1040
1041 return RNA_pointer_create_id_subdata(scene->id, &RNA_ViewLayer, view_layer);
1042}
1043
1044static void rna_Window_view_layer_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
1045{
1046 wmWindow *win = static_cast<wmWindow *>(ptr->data);
1047 ViewLayer *view_layer = static_cast<ViewLayer *>(value.data);
1048
1049 WM_window_set_active_view_layer(win, view_layer);
1050}
1051
1052static bool rna_Window_support_hdr_color_get(PointerRNA *ptr)
1053{
1054 wmWindow *win = static_cast<wmWindow *>(ptr->data);
1055 return WM_window_support_hdr_color(win);
1056}
1057
1058static bool rna_Window_modal_handler_skip(CollectionPropertyIterator * /*iter*/, void *data)
1059{
1060 const wmEventHandler_Op *handler = (wmEventHandler_Op *)data;
1061 return handler->head.type != WM_HANDLER_TYPE_OP;
1062}
1063
1064static void rna_Window_modal_operators_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1065{
1066 wmWindow *window = static_cast<wmWindow *>(ptr->data);
1067 rna_iterator_listbase_begin(iter, ptr, &window->modalhandlers, rna_Window_modal_handler_skip);
1068}
1069
1070static PointerRNA rna_Window_modal_operators_get(CollectionPropertyIterator *iter)
1071{
1072 const wmEventHandler_Op *handler = static_cast<wmEventHandler_Op *>(
1074 return RNA_pointer_create_with_parent(iter->parent, &RNA_Operator, handler->op);
1075}
1076
1077static void rna_KeyMap_modal_event_values_items_begin(CollectionPropertyIterator *iter,
1078 PointerRNA *ptr)
1079{
1080 wmKeyMap *km = static_cast<wmKeyMap *>(ptr->data);
1081
1083 if ((km->flag & KEYMAP_MODAL) != 0 && km->modal_items != nullptr) {
1084 items = static_cast<const EnumPropertyItem *>(km->modal_items);
1085 }
1086
1087 const int totitem = RNA_enum_items_count(items);
1088
1090 iter, ptr, (void *)items, sizeof(EnumPropertyItem), totitem, false, nullptr);
1091}
1092
1093static PointerRNA rna_KeyMapItem_properties_get(PointerRNA *ptr)
1094{
1095 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1096
1097 if (kmi->ptr) {
1098 BLI_assert(kmi->ptr->owner_id == nullptr);
1099 return *(kmi->ptr);
1100 }
1101
1102 // return RNA_pointer_create_with_parent(*ptr, &RNA_OperatorProperties, op->properties);
1103 return PointerRNA_NULL;
1104}
1105
1106static int rna_wmKeyMapItem_map_type_get(PointerRNA *ptr)
1107{
1108 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1109
1110 return WM_keymap_item_map_type_get(kmi);
1111}
1112
1113static void rna_wmKeyMapItem_map_type_set(PointerRNA *ptr, int value)
1114{
1115 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1116 int map_type = rna_wmKeyMapItem_map_type_get(ptr);
1117
1118 if (value != map_type) {
1119 switch (value) {
1120 case KMI_TYPE_KEYBOARD:
1121 kmi->type = EVT_AKEY;
1122 kmi->val = KM_PRESS;
1123 break;
1124 case KMI_TYPE_MOUSE:
1125 kmi->type = LEFTMOUSE;
1126 kmi->val = KM_PRESS;
1127 break;
1128 case KMI_TYPE_TEXTINPUT:
1129 kmi->type = KM_TEXTINPUT;
1130 kmi->val = KM_NOTHING;
1131 break;
1132 case KMI_TYPE_TIMER:
1133 kmi->type = TIMER;
1134 kmi->val = KM_NOTHING;
1135 break;
1136 case KMI_TYPE_NDOF:
1137 kmi->type = NDOF_MOTION;
1138 kmi->val = KM_NOTHING;
1139 break;
1140 }
1141 }
1142}
1143
1148static void rna_wmKeyMapItem_keymodifier_set(PointerRNA *ptr, int value)
1149{
1150 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1151
1152 /* XXX, this should really be managed in an _itemf function,
1153 * giving a list of valid enums, then silently changing them when they are set is not
1154 * a good precedent, don't do this unless you have a good reason! */
1155 if (value == EVT_ESCKEY) {
1156 /* pass */
1157 }
1158 else if (ISKEYBOARD(value) && !ISKEYMODIFIER(value)) {
1159 kmi->keymodifier = value;
1160 }
1161 else {
1162 kmi->keymodifier = 0;
1163 }
1164}
1165
1166static const EnumPropertyItem *rna_KeyMapItem_type_itemf(bContext * /*C*/,
1167 PointerRNA *ptr,
1168 PropertyRNA * /*prop*/,
1169 bool * /*r_free*/)
1170{
1171 int map_type = rna_wmKeyMapItem_map_type_get(ptr);
1172
1173 if (map_type == KMI_TYPE_MOUSE) {
1174 return event_mouse_type_items;
1175 }
1176 if (map_type == KMI_TYPE_TIMER) {
1177 return event_timer_type_items;
1178 }
1179 if (map_type == KMI_TYPE_NDOF) {
1180 return event_ndof_type_items;
1181 }
1182 if (map_type == KMI_TYPE_TEXTINPUT) {
1183 return event_textinput_type_items;
1184 }
1185 else {
1187 }
1188}
1189
1190static const EnumPropertyItem *rna_KeyMapItem_propvalue_itemf(bContext *C,
1191 PointerRNA *ptr,
1192 PropertyRNA * /*prop*/,
1193 bool * /*r_free*/)
1194{
1196 wmKeyConfig *kc;
1197 wmKeyMap *km;
1198
1199 for (kc = static_cast<wmKeyConfig *>(wm->runtime->keyconfigs.first); kc; kc = kc->next) {
1200 for (km = static_cast<wmKeyMap *>(kc->keymaps.first); km; km = km->next) {
1201 /* only check if it's a modal keymap */
1202 if (km->modal_items) {
1203 wmKeyMapItem *kmi;
1204 for (kmi = static_cast<wmKeyMapItem *>(km->items.first); kmi; kmi = kmi->next) {
1205 if (kmi == ptr->data) {
1206 return static_cast<const EnumPropertyItem *>(km->modal_items);
1207 }
1208 }
1209 }
1210 }
1211 }
1212
1213 return rna_enum_keymap_propvalue_items; /* ERROR */
1214}
1215
1216static bool rna_KeyMapItem_any_get(PointerRNA *ptr)
1217{
1218 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1219
1220 if (kmi->shift == KM_ANY && kmi->ctrl == KM_ANY && kmi->alt == KM_ANY && kmi->oskey == KM_ANY &&
1221 kmi->hyper == KM_ANY)
1222 {
1223 return true;
1224 }
1225 else {
1226 return false;
1227 }
1228}
1229
1230static void rna_KeyMapItem_any_set(PointerRNA *ptr, bool value)
1231{
1232 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1233
1234 if (value) {
1235 kmi->shift = kmi->ctrl = kmi->alt = kmi->oskey = kmi->hyper = KM_ANY;
1236 }
1237 else {
1238 kmi->shift = kmi->ctrl = kmi->alt = kmi->oskey = kmi->hyper = KM_NOTHING;
1239 }
1240}
1241
1242static bool rna_KeyMapItem_shift_get(PointerRNA *ptr)
1243{
1244 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1245 return kmi->shift != KM_NOTHING;
1246}
1247
1248static bool rna_KeyMapItem_ctrl_get(PointerRNA *ptr)
1249{
1250 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1251 return kmi->ctrl != KM_NOTHING;
1252}
1253
1254static bool rna_KeyMapItem_alt_get(PointerRNA *ptr)
1255{
1256 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1257 return kmi->alt != KM_NOTHING;
1258}
1259
1260static bool rna_KeyMapItem_oskey_get(PointerRNA *ptr)
1261{
1262 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1263 return kmi->oskey != KM_NOTHING;
1264}
1265
1266static bool rna_KeyMapItem_hyper_get(PointerRNA *ptr)
1267{
1268 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1269 return kmi->hyper != KM_NOTHING;
1270}
1271
1272static PointerRNA rna_WindowManager_active_keyconfig_get(PointerRNA *ptr)
1273{
1274 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1275 wmKeyConfig *kc;
1276
1277 kc = static_cast<wmKeyConfig *>(
1278 BLI_findstring(&wm->runtime->keyconfigs, U.keyconfigstr, offsetof(wmKeyConfig, idname)));
1279
1280 if (!kc) {
1281 kc = wm->runtime->defaultconf;
1282 }
1283
1284 return RNA_pointer_create_with_parent(*ptr, &RNA_KeyConfig, kc);
1285}
1286
1287static void rna_WindowManager_active_keyconfig_set(PointerRNA *ptr,
1288 PointerRNA value,
1289 ReportList * /*reports*/)
1290{
1291 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1292 wmKeyConfig *kc = static_cast<wmKeyConfig *>(value.data);
1293
1294 if (kc) {
1296 }
1297}
1298
1299static PointerRNA rna_WindowManager_default_keyconfig_get(PointerRNA *ptr)
1300{
1301 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1302 return RNA_pointer_create_with_parent(*ptr, &RNA_KeyConfig, wm->runtime->defaultconf);
1303}
1304
1305static PointerRNA rna_WindowManager_addon_keyconfig_get(PointerRNA *ptr)
1306{
1307 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1308 return RNA_pointer_create_with_parent(*ptr, &RNA_KeyConfig, wm->runtime->addonconf);
1309}
1310
1311static PointerRNA rna_WindowManager_user_keyconfig_get(PointerRNA *ptr)
1312{
1313 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1314 return RNA_pointer_create_with_parent(*ptr, &RNA_KeyConfig, wm->runtime->userconf);
1315}
1316
1317static void rna_WindowManager_extensions_statusbar_update(Main * /*bmain*/,
1318 Scene * /*scene*/,
1319 PointerRNA *ptr)
1320{
1321 if ((U.statusbar_flag & STATUSBAR_SHOW_EXTENSIONS_UPDATES) == 0) {
1322 return;
1323 }
1324
1325 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1326 LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
1328 }
1329}
1330
1331/* -------------------------------------------------------------------- */
1334
1335static PointerRNA rna_wmKeyConfig_preferences_get(PointerRNA *ptr)
1336{
1337 wmKeyConfig *kc = static_cast<wmKeyConfig *>(ptr->data);
1339 if (kpt_rt) {
1341 return RNA_pointer_create_with_parent(*ptr, kpt_rt->rna_ext.srna, kpt->prop);
1342 }
1343 else {
1344 return PointerRNA_NULL;
1345 }
1346}
1347
1348static IDProperty **rna_wmKeyConfigPref_idprops(PointerRNA *ptr)
1349{
1350 return (IDProperty **)&ptr->data;
1351}
1352
1353static bool rna_wmKeyConfigPref_unregister(Main * /*bmain*/, StructRNA *type)
1354{
1357
1358 if (!kpt_rt) {
1359 return false;
1360 }
1361
1362 RNA_struct_free_extension(type, &kpt_rt->rna_ext);
1364
1365 /* Possible we're not in the preferences if they have been reset. */
1367
1368 /* update while blender is running */
1370 return true;
1371}
1372
1373static StructRNA *rna_wmKeyConfigPref_register(Main *bmain,
1374 ReportList *reports,
1375 void *data,
1376 const char *identifier,
1377 StructValidateFunc validate,
1378 StructCallbackFunc call,
1380{
1381 const char *error_prefix = "Registering key-config preferences class:";
1382 wmKeyConfigPrefType_Runtime *kpt_rt, dummy_kpt_rt = {{'\0'}};
1383 wmKeyConfigPref dummy_kpt = {nullptr};
1384 // bool have_function[1];
1385
1386 /* setup dummy keyconf-prefs & keyconf-prefs type to store static properties in */
1388 nullptr, &RNA_KeyConfigPreferences, &dummy_kpt);
1389
1390 /* validate the python class */
1391 if (validate(&dummy_kpt_ptr, data, nullptr /*have_function*/) != 0) {
1392 return nullptr;
1393 }
1394
1395 STRNCPY(dummy_kpt_rt.idname, dummy_kpt.idname);
1396 if (strlen(identifier) >= sizeof(dummy_kpt_rt.idname)) {
1397 BKE_reportf(reports,
1398 RPT_ERROR,
1399 "%s '%s' is too long, maximum length is %d",
1400 error_prefix,
1401 identifier,
1402 int(sizeof(dummy_kpt_rt.idname)));
1403 return nullptr;
1404 }
1405
1406 /* check if we have registered this keyconf-prefs type before, and remove it */
1407 kpt_rt = BKE_keyconfig_pref_type_find(dummy_kpt.idname, true);
1408 if (kpt_rt) {
1409 BKE_reportf(reports,
1410 RPT_INFO,
1411 "%s '%s', bl_idname '%s' has been registered before, unregistering previous",
1412 error_prefix,
1413 identifier,
1414 dummy_kpt.idname);
1415
1416 StructRNA *srna = kpt_rt->rna_ext.srna;
1417 if (!(srna && rna_wmKeyConfigPref_unregister(bmain, srna))) {
1418 BKE_reportf(reports,
1419 RPT_ERROR,
1420 "%s '%s', bl_idname '%s' %s",
1421 error_prefix,
1422 identifier,
1423 dummy_kpt.idname,
1424 srna ? "is built-in" : "could not be unregistered");
1425 return nullptr;
1426 }
1427 }
1428
1429 /* create a new keyconf-prefs type */
1430 kpt_rt = MEM_mallocN<wmKeyConfigPrefType_Runtime>("keyconfigpreftype");
1431 memcpy(kpt_rt, &dummy_kpt_rt, sizeof(dummy_kpt_rt));
1432
1434
1435 kpt_rt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, identifier, &RNA_KeyConfigPreferences);
1436 kpt_rt->rna_ext.data = data;
1437 kpt_rt->rna_ext.call = call;
1438 kpt_rt->rna_ext.free = free;
1439 RNA_struct_blender_type_set(kpt_rt->rna_ext.srna, kpt_rt);
1440
1441 // kpt_rt->draw = (have_function[0]) ? header_draw : nullptr;
1442
1443 /* update while blender is running */
1445
1446 return kpt_rt->rna_ext.srna;
1447}
1448
1449/* placeholder, doesn't do anything useful yet */
1450static StructRNA *rna_wmKeyConfigPref_refine(PointerRNA *ptr)
1451{
1452 return (ptr->type) ? ptr->type : &RNA_KeyConfigPreferences;
1453}
1454
1456
1457static void rna_wmKeyMapItem_idname_get(PointerRNA *ptr, char *value)
1458{
1459 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1460 /* Pass in a fixed size buffer as the value may be allocated based on the callbacks length. */
1461 char value_buf[OP_MAX_TYPENAME];
1462 int len = WM_operator_py_idname(value_buf, kmi->idname);
1463 memcpy(value, value_buf, len + 1);
1464}
1465
1466static int rna_wmKeyMapItem_idname_length(PointerRNA *ptr)
1467{
1468 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1469 char pyname[OP_MAX_TYPENAME];
1470 return WM_operator_py_idname(pyname, kmi->idname);
1471}
1472
1473static void rna_wmKeyMapItem_idname_set(PointerRNA *ptr, const char *value)
1474{
1475 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1476 char idname[OP_MAX_TYPENAME];
1477
1478 WM_operator_bl_idname(idname, value);
1479
1480 if (!STREQ(idname, kmi->idname)) {
1481 STRNCPY(kmi->idname, idname);
1482
1483 WM_keymap_item_properties_reset(kmi, nullptr);
1484 }
1485}
1486
1487static void rna_wmKeyMapItem_name_get(PointerRNA *ptr, char *value)
1488{
1489 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1491 strcpy(value, ot ? WM_operatortype_name(ot, kmi->ptr).c_str() : kmi->idname);
1492}
1493
1494static int rna_wmKeyMapItem_name_length(PointerRNA *ptr)
1495{
1496 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1498 return strlen(ot ? WM_operatortype_name(ot, kmi->ptr).c_str() : kmi->idname);
1499}
1500
1501static bool rna_KeyMapItem_userdefined_get(PointerRNA *ptr)
1502{
1503 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1504 return kmi->id < 0;
1505}
1506
1507static void rna_WindowManager_operators_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1508{
1509 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1510 rna_iterator_listbase_begin(iter, ptr, &wm->runtime->operators, nullptr);
1511}
1512
1513static void rna_WindowManager_keyconfigs_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1514{
1515 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1516 rna_iterator_listbase_begin(iter, ptr, &wm->runtime->keyconfigs, nullptr);
1517}
1518
1519static PointerRNA rna_WindowManager_xr_session_state_get(PointerRNA *ptr)
1520{
1521 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1522 struct wmXrSessionState *state =
1523# ifdef WITH_XR_OPENXR
1525# else
1526 nullptr;
1527 UNUSED_VARS(wm);
1528# endif
1529
1530 return RNA_pointer_create_with_parent(*ptr, &RNA_XrSessionState, state);
1531}
1532
1533# ifdef WITH_PYTHON
1534
1535static bool rna_operator_poll_cb(bContext *C, wmOperatorType *ot)
1536{
1537 extern FunctionRNA rna_Operator_poll_func;
1538
1539 ParameterList list;
1540 FunctionRNA *func;
1541 void *ret;
1542 bool visible;
1543
1544 PointerRNA ptr = RNA_pointer_create_discrete(nullptr, ot->rna_ext.srna, nullptr); /* dummy */
1545 func = &rna_Operator_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
1546
1547 RNA_parameter_list_create(&list, &ptr, func);
1548 RNA_parameter_set_lookup(&list, "context", &C);
1549 ot->rna_ext.call(C, &ptr, func, &list);
1550
1551 RNA_parameter_get_lookup(&list, "visible", &ret);
1552 visible = *(bool *)ret;
1553
1555
1556 return visible;
1557}
1558
1559static wmOperatorStatus rna_operator_exec_cb(bContext *C, wmOperator *op)
1560{
1561 extern FunctionRNA rna_Operator_execute_func;
1562
1563 ParameterList list;
1564 FunctionRNA *func;
1565 void *ret;
1566
1567 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1568 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1569 func = &rna_Operator_execute_func; /* RNA_struct_find_function(&opr, "execute"); */
1570
1571 RNA_parameter_list_create(&list, &opr, func);
1572 RNA_parameter_set_lookup(&list, "context", &C);
1573 const bool has_error = op->type->rna_ext.call(C, &opr, func, &list) == -1;
1574
1575 RNA_parameter_get_lookup(&list, "result", &ret);
1577
1579
1580 if (UNLIKELY(has_error)) {
1581 /* A modal handler may have been added, ensure this is removed, see: #113479. */
1583 }
1584
1586 return result;
1587}
1588
1589/* same as execute() but no return value */
1590static bool rna_operator_check_cb(bContext *C, wmOperator *op)
1591{
1592 extern FunctionRNA rna_Operator_check_func;
1593
1594 ParameterList list;
1595 FunctionRNA *func;
1596 void *ret;
1597 bool result;
1598
1599 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1600 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1601 func = &rna_Operator_check_func; /* RNA_struct_find_function(&opr, "check"); */
1602
1603 RNA_parameter_list_create(&list, &opr, func);
1604 RNA_parameter_set_lookup(&list, "context", &C);
1605 op->type->rna_ext.call(C, &opr, func, &list);
1606
1607 RNA_parameter_get_lookup(&list, "result", &ret);
1608 result = (*(bool *)ret) != 0;
1609
1611
1612 return result;
1613}
1614
1615static wmOperatorStatus rna_operator_invoke_cb(bContext *C, wmOperator *op, const wmEvent *event)
1616{
1617 extern FunctionRNA rna_Operator_invoke_func;
1618
1619 ParameterList list;
1620 FunctionRNA *func;
1621 void *ret;
1622
1623 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1624 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1625 func = &rna_Operator_invoke_func; /* RNA_struct_find_function(&opr, "invoke"); */
1626
1627 RNA_parameter_list_create(&list, &opr, func);
1628 RNA_parameter_set_lookup(&list, "context", &C);
1629 RNA_parameter_set_lookup(&list, "event", &event);
1630 const bool has_error = op->type->rna_ext.call(C, &opr, func, &list) == -1;
1631
1632 RNA_parameter_get_lookup(&list, "result", &ret);
1633 wmOperatorStatus retval = wmOperatorStatus(*(int *)ret);
1634
1636
1637 if (UNLIKELY(has_error)) {
1638 /* A modal handler may have been added, ensure this is removed, see: #113479. */
1640 }
1641
1642 OPERATOR_RETVAL_CHECK(retval);
1643 return retval;
1644}
1645
1646/* same as invoke */
1647static wmOperatorStatus rna_operator_modal_cb(bContext *C, wmOperator *op, const wmEvent *event)
1648{
1649 extern FunctionRNA rna_Operator_modal_func;
1650
1651 ParameterList list;
1652 FunctionRNA *func;
1653 void *ret;
1654
1655 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1656 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1657 func = &rna_Operator_modal_func; /* RNA_struct_find_function(&opr, "modal"); */
1658
1659 RNA_parameter_list_create(&list, &opr, func);
1660 RNA_parameter_set_lookup(&list, "context", &C);
1661 RNA_parameter_set_lookup(&list, "event", &event);
1662 op->type->rna_ext.call(C, &opr, func, &list);
1663
1664 RNA_parameter_get_lookup(&list, "result", &ret);
1665 wmOperatorStatus retval = wmOperatorStatus(*(int *)ret);
1666
1668
1669 OPERATOR_RETVAL_CHECK(retval);
1670 return retval;
1671}
1672
1673static void rna_operator_draw_cb(bContext *C, wmOperator *op)
1674{
1675 extern FunctionRNA rna_Operator_draw_func;
1676
1677 ParameterList list;
1678 FunctionRNA *func;
1679
1680 /* Operator draw gets reused for drawing stored properties, in which
1681 * case we need a proper owner. */
1682 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1683 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1684 func = &rna_Operator_draw_func; /* RNA_struct_find_function(&opr, "draw"); */
1685
1686 RNA_parameter_list_create(&list, &opr, func);
1687 RNA_parameter_set_lookup(&list, "context", &C);
1688 op->type->rna_ext.call(C, &opr, func, &list);
1689
1691}
1692
1693/* same as exec(), but call cancel */
1694static void rna_operator_cancel_cb(bContext *C, wmOperator *op)
1695{
1696 extern FunctionRNA rna_Operator_cancel_func;
1697
1698 ParameterList list;
1699 FunctionRNA *func;
1700
1701 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1702 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1703 func = &rna_Operator_cancel_func; /* RNA_struct_find_function(&opr, "cancel"); */
1704
1705 RNA_parameter_list_create(&list, &opr, func);
1706 RNA_parameter_set_lookup(&list, "context", &C);
1707 op->type->rna_ext.call(C, &opr, func, &list);
1708
1710}
1711
1712static std::string rna_operator_description_cb(bContext *C,
1714 PointerRNA *prop_ptr)
1715{
1716 extern FunctionRNA rna_Operator_description_func;
1717
1718 ParameterList list;
1719 FunctionRNA *func;
1720 void *ret;
1721
1722 PointerRNA ptr = RNA_pointer_create_discrete(nullptr, ot->rna_ext.srna, nullptr); /* dummy */
1723 func = &rna_Operator_description_func; /* RNA_struct_find_function(&ptr, "description"); */
1724
1725 RNA_parameter_list_create(&list, &ptr, func);
1726 RNA_parameter_set_lookup(&list, "context", &C);
1727 RNA_parameter_set_lookup(&list, "properties", prop_ptr);
1728 ot->rna_ext.call(C, &ptr, func, &list);
1729
1730 RNA_parameter_get_lookup(&list, "result", &ret);
1731 std::string result = ret ? std::string(static_cast<const char *>(ret)) : "";
1732
1734
1735 return result;
1736}
1737
1738static bool rna_Operator_unregister(Main *bmain, StructRNA *type);
1739
1740/* `bpy_operator_wrap.cc` */
1741
1742extern void BPY_RNA_operator_wrapper(wmOperatorType *ot, void *userdata);
1743extern void BPY_RNA_operator_macro_wrapper(wmOperatorType *ot, void *userdata);
1744
1745static StructRNA *rna_Operator_register(Main *bmain,
1746 ReportList *reports,
1747 void *data,
1748 const char *identifier,
1749 StructValidateFunc validate,
1750 StructCallbackFunc call,
1752{
1753 const char *error_prefix = "Registering operator class:";
1754 wmOperatorType dummy_ot = {nullptr};
1755 wmOperator dummy_operator = {nullptr};
1756 bool have_function[8];
1757
1758 struct {
1759 char idname[OP_MAX_TYPENAME];
1760 char name[OP_MAX_TYPENAME];
1761 char description[RNA_DYN_DESCR_MAX];
1762 char translation_context[BKE_ST_MAXNAME];
1763 char undo_group[OP_MAX_TYPENAME];
1764 } temp_buffers;
1765
1766 /* setup dummy operator & operator type to store static properties in */
1767 dummy_operator.type = &dummy_ot;
1768 dummy_ot.idname = temp_buffers.idname; /* only assign the pointer, string is nullptr'd */
1769 dummy_ot.name = temp_buffers.name; /* only assign the pointer, string is nullptr'd */
1770 dummy_ot.description =
1771 temp_buffers.description; /* only assign the pointer, string is nullptr'd */
1772 dummy_ot.translation_context =
1773 temp_buffers.translation_context; /* only assign the pointer, string is nullptr'd */
1774 dummy_ot.undo_group = temp_buffers.undo_group; /* only assign the pointer, string is nullptr'd */
1775 PointerRNA dummy_operator_ptr = RNA_pointer_create_discrete(
1776 nullptr, &RNA_Operator, &dummy_operator);
1777
1778 /* clear in case they are left unset */
1779 temp_buffers.idname[0] = temp_buffers.name[0] = temp_buffers.description[0] =
1780 temp_buffers.undo_group[0] = temp_buffers.translation_context[0] = '\0';
1781
1782 /* validate the python class */
1783 if (validate(&dummy_operator_ptr, data, have_function) != 0) {
1784 return nullptr;
1785 }
1786
1787 /* check if we have registered this operator type before, and remove it */
1788 {
1789 wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true);
1790 if (ot) {
1791 BKE_reportf(reports,
1792 RPT_INFO,
1793 "%s '%s', bl_idname '%s' has been registered before, unregistering previous",
1794 error_prefix,
1795 identifier,
1796 dummy_ot.idname);
1797
1798 StructRNA *srna = ot->rna_ext.srna;
1799 if (!(srna && rna_Operator_unregister(bmain, srna))) {
1800 BKE_reportf(reports,
1801 RPT_ERROR,
1802 "%s '%s', bl_idname '%s' %s",
1803 error_prefix,
1804 identifier,
1805 dummy_ot.idname,
1806 srna ? "is built-in" : "could not be unregistered");
1807 return nullptr;
1808 }
1809 }
1810 }
1811
1812 if (!WM_operator_py_idname_ok_or_report(reports, identifier, dummy_ot.idname)) {
1813 return nullptr;
1814 }
1815
1816 char idname_conv[sizeof(dummy_operator.idname)];
1817 WM_operator_bl_idname(idname_conv, dummy_ot.idname); /* convert the idname from python */
1818
1819 if (!RNA_struct_available_or_report(reports, idname_conv)) {
1820 return nullptr;
1821 }
1822
1823 /* We have to set default context if the class doesn't define it. */
1824 if (temp_buffers.translation_context[0] == '\0') {
1825 STRNCPY(temp_buffers.translation_context, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
1826 }
1827
1828 /* Convert foo.bar to `FOO_OT_bar`
1829 * allocate all strings at once. */
1830 {
1831 const char *strings[] = {
1832 idname_conv,
1833 temp_buffers.name,
1834 temp_buffers.description,
1835 temp_buffers.translation_context,
1836 temp_buffers.undo_group,
1837 };
1838 char *strings_table[ARRAY_SIZE(strings)];
1840 '\0', strings_table, strings, ARRAY_SIZE(strings));
1841
1842 dummy_ot.idname = strings_table[0]; /* allocated string stored here */
1843 dummy_ot.name = strings_table[1];
1844 dummy_ot.description = *strings_table[2] ? strings_table[2] : nullptr;
1845 dummy_ot.translation_context = strings_table[3];
1846 dummy_ot.undo_group = strings_table[4];
1847 BLI_STATIC_ASSERT(ARRAY_SIZE(strings) == 5, "Unexpected number of strings")
1848 }
1849
1850 /* XXX, this doubles up with the operator name #29666.
1851 * for now just remove from `dir(bpy.types)`. */
1852
1853 /* create a new operator type */
1854 dummy_ot.rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummy_ot.idname, &RNA_Operator);
1855
1856 /* Operator properties are registered separately. */
1858
1861 dummy_ot.rna_ext.data = data;
1862 dummy_ot.rna_ext.call = call;
1863 dummy_ot.rna_ext.free = free;
1864
1865 dummy_ot.pyop_poll = (have_function[0]) ? rna_operator_poll_cb : nullptr;
1866 dummy_ot.exec = (have_function[1]) ? rna_operator_exec_cb : nullptr;
1867 dummy_ot.check = (have_function[2]) ? rna_operator_check_cb : nullptr;
1868 dummy_ot.invoke = (have_function[3]) ? rna_operator_invoke_cb : nullptr;
1869 dummy_ot.modal = (have_function[4]) ? rna_operator_modal_cb : nullptr;
1870 dummy_ot.ui = (have_function[5]) ? rna_operator_draw_cb : nullptr;
1871 dummy_ot.cancel = (have_function[6]) ? rna_operator_cancel_cb : nullptr;
1872 dummy_ot.get_description = (have_function[7]) ? rna_operator_description_cb : nullptr;
1874
1875 /* update while blender is running */
1877
1878 return dummy_ot.rna_ext.srna;
1879}
1880
1881static bool rna_Operator_unregister(Main *bmain, StructRNA *type)
1882{
1883 const char *idname;
1885 wmWindowManager *wm;
1886
1887 if (!ot) {
1888 return false;
1889 }
1890
1891 /* update while blender is running */
1892 wm = static_cast<wmWindowManager *>(bmain->wm.first);
1893 if (wm) {
1895
1897 }
1899
1900 RNA_struct_free_extension(type, &ot->rna_ext);
1901
1902 idname = ot->idname;
1904
1905 /* Not to be confused with the RNA_struct_free that WM_operatortype_remove calls,
1906 * they are 2 different srna's. */
1908
1909 MEM_freeN(idname);
1910 return true;
1911}
1912
1913static void **rna_Operator_instance(PointerRNA *ptr)
1914{
1915 wmOperator *op = static_cast<wmOperator *>(ptr->data);
1916 return &op->py_instance;
1917}
1918
1919static StructRNA *rna_MacroOperator_register(Main *bmain,
1920 ReportList *reports,
1921 void *data,
1922 const char *identifier,
1923 StructValidateFunc validate,
1924 StructCallbackFunc call,
1926{
1927 const char *error_prefix = "Registering operator macro class:";
1928 wmOperatorType dummy_ot = {nullptr};
1929 wmOperator dummy_operator = {nullptr};
1930 bool have_function[2];
1931
1932 struct {
1933 char idname[OP_MAX_TYPENAME];
1934 char name[OP_MAX_TYPENAME];
1935 char description[RNA_DYN_DESCR_MAX];
1936 char translation_context[BKE_ST_MAXNAME];
1937 char undo_group[OP_MAX_TYPENAME];
1938 } temp_buffers;
1939
1940 /* setup dummy operator & operator type to store static properties in */
1941 dummy_operator.type = &dummy_ot;
1942 dummy_ot.idname = temp_buffers.idname; /* only assign the pointer, string is nullptr'd */
1943 dummy_ot.name = temp_buffers.name; /* only assign the pointer, string is nullptr'd */
1944 dummy_ot.description =
1945 temp_buffers.description; /* only assign the pointer, string is nullptr'd */
1946 dummy_ot.translation_context =
1947 temp_buffers.translation_context; /* only assign the pointer, string is nullptr'd */
1948 dummy_ot.undo_group = temp_buffers.undo_group; /* only assign the pointer, string is nullptr'd */
1949 PointerRNA dummy_operator_ptr = RNA_pointer_create_discrete(
1950 nullptr, &RNA_Macro, &dummy_operator);
1951
1952 /* clear in case they are left unset */
1953 temp_buffers.idname[0] = temp_buffers.name[0] = temp_buffers.description[0] =
1954 temp_buffers.undo_group[0] = temp_buffers.translation_context[0] = '\0';
1955
1956 /* validate the python class */
1957 if (validate(&dummy_operator_ptr, data, have_function) != 0) {
1958 return nullptr;
1959 }
1960
1961 if (!WM_operator_py_idname_ok_or_report(reports, identifier, dummy_ot.idname)) {
1962 return nullptr;
1963 }
1964
1965 /* check if we have registered this operator type before, and remove it */
1966 {
1967 wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true);
1968 if (ot) {
1969 BKE_reportf(reports,
1970 RPT_INFO,
1971 "%s '%s', bl_idname '%s' has been registered before, unregistering previous",
1972 error_prefix,
1973 identifier,
1974 dummy_ot.idname);
1975
1976 StructRNA *srna = ot->rna_ext.srna;
1977 if (!(srna && rna_Operator_unregister(bmain, srna))) {
1978 BKE_reportf(reports,
1979 RPT_ERROR,
1980 "%s '%s', bl_idname '%s' %s",
1981 error_prefix,
1982 identifier,
1983 dummy_ot.idname,
1984 srna ? "is built-in" : "could not be unregistered");
1985 return nullptr;
1986 }
1987 }
1988 }
1989
1990 char idname_conv[sizeof(dummy_operator.idname)];
1991 WM_operator_bl_idname(idname_conv, dummy_ot.idname); /* convert the idname from python */
1992
1993 if (!RNA_struct_available_or_report(reports, idname_conv)) {
1994 return nullptr;
1995 }
1996
1997 /* We have to set default context if the class doesn't define it. */
1998 if (temp_buffers.translation_context[0] == '\0') {
1999 STRNCPY(temp_buffers.translation_context, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
2000 }
2001
2002 /* Convert `foo.bar` to `FOO_OT_bar`
2003 * allocate all strings at once. */
2004 {
2005 const char *strings[] = {
2006 idname_conv,
2007 temp_buffers.name,
2008 temp_buffers.description,
2009 temp_buffers.translation_context,
2010 temp_buffers.undo_group,
2011 };
2012 char *strings_table[ARRAY_SIZE(strings)];
2014 '\0', strings_table, strings, ARRAY_SIZE(strings));
2015
2016 dummy_ot.idname = strings_table[0]; /* allocated string stored here */
2017 dummy_ot.name = strings_table[1];
2018 dummy_ot.description = *strings_table[2] ? strings_table[2] : nullptr;
2019 dummy_ot.translation_context = strings_table[3];
2020 dummy_ot.undo_group = strings_table[4];
2021 BLI_STATIC_ASSERT(ARRAY_SIZE(strings) == 5, "Unexpected number of strings")
2022 }
2023
2024 /* XXX, this doubles up with the operator name #29666.
2025 * for now just remove from `dir(bpy.types)`. */
2026
2027 /* create a new operator type */
2028 dummy_ot.rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummy_ot.idname, &RNA_Operator);
2030 dummy_ot.rna_ext.data = data;
2031 dummy_ot.rna_ext.call = call;
2032 dummy_ot.rna_ext.free = free;
2033
2034 dummy_ot.pyop_poll = (have_function[0]) ? rna_operator_poll_cb : nullptr;
2035 dummy_ot.ui = (have_function[1]) ? rna_operator_draw_cb : nullptr;
2036
2038
2039 /* update while blender is running */
2041
2042 return dummy_ot.rna_ext.srna;
2043}
2044# endif /* WITH_PYTHON */
2045
2046static StructRNA *rna_Operator_refine(PointerRNA *opr)
2047{
2048 wmOperator *op = (wmOperator *)opr->data;
2049 return (op->type && op->type->rna_ext.srna) ? op->type->rna_ext.srna : &RNA_Operator;
2050}
2051
2052static StructRNA *rna_MacroOperator_refine(PointerRNA *opr)
2053{
2054 wmOperator *op = (wmOperator *)opr->data;
2055 return (op->type && op->type->rna_ext.srna) ? op->type->rna_ext.srna : &RNA_Macro;
2056}
2057
2058/* just to work around 'const char *' warning and to ensure this is a python op */
2059static void rna_Operator_bl_idname_set(PointerRNA *ptr, const char *value)
2060{
2061 wmOperator *data = (wmOperator *)(ptr->data);
2062 char *str = (char *)data->type->idname;
2063 if (!str[0]) {
2064 /* Calling UTF8 copy is disputable since registering ensures the value isn't truncated.
2065 * Use a UTF8 copy to ensure truncating never causes an incomplete UTF8 sequence,
2066 * even before registration. */
2068 }
2069 else {
2070 BLI_assert_msg(0, "setting the bl_idname on a non-builtin operator");
2071 }
2072}
2073
2074static void rna_Operator_bl_label_set(PointerRNA *ptr, const char *value)
2075{
2076 wmOperator *data = (wmOperator *)(ptr->data);
2077 char *str = (char *)data->type->name;
2078 if (!str[0]) {
2080 }
2081 else {
2082 BLI_assert_msg(0, "setting the bl_label on a non-builtin operator");
2083 }
2084}
2085
2091# define OPERATOR_STR_MAYBE_NULL_GETSET(attr, attr_maxncpy) \
2092 static void rna_Operator_bl_##attr##_set(PointerRNA *ptr, const char *value) \
2093 { \
2094 wmOperator *data = (wmOperator *)(ptr->data); \
2095 char *str = (char *)data->type->attr; \
2096 if (str && !str[0]) { \
2097 BLI_strncpy_utf8(str, value, attr_maxncpy); \
2098 } \
2099 else { \
2100 BLI_assert_msg(false, "setting the bl_" #attr " on a non-builtin operator"); \
2101 } \
2102 } \
2103 static void rna_Operator_bl_##attr##_get(PointerRNA *ptr, char *value) \
2104 { \
2105 const wmOperator *data = (wmOperator *)(ptr->data); \
2106 const char *str = data->type->attr; \
2107 strcpy(value, str ? str : ""); \
2108 } \
2109 static int rna_Operator_bl_##attr##_length(PointerRNA *ptr) \
2110 { \
2111 const wmOperator *data = (wmOperator *)(ptr->data); \
2112 const char *str = data->type->attr; \
2113 return str ? strlen(str) : 0; \
2114 }
2115
2116OPERATOR_STR_MAYBE_NULL_GETSET(translation_context, BKE_ST_MAXNAME)
2117OPERATOR_STR_MAYBE_NULL_GETSET(description, RNA_DYN_DESCR_MAX)
2118OPERATOR_STR_MAYBE_NULL_GETSET(undo_group, OP_MAX_TYPENAME)
2119
2120static void rna_KeyMapItem_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
2121{
2122 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
2123 WM_keyconfig_update_tag(nullptr, kmi);
2124}
2125
2126#else /* RNA_RUNTIME */
2127
2133{
2134 StructRNA *srna;
2135 PropertyRNA *prop;
2136
2137 srna = RNA_def_struct(brna, "OperatorOptions", nullptr);
2138 RNA_def_struct_ui_text(srna, "Operator Options", "Runtime options");
2139 RNA_def_struct_sdna(srna, "wmOperator");
2140
2141 prop = RNA_def_property(srna, "is_grab_cursor", PROP_BOOLEAN, PROP_BOOLEAN);
2143 RNA_def_property_ui_text(prop, "Grab Cursor", "True when the cursor is grabbed");
2145
2146 prop = RNA_def_property(srna, "is_invoke", PROP_BOOLEAN, PROP_BOOLEAN);
2147 RNA_def_property_boolean_sdna(prop, nullptr, "flag", OP_IS_INVOKE);
2149 prop, "Invoke", "True when invoked (even if only the execute callbacks available)");
2151
2152 prop = RNA_def_property(srna, "is_repeat", PROP_BOOLEAN, PROP_BOOLEAN);
2153 RNA_def_property_boolean_sdna(prop, nullptr, "flag", OP_IS_REPEAT);
2154 RNA_def_property_ui_text(prop, "Repeat", "True when run from the 'Adjust Last Operation' panel");
2156
2157 prop = RNA_def_property(srna, "is_repeat_last", PROP_BOOLEAN, PROP_BOOLEAN);
2158 RNA_def_property_boolean_sdna(prop, nullptr, "flag", OP_IS_REPEAT_LAST);
2159 RNA_def_property_ui_text(prop, "Repeat Call", "True when run from the operator 'Repeat Last'");
2161
2162 prop = RNA_def_property(srna, "use_cursor_region", PROP_BOOLEAN, PROP_BOOLEAN);
2165 prop, "Focus Region", "Enable to use the region under the cursor for modal execution");
2166}
2167
2169{
2170 PropertyRNA *prop;
2171
2172 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2175 prop, "rna_Operator_name_get", "rna_Operator_name_length", nullptr);
2176 RNA_def_property_ui_text(prop, "Name", "");
2177
2178 prop = RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
2180 RNA_def_property_struct_type(prop, "OperatorProperties");
2181 RNA_def_property_ui_text(prop, "Properties", "");
2182 RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", nullptr, nullptr, nullptr);
2183
2184 prop = RNA_def_property(srna, "has_reports", PROP_BOOLEAN, PROP_NONE);
2185 RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* this is 'virtual' property */
2186 RNA_def_property_boolean_funcs(prop, "rna_Operator_has_reports_get", nullptr);
2188 prop,
2189 "Has Reports",
2190 "Operator has a set of reports (warnings and errors) from last execution");
2191
2192 /* Registration */
2193 prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
2194 RNA_def_property_string_sdna(prop, nullptr, "type->idname");
2195 /* String stored here is the 'BL' identifier (`OPMODULE_OT_my_op`),
2196 * not the 'python' identifier (`opmodule.my_op`). */
2198 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_Operator_bl_idname_set");
2199 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2201 RNA_def_struct_name_property(srna, prop);
2202
2203 prop = RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
2204 RNA_def_property_string_sdna(prop, nullptr, "type->name");
2205 RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
2206 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_Operator_bl_label_set");
2207 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2209
2210 prop = RNA_def_property(srna, "bl_translation_context", PROP_STRING, PROP_NONE);
2211 RNA_def_property_string_sdna(prop, nullptr, "type->translation_context");
2212 RNA_def_property_string_maxlength(prop, BKE_ST_MAXNAME); /* else it uses the pointer size! */
2214 "rna_Operator_bl_translation_context_get",
2215 "rna_Operator_bl_translation_context_length",
2216 "rna_Operator_bl_translation_context_set");
2219
2220 prop = RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE);
2221 RNA_def_property_string_sdna(prop, nullptr, "type->description");
2222 RNA_def_property_string_maxlength(prop, RNA_DYN_DESCR_MAX); /* else it uses the pointer size! */
2224 "rna_Operator_bl_description_get",
2225 "rna_Operator_bl_description_length",
2226 "rna_Operator_bl_description_set");
2227 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2229
2230 prop = RNA_def_property(srna, "bl_undo_group", PROP_STRING, PROP_NONE);
2231 RNA_def_property_string_sdna(prop, nullptr, "type->undo_group");
2232 RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
2234 "rna_Operator_bl_undo_group_get",
2235 "rna_Operator_bl_undo_group_length",
2236 "rna_Operator_bl_undo_group_set");
2237 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2239
2240 prop = RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
2241 RNA_def_property_enum_sdna(prop, nullptr, "type->flag");
2244 RNA_def_property_ui_text(prop, "Options", "Options for this operator type");
2245
2246 prop = RNA_def_property(srna, "bl_cursor_pending", PROP_ENUM, PROP_NONE);
2247 RNA_def_property_enum_sdna(prop, nullptr, "type->cursor_pending");
2251 prop,
2252 "Idle Cursor",
2253 "Cursor to use when waiting for the user to select a location to activate the operator "
2254 "(when ``bl_options`` has ``DEPENDS_ON_CURSOR`` set)");
2255}
2256
2258{
2259 StructRNA *srna;
2260 PropertyRNA *prop;
2261
2262 srna = RNA_def_struct(brna, "Operator", nullptr);
2264 srna, "Operator", "Storage of an operator being executed, or registered after execution");
2265 RNA_def_struct_sdna(srna, "wmOperator");
2266 RNA_def_struct_refine_func(srna, "rna_Operator_refine");
2267# ifdef WITH_PYTHON
2269 srna, "rna_Operator_register", "rna_Operator_unregister", "rna_Operator_instance");
2270# endif
2273
2275
2276 prop = RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
2277 RNA_def_property_struct_type(prop, "UILayout");
2278 RNA_def_property_pointer_funcs(prop, "rna_Operator_layout_get", nullptr, nullptr, nullptr);
2279
2280 prop = RNA_def_property(srna, "options", PROP_POINTER, PROP_NONE);
2282 RNA_def_property_struct_type(prop, "OperatorOptions");
2283 RNA_def_property_pointer_funcs(prop, "rna_Operator_options_get", nullptr, nullptr, nullptr);
2284 RNA_def_property_ui_text(prop, "Options", "Runtime options");
2285
2286 prop = RNA_def_property(srna, "macros", PROP_COLLECTION, PROP_NONE);
2287 RNA_def_property_collection_sdna(prop, nullptr, "macro", nullptr);
2288 RNA_def_property_struct_type(prop, "Macro");
2289 RNA_def_property_ui_text(prop, "Macros", "");
2290
2291 RNA_api_operator(srna);
2292
2293 srna = RNA_def_struct(brna, "OperatorProperties", nullptr);
2294 RNA_def_struct_ui_text(srna, "Operator Properties", "Input properties of an operator");
2295 RNA_def_struct_refine_func(srna, "rna_OperatorProperties_refine");
2296 /* NOTE: `RNA_def_struct_idprops_func` should be removed once #132129 is implemented.
2297 * Similar to the issue with the nodes modifiers, see #rna_def_modifier_nodes. */
2298 RNA_def_struct_idprops_func(srna, "rna_OperatorProperties_idprops");
2299 RNA_def_struct_system_idprops_func(srna, "rna_OperatorProperties_idprops");
2302}
2303
2305{
2306 StructRNA *srna;
2307
2308 srna = RNA_def_struct(brna, "Macro", nullptr);
2310 srna,
2311 "Macro Operator",
2312 "Storage of a macro operator being executed, or registered after execution");
2313 RNA_def_struct_sdna(srna, "wmOperator");
2314 RNA_def_struct_refine_func(srna, "rna_MacroOperator_refine");
2315# ifdef WITH_PYTHON
2317 srna, "rna_MacroOperator_register", "rna_Operator_unregister", "rna_Operator_instance");
2318# endif
2321
2323
2324 RNA_api_macro(srna);
2325}
2326
2328{
2329 StructRNA *srna;
2330 PropertyRNA *prop;
2331
2332 srna = RNA_def_struct(brna, "OperatorMacro", nullptr);
2334 srna, "Operator Macro", "Storage of a sub operator in a macro after it has been added");
2335 RNA_def_struct_sdna(srna, "wmOperatorTypeMacro");
2336
2337# if 0
2338 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2340 RNA_def_property_string_sdna(prop, nullptr, "idname");
2341 RNA_def_property_ui_text(prop, "Name", "Name of the sub operator");
2342 RNA_def_struct_name_property(srna, prop);
2343# endif
2344
2345 prop = RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
2347 RNA_def_property_struct_type(prop, "OperatorProperties");
2348 RNA_def_property_ui_text(prop, "Properties", "");
2350 prop, "rna_OperatorMacro_properties_get", nullptr, nullptr, nullptr);
2351}
2352
2354{
2355 StructRNA *srna;
2356 PropertyRNA *prop;
2357
2358 srna = RNA_def_struct(brna, "OperatorMousePath", "PropertyGroup");
2360 srna, "Operator Mouse Path", "Mouse path values for operators that record such paths");
2361
2362 prop = RNA_def_property(srna, "loc", PROP_FLOAT, PROP_XYZ);
2364 RNA_def_property_array(prop, 2);
2365 RNA_def_property_ui_text(prop, "Location", "Mouse location");
2366
2367 prop = RNA_def_property(srna, "time", PROP_FLOAT, PROP_NONE);
2369 RNA_def_property_ui_text(prop, "Time", "Time of mouse location");
2370}
2371
2373{
2374 StructRNA *srna;
2375 PropertyRNA *prop;
2376
2377 srna = RNA_def_struct(brna, "OperatorFileListElement", "PropertyGroup");
2378 RNA_def_struct_ui_text(srna, "Operator File List Element", "");
2379
2380 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_FILENAME);
2382 RNA_def_property_ui_text(prop, "Name", "Name of a file or directory within a file list");
2383}
2384
2386{
2387 StructRNA *srna;
2388 PropertyRNA *prop;
2389
2390 srna = RNA_def_struct(brna, "NDOFMotionEventData", nullptr);
2391 RNA_def_struct_ui_text(srna, "NDOF Motion Data", "NDOF motion data for window manager events");
2392
2393 prop = RNA_def_property(srna, "translation", PROP_FLOAT, PROP_XYZ);
2394 RNA_def_property_array(prop, 3);
2396 RNA_def_property_float_funcs(prop, "rna_NDOFMotionEventData_translation_get", nullptr, nullptr);
2398 "Translation",
2399 "The translation of this motion event. "
2400 "The range on each axis is [-1 to 1], "
2401 "before being multiplied by the sensitivity preference. "
2402 "This is typically scaled by the time-delta before use.");
2403
2404 prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_XYZ);
2405 RNA_def_property_array(prop, 3);
2407 RNA_def_property_float_funcs(prop, "rna_NDOFMotionEventData_rotation_get", nullptr, nullptr);
2409 "Rotation",
2410 "Axis-angle rotation of this motion event. "
2411 "The vector magnitude is the angle where 1.0 represents 360 degrees. "
2412 "The angle is typically scaled by the time-delta before use.");
2413
2414 prop = RNA_def_property(srna, "progress", PROP_ENUM, PROP_NONE);
2417 RNA_def_property_enum_funcs(prop, "rna_NDOFMotionEventData_progress_get", nullptr, nullptr);
2418 RNA_def_property_ui_text(prop, "Progress", "Indicates the gesture phase");
2419
2420 prop = RNA_def_property(srna, "time_delta", PROP_FLOAT, PROP_TIME);
2422 RNA_def_property_float_funcs(prop, "rna_NDOFMotionEventData_time_delta_get", nullptr, nullptr);
2423 RNA_def_property_ui_text(prop, "Time Delta", "Time since previous motion event (in seconds)");
2424}
2425
2426static void rna_def_event(BlenderRNA *brna)
2427{
2428 StructRNA *srna;
2429 PropertyRNA *prop;
2430
2431 srna = RNA_def_struct(brna, "Event", nullptr);
2432 RNA_def_struct_ui_text(srna, "Event", "Window Manager Event");
2433 RNA_def_struct_sdna(srna, "wmEvent");
2434
2435 RNA_define_verify_sdna(false); /* not in sdna */
2436
2437 /* strings */
2438 prop = RNA_def_property(srna, "ascii", PROP_STRING, PROP_NONE);
2440 RNA_def_property_string_funcs(prop, "rna_Event_ascii_get", "rna_Event_ascii_length", nullptr);
2441 RNA_def_property_ui_text(prop, "ASCII", "Single ASCII character for this event");
2442
2443 prop = RNA_def_property(srna, "unicode", PROP_STRING, PROP_NONE);
2446 prop, "rna_Event_unicode_get", "rna_Event_unicode_length", nullptr);
2447 RNA_def_property_ui_text(prop, "Unicode", "Single unicode character for this event");
2448
2449 /* enums */
2450 prop = RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
2451 RNA_def_property_enum_sdna(prop, nullptr, "val");
2454 RNA_def_property_ui_text(prop, "Value", "The type of event, only applies to some");
2455
2456 prop = RNA_def_property(srna, "value_prev", PROP_ENUM, PROP_NONE);
2457 RNA_def_property_enum_sdna(prop, nullptr, "prev_val");
2460 RNA_def_property_ui_text(prop, "Previous Value", "The type of event, only applies to some");
2461
2462 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
2463 RNA_def_property_enum_sdna(prop, nullptr, "type");
2467 RNA_def_property_ui_text(prop, "Type", "");
2468
2469 prop = RNA_def_property(srna, "type_prev", PROP_ENUM, PROP_NONE);
2470 RNA_def_property_enum_sdna(prop, nullptr, "prev_type");
2474 RNA_def_property_ui_text(prop, "Previous Type", "");
2475
2476 prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
2477 RNA_def_property_enum_sdna(prop, nullptr, "direction");
2480 RNA_def_property_ui_text(prop, "Direction", "The direction (only applies to drag events)");
2481
2482 /* keyboard */
2483 prop = RNA_def_property(srna, "is_repeat", PROP_BOOLEAN, PROP_NONE);
2485 RNA_def_property_boolean_funcs(prop, "rna_Event_is_repeat_get", nullptr);
2486 RNA_def_property_ui_text(prop, "Is Repeat", "The event is generated by holding a key down");
2487
2488 /* Trackpad & NDOF. */
2489 prop = RNA_def_property(srna, "is_consecutive", PROP_BOOLEAN, PROP_NONE);
2491 RNA_def_property_boolean_funcs(prop, "rna_Event_is_consecutive_get", nullptr);
2493 "Is Consecutive",
2494 "Part of a trackpad or NDOF motion, "
2495 "interrupted by cursor motion, button or key press events");
2496
2497 /* mouse */
2498 prop = RNA_def_property(srna, "mouse_x", PROP_INT, PROP_NONE);
2499 RNA_def_property_int_sdna(prop, nullptr, "xy[0]");
2502 prop, "Mouse X Position", "The window relative horizontal location of the mouse");
2503
2504 prop = RNA_def_property(srna, "mouse_y", PROP_INT, PROP_NONE);
2505 RNA_def_property_int_sdna(prop, nullptr, "xy[1]");
2508 prop, "Mouse Y Position", "The window relative vertical location of the mouse");
2509
2510 prop = RNA_def_property(srna, "mouse_region_x", PROP_INT, PROP_NONE);
2511 RNA_def_property_int_sdna(prop, nullptr, "mval[0]");
2514 prop, "Mouse X Position", "The region relative horizontal location of the mouse");
2515
2516 prop = RNA_def_property(srna, "mouse_region_y", PROP_INT, PROP_NONE);
2517 RNA_def_property_int_sdna(prop, nullptr, "mval[1]");
2520 prop, "Mouse Y Position", "The region relative vertical location of the mouse");
2521
2522 prop = RNA_def_property(srna, "mouse_prev_x", PROP_INT, PROP_NONE);
2523 RNA_def_property_int_sdna(prop, nullptr, "prev_xy[0]");
2526 prop, "Mouse Previous X Position", "The window relative horizontal location of the mouse");
2527
2528 prop = RNA_def_property(srna, "mouse_prev_y", PROP_INT, PROP_NONE);
2529 RNA_def_property_int_sdna(prop, nullptr, "prev_xy[1]");
2532 prop, "Mouse Previous Y Position", "The window relative vertical location of the mouse");
2533
2534 prop = RNA_def_property(srna, "mouse_prev_press_x", PROP_INT, PROP_NONE);
2535 RNA_def_property_int_sdna(prop, nullptr, "prev_press_xy[0]");
2538 "Mouse Previous X Press Position",
2539 "The window relative horizontal location of the last press event");
2540
2541 prop = RNA_def_property(srna, "mouse_prev_press_y", PROP_INT, PROP_NONE);
2542 RNA_def_property_int_sdna(prop, nullptr, "prev_press_xy[1]");
2545 "Mouse Previous Y Press Position",
2546 "The window relative vertical location of the last press event");
2547
2548 prop = RNA_def_property(srna, "pressure", PROP_FLOAT, PROP_FACTOR);
2551 RNA_def_property_float_funcs(prop, "rna_Event_pressure_get", nullptr, nullptr);
2553 prop, "Tablet Pressure", "The pressure of the tablet or 1.0 if no tablet present");
2554
2555 prop = RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_XYZ_LENGTH);
2556 RNA_def_property_array(prop, 2);
2558 RNA_def_property_float_funcs(prop, "rna_Event_tilt_get", nullptr, nullptr);
2560 prop, "Tablet Tilt", "The pressure of the tablet or zeroes if no tablet present");
2561
2562 prop = RNA_def_property(srna, "is_tablet", PROP_BOOLEAN, PROP_NONE);
2564 RNA_def_property_boolean_funcs(prop, "rna_Event_is_tablet_get", nullptr);
2565 RNA_def_property_ui_text(prop, "Is Tablet", "The event has tablet data");
2566
2567 prop = RNA_def_property(srna, "is_mouse_absolute", PROP_BOOLEAN, PROP_NONE);
2568 RNA_def_property_boolean_sdna(prop, nullptr, "tablet.is_motion_absolute", 1);
2570 RNA_def_property_ui_text(prop, "Absolute Motion", "The last motion event was an absolute input");
2571
2572 /* NDOF motion. */
2573 prop = RNA_def_property(srna, "ndof_motion", PROP_POINTER, PROP_NONE);
2574 RNA_def_property_struct_type(prop, "NDOFMotionEventData");
2576 RNA_def_property_pointer_funcs(prop, "rna_Event_ndof_motion_get", nullptr, nullptr, nullptr);
2577 RNA_def_property_ui_text(prop, "NDOF motion", "NDOF motion event data");
2578
2579 /* xr */
2580 prop = RNA_def_property(srna, "xr", PROP_POINTER, PROP_NONE);
2581 RNA_def_property_struct_type(prop, "XrEventData");
2583 RNA_def_property_pointer_funcs(prop, "rna_Event_xr_get", nullptr, nullptr, nullptr);
2584 RNA_def_property_ui_text(prop, "XR", "XR event data");
2585
2586 /* modifiers */
2587 prop = RNA_def_property(srna, "shift", PROP_BOOLEAN, PROP_NONE);
2588 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_SHIFT);
2590 RNA_def_property_ui_text(prop, "Shift", "True when the Shift key is held");
2592
2593 prop = RNA_def_property(srna, "ctrl", PROP_BOOLEAN, PROP_NONE);
2594 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_CTRL);
2596 RNA_def_property_ui_text(prop, "Ctrl", "True when the Ctrl key is held");
2597
2598 prop = RNA_def_property(srna, "alt", PROP_BOOLEAN, PROP_NONE);
2599 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_ALT);
2601 RNA_def_property_ui_text(prop, "Alt", "True when the Alt/Option key is held");
2602
2603 prop = RNA_def_property(srna, "oskey", PROP_BOOLEAN, PROP_NONE);
2604 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_OSKEY);
2606 RNA_def_property_ui_text(prop, "OS Key", "True when the Cmd key is held");
2607
2608 prop = RNA_def_property(srna, "hyper", PROP_BOOLEAN, PROP_NONE);
2609 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_HYPER);
2611 RNA_def_property_ui_text(prop, "Hyper", "True when the Hyper key is held");
2612
2613 RNA_define_verify_sdna(true); /* not in sdna */
2614}
2615
2616static void rna_def_timer(BlenderRNA *brna)
2617{
2618 StructRNA *srna;
2619 PropertyRNA *prop;
2620
2621 srna = RNA_def_struct(brna, "Timer", nullptr);
2622 RNA_def_struct_ui_text(srna, "Timer", "Window event timer");
2623 RNA_def_struct_sdna(srna, "wmTimer");
2624
2625 RNA_define_verify_sdna(false); /* not in sdna */
2626
2627 /* could wrap more, for now this is enough */
2628 prop = RNA_def_property(srna, "time_step", PROP_FLOAT, PROP_NONE);
2629 RNA_def_property_float_sdna(prop, nullptr, "time_step");
2631 RNA_def_property_ui_text(prop, "Time Step", "");
2632
2633 prop = RNA_def_property(srna, "time_delta", PROP_FLOAT, PROP_NONE);
2634 RNA_def_property_float_sdna(prop, nullptr, "time_delta");
2636 RNA_def_property_ui_text(prop, "Delta", "Time since last step in seconds");
2637
2638 prop = RNA_def_property(srna, "time_duration", PROP_FLOAT, PROP_NONE);
2639 RNA_def_property_float_sdna(prop, nullptr, "time_duration");
2641 RNA_def_property_ui_text(prop, "Delta", "Time since the timer started seconds");
2642
2643 RNA_define_verify_sdna(true); /* not in sdna */
2644}
2645
2647 const char *rna_type,
2648 const char *c_type,
2649 const char *layout_get_fn)
2650{
2651 StructRNA *srna;
2652 PropertyRNA *prop;
2653
2654 srna = RNA_def_struct(brna, rna_type, nullptr);
2655 /* UI name isn't visible, name same as type. */
2656 RNA_def_struct_ui_text(srna, rna_type, "");
2657 RNA_def_struct_sdna(srna, c_type);
2658
2659 RNA_define_verify_sdna(false); /* not in sdna */
2660
2661 /* could wrap more, for now this is enough */
2662 prop = RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
2663 RNA_def_property_struct_type(prop, "UILayout");
2664 RNA_def_property_pointer_funcs(prop, layout_get_fn, nullptr, nullptr, nullptr);
2665
2666 RNA_define_verify_sdna(true); /* not in sdna */
2667}
2668
2670{
2671 rna_def_popup_menu_wrapper(brna, "UIPopupMenu", "uiPopupMenu", "rna_PopupMenu_layout_get");
2672}
2673
2675{
2676 rna_def_popup_menu_wrapper(brna, "UIPopover", "uiPopover", "rna_PopoverMenu_layout_get");
2677}
2678
2679static void rna_def_piemenu(BlenderRNA *brna)
2680{
2681 rna_def_popup_menu_wrapper(brna, "UIPieMenu", "uiPieMenu", "rna_PieMenu_layout_get");
2682}
2683
2685{
2686 StructRNA *srna;
2687 PropertyRNA *prop;
2688
2689 srna = RNA_def_struct(brna, "Stereo3dDisplay", nullptr);
2690 RNA_def_struct_sdna(srna, "Stereo3dFormat");
2691 RNA_def_struct_ui_text(srna, "Stereo 3D Display", "Settings for stereo 3D display");
2692
2693 prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
2695 RNA_def_property_ui_text(prop, "Display Mode", "");
2696
2697 prop = RNA_def_property(srna, "anaglyph_type", PROP_ENUM, PROP_NONE);
2699 RNA_def_property_ui_text(prop, "Anaglyph Type", "");
2700
2701 prop = RNA_def_property(srna, "interlace_type", PROP_ENUM, PROP_NONE);
2703 RNA_def_property_ui_text(prop, "Interlace Type", "");
2704
2705 prop = RNA_def_property(srna, "use_interlace_swap", PROP_BOOLEAN, PROP_BOOLEAN);
2706 RNA_def_property_boolean_sdna(prop, nullptr, "flag", S3D_INTERLACE_SWAP);
2707 RNA_def_property_ui_text(prop, "Swap Left/Right", "Swap left and right stereo channels");
2708
2709 prop = RNA_def_property(srna, "use_sidebyside_crosseyed", PROP_BOOLEAN, PROP_BOOLEAN);
2711 RNA_def_property_ui_text(prop, "Cross-Eyed", "Right eye should see left image and vice versa");
2712}
2713
2714static void rna_def_window(BlenderRNA *brna)
2715{
2716 StructRNA *srna;
2717 PropertyRNA *prop;
2718
2719 srna = RNA_def_struct(brna, "Window", nullptr);
2720 RNA_def_struct_ui_text(srna, "Window", "Open window");
2721 RNA_def_struct_sdna(srna, "wmWindow");
2722
2723 prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
2724 RNA_def_property_ui_text(prop, "Parent Window", "Active workspace and scene follow this window");
2725
2727
2728 prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
2730 RNA_def_property_pointer_funcs(prop, nullptr, "rna_Window_scene_set", nullptr, nullptr);
2731 RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the window");
2733 RNA_def_property_update(prop, 0, "rna_Window_scene_update");
2734
2735 prop = RNA_def_property(srna, "workspace", PROP_POINTER, PROP_NONE);
2737 RNA_def_property_struct_type(prop, "WorkSpace");
2738 RNA_def_property_ui_text(prop, "Workspace", "Active workspace showing in the window");
2740 prop, "rna_Window_workspace_get", "rna_Window_workspace_set", nullptr, nullptr);
2742 RNA_def_property_update(prop, 0, "rna_Window_workspace_update");
2743
2744 prop = RNA_def_property(srna, "screen", PROP_POINTER, PROP_NONE);
2745 RNA_def_property_struct_type(prop, "Screen");
2746 RNA_def_property_ui_text(prop, "Screen", "Active workspace screen showing in the window");
2748 "rna_Window_screen_get",
2749 "rna_Window_screen_set",
2750 nullptr,
2751 "rna_Window_screen_assign_poll");
2754 RNA_def_property_update(prop, 0, "rna_workspace_screen_update");
2755
2756 prop = RNA_def_property(srna, "view_layer", PROP_POINTER, PROP_NONE);
2757 RNA_def_property_struct_type(prop, "ViewLayer");
2759 prop, "rna_Window_view_layer_get", "rna_Window_view_layer_set", nullptr, nullptr);
2761 prop, "Active View Layer", "The active workspace view layer showing in the window");
2763 RNA_def_property_update(prop, NC_SCREEN | ND_LAYER, nullptr);
2764
2765 prop = RNA_def_property(srna, "x", PROP_INT, PROP_NONE);
2766 RNA_def_property_int_sdna(prop, nullptr, "posx");
2768 RNA_def_property_ui_text(prop, "X Position", "Horizontal location of the window");
2769
2770 prop = RNA_def_property(srna, "y", PROP_INT, PROP_NONE);
2771 RNA_def_property_int_sdna(prop, nullptr, "posy");
2773 RNA_def_property_ui_text(prop, "Y Position", "Vertical location of the window");
2774
2775 prop = RNA_def_property(srna, "width", PROP_INT, PROP_UNSIGNED);
2776 RNA_def_property_int_sdna(prop, nullptr, "sizex");
2778 RNA_def_property_ui_text(prop, "Width", "Window width");
2779
2780 prop = RNA_def_property(srna, "height", PROP_INT, PROP_UNSIGNED);
2781 RNA_def_property_int_sdna(prop, nullptr, "sizey");
2783 RNA_def_property_ui_text(prop, "Height", "Window height");
2784
2785 prop = RNA_def_property(srna, "stereo_3d_display", PROP_POINTER, PROP_NONE);
2786 RNA_def_property_pointer_sdna(prop, nullptr, "stereo3d_format");
2788 RNA_def_property_struct_type(prop, "Stereo3dDisplay");
2789 RNA_def_property_ui_text(prop, "Stereo 3D Display", "Settings for stereo 3D display");
2790
2791 prop = RNA_def_property(srna, "support_hdr_color", PROP_BOOLEAN, PROP_NONE);
2794 "Support HDR Color",
2795 "The window has a HDR graphics buffer that wide gamut and high dynamic "
2796 "range colors can be written to, in extended sRGB color space.");
2797 RNA_def_property_boolean_funcs(prop, "rna_Window_support_hdr_color_get", nullptr);
2798
2799 prop = RNA_def_property(srna, "modal_operators", PROP_COLLECTION, PROP_NONE);
2800 RNA_def_property_struct_type(prop, "Operator");
2803 "rna_Window_modal_operators_begin",
2804 "rna_iterator_listbase_next",
2805 "rna_iterator_listbase_end",
2806 "rna_Window_modal_operators_get",
2807 nullptr,
2808 nullptr,
2809 nullptr,
2810 nullptr);
2811 RNA_def_property_ui_text(prop, "Modal Operators", "A list of currently running modal operators");
2812
2813 RNA_api_window(srna);
2814}
2815
2816/* curve.splines */
2818{
2819 StructRNA *srna;
2820 PropertyRNA *prop;
2821
2822 RNA_def_property_srna(cprop, "KeyConfigurations");
2823 srna = RNA_def_struct(brna, "KeyConfigurations", nullptr);
2824 RNA_def_struct_sdna(srna, "wmWindowManager");
2825 RNA_def_struct_ui_text(srna, "KeyConfigs", "Collection of KeyConfigs");
2826
2827 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2828 RNA_def_property_struct_type(prop, "KeyConfig");
2830 "rna_WindowManager_active_keyconfig_get",
2831 "rna_WindowManager_active_keyconfig_set",
2832 nullptr,
2833 nullptr);
2835 RNA_def_property_ui_text(prop, "Active KeyConfig", "Active key configuration (preset)");
2836
2837 prop = RNA_def_property(srna, "default", PROP_POINTER, PROP_NEVER_NULL);
2839 prop, "rna_WindowManager_default_keyconfig_get", nullptr, nullptr, nullptr);
2840 RNA_def_property_struct_type(prop, "KeyConfig");
2841 RNA_def_property_ui_text(prop, "Default Key Configuration", "Default builtin key configuration");
2842
2843 prop = RNA_def_property(srna, "addon", PROP_POINTER, PROP_NEVER_NULL);
2844 RNA_def_property_struct_type(prop, "KeyConfig");
2846 prop, "rna_WindowManager_addon_keyconfig_get", nullptr, nullptr, nullptr);
2848 prop,
2849 "Add-on Key Configuration",
2850 "Key configuration that can be extended by add-ons, and is added to the active "
2851 "configuration when handling events");
2852
2853 prop = RNA_def_property(srna, "user", PROP_POINTER, PROP_NEVER_NULL);
2854 RNA_def_property_struct_type(prop, "KeyConfig");
2856 prop, "rna_WindowManager_user_keyconfig_get", nullptr, nullptr, nullptr);
2858 prop,
2859 "User Key Configuration",
2860 "Final key configuration that combines keymaps from the active and add-on configurations, "
2861 "and can be edited by the user");
2862
2863 RNA_api_keyconfigs(srna);
2864}
2865
2867{
2868 StructRNA *srna;
2869 PropertyRNA *prop;
2870
2871 srna = RNA_def_struct(brna, "WindowManager", "ID");
2873 srna,
2874 "Window Manager",
2875 "Window manager data-block defining open windows and other user interface data");
2877 RNA_def_struct_sdna(srna, "wmWindowManager");
2878
2879 prop = RNA_def_property(srna, "operators", PROP_COLLECTION, PROP_NONE);
2880 RNA_def_property_struct_type(prop, "Operator");
2882 "rna_WindowManager_operators_begin",
2883 "rna_iterator_listbase_next",
2884 "rna_iterator_listbase_end",
2885 "rna_iterator_listbase_get",
2886 nullptr,
2887 nullptr,
2888 nullptr,
2889 nullptr);
2890 RNA_def_property_ui_text(prop, "Operators", "Operator registry");
2891
2892 prop = RNA_def_property(srna, "windows", PROP_COLLECTION, PROP_NONE);
2893 RNA_def_property_struct_type(prop, "Window");
2894 RNA_def_property_ui_text(prop, "Windows", "Open windows");
2895
2896 prop = RNA_def_property(srna, "keyconfigs", PROP_COLLECTION, PROP_NONE);
2897 RNA_def_property_struct_type(prop, "KeyConfig");
2899 "rna_WindowManager_keyconfigs_begin",
2900 "rna_iterator_listbase_next",
2901 "rna_iterator_listbase_end",
2902 "rna_iterator_listbase_get",
2903 nullptr,
2904 nullptr,
2905 nullptr,
2906 nullptr);
2907 RNA_def_property_ui_text(prop, "Key Configurations", "Registered key configurations");
2908 rna_def_wm_keyconfigs(brna, prop);
2909
2910 prop = RNA_def_property(srna, "xr_session_settings", PROP_POINTER, PROP_NONE);
2911 RNA_def_property_pointer_sdna(prop, nullptr, "xr.session_settings");
2913 RNA_def_property_ui_text(prop, "XR Session Settings", "");
2914
2915 prop = RNA_def_property(srna, "xr_session_state", PROP_POINTER, PROP_NONE);
2916 RNA_def_property_struct_type(prop, "XrSessionState");
2918 prop, "rna_WindowManager_xr_session_state_get", nullptr, nullptr, nullptr);
2921 prop, "XR Session State", "Runtime state information about the VR session");
2922
2923 prop = RNA_def_property(srna, "extensions_updates", PROP_INT, PROP_NONE);
2925 prop, "Extensions Updates", "Number of extensions with available update");
2926 RNA_def_property_update(prop, 0, "rna_WindowManager_extensions_statusbar_update");
2927
2928 prop = RNA_def_property(srna, "extensions_blocked", PROP_INT, PROP_NONE);
2930 prop, "Extensions Blocked", "Number of installed extensions which are blocked");
2931 RNA_def_property_update(prop, 0, "rna_WindowManager_extensions_statusbar_update");
2932
2933 RNA_api_wm(srna);
2934}
2935
2936/* keyconfig.items */
2938{
2939 StructRNA *srna;
2940
2941 RNA_def_property_srna(cprop, "KeyMapItems");
2942 srna = RNA_def_struct(brna, "KeyMapItems", nullptr);
2943 RNA_def_struct_sdna(srna, "wmKeyMap");
2944 RNA_def_struct_ui_text(srna, "KeyMap Items", "Collection of keymap items");
2945
2946 RNA_api_keymapitems(srna);
2947}
2948
2950{
2951 StructRNA *srna;
2952
2953 RNA_def_property_srna(cprop, "KeyMaps");
2954 srna = RNA_def_struct(brna, "KeyMaps", nullptr);
2955 RNA_def_struct_sdna(srna, "wmKeyConfig");
2956 RNA_def_struct_ui_text(srna, "Key Maps", "Collection of keymaps");
2957
2958 RNA_api_keymaps(srna);
2959}
2960
2962{
2963 StructRNA *srna;
2964 PropertyRNA *prop;
2965
2966 srna = RNA_def_struct(brna, "KeyConfigPreferences", nullptr);
2967 RNA_def_struct_ui_text(srna, "Key-Config Preferences", "");
2968 RNA_def_struct_sdna(srna, "wmKeyConfigPref"); /* WARNING: only a bAddon during registration */
2969
2970 RNA_def_struct_refine_func(srna, "rna_wmKeyConfigPref_refine");
2972 srna, "rna_wmKeyConfigPref_register", "rna_wmKeyConfigPref_unregister", nullptr);
2973 RNA_def_struct_system_idprops_func(srna, "rna_wmKeyConfigPref_idprops");
2975
2976 /* registration */
2978 prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
2979 RNA_def_property_string_sdna(prop, nullptr, "idname");
2982}
2983
2985{
2986 StructRNA *srna;
2987 PropertyRNA *prop;
2988
2989 static const EnumPropertyItem map_type_items[] = {
2990 {KMI_TYPE_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""},
2991 {KMI_TYPE_MOUSE, "MOUSE", 0, "Mouse", ""},
2992 {KMI_TYPE_NDOF, "NDOF", 0, "NDOF", ""},
2993 {KMI_TYPE_TEXTINPUT, "TEXTINPUT", 0, "Text Input", ""},
2994 {KMI_TYPE_TIMER, "TIMER", 0, "Timer", ""},
2995 {0, nullptr, 0, nullptr, nullptr},
2996 };
2997
2998 /* KeyConfig */
2999 srna = RNA_def_struct(brna, "KeyConfig", nullptr);
3000 RNA_def_struct_sdna(srna, "wmKeyConfig");
3001 RNA_def_struct_ui_text(srna, "Key Configuration", "Input configuration, including keymaps");
3002
3003 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
3004 RNA_def_property_string_sdna(prop, nullptr, "idname");
3005 RNA_def_property_ui_text(prop, "Name", "Name of the key configuration");
3006 RNA_def_struct_name_property(srna, prop);
3007
3008 prop = RNA_def_property(srna, "keymaps", PROP_COLLECTION, PROP_NONE);
3009 RNA_def_property_struct_type(prop, "KeyMap");
3010 RNA_def_property_ui_text(prop, "Key Maps", "Key maps configured as part of this configuration");
3011 rna_def_wm_keymaps(brna, prop);
3012
3013 prop = RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
3014 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KEYCONF_USER);
3017 prop, "User Defined", "Indicates that a keyconfig was defined by the user");
3018
3019 /* Collection active property */
3020 prop = RNA_def_property(srna, "preferences", PROP_POINTER, PROP_NONE);
3021 RNA_def_property_struct_type(prop, "KeyConfigPreferences");
3023 prop, "rna_wmKeyConfig_preferences_get", nullptr, nullptr, nullptr);
3024
3025 RNA_api_keyconfig(srna);
3026
3027 /* KeyMap */
3028 srna = RNA_def_struct(brna, "KeyMap", nullptr);
3029 RNA_def_struct_sdna(srna, "wmKeyMap");
3030 RNA_def_struct_ui_text(srna, "Key Map", "Input configuration, including keymaps");
3031
3032 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
3033 RNA_def_property_string_sdna(prop, nullptr, "idname");
3035 RNA_def_property_ui_text(prop, "Name", "Name of the key map");
3036 RNA_def_struct_name_property(srna, prop);
3037
3038 prop = RNA_def_property(srna, "bl_owner_id", PROP_STRING, PROP_NONE);
3039 RNA_def_property_string_sdna(prop, nullptr, "owner_id");
3040 RNA_def_property_ui_text(prop, "Owner", "Internal owner");
3041
3042 prop = RNA_def_property(srna, "space_type", PROP_ENUM, PROP_NONE);
3043 RNA_def_property_enum_sdna(prop, nullptr, "spaceid");
3046 RNA_def_property_ui_text(prop, "Space Type", "Optional space type keymap is associated with");
3047
3048 prop = RNA_def_property(srna, "region_type", PROP_ENUM, PROP_NONE);
3049 RNA_def_property_enum_sdna(prop, nullptr, "regionid");
3052 RNA_def_property_ui_text(prop, "Region Type", "Optional region type keymap is associated with");
3053
3054 prop = RNA_def_property(srna, "keymap_items", PROP_COLLECTION, PROP_NONE);
3055 RNA_def_property_collection_sdna(prop, nullptr, "items", nullptr);
3056 RNA_def_property_struct_type(prop, "KeyMapItem");
3058 prop, "Items", "Items in the keymap, linking an operator to an input event");
3059 rna_def_keymap_items(brna, prop);
3060
3061 prop = RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NONE);
3063 RNA_def_property_ui_text(prop, "User Defined", "Keymap is defined by the user");
3064
3065 prop = RNA_def_property(srna, "is_modal", PROP_BOOLEAN, PROP_NONE);
3066 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KEYMAP_MODAL);
3069 prop,
3070 "Modal Keymap",
3071 "Indicates that a keymap is used for translate modal events for an operator");
3072
3073 prop = RNA_def_property(srna, "show_expanded_items", PROP_BOOLEAN, PROP_NONE);
3074 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KEYMAP_EXPANDED);
3075 RNA_def_property_ui_text(prop, "Items Expanded", "Expanded in the user interface");
3076 RNA_def_property_ui_icon(prop, ICON_RIGHTARROW, 1);
3077
3078 prop = RNA_def_property(srna, "show_expanded_children", PROP_BOOLEAN, PROP_NONE);
3080 RNA_def_property_ui_text(prop, "Children Expanded", "Children expanded in the user interface");
3081 RNA_def_property_ui_icon(prop, ICON_RIGHTARROW, 1);
3082
3083 prop = RNA_def_property(srna, "modal_event_values", PROP_COLLECTION, PROP_NONE);
3085 RNA_def_property_struct_type(prop, "EnumPropertyItem");
3087 "rna_KeyMap_modal_event_values_items_begin",
3088 "rna_iterator_array_next",
3089 "rna_iterator_array_end",
3090 "rna_iterator_array_get",
3091 nullptr,
3092 nullptr,
3093 nullptr,
3094 nullptr);
3096 "Modal Events",
3097 "Give access to the possible event values of this modal keymap's items "
3098 "(#KeyMapItem.propvalue), for API introspection");
3099
3100 RNA_api_keymap(srna);
3101
3102 /* KeyMapItem */
3103 srna = RNA_def_struct(brna, "KeyMapItem", nullptr);
3104 RNA_def_struct_sdna(srna, "wmKeyMapItem");
3105 RNA_def_struct_ui_text(srna, "Key Map Item", "Item in a Key Map");
3106
3107 prop = RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
3108 RNA_def_property_string_sdna(prop, nullptr, "idname");
3109 RNA_def_property_ui_text(prop, "Identifier", "Identifier of operator to call on input event");
3111 "rna_wmKeyMapItem_idname_get",
3112 "rna_wmKeyMapItem_idname_length",
3113 "rna_wmKeyMapItem_idname_set");
3115 "WM_operatortype_idname_visit_for_search",
3117 RNA_def_struct_name_property(srna, prop);
3118 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3119
3120 /* this is in fact the operator name, but if the operator can't be found we
3121 * fall back on the operator ID */
3122 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
3124 RNA_def_property_ui_text(prop, "Name", "Name of operator (translated) to call on input event");
3126 prop, "rna_wmKeyMapItem_name_get", "rna_wmKeyMapItem_name_length", nullptr);
3127
3128 prop = RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
3129 RNA_def_property_struct_type(prop, "OperatorProperties");
3130 RNA_def_property_pointer_funcs(prop, "rna_KeyMapItem_properties_get", nullptr, nullptr, nullptr);
3131 RNA_def_property_ui_text(prop, "Properties", "Properties to set when the operator is called");
3132 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3133
3134 prop = RNA_def_property(srna, "map_type", PROP_ENUM, PROP_NONE);
3135 RNA_def_property_enum_sdna(prop, nullptr, "maptype");
3136 RNA_def_property_enum_items(prop, map_type_items);
3138 prop, "rna_wmKeyMapItem_map_type_get", "rna_wmKeyMapItem_map_type_set", nullptr);
3139 RNA_def_property_ui_text(prop, "Map Type", "Type of event mapping");
3140 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3141
3142 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
3143 RNA_def_property_enum_sdna(prop, nullptr, "type");
3146 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_KeyMapItem_type_itemf");
3147 RNA_def_property_ui_text(prop, "Type", "Type of event");
3148 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3149
3150 prop = RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
3151 RNA_def_property_enum_sdna(prop, nullptr, "val");
3153 RNA_def_property_ui_text(prop, "Value", "");
3154 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3155
3156 prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
3157 RNA_def_property_enum_sdna(prop, nullptr, "direction");
3159 RNA_def_property_ui_text(prop, "Direction", "The direction (only applies to drag events)");
3160 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3161
3162 prop = RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
3163 RNA_def_property_int_sdna(prop, nullptr, "id");
3165 RNA_def_property_ui_text(prop, "ID", "ID of the item");
3166 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3167
3168 prop = RNA_def_property(srna, "any", PROP_BOOLEAN, PROP_NONE);
3169 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_any_get", "rna_KeyMapItem_any_set");
3170 RNA_def_property_ui_text(prop, "Any", "Any modifier keys pressed");
3171 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3172
3173 prop = RNA_def_property(srna, "shift", PROP_INT, PROP_NONE);
3174 RNA_def_property_int_sdna(prop, nullptr, "shift");
3176 RNA_def_property_ui_text(prop, "Shift", "Shift key pressed, -1 for any state");
3178 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3179
3180 prop = RNA_def_property(srna, "ctrl", PROP_INT, PROP_NONE);
3181 RNA_def_property_int_sdna(prop, nullptr, "ctrl");
3183 RNA_def_property_ui_text(prop, "Ctrl", "Control key pressed, -1 for any state");
3184 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3185
3186 prop = RNA_def_property(srna, "alt", PROP_INT, PROP_NONE);
3187 RNA_def_property_int_sdna(prop, nullptr, "alt");
3189 RNA_def_property_ui_text(prop, "Alt", "Alt key pressed, -1 for any state");
3190 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3191
3192 prop = RNA_def_property(srna, "oskey", PROP_INT, PROP_NONE);
3193 RNA_def_property_int_sdna(prop, nullptr, "oskey");
3195 RNA_def_property_ui_text(prop, "OS Key", "Operating system key pressed, -1 for any state");
3196 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3197
3198 prop = RNA_def_property(srna, "hyper", PROP_INT, PROP_NONE);
3199 RNA_def_property_int_sdna(prop, nullptr, "hyper");
3201 RNA_def_property_ui_text(prop, "Hyper", "Hyper key pressed, -1 for any state");
3202 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3203
3204 /* XXX(@ideasman42): the `*_ui` suffix is only for the UI, may be removed,
3205 * since this is only exposed so the UI can show these settings as toggle-buttons. */
3206 prop = RNA_def_property(srna, "shift_ui", PROP_BOOLEAN, PROP_NONE);
3207 RNA_def_property_boolean_sdna(prop, nullptr, "shift", 0);
3208 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_shift_get", nullptr);
3209 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3210 RNA_def_property_ui_text(prop, "Shift", "Shift key pressed");
3212 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3213
3214 prop = RNA_def_property(srna, "ctrl_ui", PROP_BOOLEAN, PROP_NONE);
3215 RNA_def_property_boolean_sdna(prop, nullptr, "ctrl", 0);
3216 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_ctrl_get", nullptr);
3217 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3218 RNA_def_property_ui_text(prop, "Ctrl", "Control key pressed");
3219 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3220
3221 prop = RNA_def_property(srna, "alt_ui", PROP_BOOLEAN, PROP_NONE);
3222 RNA_def_property_boolean_sdna(prop, nullptr, "alt", 0);
3223 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_alt_get", nullptr);
3224 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3225 RNA_def_property_ui_text(prop, "Alt", "Alt key pressed");
3226 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3227
3228 prop = RNA_def_property(srna, "oskey_ui", PROP_BOOLEAN, PROP_NONE);
3229 RNA_def_property_boolean_sdna(prop, nullptr, "oskey", 0);
3230 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_oskey_get", nullptr);
3231 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3232 RNA_def_property_ui_text(prop, "OS Key", "Operating system key pressed");
3233 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3234
3235 prop = RNA_def_property(srna, "hyper_ui", PROP_BOOLEAN, PROP_NONE);
3236 RNA_def_property_boolean_sdna(prop, nullptr, "hyper", 0);
3237 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_hyper_get", nullptr);
3238 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3240 prop,
3241 "Hyper",
3242 "Hyper key pressed. "
3243 /* Additional info since this is not so widely known. */
3244 "An additional modifier which can be configured on Linux, typically replacing CapsLock");
3245 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3246 /* End `_ui` modifiers. */
3247
3248 prop = RNA_def_property(srna, "key_modifier", PROP_ENUM, PROP_NONE);
3249 RNA_def_property_enum_sdna(prop, nullptr, "keymodifier");
3252 RNA_def_property_enum_funcs(prop, nullptr, "rna_wmKeyMapItem_keymodifier_set", nullptr);
3253 RNA_def_property_ui_text(prop, "Key Modifier", "Regular key pressed as a modifier");
3254 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3255
3256 prop = RNA_def_property(srna, "repeat", PROP_BOOLEAN, PROP_NONE);
3259 RNA_def_property_ui_text(prop, "Repeat", "Active on key-repeat events (when a key is held)");
3260 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3261
3262 prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
3264 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KMI_EXPANDED);
3266 prop, "Expanded", "Show key map event and property details in the user interface");
3267 RNA_def_property_ui_icon(prop, ICON_RIGHTARROW, 1);
3268 /* Display only, no need to call `rna_KeyMapItem_update`. */
3269
3270 prop = RNA_def_property(srna, "propvalue", PROP_ENUM, PROP_NONE);
3271 RNA_def_property_enum_sdna(prop, nullptr, "propvalue");
3273 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_KeyMapItem_propvalue_itemf");
3275 prop, "Property Value", "The value this event translates to in a modal keymap");
3277 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3278
3279 prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
3281 RNA_def_property_ui_text(prop, "Active", "Activate or deactivate item");
3282 RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
3283 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3284
3285 prop = RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NONE);
3286 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KMI_USER_MODIFIED);
3288 RNA_def_property_ui_text(prop, "User Modified", "Is this keymap item modified by the user");
3289
3290 prop = RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
3293 prop,
3294 "User Defined",
3295 "Is this keymap item user defined (does not just replace a builtin item)");
3296 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_userdefined_get", nullptr);
3297
3298 RNA_api_keymapitem(srna);
3299}
3300
3320
3321#endif /* RNA_RUNTIME */
Main * CTX_data_main(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
@ G_DEBUG
void BKE_keyconfig_pref_type_add(struct wmKeyConfigPrefType_Runtime *kpt_rt)
Definition keyconfig.cc:84
void BKE_keyconfig_pref_type_remove(const struct wmKeyConfigPrefType_Runtime *kpt_rt)
struct wmKeyConfigPref * BKE_keyconfig_pref_ensure(struct UserDef *userdef, const char *kc_idname)
Definition keyconfig.cc:34
struct wmKeyConfigPrefType_Runtime wmKeyConfigPrefType_Runtime
struct wmKeyConfigPrefType_Runtime * BKE_keyconfig_pref_type_find(const char *idname, bool quiet)
Definition keyconfig.cc:60
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
@ RPT_ERROR_OUT_OF_MEMORY
Definition BKE_report.hh:42
@ RPT_INFO
Definition BKE_report.hh:35
@ RPT_OPERATOR
Definition BKE_report.hh:36
@ RPT_ERROR_INVALID_INPUT
Definition BKE_report.hh:40
@ RPT_DEBUG
Definition BKE_report.hh:34
@ RPT_ERROR
Definition BKE_report.hh:39
@ RPT_ERROR_INVALID_CONTEXT
Definition BKE_report.hh:41
@ RPT_WARNING
Definition BKE_report.hh:38
@ RPT_PROPERTY
Definition BKE_report.hh:37
#define BKE_ST_MAXNAME
Definition BKE_screen.hh:72
WorkSpaceLayout * BKE_workspace_layout_find(const WorkSpace *workspace, const bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
Definition workspace.cc:429
bScreen * BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook) GETTER_ATTRS
Definition workspace.cc:614
WorkSpace * BKE_workspace_active_get(WorkSpaceInstanceHook *hook) GETTER_ATTRS
Definition workspace.cc:563
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_STATIC_ASSERT(a, msg)
Definition BLI_assert.h:83
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
void BLI_kdtree_nd_ free(KDTree *tree)
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:608
MINLINE void copy_v3_v3(float r[3], const float a[3])
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:693
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
unsigned int unsigned int BLI_str_utf8_as_unicode_step_or_error(const char *__restrict p, size_t p_len, size_t *__restrict index) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
#define BLI_UTF8_ERR
const char int BLI_str_utf8_size_or_error(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define BLI_STR_UTF8_LEFTWARDS_ARROW
#define BLI_STR_UTF8_UPWARDS_ARROW
#define BLI_STR_UTF8_DOWNWARDS_ARROW
#define BLI_STR_UTF8_BLACK_RIGHT_POINTING_DOUBLE_TRIANGLE_WITH_VERTICAL_BAR
#define BLI_STR_UTF8_BLACK_SQUARE_FOR_STOP
#define BLI_STR_UTF8_RIGHTWARDS_ARROW
#define BLI_STR_UTF8_BLACK_LEFT_POINTING_DOUBLE_TRIANGLE_WITH_VERTICAL_BAR
#define BLI_STR_UTF8_BLACK_RIGHT_POINTING_TRIANGLE_WITH_DOUBLE_VERTICAL_BAR
void void char * BLI_string_join_array_by_sep_char_with_tableN(char sep, char *table[], const char *strings[], uint strings_num) ATTR_NONNULL(2
#define ARRAY_SIZE(arr)
#define UNUSED_VARS(...)
#define ARRAY_SET_ITEMS(...)
#define UNLIKELY(x)
#define STREQ(a, b)
#define BLT_I18NCONTEXT_ID_WINDOWMANAGER
#define CTX_N_(context, msgid)
#define BLT_I18NCONTEXT_ID_SCREEN
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define BLT_I18NCONTEXT_UI_EVENTS
#define BPy_BEGIN_ALLOW_THREADS
Definition BPY_extern.hh:52
#define BPy_END_ALLOW_THREADS
Definition BPY_extern.hh:56
ID and Library types, which are fundamental for SDNA.
@ ID_WM
@ S3D_INTERLACE_SWAP
@ S3D_SIDEBYSIDE_CROSSEYED
@ STATUSBAR_SHOW_EXTENSIONS_UPDATES
@ OPERATOR_CANCELLED
@ OPERATOR_INTERFACE
@ OPERATOR_FINISHED
@ OPERATOR_RUNNING_MODAL
@ OPERATOR_PASS_THROUGH
@ OP_IS_REPEAT_LAST
@ OP_IS_MODAL_CURSOR_REGION
@ OP_IS_MODAL_GRAB_CURSOR
#define OPERATOR_RETVAL_CHECK(ret)
#define OP_MAX_TYPENAME
@ KEYMAP_USER_MODIFIED
@ KEYMAP_CHILDREN_EXPANDED
Read Guarded memory(de)allocation.
#define RNA_DYN_DESCR_MAX
@ STRUCT_ID_REFCOUNT
Definition RNA_types.hh:959
@ STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID
Definition RNA_types.hh:982
@ STRUCT_NO_DATABLOCK_IDPROPERTIES
Definition RNA_types.hh:970
@ STRUCT_NO_IDPROPERTIES
Definition RNA_types.hh:968
@ STRUCT_PUBLIC_NAMESPACE_INHERIT
Definition RNA_types.hh:976
@ PROP_STRING_SEARCH_SUGGESTION
Definition RNA_types.hh:792
@ PROP_STRING_SEARCH_SORT
Definition RNA_types.hh:785
int(*)(PointerRNA *ptr, void *data, bool *have_function) StructValidateFunc
Definition RNA_types.hh:985
@ PROP_FLOAT
Definition RNA_types.hh:164
@ PROP_BOOLEAN
Definition RNA_types.hh:162
@ PROP_ENUM
Definition RNA_types.hh:166
@ PROP_INT
Definition RNA_types.hh:163
@ PROP_STRING
Definition RNA_types.hh:165
@ PROP_POINTER
Definition RNA_types.hh:167
@ PROP_COLLECTION
Definition RNA_types.hh:168
#define RNA_ENUM_ITEM_SEPR
Definition RNA_types.hh:676
int(*)(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *list) StructCallbackFunc
Definition RNA_types.hh:986
void(*)(void *data) StructFreeFunc
Definition RNA_types.hh:990
@ PROP_CONTEXT_UPDATE
Definition RNA_types.hh:407
@ PROP_EDITABLE
Definition RNA_types.hh:306
@ PROP_ENUM_FLAG
Definition RNA_types.hh:404
@ PROP_REGISTER_OPTIONAL
Definition RNA_types.hh:412
@ PROP_NEVER_NULL
Definition RNA_types.hh:377
@ PROP_NO_DEG_UPDATE
Definition RNA_types.hh:439
@ PROP_REGISTER
Definition RNA_types.hh:411
@ PROP_IDPROPERTY
Definition RNA_types.hh:426
@ PROP_TIME
Definition RNA_types.hh:253
@ PROP_XYZ
Definition RNA_types.hh:269
@ PROP_FILENAME
Definition RNA_types.hh:238
@ PROP_NONE
Definition RNA_types.hh:233
@ PROP_FACTOR
Definition RNA_types.hh:251
@ PROP_XYZ_LENGTH
Definition RNA_types.hh:270
@ PROP_UNSIGNED
Definition RNA_types.hh:249
#define C
Definition RandGen.cpp:29
uiLayout * UI_pie_menu_layout(uiPieMenu *pie)
uiLayout * UI_popover_layout(uiPopover *pup)
uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
@ WM_JOB_TYPE_COMPOSITE
Definition WM_api.hh:1777
@ WM_JOB_TYPE_OBJECT_BAKE
Definition WM_api.hh:1785
@ WM_JOB_TYPE_RENDER_PREVIEW
Definition WM_api.hh:1779
@ WM_JOB_TYPE_RENDER
Definition WM_api.hh:1778
@ WM_JOB_TYPE_SHADER_COMPILATION
Definition WM_api.hh:1800
#define NC_WINDOW
Definition WM_types.hh:375
#define ND_SPACE_INFO
Definition WM_types.hh:521
@ KM_CTRL
Definition WM_types.hh:279
@ KM_ALT
Definition WM_types.hh:280
@ KM_HYPER
Definition WM_types.hh:292
@ KM_OSKEY
Definition WM_types.hh:282
@ KM_SHIFT
Definition WM_types.hh:278
@ WM_EVENT_IS_CONSECUTIVE
Definition WM_types.hh:692
@ WM_EVENT_IS_REPEAT
Definition WM_types.hh:684
@ KM_TEXTINPUT
Definition WM_types.hh:304
@ KM_NOTHING
Definition WM_types.hh:310
@ KM_ANY
Definition WM_types.hh:309
@ KM_PRESS
Definition WM_types.hh:311
@ KM_DBL_CLICK
Definition WM_types.hh:314
@ KM_PRESS_DRAG
Definition WM_types.hh:319
@ KM_RELEASE
Definition WM_types.hh:312
@ KM_CLICK
Definition WM_types.hh:313
#define NC_SCREEN
Definition WM_types.hh:377
#define NC_SCENE
Definition WM_types.hh:378
@ OPTYPE_PRESET
Definition WM_types.hh:195
@ OPTYPE_INTERNAL
Definition WM_types.hh:202
@ OPTYPE_MACRO
Definition WM_types.hh:185
@ OPTYPE_BLOCKING
Definition WM_types.hh:184
@ OPTYPE_MODAL_PRIORITY
Definition WM_types.hh:221
@ OPTYPE_UNDO_GROUPED
Definition WM_types.hh:207
@ OPTYPE_DEPENDS_ON_CURSOR
Definition WM_types.hh:218
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_GRAB_CURSOR_XY
Definition WM_types.hh:188
@ OPTYPE_REGISTER
Definition WM_types.hh:180
@ OPTYPE_GRAB_CURSOR_X
Definition WM_types.hh:190
@ OPTYPE_GRAB_CURSOR_Y
Definition WM_types.hh:192
#define NA_EDITED
Definition WM_types.hh:584
#define OP_PROP_TAG_ADVANCED
Definition WM_types.hh:266
#define ND_LAYER
Definition WM_types.hh:450
#define ND_WORKSPACE_SET
Definition WM_types.hh:428
#define ND_LAYOUTBROWSE
Definition WM_types.hh:422
@ KM_DIRECTION_NW
Definition WM_types.hh:341
@ KM_DIRECTION_N
Definition WM_types.hh:334
@ KM_DIRECTION_SW
Definition WM_types.hh:339
@ KM_DIRECTION_NE
Definition WM_types.hh:335
@ KM_DIRECTION_E
Definition WM_types.hh:336
@ KM_DIRECTION_W
Definition WM_types.hh:340
@ KM_DIRECTION_SE
Definition WM_types.hh:337
@ KM_DIRECTION_S
Definition WM_types.hh:338
#define ND_SCENEBROWSE
Definition WM_types.hh:432
@ P_IN_PROGRESS
Definition WM_types.hh:853
@ P_STARTING
Definition WM_types.hh:852
@ P_FINISHING
Definition WM_types.hh:854
#define NC_SPACE
Definition WM_types.hh:392
#define KM_MOD_HELD
Definition WM_types.hh:326
#define U
BMesh const char void * data
void BPY_RNA_operator_macro_wrapper(wmOperatorType *ot, void *userdata)
void BPY_RNA_operator_wrapper(wmOperatorType *ot, void *userdata)
#define offsetof(t, d)
#define str(s)
#define GS(x)
#define printf(...)
void * MEM_mallocN(size_t len, const char *str)
Definition mallocn.cc:128
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
static ulong state[N]
#define G(x, y, z)
const char * name
return ret
PointerRNA RNA_pointer_create_id_subdata(ID &id, StructRNA *type, void *data)
bool RNA_struct_available_or_report(ReportList *reports, const char *identifier)
void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
uint RNA_enum_items_count(const EnumPropertyItem *item)
const PointerRNA PointerRNA_NULL
void * RNA_struct_blender_type_get(StructRNA *srna)
void RNA_parameter_list_free(ParameterList *parms)
void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, PointerRNA *ptr, ListBase *lb, IteratorSkipFunc skip)
void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value)
void rna_iterator_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr, void *data, size_t itemsize, int64_t length, bool free_ptr, IteratorSkipFunc skip)
ParameterList * RNA_parameter_list_create(ParameterList *parms, PointerRNA *, FunctionRNA *func)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
void * rna_iterator_listbase_get(CollectionPropertyIterator *iter)
void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **r_value)
PointerRNA RNA_pointer_create_with_parent(const PointerRNA &parent, StructRNA *type, void *data)
PointerRNA RNA_id_pointer_create(ID *id)
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop)
void RNA_def_struct_refine_func(StructRNA *srna, const char *refine)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_system_idprops_func(StructRNA *srna, const char *system_idproperties)
void RNA_def_struct_flag(StructRNA *srna, int flag)
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set)
void RNA_def_property_float_default(PropertyRNA *prop, float value)
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_define_verify_sdna(bool verify)
void RNA_def_property_string_search_func(PropertyRNA *prop, const char *search, const eStringPropertySearchFlag search_flag)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, int consecutive)
void RNA_def_struct_property_tags(StructRNA *srna, const EnumPropertyItem *prop_tag_defines)
void RNA_def_property_srna(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_funcs(PropertyRNA *prop, const char *begin, const char *next, const char *end, const char *get, const char *length, const char *lookupint, const char *lookupstring, const char *assignint)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set)
void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg, const char *instance)
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item)
void RNA_def_struct_sdna(StructRNA *srna, const char *structname)
void RNA_def_struct_clear_flag(StructRNA *srna, int flag)
void RNA_def_property_array(PropertyRNA *prop, int length)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
void RNA_def_property_string_maxlength(PropertyRNA *prop, int maxlength)
void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname, const char *propname, const char *lengthpropname)
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char *set, const char *item)
StructRNA * RNA_def_struct_ptr(BlenderRNA *brna, const char *identifier, StructRNA *srnafrom)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_struct_free_extension(StructRNA *srna, ExtensionRNA *rna_ext)
void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *type_fn, const char *poll)
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_string_default(PropertyRNA *prop, const char *value)
void RNA_struct_free(BlenderRNA *brna, StructRNA *srna)
void RNA_def_struct_idprops_func(StructRNA *srna, const char *idproperties)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_translation_context(StructRNA *srna, const char *context)
void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_api_keymapitem(StructRNA *srna)
void RNA_api_window(StructRNA *srna)
void RNA_api_wm(StructRNA *srna)
BlenderRNA BLENDER_RNA
void RNA_api_keyconfigs(StructRNA *srna)
void RNA_api_macro(StructRNA *srna)
void RNA_api_keymap(StructRNA *srna)
void RNA_api_keymapitems(StructRNA *srna)
void RNA_api_keymaps(StructRNA *srna)
void RNA_api_operator(StructRNA *srna)
void RNA_api_keyconfig(StructRNA *srna)
const EnumPropertyItem rna_enum_stereo3d_display_items[]
Definition rna_scene.cc:515
const EnumPropertyItem rna_enum_stereo3d_anaglyph_type_items[]
Definition rna_scene.cc:547
const EnumPropertyItem rna_enum_stereo3d_interlace_type_items[]
Definition rna_scene.cc:554
const EnumPropertyItem rna_enum_region_type_items[]
Definition rna_screen.cc:21
const EnumPropertyItem rna_enum_space_type_items[]
Definition rna_space.cc:73
const EnumPropertyItem rna_enum_wm_job_type_items[]
Definition rna_wm.cc:206
static void rna_def_wm_keymaps(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_wm.cc:2949
void RNA_def_wm(BlenderRNA *brna)
Definition rna_wm.cc:3301
const EnumPropertyItem rna_enum_event_direction_items[]
Definition rna_wm.cc:489
static void rna_def_operator_type_macro(BlenderRNA *brna)
Definition rna_wm.cc:2327
static void rna_def_timer(BlenderRNA *brna)
Definition rna_wm.cc:2616
static void rna_def_keyconfig_prefs(BlenderRNA *brna)
Definition rna_wm.cc:2961
static void rna_def_operator_common(StructRNA *srna)
Definition rna_wm.cc:2168
static void rna_def_popup_menu_wrapper(BlenderRNA *brna, const char *rna_type, const char *c_type, const char *layout_get_fn)
Definition rna_wm.cc:2646
static void rna_def_event(BlenderRNA *brna)
Definition rna_wm.cc:2426
const EnumPropertyItem rna_enum_event_value_items[]
Definition rna_wm.cc:477
static void rna_def_window_stereo3d(BlenderRNA *brna)
Definition rna_wm.cc:2684
static void rna_def_macro_operator(BlenderRNA *brna)
Definition rna_wm.cc:2304
const EnumPropertyItem rna_enum_event_type_mask_items[]
Definition rna_wm.cc:518
const EnumPropertyItem rna_enum_operator_property_tag_items[]
Definition rna_wm.cc:606
static void rna_def_popovermenu(BlenderRNA *brna)
Definition rna_wm.cc:2674
static void rna_def_operator_filelist_element(BlenderRNA *brna)
Definition rna_wm.cc:2372
static void rna_def_windowmanager(BlenderRNA *brna)
Definition rna_wm.cc:2866
static void rna_def_wm_keyconfigs(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_wm.cc:2817
static void rna_def_event_ndof_motion(BlenderRNA *brna)
Definition rna_wm.cc:2385
static void rna_def_operator(BlenderRNA *brna)
Definition rna_wm.cc:2257
const EnumPropertyItem rna_enum_event_type_items[]
Definition rna_wm.cc:215
static void rna_def_operator_options_runtime(BlenderRNA *brna)
Definition rna_wm.cc:2132
static void rna_def_piemenu(BlenderRNA *brna)
Definition rna_wm.cc:2679
static void rna_def_window(BlenderRNA *brna)
Definition rna_wm.cc:2714
const EnumPropertyItem rna_enum_wm_report_items[]
Definition rna_wm.cc:616
const EnumPropertyItem rna_enum_keymap_propvalue_items[]
Definition rna_wm.cc:512
const EnumPropertyItem rna_enum_operator_type_flag_items[]
Definition rna_wm.cc:539
const EnumPropertyItem rna_enum_operator_return_items[]
Definition rna_wm.cc:584
static const EnumPropertyItem rna_enum_ndof_motion_progress_items[]
Definition rna_wm.cc:505
static void rna_def_keyconfig(BlenderRNA *brna)
Definition rna_wm.cc:2984
static void rna_def_operator_utils(BlenderRNA *brna)
Definition rna_wm.cc:2353
static void rna_def_popupmenu(BlenderRNA *brna)
Definition rna_wm.cc:2669
static void rna_def_keymap_items(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_wm.cc:2937
const EnumPropertyItem rna_enum_window_cursor_items[]
Definition rna_wm_api.cc:31
StructRNA * srna
StructCallbackFunc call
StructFreeFunc free
Definition DNA_ID.h:414
void * first
ListBase wm
Definition BKE_main.hh:307
ID * owner_id
Definition RNA_types.hh:51
void * data
Definition RNA_types.hh:53
struct WorkSpaceLayout * temp_layout_store
Wrapper for bScreen.
wmEventHandler head
eWM_EventHandlerType type
struct wmKeyConfig * next
struct PointerRNA * ptr
struct wmKeyMapItem * next
struct wmKeyMap * next
const void * modal_items
const char * name
Definition WM_types.hh:1033
wmOperatorStatus(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1049
std::string(* get_description)(bContext *C, wmOperatorType *ot, PointerRNA *ptr)
Definition WM_types.hh:1121
const char * idname
Definition WM_types.hh:1035
bool(* check)(bContext *C, wmOperator *op)
Definition WM_types.hh:1057
bool(* pyop_poll)(bContext *C, wmOperatorType *ot) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1148
ExtensionRNA rna_ext
Definition WM_types.hh:1151
const char * translation_context
Definition WM_types.hh:1037
const char * description
Definition WM_types.hh:1039
wmOperatorStatus(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1065
void(* ui)(bContext *C, wmOperator *op)
Definition WM_types.hh:1100
const char * undo_group
Definition WM_types.hh:1041
StructRNA * srna
Definition WM_types.hh:1127
wmOperatorStatus(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1081
void(* cancel)(bContext *C, wmOperator *op)
Definition WM_types.hh:1073
struct wmOperator * prev
struct wmOperatorType * type
struct PointerRNA * ptr
WindowManagerRuntimeHandle * runtime
struct WorkSpaceInstanceHook * workspace_hook
struct Scene * new_scene
uint len
void WM_operator_stack_clear(wmWindowManager *wm)
Definition wm.cc:358
void WM_operator_handlers_clear(wmWindowManager *wm, wmOperatorType *ot)
Definition wm.cc:367
float WM_event_tablet_data(const wmEvent *event, bool *r_pen_flip, float r_tilt[2])
char WM_event_utf8_to_ascii(const wmEvent *event)
bool WM_event_is_tablet(const wmEvent *event)
void WM_window_status_area_tag_redraw(wmWindow *win)
void WM_event_add_notifier_ex(wmWindowManager *wm, const wmWindow *win, uint type, void *reference)
void WM_main_add_notifier(uint type, void *reference)
void WM_event_remove_modal_handler_all(const wmOperator *op, const bool postpone)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
@ WM_HANDLER_TYPE_OP
@ EVT_DATA_NDOF_MOTION
@ EVT_TYPE_MASK_ACTIONZONE
@ EVT_TYPE_MASK_KEYBOARD_MODIFIER
@ EVT_TYPE_MASK_NDOF
@ EVT_TYPE_MASK_MOUSE_WHEEL
@ EVT_TYPE_MASK_MOUSE_GESTURE
@ EVT_TYPE_MASK_MOUSE_BUTTON
@ EVT_TYPE_MASK_MOUSE
@ EVT_TYPE_MASK_KEYBOARD
#define ISKEYMODIFIER(event_type)
@ EVT_PAD8
@ EVT_F14KEY
@ EVT_PAD2
@ MOUSEPAN
@ BUTTON7MOUSE
@ RIGHTMOUSE
@ EVT_SIXKEY
@ EVT_QUOTEKEY
@ EVT_PADPERIOD
@ NDOF_BUTTON_SPIN_CW
@ EVT_OKEY
@ NDOF_BUTTON_TILT_CCW
@ TIMER
@ EVT_EKEY
@ EVT_PAD4
@ EVT_JKEY
@ EVT_PADASTERKEY
@ NDOF_BUTTON_7
@ BUTTON6MOUSE
@ NDOF_BUTTON_V2
@ EVT_F18KEY
@ EVT_PLUSKEY
@ EVT_PAD0
@ EVT_F7KEY
@ EVT_FOURKEY
@ NDOF_BUTTON_2
@ EVT_YKEY
@ EVT_RIGHTCTRLKEY
@ EVT_F17KEY
@ EVT_SKEY
@ EVT_VKEY
@ WHEELLEFTMOUSE
@ MOUSEZOOM
@ NDOF_BUTTON_8
@ EVT_IKEY
@ NDOF_BUTTON_MENU
@ EVT_F1KEY
@ EVT_PERIODKEY
@ EVT_PADSLASHKEY
@ EVT_XKEY
@ WHEELRIGHTMOUSE
@ NDOF_BUTTON_1
@ EVT_COMMAKEY
@ NDOF_BUTTON_BOTTOM
@ EVT_MEDIAPLAY
@ EVT_LEFTBRACKETKEY
@ EVT_ACTIONZONE_FULLSCREEN
@ EVT_MEDIAFIRST
@ EVT_F23KEY
@ EVT_ZEROKEY
@ EVT_F10KEY
@ EVT_FKEY
@ EVT_PAD9
@ EVT_DELKEY
@ EVT_SEVENKEY
@ TIMERJOBS
@ NDOF_BUTTON_V1
@ EVT_F20KEY
@ EVT_CKEY
@ EVT_F2KEY
@ EVT_GKEY
@ EVT_ACTIONZONE_REGION
@ EVT_KKEY
@ EVT_TABKEY
@ EVT_DOWNARROWKEY
@ NDOF_BUTTON_BACK
@ EVT_UKEY
@ EVT_MEDIASTOP
@ EVT_AKEY
@ EVT_PAD3
@ EVT_MINUSKEY
@ MOUSEROTATE
@ WHEELUPMOUSE
@ EVT_PAGEUPKEY
@ EVT_OSKEY
@ EVT_F4KEY
@ EVT_PAGEDOWNKEY
@ NDOF_BUTTON_5
@ TIMERAUTOSAVE
@ TIMER1
@ EVT_F8KEY
@ NDOF_BUTTON_SAVE_V2
@ NDOF_BUTTON_RIGHT
@ EVT_LEFTCTRLKEY
@ NDOF_BUTTON_ROLL_CW
@ NDOF_BUTTON_10
@ TABLET_ERASER
@ EVT_EQUALKEY
@ NDOF_BUTTON_3
@ EVT_RIGHTARROWKEY
@ EVT_F6KEY
@ EVT_F5KEY
@ EVT_PADENTER
@ EVT_F22KEY
@ EVT_F19KEY
@ EVT_NINEKEY
@ NDOF_BUTTON_PLUS
@ EVT_SPACEKEY
@ BUTTON4MOUSE
@ WHEELDOWNMOUSE
@ EVT_PAD6
@ EVT_ACTIONZONE_AREA
@ NDOF_BUTTON_ISO2
@ EVT_PAD5
@ EVT_HOMEKEY
@ TABLET_STYLUS
@ MOUSEMOVE
@ EVT_RIGHTBRACKETKEY
@ EVT_WKEY
@ NDOF_BUTTON_PANZOOM
@ EVT_ENDKEY
@ EVT_RIGHTALTKEY
@ EVT_MEDIALAST
@ EVT_MKEY
@ EVT_LINEFEEDKEY
@ TIMER2
@ EVT_TKEY
@ EVT_HKEY
@ MOUSESMARTZOOM
@ NDOF_BUTTON_MINUS
@ EVT_BACKSLASHKEY
@ EVT_FIVEKEY
@ EVT_APPKEY
@ EVT_F24KEY
@ TIMER0
@ EVT_ACCENTGRAVEKEY
@ EVT_PADMINUS
@ EVT_F21KEY
@ EVT_ONEKEY
@ EVT_UPARROWKEY
@ LEFTMOUSE
@ EVT_F11KEY
@ EVT_SLASHKEY
@ EVT_EIGHTKEY
@ EVT_F13KEY
@ NDOF_BUTTON_DOMINANT
@ EVT_F15KEY
@ EVT_LEFTARROWKEY
@ NDOF_MOTION
@ EVT_INSERTKEY
@ EVT_NKEY
@ EVT_QKEY
@ MIDDLEMOUSE
@ TIMERREPORT
@ NDOF_BUTTON_TILT_CW
@ EVT_LEFTALTKEY
@ EVT_ZKEY
@ EVT_ESCKEY
@ NDOF_BUTTON_9
@ NDOF_BUTTON_LEFT
@ NDOF_BUTTON_FIT
@ EVT_THREEKEY
@ WHEELOUTMOUSE
@ NDOF_BUTTON_V3
@ EVT_BACKSPACEKEY
@ WHEELINMOUSE
@ EVT_F12KEY
@ INBETWEEN_MOUSEMOVE
@ EVT_DKEY
@ NDOF_BUTTON_SAVE_V3
@ EVT_F16KEY
@ NDOF_BUTTON_4
@ EVT_PAD1
@ EVT_TWOKEY
@ EVT_GRLESSKEY
@ EVT_LKEY
@ NDOF_BUTTON_12
@ EVT_RIGHTSHIFTKEY
@ NDOF_BUTTON_FRONT
@ NDOF_BUTTON_SAVE_V1
@ NDOF_BUTTON_11
@ EVT_PAUSEKEY
@ EVT_PAD7
@ NDOF_BUTTON_SPIN_CCW
@ EVT_LEFTSHIFTKEY
@ NDOF_BUTTON_ISO1
@ EVT_PADPLUSKEY
@ NDOF_BUTTON_6
@ EVT_F3KEY
@ NDOF_BUTTON_TOP
@ EVT_F9KEY
@ EVT_RKEY
@ WINDEACTIVATE
@ EVT_SEMICOLONKEY
@ EVT_BKEY
@ EVT_PKEY
@ EVT_XR_ACTION
@ TIMERREGION
@ NDOF_BUTTON_ROTATE
@ EVT_HYPER
@ EVT_RETKEY
@ BUTTON5MOUSE
@ NDOF_BUTTON_ROLL_CCW
#define ISKEYBOARD(event_type)
PointerRNA * ptr
Definition wm_files.cc:4238
wmOperatorType * ot
Definition wm_files.cc:4237
void WM_keymap_item_properties_reset(wmKeyMapItem *kmi, IDProperty *properties)
Definition wm_keymap.cc:206
int WM_keymap_item_map_type_get(const wmKeyMapItem *kmi)
Definition wm_keymap.cc:223
void WM_keyconfig_set_active(wmWindowManager *wm, const char *idname)
Definition wm_keymap.cc:382
void WM_keyconfig_update_tag(wmKeyMap *keymap, wmKeyMapItem *kmi)
void WM_operatortype_append_macro_ptr(void(*opfunc)(wmOperatorType *ot, void *userdata), void *userdata)
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operatortype_append_ptr(void(*opfunc)(wmOperatorType *, void *), void *userdata)
void WM_operatortype_remove_ptr(wmOperatorType *ot)
size_t WM_operator_py_idname(char *dst, const char *src)
size_t WM_operator_bl_idname(char *dst, const char *src)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
bool WM_operator_py_idname_ok_or_report(ReportList *reports, const char *classname, const char *idname)
void WM_window_set_active_scene(Main *bmain, bContext *C, wmWindow *win, Scene *scene)
bool WM_window_is_temp_screen(const wmWindow *win)
void WM_window_set_active_view_layer(wmWindow *win, ViewLayer *view_layer)
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Scene * WM_window_get_active_scene(const wmWindow *win)
bool WM_window_support_hdr_color(const wmWindow *win)
wmXrSessionState * WM_xr_session_state_handle_get(const wmXrData *xr)