Blender V4.5
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_CLICK_DRAG, "CLICK_DRAG", 0, "Click 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->operators.last); op; op = op->prev) {
660 if (op->properties == properties) {
661 return op;
662 }
663 }
664
665 return nullptr;
666}
667
668static StructRNA *rna_OperatorProperties_refine(PointerRNA *ptr)
669{
670 wmOperator *op = rna_OperatorProperties_find_operator(ptr);
671
672 if (op) {
673 return op->type->srna;
674 }
675 else {
676 return ptr->type;
677 }
678}
679
680static IDProperty **rna_OperatorProperties_idprops(PointerRNA *ptr)
681{
682 return (IDProperty **)&ptr->data;
683}
684
685static void rna_Operator_name_get(PointerRNA *ptr, char *value)
686{
687 wmOperator *op = (wmOperator *)ptr->data;
688 strcpy(value, op->type->name);
689}
690
691static int rna_Operator_name_length(PointerRNA *ptr)
692{
693 wmOperator *op = (wmOperator *)ptr->data;
694 return strlen(op->type->name);
695}
696
697static bool rna_Operator_has_reports_get(PointerRNA *ptr)
698{
699 wmOperator *op = (wmOperator *)ptr->data;
700 return (op->reports && op->reports->list.first);
701}
702
703static PointerRNA rna_Operator_layout_get(PointerRNA *ptr)
704{
705 /* Operator owner is not inherited, layout is owned by WM. */
706 wmOperator *op = (wmOperator *)ptr->data;
707 return RNA_pointer_create_discrete(nullptr, &RNA_UILayout, op->layout);
708}
709
710static PointerRNA rna_Operator_options_get(PointerRNA *ptr)
711{
712 return RNA_pointer_create_with_parent(*ptr, &RNA_OperatorOptions, ptr->data);
713}
714
715static PointerRNA rna_Operator_properties_get(PointerRNA *ptr)
716{
717 wmOperator *op = (wmOperator *)ptr->data;
718
721 result.owner_id = (ptr->owner_id) ? ptr->owner_id : result.owner_id;
722 result.data = op->properties;
723 return result;
724}
725
726static PointerRNA rna_OperatorMacro_properties_get(PointerRNA *ptr)
727{
728 wmOperatorTypeMacro *otmacro = (wmOperatorTypeMacro *)ptr->data;
729 wmOperatorType *ot = WM_operatortype_find(otmacro->idname, true);
730
733 result.owner_id = (ptr->owner_id) ? ptr->owner_id : result.owner_id;
734 result.data = otmacro->properties;
735 return result;
736}
737
738static void rna_Event_ascii_get(PointerRNA *ptr, char *value)
739{
740 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
741 value[0] = WM_event_utf8_to_ascii(event);
742 value[1] = '\0';
743}
744
745static int rna_Event_ascii_length(PointerRNA *ptr)
746{
747 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
748 return WM_event_utf8_to_ascii(event) ? 1 : 0;
749}
750
751static void rna_Event_unicode_get(PointerRNA *ptr, char *value)
752{
753 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
754 size_t len = 0;
755
756 if (event->utf8_buf[0]) {
757 if (BLI_str_utf8_as_unicode_step_or_error(event->utf8_buf, sizeof(event->utf8_buf), &len) !=
759 memcpy(value, event->utf8_buf, len);
760 }
761
762 value[len] = '\0';
763}
764
765static int rna_Event_unicode_length(PointerRNA *ptr)
766{
767 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
768 int len = 0;
769 if (event->utf8_buf[0]) {
770 len = BLI_str_utf8_size_or_error(event->utf8_buf);
771 if (len == -1) {
772 /* Even though this is documented as always being a valid UTF8 sequence,
773 * assert instead of returning a negative length if it is. */
775 len = 0;
776 }
777 }
778 return len;
779}
780
781static bool rna_Event_is_repeat_get(PointerRNA *ptr)
782{
783 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
784 return (event->flag & WM_EVENT_IS_REPEAT) != 0;
785}
786
787static bool rna_Event_is_consecutive_get(PointerRNA *ptr)
788{
789 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
790 return (event->flag & WM_EVENT_IS_CONSECUTIVE) != 0;
791}
792
793static float rna_Event_pressure_get(PointerRNA *ptr)
794{
795 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
796 return WM_event_tablet_data(event, nullptr, nullptr);
797}
798
799static bool rna_Event_is_tablet_get(PointerRNA *ptr)
800{
801 const wmEvent *event = static_cast<wmEvent *>(ptr->data);
802 return WM_event_is_tablet(event);
803}
804
805static void rna_Event_tilt_get(PointerRNA *ptr, float *values)
806{
807 wmEvent *event = static_cast<wmEvent *>(ptr->data);
808 WM_event_tablet_data(event, nullptr, values);
809}
810
811static void rna_NDOFMotionEventData_translation_get(PointerRNA *ptr, float *values)
812{
813# ifdef WITH_INPUT_NDOF
814 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
815 copy_v3_v3(values, WM_event_ndof_translation_get(ndof));
816# else
818 ARRAY_SET_ITEMS(values, 0, 0, 0);
819# endif
820}
821
822static void rna_NDOFMotionEventData_rotation_get(PointerRNA *ptr, float *values)
823{
824# ifdef WITH_INPUT_NDOF
825 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
826 copy_v3_v3(values, WM_event_ndof_rotation_get(ndof));
827# else
829 ARRAY_SET_ITEMS(values, 0, 0, 0);
830# endif
831}
832
833static float rna_NDOFMotionEventData_time_delta_get(PointerRNA *ptr)
834{
835# ifdef WITH_INPUT_NDOF
836 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
837 return ndof.dt;
838# else
840 return 0.0f;
841# endif
842}
843
844static int rna_NDOFMotionEventData_progress_get(PointerRNA *ptr)
845{
846# ifdef WITH_INPUT_NDOF
847 const wmNDOFMotionData &ndof = *static_cast<const wmNDOFMotionData *>(ptr->data);
848 return static_cast<int>(ndof.progress);
849# else
851 return 0;
852# endif
853}
854
855static PointerRNA rna_Event_ndof_motion_get(PointerRNA *ptr)
856{
857# ifdef WITH_INPUT_NDOF
858 wmEvent *event = static_cast<wmEvent *>(ptr->data);
859 if (event->custom == EVT_DATA_NDOF_MOTION) {
860 wmNDOFMotionData *ndof = static_cast<wmNDOFMotionData *>(event->customdata);
861 return RNA_pointer_create_with_parent(*ptr, &RNA_NDOFMotionEventData, ndof);
862 }
863# else
865# endif
866 return PointerRNA_NULL;
867}
868
869static PointerRNA rna_Event_xr_get(PointerRNA *ptr)
870{
871# ifdef WITH_XR_OPENXR
872 wmEvent *event = static_cast<wmEvent *>(ptr->data);
873 wmXrActionData *actiondata = static_cast<wmXrActionData *>(
874 WM_event_is_xr(event) ? event->customdata : nullptr);
875 return RNA_pointer_create_with_parent(*ptr, &RNA_XrEventData, actiondata);
876# else
878 return PointerRNA_NULL;
879# endif
880}
881
882static PointerRNA rna_PopupMenu_layout_get(PointerRNA *ptr)
883{
884 uiPopupMenu *pup = static_cast<uiPopupMenu *>(ptr->data);
885 uiLayout *layout = UI_popup_menu_layout(pup);
886
887 PointerRNA rptr = RNA_pointer_create_discrete(ptr->owner_id, &RNA_UILayout, layout);
888 return rptr;
889}
890
891static PointerRNA rna_PopoverMenu_layout_get(PointerRNA *ptr)
892{
893 uiPopover *pup = static_cast<uiPopover *>(ptr->data);
894 uiLayout *layout = UI_popover_layout(pup);
895
896 PointerRNA rptr = RNA_pointer_create_discrete(ptr->owner_id, &RNA_UILayout, layout);
897 return rptr;
898}
899
900static PointerRNA rna_PieMenu_layout_get(PointerRNA *ptr)
901{
902 uiPieMenu *pie = static_cast<uiPieMenu *>(ptr->data);
903 uiLayout *layout = UI_pie_menu_layout(pie);
904
905 PointerRNA rptr = RNA_pointer_create_discrete(ptr->owner_id, &RNA_UILayout, layout);
906 return rptr;
907}
908
909static void rna_Window_scene_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
910{
911 wmWindow *win = static_cast<wmWindow *>(ptr->data);
912
913 if (value.data == nullptr) {
914 return;
915 }
916
917 win->new_scene = static_cast<Scene *>(value.data);
918}
919
920static void rna_Window_scene_update(bContext *C, PointerRNA *ptr)
921{
922 Main *bmain = CTX_data_main(C);
923 wmWindow *win = static_cast<wmWindow *>(ptr->data);
924
925 /* Exception: must use context so notifier gets to the right window. */
926 if (win->new_scene) {
927# ifdef WITH_PYTHON
929# endif
930
931 WM_window_set_active_scene(bmain, C, win, win->new_scene);
932
933# ifdef WITH_PYTHON
935# endif
936
939
940 if (G.debug & G_DEBUG) {
941 printf("scene set %p\n", win->new_scene);
942 }
943
944 win->new_scene = nullptr;
945 }
946}
947
948static PointerRNA rna_Window_workspace_get(PointerRNA *ptr)
949{
950 wmWindow *win = static_cast<wmWindow *>(ptr->data);
952 reinterpret_cast<ID *>(BKE_workspace_active_get(win->workspace_hook)));
953}
954
955static void rna_Window_workspace_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
956{
957 wmWindow *win = (wmWindow *)ptr->data;
958
959 /* disallow ID-browsing away from temp screens */
960 if (WM_window_is_temp_screen(win)) {
961 return;
962 }
963 if (value.data == nullptr) {
964 return;
965 }
966
967 /* exception: can't set workspaces inside of area/region handlers */
968 win->workspace_hook->temp_workspace_store = static_cast<WorkSpace *>(value.data);
969}
970
971static void rna_Window_workspace_update(bContext *C, PointerRNA *ptr)
972{
973 wmWindow *win = static_cast<wmWindow *>(ptr->data);
974 WorkSpace *new_workspace = win->workspace_hook->temp_workspace_store;
975
976 /* exception: can't set screens inside of area/region handlers,
977 * and must use context so notifier gets to the right window */
978 if (new_workspace) {
980 WM_event_add_notifier_ex(wm, win, NC_SCREEN | ND_WORKSPACE_SET, new_workspace);
982 win->workspace_hook->temp_workspace_store = nullptr;
983 }
984}
985
986PointerRNA rna_Window_screen_get(PointerRNA *ptr)
987{
988 wmWindow *win = static_cast<wmWindow *>(ptr->data);
990 reinterpret_cast<ID *>(BKE_workspace_active_screen_get(win->workspace_hook)));
991}
992
993static void rna_Window_screen_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
994{
995 wmWindow *win = static_cast<wmWindow *>(ptr->data);
997 WorkSpaceLayout *layout_new;
999
1000 /* disallow ID-browsing away from temp screens */
1001 if (screen->temp) {
1002 return;
1003 }
1004 if (value.data == nullptr) {
1005 return;
1006 }
1007
1008 /* exception: can't set screens inside of area/region handlers */
1009 layout_new = static_cast<WorkSpaceLayout *>(
1010 BKE_workspace_layout_find(workspace, static_cast<bScreen *>(value.data)));
1011 win->workspace_hook->temp_layout_store = layout_new;
1012}
1013
1014static bool rna_Window_screen_assign_poll(PointerRNA * /*ptr*/, PointerRNA value)
1015{
1016 bScreen *screen = (bScreen *)value.owner_id;
1017 return !screen->temp;
1018}
1019
1020static void rna_workspace_screen_update(bContext *C, PointerRNA *ptr)
1021{
1022 wmWindow *win = static_cast<wmWindow *>(ptr->data);
1024
1025 /* exception: can't set screens inside of area/region handlers,
1026 * and must use context so notifier gets to the right window */
1027 if (layout_new) {
1029 WM_event_add_notifier_ex(wm, win, NC_SCREEN | ND_LAYOUTBROWSE, layout_new);
1030 win->workspace_hook->temp_layout_store = nullptr;
1031 }
1032}
1033
1034static PointerRNA rna_Window_view_layer_get(PointerRNA *ptr)
1035{
1036 wmWindow *win = static_cast<wmWindow *>(ptr->data);
1037 Scene *scene = WM_window_get_active_scene(win);
1038 ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1039
1040 return RNA_pointer_create_id_subdata(scene->id, &RNA_ViewLayer, view_layer);
1041}
1042
1043static void rna_Window_view_layer_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
1044{
1045 wmWindow *win = static_cast<wmWindow *>(ptr->data);
1046 ViewLayer *view_layer = static_cast<ViewLayer *>(value.data);
1047
1048 WM_window_set_active_view_layer(win, view_layer);
1049}
1050
1051static bool rna_Window_modal_handler_skip(CollectionPropertyIterator * /*iter*/, void *data)
1052{
1053 const wmEventHandler_Op *handler = (wmEventHandler_Op *)data;
1054 return handler->head.type != WM_HANDLER_TYPE_OP;
1055}
1056
1057static void rna_Window_modal_operators_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1058{
1059 wmWindow *window = static_cast<wmWindow *>(ptr->data);
1060 rna_iterator_listbase_begin(iter, ptr, &window->modalhandlers, rna_Window_modal_handler_skip);
1061}
1062
1063static PointerRNA rna_Window_modal_operators_get(CollectionPropertyIterator *iter)
1064{
1065 const wmEventHandler_Op *handler = static_cast<wmEventHandler_Op *>(
1067 return RNA_pointer_create_with_parent(iter->parent, &RNA_Operator, handler->op);
1068}
1069
1070static void rna_KeyMap_modal_event_values_items_begin(CollectionPropertyIterator *iter,
1071 PointerRNA *ptr)
1072{
1073 wmKeyMap *km = static_cast<wmKeyMap *>(ptr->data);
1074
1076 if ((km->flag & KEYMAP_MODAL) != 0 && km->modal_items != nullptr) {
1077 items = static_cast<const EnumPropertyItem *>(km->modal_items);
1078 }
1079
1080 const int totitem = RNA_enum_items_count(items);
1081
1083 iter, ptr, (void *)items, sizeof(EnumPropertyItem), totitem, false, nullptr);
1084}
1085
1086static PointerRNA rna_KeyMapItem_properties_get(PointerRNA *ptr)
1087{
1088 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1089
1090 if (kmi->ptr) {
1091 BLI_assert(kmi->ptr->owner_id == nullptr);
1092 return *(kmi->ptr);
1093 }
1094
1095 // return RNA_pointer_create_with_parent(*ptr, &RNA_OperatorProperties, op->properties);
1096 return PointerRNA_NULL;
1097}
1098
1099static int rna_wmKeyMapItem_map_type_get(PointerRNA *ptr)
1100{
1101 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1102
1103 return WM_keymap_item_map_type_get(kmi);
1104}
1105
1106static void rna_wmKeyMapItem_map_type_set(PointerRNA *ptr, int value)
1107{
1108 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1109 int map_type = rna_wmKeyMapItem_map_type_get(ptr);
1110
1111 if (value != map_type) {
1112 switch (value) {
1113 case KMI_TYPE_KEYBOARD:
1114 kmi->type = EVT_AKEY;
1115 kmi->val = KM_PRESS;
1116 break;
1117 case KMI_TYPE_MOUSE:
1118 kmi->type = LEFTMOUSE;
1119 kmi->val = KM_PRESS;
1120 break;
1121 case KMI_TYPE_TEXTINPUT:
1122 kmi->type = KM_TEXTINPUT;
1123 kmi->val = KM_NOTHING;
1124 break;
1125 case KMI_TYPE_TIMER:
1126 kmi->type = TIMER;
1127 kmi->val = KM_NOTHING;
1128 break;
1129 case KMI_TYPE_NDOF:
1130 kmi->type = NDOF_MOTION;
1131 kmi->val = KM_NOTHING;
1132 break;
1133 }
1134 }
1135}
1136
1141static void rna_wmKeyMapItem_keymodifier_set(PointerRNA *ptr, int value)
1142{
1143 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1144
1145 /* XXX, this should really be managed in an _itemf function,
1146 * giving a list of valid enums, then silently changing them when they are set is not
1147 * a good precedent, don't do this unless you have a good reason! */
1148 if (value == EVT_ESCKEY) {
1149 /* pass */
1150 }
1151 else if (ISKEYBOARD(value) && !ISKEYMODIFIER(value)) {
1152 kmi->keymodifier = value;
1153 }
1154 else {
1155 kmi->keymodifier = 0;
1156 }
1157}
1158
1159static const EnumPropertyItem *rna_KeyMapItem_type_itemf(bContext * /*C*/,
1160 PointerRNA *ptr,
1161 PropertyRNA * /*prop*/,
1162 bool * /*r_free*/)
1163{
1164 int map_type = rna_wmKeyMapItem_map_type_get(ptr);
1165
1166 if (map_type == KMI_TYPE_MOUSE) {
1167 return event_mouse_type_items;
1168 }
1169 if (map_type == KMI_TYPE_TIMER) {
1170 return event_timer_type_items;
1171 }
1172 if (map_type == KMI_TYPE_NDOF) {
1173 return event_ndof_type_items;
1174 }
1175 if (map_type == KMI_TYPE_TEXTINPUT) {
1176 return event_textinput_type_items;
1177 }
1178 else {
1180 }
1181}
1182
1183static const EnumPropertyItem *rna_KeyMapItem_propvalue_itemf(bContext *C,
1184 PointerRNA *ptr,
1185 PropertyRNA * /*prop*/,
1186 bool * /*r_free*/)
1187{
1189 wmKeyConfig *kc;
1190 wmKeyMap *km;
1191
1192 for (kc = static_cast<wmKeyConfig *>(wm->keyconfigs.first); kc; kc = kc->next) {
1193 for (km = static_cast<wmKeyMap *>(kc->keymaps.first); km; km = km->next) {
1194 /* only check if it's a modal keymap */
1195 if (km->modal_items) {
1196 wmKeyMapItem *kmi;
1197 for (kmi = static_cast<wmKeyMapItem *>(km->items.first); kmi; kmi = kmi->next) {
1198 if (kmi == ptr->data) {
1199 return static_cast<const EnumPropertyItem *>(km->modal_items);
1200 }
1201 }
1202 }
1203 }
1204 }
1205
1206 return rna_enum_keymap_propvalue_items; /* ERROR */
1207}
1208
1209static bool rna_KeyMapItem_any_get(PointerRNA *ptr)
1210{
1211 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1212
1213 if (kmi->shift == KM_ANY && kmi->ctrl == KM_ANY && kmi->alt == KM_ANY && kmi->oskey == KM_ANY &&
1214 kmi->hyper == KM_ANY)
1215 {
1216 return true;
1217 }
1218 else {
1219 return false;
1220 }
1221}
1222
1223static void rna_KeyMapItem_any_set(PointerRNA *ptr, bool value)
1224{
1225 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1226
1227 if (value) {
1228 kmi->shift = kmi->ctrl = kmi->alt = kmi->oskey = kmi->hyper = KM_ANY;
1229 }
1230 else {
1231 kmi->shift = kmi->ctrl = kmi->alt = kmi->oskey = kmi->hyper = KM_NOTHING;
1232 }
1233}
1234
1235static bool rna_KeyMapItem_shift_get(PointerRNA *ptr)
1236{
1237 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1238 return kmi->shift != KM_NOTHING;
1239}
1240
1241static bool rna_KeyMapItem_ctrl_get(PointerRNA *ptr)
1242{
1243 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1244 return kmi->ctrl != KM_NOTHING;
1245}
1246
1247static bool rna_KeyMapItem_alt_get(PointerRNA *ptr)
1248{
1249 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1250 return kmi->alt != KM_NOTHING;
1251}
1252
1253static bool rna_KeyMapItem_oskey_get(PointerRNA *ptr)
1254{
1255 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1256 return kmi->oskey != KM_NOTHING;
1257}
1258
1259static bool rna_KeyMapItem_hyper_get(PointerRNA *ptr)
1260{
1261 wmKeyMapItem *kmi = (wmKeyMapItem *)ptr->data;
1262 return kmi->hyper != KM_NOTHING;
1263}
1264
1265static PointerRNA rna_WindowManager_active_keyconfig_get(PointerRNA *ptr)
1266{
1267 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1268 wmKeyConfig *kc;
1269
1270 kc = static_cast<wmKeyConfig *>(
1271 BLI_findstring(&wm->keyconfigs, U.keyconfigstr, offsetof(wmKeyConfig, idname)));
1272
1273 if (!kc) {
1274 kc = wm->defaultconf;
1275 }
1276
1277 return RNA_pointer_create_with_parent(*ptr, &RNA_KeyConfig, kc);
1278}
1279
1280static void rna_WindowManager_active_keyconfig_set(PointerRNA *ptr,
1281 PointerRNA value,
1282 ReportList * /*reports*/)
1283{
1284 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1285 wmKeyConfig *kc = static_cast<wmKeyConfig *>(value.data);
1286
1287 if (kc) {
1289 }
1290}
1291
1292static void rna_WindowManager_extensions_statusbar_update(Main * /*bmain*/,
1293 Scene * /*scene*/,
1294 PointerRNA *ptr)
1295{
1296 if ((U.statusbar_flag & STATUSBAR_SHOW_EXTENSIONS_UPDATES) == 0) {
1297 return;
1298 }
1299
1300 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1301 LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
1303 }
1304}
1305
1306/* -------------------------------------------------------------------- */
1309
1310static PointerRNA rna_wmKeyConfig_preferences_get(PointerRNA *ptr)
1311{
1312 wmKeyConfig *kc = static_cast<wmKeyConfig *>(ptr->data);
1314 if (kpt_rt) {
1316 return RNA_pointer_create_with_parent(*ptr, kpt_rt->rna_ext.srna, kpt->prop);
1317 }
1318 else {
1319 return PointerRNA_NULL;
1320 }
1321}
1322
1323static IDProperty **rna_wmKeyConfigPref_idprops(PointerRNA *ptr)
1324{
1325 return (IDProperty **)&ptr->data;
1326}
1327
1328static bool rna_wmKeyConfigPref_unregister(Main * /*bmain*/, StructRNA *type)
1329{
1332
1333 if (!kpt_rt) {
1334 return false;
1335 }
1336
1337 RNA_struct_free_extension(type, &kpt_rt->rna_ext);
1339
1340 /* Possible we're not in the preferences if they have been reset. */
1342
1343 /* update while blender is running */
1345 return true;
1346}
1347
1348static StructRNA *rna_wmKeyConfigPref_register(Main *bmain,
1350 void *data,
1351 const char *identifier,
1352 StructValidateFunc validate,
1353 StructCallbackFunc call,
1355{
1356 const char *error_prefix = "Registering key-config preferences class:";
1357 wmKeyConfigPrefType_Runtime *kpt_rt, dummy_kpt_rt = {{'\0'}};
1358 wmKeyConfigPref dummy_kpt = {nullptr};
1359 // bool have_function[1];
1360
1361 /* setup dummy keyconf-prefs & keyconf-prefs type to store static properties in */
1363 nullptr, &RNA_KeyConfigPreferences, &dummy_kpt);
1364
1365 /* validate the python class */
1366 if (validate(&dummy_kpt_ptr, data, nullptr /*have_function*/) != 0) {
1367 return nullptr;
1368 }
1369
1370 STRNCPY(dummy_kpt_rt.idname, dummy_kpt.idname);
1371 if (strlen(identifier) >= sizeof(dummy_kpt_rt.idname)) {
1373 RPT_ERROR,
1374 "%s '%s' is too long, maximum length is %d",
1375 error_prefix,
1376 identifier,
1377 int(sizeof(dummy_kpt_rt.idname)));
1378 return nullptr;
1379 }
1380
1381 /* check if we have registered this keyconf-prefs type before, and remove it */
1382 kpt_rt = BKE_keyconfig_pref_type_find(dummy_kpt.idname, true);
1383 if (kpt_rt) {
1385 RPT_INFO,
1386 "%s '%s', bl_idname '%s' has been registered before, unregistering previous",
1387 error_prefix,
1388 identifier,
1389 dummy_kpt.idname);
1390
1391 StructRNA *srna = kpt_rt->rna_ext.srna;
1392 if (!(srna && rna_wmKeyConfigPref_unregister(bmain, srna))) {
1394 RPT_ERROR,
1395 "%s '%s', bl_idname '%s' %s",
1396 error_prefix,
1397 identifier,
1398 dummy_kpt.idname,
1399 srna ? "is built-in" : "could not be unregistered");
1400 return nullptr;
1401 }
1402 }
1403
1404 /* create a new keyconf-prefs type */
1405 kpt_rt = MEM_mallocN<wmKeyConfigPrefType_Runtime>("keyconfigpreftype");
1406 memcpy(kpt_rt, &dummy_kpt_rt, sizeof(dummy_kpt_rt));
1407
1409
1410 kpt_rt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, identifier, &RNA_KeyConfigPreferences);
1411 kpt_rt->rna_ext.data = data;
1412 kpt_rt->rna_ext.call = call;
1413 kpt_rt->rna_ext.free = free;
1414 RNA_struct_blender_type_set(kpt_rt->rna_ext.srna, kpt_rt);
1415
1416 // kpt_rt->draw = (have_function[0]) ? header_draw : nullptr;
1417
1418 /* update while blender is running */
1420
1421 return kpt_rt->rna_ext.srna;
1422}
1423
1424/* placeholder, doesn't do anything useful yet */
1425static StructRNA *rna_wmKeyConfigPref_refine(PointerRNA *ptr)
1426{
1427 return (ptr->type) ? ptr->type : &RNA_KeyConfigPreferences;
1428}
1429
1431
1432static void rna_wmKeyMapItem_idname_get(PointerRNA *ptr, char *value)
1433{
1434 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1435 /* Pass in a fixed size buffer as the value may be allocated based on the callbacks length. */
1436 char value_buf[OP_MAX_TYPENAME];
1437 int len = WM_operator_py_idname(value_buf, kmi->idname);
1438 memcpy(value, value_buf, len + 1);
1439}
1440
1441static int rna_wmKeyMapItem_idname_length(PointerRNA *ptr)
1442{
1443 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1444 char pyname[OP_MAX_TYPENAME];
1445 return WM_operator_py_idname(pyname, kmi->idname);
1446}
1447
1448static void rna_wmKeyMapItem_idname_set(PointerRNA *ptr, const char *value)
1449{
1450 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1451 char idname[OP_MAX_TYPENAME];
1452
1453 WM_operator_bl_idname(idname, value);
1454
1455 if (!STREQ(idname, kmi->idname)) {
1456 STRNCPY(kmi->idname, idname);
1457
1458 WM_keymap_item_properties_reset(kmi, nullptr);
1459 }
1460}
1461
1462static void rna_wmKeyMapItem_name_get(PointerRNA *ptr, char *value)
1463{
1464 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1466 strcpy(value, ot ? WM_operatortype_name(ot, kmi->ptr).c_str() : kmi->idname);
1467}
1468
1469static int rna_wmKeyMapItem_name_length(PointerRNA *ptr)
1470{
1471 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1473 return strlen(ot ? WM_operatortype_name(ot, kmi->ptr).c_str() : kmi->idname);
1474}
1475
1476static bool rna_KeyMapItem_userdefined_get(PointerRNA *ptr)
1477{
1478 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
1479 return kmi->id < 0;
1480}
1481
1482static PointerRNA rna_WindowManager_xr_session_state_get(PointerRNA *ptr)
1483{
1484 wmWindowManager *wm = static_cast<wmWindowManager *>(ptr->data);
1485 struct wmXrSessionState *state =
1486# ifdef WITH_XR_OPENXR
1488# else
1489 nullptr;
1490 UNUSED_VARS(wm);
1491# endif
1492
1493 return RNA_pointer_create_with_parent(*ptr, &RNA_XrSessionState, state);
1494}
1495
1496# ifdef WITH_PYTHON
1497
1498static bool rna_operator_poll_cb(bContext *C, wmOperatorType *ot)
1499{
1500 extern FunctionRNA rna_Operator_poll_func;
1501
1502 ParameterList list;
1503 FunctionRNA *func;
1504 void *ret;
1505 bool visible;
1506
1507 PointerRNA ptr = RNA_pointer_create_discrete(nullptr, ot->rna_ext.srna, nullptr); /* dummy */
1508 func = &rna_Operator_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
1509
1510 RNA_parameter_list_create(&list, &ptr, func);
1511 RNA_parameter_set_lookup(&list, "context", &C);
1512 ot->rna_ext.call(C, &ptr, func, &list);
1513
1514 RNA_parameter_get_lookup(&list, "visible", &ret);
1515 visible = *(bool *)ret;
1516
1518
1519 return visible;
1520}
1521
1522static wmOperatorStatus rna_operator_exec_cb(bContext *C, wmOperator *op)
1523{
1524 extern FunctionRNA rna_Operator_execute_func;
1525
1526 ParameterList list;
1527 FunctionRNA *func;
1528 void *ret;
1529
1530 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1531 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1532 func = &rna_Operator_execute_func; /* RNA_struct_find_function(&opr, "execute"); */
1533
1534 RNA_parameter_list_create(&list, &opr, func);
1535 RNA_parameter_set_lookup(&list, "context", &C);
1536 const bool has_error = op->type->rna_ext.call(C, &opr, func, &list) == -1;
1537
1538 RNA_parameter_get_lookup(&list, "result", &ret);
1540
1542
1543 if (UNLIKELY(has_error)) {
1544 /* A modal handler may have been added, ensure this is removed, see: #113479. */
1546 }
1547
1549 return result;
1550}
1551
1552/* same as execute() but no return value */
1553static bool rna_operator_check_cb(bContext *C, wmOperator *op)
1554{
1555 extern FunctionRNA rna_Operator_check_func;
1556
1557 ParameterList list;
1558 FunctionRNA *func;
1559 void *ret;
1560 bool result;
1561
1562 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1563 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1564 func = &rna_Operator_check_func; /* RNA_struct_find_function(&opr, "check"); */
1565
1566 RNA_parameter_list_create(&list, &opr, func);
1567 RNA_parameter_set_lookup(&list, "context", &C);
1568 op->type->rna_ext.call(C, &opr, func, &list);
1569
1570 RNA_parameter_get_lookup(&list, "result", &ret);
1571 result = (*(bool *)ret) != 0;
1572
1574
1575 return result;
1576}
1577
1578static wmOperatorStatus rna_operator_invoke_cb(bContext *C, wmOperator *op, const wmEvent *event)
1579{
1580 extern FunctionRNA rna_Operator_invoke_func;
1581
1582 ParameterList list;
1583 FunctionRNA *func;
1584 void *ret;
1585
1586 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1587 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1588 func = &rna_Operator_invoke_func; /* RNA_struct_find_function(&opr, "invoke"); */
1589
1590 RNA_parameter_list_create(&list, &opr, func);
1591 RNA_parameter_set_lookup(&list, "context", &C);
1592 RNA_parameter_set_lookup(&list, "event", &event);
1593 const bool has_error = op->type->rna_ext.call(C, &opr, func, &list) == -1;
1594
1595 RNA_parameter_get_lookup(&list, "result", &ret);
1596 wmOperatorStatus retval = wmOperatorStatus(*(int *)ret);
1597
1599
1600 if (UNLIKELY(has_error)) {
1601 /* A modal handler may have been added, ensure this is removed, see: #113479. */
1603 }
1604
1605 OPERATOR_RETVAL_CHECK(retval);
1606 return retval;
1607}
1608
1609/* same as invoke */
1610static wmOperatorStatus rna_operator_modal_cb(bContext *C, wmOperator *op, const wmEvent *event)
1611{
1612 extern FunctionRNA rna_Operator_modal_func;
1613
1614 ParameterList list;
1615 FunctionRNA *func;
1616 void *ret;
1617
1618 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1619 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1620 func = &rna_Operator_modal_func; /* RNA_struct_find_function(&opr, "modal"); */
1621
1622 RNA_parameter_list_create(&list, &opr, func);
1623 RNA_parameter_set_lookup(&list, "context", &C);
1624 RNA_parameter_set_lookup(&list, "event", &event);
1625 op->type->rna_ext.call(C, &opr, func, &list);
1626
1627 RNA_parameter_get_lookup(&list, "result", &ret);
1628 wmOperatorStatus retval = wmOperatorStatus(*(int *)ret);
1629
1631
1632 OPERATOR_RETVAL_CHECK(retval);
1633 return retval;
1634}
1635
1636static void rna_operator_draw_cb(bContext *C, wmOperator *op)
1637{
1638 extern FunctionRNA rna_Operator_draw_func;
1639
1640 ParameterList list;
1641 FunctionRNA *func;
1642
1643 /* Operator draw gets reused for drawing stored properties, in which
1644 * case we need a proper owner. */
1645 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1646 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1647 func = &rna_Operator_draw_func; /* RNA_struct_find_function(&opr, "draw"); */
1648
1649 RNA_parameter_list_create(&list, &opr, func);
1650 RNA_parameter_set_lookup(&list, "context", &C);
1651 op->type->rna_ext.call(C, &opr, func, &list);
1652
1654}
1655
1656/* same as exec(), but call cancel */
1657static void rna_operator_cancel_cb(bContext *C, wmOperator *op)
1658{
1659 extern FunctionRNA rna_Operator_cancel_func;
1660
1661 ParameterList list;
1662 FunctionRNA *func;
1663
1664 ID *owner_id = (op->ptr) ? op->ptr->owner_id : nullptr;
1665 PointerRNA opr = RNA_pointer_create_discrete(owner_id, op->type->rna_ext.srna, op);
1666 func = &rna_Operator_cancel_func; /* RNA_struct_find_function(&opr, "cancel"); */
1667
1668 RNA_parameter_list_create(&list, &opr, func);
1669 RNA_parameter_set_lookup(&list, "context", &C);
1670 op->type->rna_ext.call(C, &opr, func, &list);
1671
1673}
1674
1675static std::string rna_operator_description_cb(bContext *C,
1677 PointerRNA *prop_ptr)
1678{
1679 extern FunctionRNA rna_Operator_description_func;
1680
1681 ParameterList list;
1682 FunctionRNA *func;
1683 void *ret;
1684
1685 PointerRNA ptr = RNA_pointer_create_discrete(nullptr, ot->rna_ext.srna, nullptr); /* dummy */
1686 func = &rna_Operator_description_func; /* RNA_struct_find_function(&ptr, "description"); */
1687
1688 RNA_parameter_list_create(&list, &ptr, func);
1689 RNA_parameter_set_lookup(&list, "context", &C);
1690 RNA_parameter_set_lookup(&list, "properties", prop_ptr);
1691 ot->rna_ext.call(C, &ptr, func, &list);
1692
1693 RNA_parameter_get_lookup(&list, "result", &ret);
1694 std::string result = ret ? std::string(static_cast<const char *>(ret)) : "";
1695
1697
1698 return result;
1699}
1700
1701static bool rna_Operator_unregister(Main *bmain, StructRNA *type);
1702
1703/* `bpy_operator_wrap.cc` */
1704
1705extern void BPY_RNA_operator_wrapper(wmOperatorType *ot, void *userdata);
1706extern void BPY_RNA_operator_macro_wrapper(wmOperatorType *ot, void *userdata);
1707
1708static StructRNA *rna_Operator_register(Main *bmain,
1710 void *data,
1711 const char *identifier,
1712 StructValidateFunc validate,
1713 StructCallbackFunc call,
1715{
1716 const char *error_prefix = "Registering operator class:";
1717 wmOperatorType dummy_ot = {nullptr};
1718 wmOperator dummy_operator = {nullptr};
1719 bool have_function[8];
1720
1721 struct {
1722 char idname[OP_MAX_TYPENAME];
1723 char name[OP_MAX_TYPENAME];
1724 char description[RNA_DYN_DESCR_MAX];
1725 char translation_context[BKE_ST_MAXNAME];
1726 char undo_group[OP_MAX_TYPENAME];
1727 } temp_buffers;
1728
1729 /* setup dummy operator & operator type to store static properties in */
1730 dummy_operator.type = &dummy_ot;
1731 dummy_ot.idname = temp_buffers.idname; /* only assign the pointer, string is nullptr'd */
1732 dummy_ot.name = temp_buffers.name; /* only assign the pointer, string is nullptr'd */
1733 dummy_ot.description =
1734 temp_buffers.description; /* only assign the pointer, string is nullptr'd */
1735 dummy_ot.translation_context =
1736 temp_buffers.translation_context; /* only assign the pointer, string is nullptr'd */
1737 dummy_ot.undo_group = temp_buffers.undo_group; /* only assign the pointer, string is nullptr'd */
1738 PointerRNA dummy_operator_ptr = RNA_pointer_create_discrete(
1739 nullptr, &RNA_Operator, &dummy_operator);
1740
1741 /* clear in case they are left unset */
1742 temp_buffers.idname[0] = temp_buffers.name[0] = temp_buffers.description[0] =
1743 temp_buffers.undo_group[0] = temp_buffers.translation_context[0] = '\0';
1744
1745 /* validate the python class */
1746 if (validate(&dummy_operator_ptr, data, have_function) != 0) {
1747 return nullptr;
1748 }
1749
1750 /* check if we have registered this operator type before, and remove it */
1751 {
1752 wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true);
1753 if (ot) {
1755 RPT_INFO,
1756 "%s '%s', bl_idname '%s' has been registered before, unregistering previous",
1757 error_prefix,
1758 identifier,
1759 dummy_ot.idname);
1760
1761 StructRNA *srna = ot->rna_ext.srna;
1762 if (!(srna && rna_Operator_unregister(bmain, srna))) {
1764 RPT_ERROR,
1765 "%s '%s', bl_idname '%s' %s",
1766 error_prefix,
1767 identifier,
1768 dummy_ot.idname,
1769 srna ? "is built-in" : "could not be unregistered");
1770 return nullptr;
1771 }
1772 }
1773 }
1774
1775 if (!WM_operator_py_idname_ok_or_report(reports, identifier, dummy_ot.idname)) {
1776 return nullptr;
1777 }
1778
1779 char idname_conv[sizeof(dummy_operator.idname)];
1780 WM_operator_bl_idname(idname_conv, dummy_ot.idname); /* convert the idname from python */
1781
1782 if (!RNA_struct_available_or_report(reports, idname_conv)) {
1783 return nullptr;
1784 }
1785
1786 /* We have to set default context if the class doesn't define it. */
1787 if (temp_buffers.translation_context[0] == '\0') {
1788 STRNCPY(temp_buffers.translation_context, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
1789 }
1790
1791 /* Convert foo.bar to `FOO_OT_bar`
1792 * allocate all strings at once. */
1793 {
1794 const char *strings[] = {
1795 idname_conv,
1796 temp_buffers.name,
1797 temp_buffers.description,
1798 temp_buffers.translation_context,
1799 temp_buffers.undo_group,
1800 };
1801 char *strings_table[ARRAY_SIZE(strings)];
1803 '\0', strings_table, strings, ARRAY_SIZE(strings));
1804
1805 dummy_ot.idname = strings_table[0]; /* allocated string stored here */
1806 dummy_ot.name = strings_table[1];
1807 dummy_ot.description = *strings_table[2] ? strings_table[2] : nullptr;
1808 dummy_ot.translation_context = strings_table[3];
1809 dummy_ot.undo_group = strings_table[4];
1810 BLI_STATIC_ASSERT(ARRAY_SIZE(strings) == 5, "Unexpected number of strings")
1811 }
1812
1813 /* XXX, this doubles up with the operator name #29666.
1814 * for now just remove from `dir(bpy.types)`. */
1815
1816 /* create a new operator type */
1817 dummy_ot.rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummy_ot.idname, &RNA_Operator);
1818
1819 /* Operator properties are registered separately. */
1821
1824 dummy_ot.rna_ext.data = data;
1825 dummy_ot.rna_ext.call = call;
1826 dummy_ot.rna_ext.free = free;
1827
1828 dummy_ot.pyop_poll = (have_function[0]) ? rna_operator_poll_cb : nullptr;
1829 dummy_ot.exec = (have_function[1]) ? rna_operator_exec_cb : nullptr;
1830 dummy_ot.check = (have_function[2]) ? rna_operator_check_cb : nullptr;
1831 dummy_ot.invoke = (have_function[3]) ? rna_operator_invoke_cb : nullptr;
1832 dummy_ot.modal = (have_function[4]) ? rna_operator_modal_cb : nullptr;
1833 dummy_ot.ui = (have_function[5]) ? rna_operator_draw_cb : nullptr;
1834 dummy_ot.cancel = (have_function[6]) ? rna_operator_cancel_cb : nullptr;
1835 dummy_ot.get_description = (have_function[7]) ? rna_operator_description_cb : nullptr;
1837
1838 /* update while blender is running */
1840
1841 return dummy_ot.rna_ext.srna;
1842}
1843
1844static bool rna_Operator_unregister(Main *bmain, StructRNA *type)
1845{
1846 const char *idname;
1848 wmWindowManager *wm;
1849
1850 if (!ot) {
1851 return false;
1852 }
1853
1854 /* update while blender is running */
1855 wm = static_cast<wmWindowManager *>(bmain->wm.first);
1856 if (wm) {
1858
1860 }
1862
1863 RNA_struct_free_extension(type, &ot->rna_ext);
1864
1865 idname = ot->idname;
1867
1868 /* Not to be confused with the RNA_struct_free that WM_operatortype_remove calls,
1869 * they are 2 different srna's. */
1871
1872 MEM_freeN(idname);
1873 return true;
1874}
1875
1876static void **rna_Operator_instance(PointerRNA *ptr)
1877{
1878 wmOperator *op = static_cast<wmOperator *>(ptr->data);
1879 return &op->py_instance;
1880}
1881
1882static StructRNA *rna_MacroOperator_register(Main *bmain,
1884 void *data,
1885 const char *identifier,
1886 StructValidateFunc validate,
1887 StructCallbackFunc call,
1889{
1890 const char *error_prefix = "Registering operator macro class:";
1891 wmOperatorType dummy_ot = {nullptr};
1892 wmOperator dummy_operator = {nullptr};
1893 bool have_function[2];
1894
1895 struct {
1896 char idname[OP_MAX_TYPENAME];
1897 char name[OP_MAX_TYPENAME];
1898 char description[RNA_DYN_DESCR_MAX];
1899 char translation_context[BKE_ST_MAXNAME];
1900 char undo_group[OP_MAX_TYPENAME];
1901 } temp_buffers;
1902
1903 /* setup dummy operator & operator type to store static properties in */
1904 dummy_operator.type = &dummy_ot;
1905 dummy_ot.idname = temp_buffers.idname; /* only assign the pointer, string is nullptr'd */
1906 dummy_ot.name = temp_buffers.name; /* only assign the pointer, string is nullptr'd */
1907 dummy_ot.description =
1908 temp_buffers.description; /* only assign the pointer, string is nullptr'd */
1909 dummy_ot.translation_context =
1910 temp_buffers.translation_context; /* only assign the pointer, string is nullptr'd */
1911 dummy_ot.undo_group = temp_buffers.undo_group; /* only assign the pointer, string is nullptr'd */
1912 PointerRNA dummy_operator_ptr = RNA_pointer_create_discrete(
1913 nullptr, &RNA_Macro, &dummy_operator);
1914
1915 /* clear in case they are left unset */
1916 temp_buffers.idname[0] = temp_buffers.name[0] = temp_buffers.description[0] =
1917 temp_buffers.undo_group[0] = temp_buffers.translation_context[0] = '\0';
1918
1919 /* validate the python class */
1920 if (validate(&dummy_operator_ptr, data, have_function) != 0) {
1921 return nullptr;
1922 }
1923
1924 if (!WM_operator_py_idname_ok_or_report(reports, identifier, dummy_ot.idname)) {
1925 return nullptr;
1926 }
1927
1928 /* check if we have registered this operator type before, and remove it */
1929 {
1930 wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true);
1931 if (ot) {
1933 RPT_INFO,
1934 "%s '%s', bl_idname '%s' has been registered before, unregistering previous",
1935 error_prefix,
1936 identifier,
1937 dummy_ot.idname);
1938
1939 StructRNA *srna = ot->rna_ext.srna;
1940 if (!(srna && rna_Operator_unregister(bmain, srna))) {
1942 RPT_ERROR,
1943 "%s '%s', bl_idname '%s' %s",
1944 error_prefix,
1945 identifier,
1946 dummy_ot.idname,
1947 srna ? "is built-in" : "could not be unregistered");
1948 return nullptr;
1949 }
1950 }
1951 }
1952
1953 char idname_conv[sizeof(dummy_operator.idname)];
1954 WM_operator_bl_idname(idname_conv, dummy_ot.idname); /* convert the idname from python */
1955
1956 if (!RNA_struct_available_or_report(reports, idname_conv)) {
1957 return nullptr;
1958 }
1959
1960 /* We have to set default context if the class doesn't define it. */
1961 if (temp_buffers.translation_context[0] == '\0') {
1962 STRNCPY(temp_buffers.translation_context, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
1963 }
1964
1965 /* Convert `foo.bar` to `FOO_OT_bar`
1966 * allocate all strings at once. */
1967 {
1968 const char *strings[] = {
1969 idname_conv,
1970 temp_buffers.name,
1971 temp_buffers.description,
1972 temp_buffers.translation_context,
1973 temp_buffers.undo_group,
1974 };
1975 char *strings_table[ARRAY_SIZE(strings)];
1977 '\0', strings_table, strings, ARRAY_SIZE(strings));
1978
1979 dummy_ot.idname = strings_table[0]; /* allocated string stored here */
1980 dummy_ot.name = strings_table[1];
1981 dummy_ot.description = *strings_table[2] ? strings_table[2] : nullptr;
1982 dummy_ot.translation_context = strings_table[3];
1983 dummy_ot.undo_group = strings_table[4];
1984 BLI_STATIC_ASSERT(ARRAY_SIZE(strings) == 5, "Unexpected number of strings")
1985 }
1986
1987 /* XXX, this doubles up with the operator name #29666.
1988 * for now just remove from `dir(bpy.types)`. */
1989
1990 /* create a new operator type */
1991 dummy_ot.rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummy_ot.idname, &RNA_Operator);
1993 dummy_ot.rna_ext.data = data;
1994 dummy_ot.rna_ext.call = call;
1995 dummy_ot.rna_ext.free = free;
1996
1997 dummy_ot.pyop_poll = (have_function[0]) ? rna_operator_poll_cb : nullptr;
1998 dummy_ot.ui = (have_function[1]) ? rna_operator_draw_cb : nullptr;
1999
2001
2002 /* update while blender is running */
2004
2005 return dummy_ot.rna_ext.srna;
2006}
2007# endif /* WITH_PYTHON */
2008
2009static StructRNA *rna_Operator_refine(PointerRNA *opr)
2010{
2011 wmOperator *op = (wmOperator *)opr->data;
2012 return (op->type && op->type->rna_ext.srna) ? op->type->rna_ext.srna : &RNA_Operator;
2013}
2014
2015static StructRNA *rna_MacroOperator_refine(PointerRNA *opr)
2016{
2017 wmOperator *op = (wmOperator *)opr->data;
2018 return (op->type && op->type->rna_ext.srna) ? op->type->rna_ext.srna : &RNA_Macro;
2019}
2020
2021/* just to work around 'const char *' warning and to ensure this is a python op */
2022static void rna_Operator_bl_idname_set(PointerRNA *ptr, const char *value)
2023{
2024 wmOperator *data = (wmOperator *)(ptr->data);
2025 char *str = (char *)data->type->idname;
2026 if (!str[0]) {
2027 /* Calling UTF8 copy is disputable since registering ensures the value isn't truncated.
2028 * Use a UTF8 copy to ensure truncating never causes an incomplete UTF8 sequence,
2029 * even before registration. */
2031 }
2032 else {
2033 BLI_assert_msg(0, "setting the bl_idname on a non-builtin operator");
2034 }
2035}
2036
2037static void rna_Operator_bl_label_set(PointerRNA *ptr, const char *value)
2038{
2039 wmOperator *data = (wmOperator *)(ptr->data);
2040 char *str = (char *)data->type->name;
2041 if (!str[0]) {
2043 }
2044 else {
2045 BLI_assert_msg(0, "setting the bl_label on a non-builtin operator");
2046 }
2047}
2048
2054# define OPERATOR_STR_MAYBE_NULL_GETSET(attr, attr_maxncpy) \
2055 static void rna_Operator_bl_##attr##_set(PointerRNA *ptr, const char *value) \
2056 { \
2057 wmOperator *data = (wmOperator *)(ptr->data); \
2058 char *str = (char *)data->type->attr; \
2059 if (str && !str[0]) { \
2060 BLI_strncpy_utf8(str, value, attr_maxncpy); \
2061 } \
2062 else { \
2063 BLI_assert_msg(false, "setting the bl_" #attr " on a non-builtin operator"); \
2064 } \
2065 } \
2066 static void rna_Operator_bl_##attr##_get(PointerRNA *ptr, char *value) \
2067 { \
2068 const wmOperator *data = (wmOperator *)(ptr->data); \
2069 const char *str = data->type->attr; \
2070 strcpy(value, str ? str : ""); \
2071 } \
2072 static int rna_Operator_bl_##attr##_length(PointerRNA *ptr) \
2073 { \
2074 const wmOperator *data = (wmOperator *)(ptr->data); \
2075 const char *str = data->type->attr; \
2076 return str ? strlen(str) : 0; \
2077 }
2078
2079OPERATOR_STR_MAYBE_NULL_GETSET(translation_context, BKE_ST_MAXNAME)
2080OPERATOR_STR_MAYBE_NULL_GETSET(description, RNA_DYN_DESCR_MAX)
2081OPERATOR_STR_MAYBE_NULL_GETSET(undo_group, OP_MAX_TYPENAME)
2082
2083static void rna_KeyMapItem_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
2084{
2085 wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(ptr->data);
2086 WM_keyconfig_update_tag(nullptr, kmi);
2087}
2088
2089#else /* RNA_RUNTIME */
2090
2096{
2097 StructRNA *srna;
2098 PropertyRNA *prop;
2099
2100 srna = RNA_def_struct(brna, "OperatorOptions", nullptr);
2101 RNA_def_struct_ui_text(srna, "Operator Options", "Runtime options");
2102 RNA_def_struct_sdna(srna, "wmOperator");
2103
2104 prop = RNA_def_property(srna, "is_grab_cursor", PROP_BOOLEAN, PROP_BOOLEAN);
2106 RNA_def_property_ui_text(prop, "Grab Cursor", "True when the cursor is grabbed");
2108
2109 prop = RNA_def_property(srna, "is_invoke", PROP_BOOLEAN, PROP_BOOLEAN);
2110 RNA_def_property_boolean_sdna(prop, nullptr, "flag", OP_IS_INVOKE);
2112 prop, "Invoke", "True when invoked (even if only the execute callbacks available)");
2114
2115 prop = RNA_def_property(srna, "is_repeat", PROP_BOOLEAN, PROP_BOOLEAN);
2116 RNA_def_property_boolean_sdna(prop, nullptr, "flag", OP_IS_REPEAT);
2117 RNA_def_property_ui_text(prop, "Repeat", "True when run from the 'Adjust Last Operation' panel");
2119
2120 prop = RNA_def_property(srna, "is_repeat_last", PROP_BOOLEAN, PROP_BOOLEAN);
2121 RNA_def_property_boolean_sdna(prop, nullptr, "flag", OP_IS_REPEAT_LAST);
2122 RNA_def_property_ui_text(prop, "Repeat Call", "True when run from the operator 'Repeat Last'");
2124
2125 prop = RNA_def_property(srna, "use_cursor_region", PROP_BOOLEAN, PROP_BOOLEAN);
2128 prop, "Focus Region", "Enable to use the region under the cursor for modal execution");
2129}
2130
2132{
2133 PropertyRNA *prop;
2134
2135 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2138 prop, "rna_Operator_name_get", "rna_Operator_name_length", nullptr);
2139 RNA_def_property_ui_text(prop, "Name", "");
2140
2141 prop = RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
2143 RNA_def_property_struct_type(prop, "OperatorProperties");
2144 RNA_def_property_ui_text(prop, "Properties", "");
2145 RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", nullptr, nullptr, nullptr);
2146
2147 prop = RNA_def_property(srna, "has_reports", PROP_BOOLEAN, PROP_NONE);
2148 RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* this is 'virtual' property */
2149 RNA_def_property_boolean_funcs(prop, "rna_Operator_has_reports_get", nullptr);
2151 prop,
2152 "Has Reports",
2153 "Operator has a set of reports (warnings and errors) from last execution");
2154
2155 /* Registration */
2156 prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
2157 RNA_def_property_string_sdna(prop, nullptr, "type->idname");
2158 /* String stored here is the 'BL' identifier (`OPMODULE_OT_my_op`),
2159 * not the 'python' identifier (`opmodule.my_op`). */
2161 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_Operator_bl_idname_set");
2162 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2164 RNA_def_struct_name_property(srna, prop);
2165
2166 prop = RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
2167 RNA_def_property_string_sdna(prop, nullptr, "type->name");
2168 RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
2169 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_Operator_bl_label_set");
2170 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2172
2173 prop = RNA_def_property(srna, "bl_translation_context", PROP_STRING, PROP_NONE);
2174 RNA_def_property_string_sdna(prop, nullptr, "type->translation_context");
2175 RNA_def_property_string_maxlength(prop, BKE_ST_MAXNAME); /* else it uses the pointer size! */
2177 "rna_Operator_bl_translation_context_get",
2178 "rna_Operator_bl_translation_context_length",
2179 "rna_Operator_bl_translation_context_set");
2182
2183 prop = RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE);
2184 RNA_def_property_string_sdna(prop, nullptr, "type->description");
2185 RNA_def_property_string_maxlength(prop, RNA_DYN_DESCR_MAX); /* else it uses the pointer size! */
2187 "rna_Operator_bl_description_get",
2188 "rna_Operator_bl_description_length",
2189 "rna_Operator_bl_description_set");
2190 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2192
2193 prop = RNA_def_property(srna, "bl_undo_group", PROP_STRING, PROP_NONE);
2194 RNA_def_property_string_sdna(prop, nullptr, "type->undo_group");
2195 RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
2197 "rna_Operator_bl_undo_group_get",
2198 "rna_Operator_bl_undo_group_length",
2199 "rna_Operator_bl_undo_group_set");
2200 // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2202
2203 prop = RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
2204 RNA_def_property_enum_sdna(prop, nullptr, "type->flag");
2207 RNA_def_property_ui_text(prop, "Options", "Options for this operator type");
2208
2209 prop = RNA_def_property(srna, "bl_cursor_pending", PROP_ENUM, PROP_NONE);
2210 RNA_def_property_enum_sdna(prop, nullptr, "type->cursor_pending");
2214 prop,
2215 "Idle Cursor",
2216 "Cursor to use when waiting for the user to select a location to activate the operator "
2217 "(when ``bl_options`` has ``DEPENDS_ON_CURSOR`` set)");
2218}
2219
2221{
2222 StructRNA *srna;
2223 PropertyRNA *prop;
2224
2225 srna = RNA_def_struct(brna, "Operator", nullptr);
2227 srna, "Operator", "Storage of an operator being executed, or registered after execution");
2228 RNA_def_struct_sdna(srna, "wmOperator");
2229 RNA_def_struct_refine_func(srna, "rna_Operator_refine");
2230# ifdef WITH_PYTHON
2232 srna, "rna_Operator_register", "rna_Operator_unregister", "rna_Operator_instance");
2233# endif
2236
2238
2239 prop = RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
2240 RNA_def_property_struct_type(prop, "UILayout");
2241 RNA_def_property_pointer_funcs(prop, "rna_Operator_layout_get", nullptr, nullptr, nullptr);
2242
2243 prop = RNA_def_property(srna, "options", PROP_POINTER, PROP_NONE);
2245 RNA_def_property_struct_type(prop, "OperatorOptions");
2246 RNA_def_property_pointer_funcs(prop, "rna_Operator_options_get", nullptr, nullptr, nullptr);
2247 RNA_def_property_ui_text(prop, "Options", "Runtime options");
2248
2249 prop = RNA_def_property(srna, "macros", PROP_COLLECTION, PROP_NONE);
2250 RNA_def_property_collection_sdna(prop, nullptr, "macro", nullptr);
2251 RNA_def_property_struct_type(prop, "Macro");
2252 RNA_def_property_ui_text(prop, "Macros", "");
2253
2254 RNA_api_operator(srna);
2255
2256 srna = RNA_def_struct(brna, "OperatorProperties", nullptr);
2257 RNA_def_struct_ui_text(srna, "Operator Properties", "Input properties of an operator");
2258 RNA_def_struct_refine_func(srna, "rna_OperatorProperties_refine");
2259 RNA_def_struct_idprops_func(srna, "rna_OperatorProperties_idprops");
2262}
2263
2265{
2266 StructRNA *srna;
2267
2268 srna = RNA_def_struct(brna, "Macro", nullptr);
2270 srna,
2271 "Macro Operator",
2272 "Storage of a macro operator being executed, or registered after execution");
2273 RNA_def_struct_sdna(srna, "wmOperator");
2274 RNA_def_struct_refine_func(srna, "rna_MacroOperator_refine");
2275# ifdef WITH_PYTHON
2277 srna, "rna_MacroOperator_register", "rna_Operator_unregister", "rna_Operator_instance");
2278# endif
2281
2283
2284 RNA_api_macro(srna);
2285}
2286
2288{
2289 StructRNA *srna;
2290 PropertyRNA *prop;
2291
2292 srna = RNA_def_struct(brna, "OperatorMacro", nullptr);
2294 srna, "Operator Macro", "Storage of a sub operator in a macro after it has been added");
2295 RNA_def_struct_sdna(srna, "wmOperatorTypeMacro");
2296
2297# if 0
2298 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2300 RNA_def_property_string_sdna(prop, nullptr, "idname");
2301 RNA_def_property_ui_text(prop, "Name", "Name of the sub operator");
2302 RNA_def_struct_name_property(srna, prop);
2303# endif
2304
2305 prop = RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
2307 RNA_def_property_struct_type(prop, "OperatorProperties");
2308 RNA_def_property_ui_text(prop, "Properties", "");
2310 prop, "rna_OperatorMacro_properties_get", nullptr, nullptr, nullptr);
2311}
2312
2314{
2315 StructRNA *srna;
2316 PropertyRNA *prop;
2317
2318 srna = RNA_def_struct(brna, "OperatorMousePath", "PropertyGroup");
2320 srna, "Operator Mouse Path", "Mouse path values for operators that record such paths");
2321
2322 prop = RNA_def_property(srna, "loc", PROP_FLOAT, PROP_XYZ);
2324 RNA_def_property_array(prop, 2);
2325 RNA_def_property_ui_text(prop, "Location", "Mouse location");
2326
2327 prop = RNA_def_property(srna, "time", PROP_FLOAT, PROP_NONE);
2329 RNA_def_property_ui_text(prop, "Time", "Time of mouse location");
2330}
2331
2333{
2334 StructRNA *srna;
2335 PropertyRNA *prop;
2336
2337 srna = RNA_def_struct(brna, "OperatorFileListElement", "PropertyGroup");
2338 RNA_def_struct_ui_text(srna, "Operator File List Element", "");
2339
2340 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_FILENAME);
2342 RNA_def_property_ui_text(prop, "Name", "Name of a file or directory within a file list");
2343}
2344
2346{
2347 StructRNA *srna;
2348 PropertyRNA *prop;
2349
2350 srna = RNA_def_struct(brna, "NDOFMotionEventData", nullptr);
2351 RNA_def_struct_ui_text(srna, "NDOF Motion Data", "NDOF motion data for window manager events");
2352
2353 prop = RNA_def_property(srna, "translation", PROP_FLOAT, PROP_XYZ);
2354 RNA_def_property_array(prop, 3);
2356 RNA_def_property_float_funcs(prop, "rna_NDOFMotionEventData_translation_get", nullptr, nullptr);
2358 "Translation",
2359 "The translation of this motion event. "
2360 "The range on each axis is [-1 to 1], "
2361 "before being multiplied by the sensitivity preference. "
2362 "This is typically scaled by the time-delta before use.");
2363
2364 prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_XYZ);
2365 RNA_def_property_array(prop, 3);
2367 RNA_def_property_float_funcs(prop, "rna_NDOFMotionEventData_rotation_get", nullptr, nullptr);
2369 "Rotation",
2370 "Axis-angle rotation of this motion event. "
2371 "The vector magnitude is the angle where 1.0 represents 360 degrees. "
2372 "The angle is typically scaled by the time-delta before use.");
2373
2374 prop = RNA_def_property(srna, "progress", PROP_ENUM, PROP_NONE);
2377 RNA_def_property_enum_funcs(prop, "rna_NDOFMotionEventData_progress_get", nullptr, nullptr);
2378 RNA_def_property_ui_text(prop, "Progress", "Indicates the gesture phase");
2379
2380 prop = RNA_def_property(srna, "time_delta", PROP_FLOAT, PROP_TIME);
2382 RNA_def_property_float_funcs(prop, "rna_NDOFMotionEventData_time_delta_get", nullptr, nullptr);
2383 RNA_def_property_ui_text(prop, "Time Delta", "Time since previous motion event (in seconds)");
2384}
2385
2386static void rna_def_event(BlenderRNA *brna)
2387{
2388 StructRNA *srna;
2389 PropertyRNA *prop;
2390
2391 srna = RNA_def_struct(brna, "Event", nullptr);
2392 RNA_def_struct_ui_text(srna, "Event", "Window Manager Event");
2393 RNA_def_struct_sdna(srna, "wmEvent");
2394
2395 RNA_define_verify_sdna(false); /* not in sdna */
2396
2397 /* strings */
2398 prop = RNA_def_property(srna, "ascii", PROP_STRING, PROP_NONE);
2400 RNA_def_property_string_funcs(prop, "rna_Event_ascii_get", "rna_Event_ascii_length", nullptr);
2401 RNA_def_property_ui_text(prop, "ASCII", "Single ASCII character for this event");
2402
2403 prop = RNA_def_property(srna, "unicode", PROP_STRING, PROP_NONE);
2406 prop, "rna_Event_unicode_get", "rna_Event_unicode_length", nullptr);
2407 RNA_def_property_ui_text(prop, "Unicode", "Single unicode character for this event");
2408
2409 /* enums */
2410 prop = RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
2411 RNA_def_property_enum_sdna(prop, nullptr, "val");
2414 RNA_def_property_ui_text(prop, "Value", "The type of event, only applies to some");
2415
2416 prop = RNA_def_property(srna, "value_prev", PROP_ENUM, PROP_NONE);
2417 RNA_def_property_enum_sdna(prop, nullptr, "prev_val");
2420 RNA_def_property_ui_text(prop, "Previous Value", "The type of event, only applies to some");
2421
2422 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
2423 RNA_def_property_enum_sdna(prop, nullptr, "type");
2427 RNA_def_property_ui_text(prop, "Type", "");
2428
2429 prop = RNA_def_property(srna, "type_prev", PROP_ENUM, PROP_NONE);
2430 RNA_def_property_enum_sdna(prop, nullptr, "prev_type");
2434 RNA_def_property_ui_text(prop, "Previous Type", "");
2435
2436 prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
2437 RNA_def_property_enum_sdna(prop, nullptr, "direction");
2440 RNA_def_property_ui_text(prop, "Direction", "The direction (only applies to drag events)");
2441
2442 /* keyboard */
2443 prop = RNA_def_property(srna, "is_repeat", PROP_BOOLEAN, PROP_NONE);
2445 RNA_def_property_boolean_funcs(prop, "rna_Event_is_repeat_get", nullptr);
2446 RNA_def_property_ui_text(prop, "Is Repeat", "The event is generated by holding a key down");
2447
2448 /* Trackpad & NDOF. */
2449 prop = RNA_def_property(srna, "is_consecutive", PROP_BOOLEAN, PROP_NONE);
2451 RNA_def_property_boolean_funcs(prop, "rna_Event_is_consecutive_get", nullptr);
2453 "Is Consecutive",
2454 "Part of a trackpad or NDOF motion, "
2455 "interrupted by cursor motion, button or key press events");
2456
2457 /* mouse */
2458 prop = RNA_def_property(srna, "mouse_x", PROP_INT, PROP_NONE);
2459 RNA_def_property_int_sdna(prop, nullptr, "xy[0]");
2462 prop, "Mouse X Position", "The window relative horizontal location of the mouse");
2463
2464 prop = RNA_def_property(srna, "mouse_y", PROP_INT, PROP_NONE);
2465 RNA_def_property_int_sdna(prop, nullptr, "xy[1]");
2468 prop, "Mouse Y Position", "The window relative vertical location of the mouse");
2469
2470 prop = RNA_def_property(srna, "mouse_region_x", PROP_INT, PROP_NONE);
2471 RNA_def_property_int_sdna(prop, nullptr, "mval[0]");
2474 prop, "Mouse X Position", "The region relative horizontal location of the mouse");
2475
2476 prop = RNA_def_property(srna, "mouse_region_y", PROP_INT, PROP_NONE);
2477 RNA_def_property_int_sdna(prop, nullptr, "mval[1]");
2480 prop, "Mouse Y Position", "The region relative vertical location of the mouse");
2481
2482 prop = RNA_def_property(srna, "mouse_prev_x", PROP_INT, PROP_NONE);
2483 RNA_def_property_int_sdna(prop, nullptr, "prev_xy[0]");
2486 prop, "Mouse Previous X Position", "The window relative horizontal location of the mouse");
2487
2488 prop = RNA_def_property(srna, "mouse_prev_y", PROP_INT, PROP_NONE);
2489 RNA_def_property_int_sdna(prop, nullptr, "prev_xy[1]");
2492 prop, "Mouse Previous Y Position", "The window relative vertical location of the mouse");
2493
2494 prop = RNA_def_property(srna, "mouse_prev_press_x", PROP_INT, PROP_NONE);
2495 RNA_def_property_int_sdna(prop, nullptr, "prev_press_xy[0]");
2498 "Mouse Previous X Press Position",
2499 "The window relative horizontal location of the last press event");
2500
2501 prop = RNA_def_property(srna, "mouse_prev_press_y", PROP_INT, PROP_NONE);
2502 RNA_def_property_int_sdna(prop, nullptr, "prev_press_xy[1]");
2505 "Mouse Previous Y Press Position",
2506 "The window relative vertical location of the last press event");
2507
2508 prop = RNA_def_property(srna, "pressure", PROP_FLOAT, PROP_FACTOR);
2511 RNA_def_property_float_funcs(prop, "rna_Event_pressure_get", nullptr, nullptr);
2513 prop, "Tablet Pressure", "The pressure of the tablet or 1.0 if no tablet present");
2514
2515 prop = RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_XYZ_LENGTH);
2516 RNA_def_property_array(prop, 2);
2518 RNA_def_property_float_funcs(prop, "rna_Event_tilt_get", nullptr, nullptr);
2520 prop, "Tablet Tilt", "The pressure of the tablet or zeroes if no tablet present");
2521
2522 prop = RNA_def_property(srna, "is_tablet", PROP_BOOLEAN, PROP_NONE);
2524 RNA_def_property_boolean_funcs(prop, "rna_Event_is_tablet_get", nullptr);
2525 RNA_def_property_ui_text(prop, "Is Tablet", "The event has tablet data");
2526
2527 prop = RNA_def_property(srna, "is_mouse_absolute", PROP_BOOLEAN, PROP_NONE);
2528 RNA_def_property_boolean_sdna(prop, nullptr, "tablet.is_motion_absolute", 1);
2530 RNA_def_property_ui_text(prop, "Absolute Motion", "The last motion event was an absolute input");
2531
2532 /* NDOF motion. */
2533 prop = RNA_def_property(srna, "ndof_motion", PROP_POINTER, PROP_NONE);
2534 RNA_def_property_struct_type(prop, "NDOFMotionEventData");
2536 RNA_def_property_pointer_funcs(prop, "rna_Event_ndof_motion_get", nullptr, nullptr, nullptr);
2537 RNA_def_property_ui_text(prop, "NDOF motion", "NDOF motion event data");
2538
2539 /* xr */
2540 prop = RNA_def_property(srna, "xr", PROP_POINTER, PROP_NONE);
2541 RNA_def_property_struct_type(prop, "XrEventData");
2543 RNA_def_property_pointer_funcs(prop, "rna_Event_xr_get", nullptr, nullptr, nullptr);
2544 RNA_def_property_ui_text(prop, "XR", "XR event data");
2545
2546 /* modifiers */
2547 prop = RNA_def_property(srna, "shift", PROP_BOOLEAN, PROP_NONE);
2548 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_SHIFT);
2550 RNA_def_property_ui_text(prop, "Shift", "True when the Shift key is held");
2552
2553 prop = RNA_def_property(srna, "ctrl", PROP_BOOLEAN, PROP_NONE);
2554 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_CTRL);
2556 RNA_def_property_ui_text(prop, "Ctrl", "True when the Ctrl key is held");
2557
2558 prop = RNA_def_property(srna, "alt", PROP_BOOLEAN, PROP_NONE);
2559 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_ALT);
2561 RNA_def_property_ui_text(prop, "Alt", "True when the Alt/Option key is held");
2562
2563 prop = RNA_def_property(srna, "oskey", PROP_BOOLEAN, PROP_NONE);
2564 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_OSKEY);
2566 RNA_def_property_ui_text(prop, "OS Key", "True when the Cmd key is held");
2567
2568 prop = RNA_def_property(srna, "hyper", PROP_BOOLEAN, PROP_NONE);
2569 RNA_def_property_boolean_sdna(prop, nullptr, "modifier", KM_HYPER);
2571 RNA_def_property_ui_text(prop, "Hyper", "True when the Hyper key is held");
2572
2573 RNA_define_verify_sdna(true); /* not in sdna */
2574}
2575
2576static void rna_def_timer(BlenderRNA *brna)
2577{
2578 StructRNA *srna;
2579 PropertyRNA *prop;
2580
2581 srna = RNA_def_struct(brna, "Timer", nullptr);
2582 RNA_def_struct_ui_text(srna, "Timer", "Window event timer");
2583 RNA_def_struct_sdna(srna, "wmTimer");
2584
2585 RNA_define_verify_sdna(false); /* not in sdna */
2586
2587 /* could wrap more, for now this is enough */
2588 prop = RNA_def_property(srna, "time_step", PROP_FLOAT, PROP_NONE);
2589 RNA_def_property_float_sdna(prop, nullptr, "time_step");
2591 RNA_def_property_ui_text(prop, "Time Step", "");
2592
2593 prop = RNA_def_property(srna, "time_delta", PROP_FLOAT, PROP_NONE);
2594 RNA_def_property_float_sdna(prop, nullptr, "time_delta");
2596 RNA_def_property_ui_text(prop, "Delta", "Time since last step in seconds");
2597
2598 prop = RNA_def_property(srna, "time_duration", PROP_FLOAT, PROP_NONE);
2599 RNA_def_property_float_sdna(prop, nullptr, "time_duration");
2601 RNA_def_property_ui_text(prop, "Delta", "Time since the timer started seconds");
2602
2603 RNA_define_verify_sdna(true); /* not in sdna */
2604}
2605
2607 const char *rna_type,
2608 const char *c_type,
2609 const char *layout_get_fn)
2610{
2611 StructRNA *srna;
2612 PropertyRNA *prop;
2613
2614 srna = RNA_def_struct(brna, rna_type, nullptr);
2615 /* UI name isn't visible, name same as type. */
2616 RNA_def_struct_ui_text(srna, rna_type, "");
2617 RNA_def_struct_sdna(srna, c_type);
2618
2619 RNA_define_verify_sdna(false); /* not in sdna */
2620
2621 /* could wrap more, for now this is enough */
2622 prop = RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
2623 RNA_def_property_struct_type(prop, "UILayout");
2624 RNA_def_property_pointer_funcs(prop, layout_get_fn, nullptr, nullptr, nullptr);
2625
2626 RNA_define_verify_sdna(true); /* not in sdna */
2627}
2628
2630{
2631 rna_def_popup_menu_wrapper(brna, "UIPopupMenu", "uiPopupMenu", "rna_PopupMenu_layout_get");
2632}
2633
2635{
2636 rna_def_popup_menu_wrapper(brna, "UIPopover", "uiPopover", "rna_PopoverMenu_layout_get");
2637}
2638
2639static void rna_def_piemenu(BlenderRNA *brna)
2640{
2641 rna_def_popup_menu_wrapper(brna, "UIPieMenu", "uiPieMenu", "rna_PieMenu_layout_get");
2642}
2643
2645{
2646 StructRNA *srna;
2647 PropertyRNA *prop;
2648
2649 srna = RNA_def_struct(brna, "Stereo3dDisplay", nullptr);
2650 RNA_def_struct_sdna(srna, "Stereo3dFormat");
2651 RNA_def_struct_ui_text(srna, "Stereo 3D Display", "Settings for stereo 3D display");
2652
2653 prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
2655 RNA_def_property_ui_text(prop, "Display Mode", "");
2656
2657 prop = RNA_def_property(srna, "anaglyph_type", PROP_ENUM, PROP_NONE);
2659 RNA_def_property_ui_text(prop, "Anaglyph Type", "");
2660
2661 prop = RNA_def_property(srna, "interlace_type", PROP_ENUM, PROP_NONE);
2663 RNA_def_property_ui_text(prop, "Interlace Type", "");
2664
2665 prop = RNA_def_property(srna, "use_interlace_swap", PROP_BOOLEAN, PROP_BOOLEAN);
2666 RNA_def_property_boolean_sdna(prop, nullptr, "flag", S3D_INTERLACE_SWAP);
2667 RNA_def_property_ui_text(prop, "Swap Left/Right", "Swap left and right stereo channels");
2668
2669 prop = RNA_def_property(srna, "use_sidebyside_crosseyed", PROP_BOOLEAN, PROP_BOOLEAN);
2671 RNA_def_property_ui_text(prop, "Cross-Eyed", "Right eye should see left image and vice versa");
2672}
2673
2674static void rna_def_window(BlenderRNA *brna)
2675{
2676 StructRNA *srna;
2677 PropertyRNA *prop;
2678
2679 srna = RNA_def_struct(brna, "Window", nullptr);
2680 RNA_def_struct_ui_text(srna, "Window", "Open window");
2681 RNA_def_struct_sdna(srna, "wmWindow");
2682
2683 prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
2684 RNA_def_property_ui_text(prop, "Parent Window", "Active workspace and scene follow this window");
2685
2687
2688 prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
2690 RNA_def_property_pointer_funcs(prop, nullptr, "rna_Window_scene_set", nullptr, nullptr);
2691 RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the window");
2693 RNA_def_property_update(prop, 0, "rna_Window_scene_update");
2694
2695 prop = RNA_def_property(srna, "workspace", PROP_POINTER, PROP_NONE);
2697 RNA_def_property_struct_type(prop, "WorkSpace");
2698 RNA_def_property_ui_text(prop, "Workspace", "Active workspace showing in the window");
2700 prop, "rna_Window_workspace_get", "rna_Window_workspace_set", nullptr, nullptr);
2702 RNA_def_property_update(prop, 0, "rna_Window_workspace_update");
2703
2704 prop = RNA_def_property(srna, "screen", PROP_POINTER, PROP_NONE);
2705 RNA_def_property_struct_type(prop, "Screen");
2706 RNA_def_property_ui_text(prop, "Screen", "Active workspace screen showing in the window");
2708 "rna_Window_screen_get",
2709 "rna_Window_screen_set",
2710 nullptr,
2711 "rna_Window_screen_assign_poll");
2714 RNA_def_property_update(prop, 0, "rna_workspace_screen_update");
2715
2716 prop = RNA_def_property(srna, "view_layer", PROP_POINTER, PROP_NONE);
2717 RNA_def_property_struct_type(prop, "ViewLayer");
2719 prop, "rna_Window_view_layer_get", "rna_Window_view_layer_set", nullptr, nullptr);
2721 prop, "Active View Layer", "The active workspace view layer showing in the window");
2723 RNA_def_property_update(prop, NC_SCREEN | ND_LAYER, nullptr);
2724
2725 prop = RNA_def_property(srna, "x", PROP_INT, PROP_NONE);
2726 RNA_def_property_int_sdna(prop, nullptr, "posx");
2728 RNA_def_property_ui_text(prop, "X Position", "Horizontal location of the window");
2729
2730 prop = RNA_def_property(srna, "y", PROP_INT, PROP_NONE);
2731 RNA_def_property_int_sdna(prop, nullptr, "posy");
2733 RNA_def_property_ui_text(prop, "Y Position", "Vertical location of the window");
2734
2735 prop = RNA_def_property(srna, "width", PROP_INT, PROP_UNSIGNED);
2736 RNA_def_property_int_sdna(prop, nullptr, "sizex");
2738 RNA_def_property_ui_text(prop, "Width", "Window width");
2739
2740 prop = RNA_def_property(srna, "height", PROP_INT, PROP_UNSIGNED);
2741 RNA_def_property_int_sdna(prop, nullptr, "sizey");
2743 RNA_def_property_ui_text(prop, "Height", "Window height");
2744
2745 prop = RNA_def_property(srna, "stereo_3d_display", PROP_POINTER, PROP_NONE);
2746 RNA_def_property_pointer_sdna(prop, nullptr, "stereo3d_format");
2748 RNA_def_property_struct_type(prop, "Stereo3dDisplay");
2749 RNA_def_property_ui_text(prop, "Stereo 3D Display", "Settings for stereo 3D display");
2750
2751 prop = RNA_def_property(srna, "modal_operators", PROP_COLLECTION, PROP_NONE);
2752 RNA_def_property_struct_type(prop, "Operator");
2755 "rna_Window_modal_operators_begin",
2756 "rna_iterator_listbase_next",
2757 "rna_iterator_listbase_end",
2758 "rna_Window_modal_operators_get",
2759 nullptr,
2760 nullptr,
2761 nullptr,
2762 nullptr);
2763 RNA_def_property_ui_text(prop, "Modal Operators", "A list of currently running modal operators");
2764
2765 RNA_api_window(srna);
2766}
2767
2768/* curve.splines */
2770{
2771 StructRNA *srna;
2772 PropertyRNA *prop;
2773
2774 RNA_def_property_srna(cprop, "KeyConfigurations");
2775 srna = RNA_def_struct(brna, "KeyConfigurations", nullptr);
2776 RNA_def_struct_sdna(srna, "wmWindowManager");
2777 RNA_def_struct_ui_text(srna, "KeyConfigs", "Collection of KeyConfigs");
2778
2779 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2780 RNA_def_property_struct_type(prop, "KeyConfig");
2782 "rna_WindowManager_active_keyconfig_get",
2783 "rna_WindowManager_active_keyconfig_set",
2784 nullptr,
2785 nullptr);
2787 RNA_def_property_ui_text(prop, "Active KeyConfig", "Active key configuration (preset)");
2788
2789 prop = RNA_def_property(srna, "default", PROP_POINTER, PROP_NEVER_NULL);
2790 RNA_def_property_pointer_sdna(prop, nullptr, "defaultconf");
2791 RNA_def_property_struct_type(prop, "KeyConfig");
2792 RNA_def_property_ui_text(prop, "Default Key Configuration", "Default builtin key configuration");
2793
2794 prop = RNA_def_property(srna, "addon", PROP_POINTER, PROP_NEVER_NULL);
2795 RNA_def_property_pointer_sdna(prop, nullptr, "addonconf");
2796 RNA_def_property_struct_type(prop, "KeyConfig");
2798 prop,
2799 "Add-on Key Configuration",
2800 "Key configuration that can be extended by add-ons, and is added to the active "
2801 "configuration when handling events");
2802
2803 prop = RNA_def_property(srna, "user", PROP_POINTER, PROP_NEVER_NULL);
2804 RNA_def_property_pointer_sdna(prop, nullptr, "userconf");
2805 RNA_def_property_struct_type(prop, "KeyConfig");
2807 prop,
2808 "User Key Configuration",
2809 "Final key configuration that combines keymaps from the active and add-on configurations, "
2810 "and can be edited by the user");
2811
2812 RNA_api_keyconfigs(srna);
2813}
2814
2816{
2817 StructRNA *srna;
2818 PropertyRNA *prop;
2819
2820 srna = RNA_def_struct(brna, "WindowManager", "ID");
2822 srna,
2823 "Window Manager",
2824 "Window manager data-block defining open windows and other user interface data");
2826 RNA_def_struct_sdna(srna, "wmWindowManager");
2827
2828 prop = RNA_def_property(srna, "operators", PROP_COLLECTION, PROP_NONE);
2829 RNA_def_property_struct_type(prop, "Operator");
2830 RNA_def_property_ui_text(prop, "Operators", "Operator registry");
2831
2832 prop = RNA_def_property(srna, "windows", PROP_COLLECTION, PROP_NONE);
2833 RNA_def_property_struct_type(prop, "Window");
2834 RNA_def_property_ui_text(prop, "Windows", "Open windows");
2835
2836 prop = RNA_def_property(srna, "keyconfigs", PROP_COLLECTION, PROP_NONE);
2837 RNA_def_property_struct_type(prop, "KeyConfig");
2838 RNA_def_property_ui_text(prop, "Key Configurations", "Registered key configurations");
2839 rna_def_wm_keyconfigs(brna, prop);
2840
2841 prop = RNA_def_property(srna, "xr_session_settings", PROP_POINTER, PROP_NONE);
2842 RNA_def_property_pointer_sdna(prop, nullptr, "xr.session_settings");
2844 RNA_def_property_ui_text(prop, "XR Session Settings", "");
2845
2846 prop = RNA_def_property(srna, "xr_session_state", PROP_POINTER, PROP_NONE);
2847 RNA_def_property_struct_type(prop, "XrSessionState");
2849 prop, "rna_WindowManager_xr_session_state_get", nullptr, nullptr, nullptr);
2852 prop, "XR Session State", "Runtime state information about the VR session");
2853
2854 prop = RNA_def_property(srna, "extensions_updates", PROP_INT, PROP_NONE);
2856 prop, "Extensions Updates", "Number of extensions with available update");
2857 RNA_def_property_update(prop, 0, "rna_WindowManager_extensions_statusbar_update");
2858
2859 prop = RNA_def_property(srna, "extensions_blocked", PROP_INT, PROP_NONE);
2861 prop, "Extensions Blocked", "Number of installed extensions which are blocked");
2862 RNA_def_property_update(prop, 0, "rna_WindowManager_extensions_statusbar_update");
2863
2864 RNA_api_wm(srna);
2865}
2866
2867/* keyconfig.items */
2869{
2870 StructRNA *srna;
2871
2872 RNA_def_property_srna(cprop, "KeyMapItems");
2873 srna = RNA_def_struct(brna, "KeyMapItems", nullptr);
2874 RNA_def_struct_sdna(srna, "wmKeyMap");
2875 RNA_def_struct_ui_text(srna, "KeyMap Items", "Collection of keymap items");
2876
2877 RNA_api_keymapitems(srna);
2878}
2879
2881{
2882 StructRNA *srna;
2883
2884 RNA_def_property_srna(cprop, "KeyMaps");
2885 srna = RNA_def_struct(brna, "KeyMaps", nullptr);
2886 RNA_def_struct_sdna(srna, "wmKeyConfig");
2887 RNA_def_struct_ui_text(srna, "Key Maps", "Collection of keymaps");
2888
2889 RNA_api_keymaps(srna);
2890}
2891
2893{
2894 StructRNA *srna;
2895 PropertyRNA *prop;
2896
2897 srna = RNA_def_struct(brna, "KeyConfigPreferences", nullptr);
2898 RNA_def_struct_ui_text(srna, "Key-Config Preferences", "");
2899 RNA_def_struct_sdna(srna, "wmKeyConfigPref"); /* WARNING: only a bAddon during registration */
2900
2901 RNA_def_struct_refine_func(srna, "rna_wmKeyConfigPref_refine");
2903 srna, "rna_wmKeyConfigPref_register", "rna_wmKeyConfigPref_unregister", nullptr);
2904 RNA_def_struct_idprops_func(srna, "rna_wmKeyConfigPref_idprops");
2906
2907 /* registration */
2909 prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
2910 RNA_def_property_string_sdna(prop, nullptr, "idname");
2913}
2914
2916{
2917 StructRNA *srna;
2918 PropertyRNA *prop;
2919
2920 static const EnumPropertyItem map_type_items[] = {
2921 {KMI_TYPE_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""},
2922 {KMI_TYPE_MOUSE, "MOUSE", 0, "Mouse", ""},
2923 {KMI_TYPE_NDOF, "NDOF", 0, "NDOF", ""},
2924 {KMI_TYPE_TEXTINPUT, "TEXTINPUT", 0, "Text Input", ""},
2925 {KMI_TYPE_TIMER, "TIMER", 0, "Timer", ""},
2926 {0, nullptr, 0, nullptr, nullptr},
2927 };
2928
2929 /* KeyConfig */
2930 srna = RNA_def_struct(brna, "KeyConfig", nullptr);
2931 RNA_def_struct_sdna(srna, "wmKeyConfig");
2932 RNA_def_struct_ui_text(srna, "Key Configuration", "Input configuration, including keymaps");
2933
2934 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2935 RNA_def_property_string_sdna(prop, nullptr, "idname");
2936 RNA_def_property_ui_text(prop, "Name", "Name of the key configuration");
2937 RNA_def_struct_name_property(srna, prop);
2938
2939 prop = RNA_def_property(srna, "keymaps", PROP_COLLECTION, PROP_NONE);
2940 RNA_def_property_struct_type(prop, "KeyMap");
2941 RNA_def_property_ui_text(prop, "Key Maps", "Key maps configured as part of this configuration");
2942 rna_def_wm_keymaps(brna, prop);
2943
2944 prop = RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
2945 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KEYCONF_USER);
2948 prop, "User Defined", "Indicates that a keyconfig was defined by the user");
2949
2950 /* Collection active property */
2951 prop = RNA_def_property(srna, "preferences", PROP_POINTER, PROP_NONE);
2952 RNA_def_property_struct_type(prop, "KeyConfigPreferences");
2954 prop, "rna_wmKeyConfig_preferences_get", nullptr, nullptr, nullptr);
2955
2956 RNA_api_keyconfig(srna);
2957
2958 /* KeyMap */
2959 srna = RNA_def_struct(brna, "KeyMap", nullptr);
2960 RNA_def_struct_sdna(srna, "wmKeyMap");
2961 RNA_def_struct_ui_text(srna, "Key Map", "Input configuration, including keymaps");
2962
2963 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2964 RNA_def_property_string_sdna(prop, nullptr, "idname");
2966 RNA_def_property_ui_text(prop, "Name", "Name of the key map");
2967 RNA_def_struct_name_property(srna, prop);
2968
2969 prop = RNA_def_property(srna, "bl_owner_id", PROP_STRING, PROP_NONE);
2970 RNA_def_property_string_sdna(prop, nullptr, "owner_id");
2971 RNA_def_property_ui_text(prop, "Owner", "Internal owner");
2972
2973 prop = RNA_def_property(srna, "space_type", PROP_ENUM, PROP_NONE);
2974 RNA_def_property_enum_sdna(prop, nullptr, "spaceid");
2977 RNA_def_property_ui_text(prop, "Space Type", "Optional space type keymap is associated with");
2978
2979 prop = RNA_def_property(srna, "region_type", PROP_ENUM, PROP_NONE);
2980 RNA_def_property_enum_sdna(prop, nullptr, "regionid");
2983 RNA_def_property_ui_text(prop, "Region Type", "Optional region type keymap is associated with");
2984
2985 prop = RNA_def_property(srna, "keymap_items", PROP_COLLECTION, PROP_NONE);
2986 RNA_def_property_collection_sdna(prop, nullptr, "items", nullptr);
2987 RNA_def_property_struct_type(prop, "KeyMapItem");
2989 prop, "Items", "Items in the keymap, linking an operator to an input event");
2990 rna_def_keymap_items(brna, prop);
2991
2992 prop = RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NONE);
2994 RNA_def_property_ui_text(prop, "User Defined", "Keymap is defined by the user");
2995
2996 prop = RNA_def_property(srna, "is_modal", PROP_BOOLEAN, PROP_NONE);
2997 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KEYMAP_MODAL);
3000 prop,
3001 "Modal Keymap",
3002 "Indicates that a keymap is used for translate modal events for an operator");
3003
3004 prop = RNA_def_property(srna, "show_expanded_items", PROP_BOOLEAN, PROP_NONE);
3005 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KEYMAP_EXPANDED);
3006 RNA_def_property_ui_text(prop, "Items Expanded", "Expanded in the user interface");
3007 RNA_def_property_ui_icon(prop, ICON_RIGHTARROW, 1);
3008
3009 prop = RNA_def_property(srna, "show_expanded_children", PROP_BOOLEAN, PROP_NONE);
3011 RNA_def_property_ui_text(prop, "Children Expanded", "Children expanded in the user interface");
3012 RNA_def_property_ui_icon(prop, ICON_RIGHTARROW, 1);
3013
3014 prop = RNA_def_property(srna, "modal_event_values", PROP_COLLECTION, PROP_NONE);
3016 RNA_def_property_struct_type(prop, "EnumPropertyItem");
3018 "rna_KeyMap_modal_event_values_items_begin",
3019 "rna_iterator_array_next",
3020 "rna_iterator_array_end",
3021 "rna_iterator_array_get",
3022 nullptr,
3023 nullptr,
3024 nullptr,
3025 nullptr);
3027 "Modal Events",
3028 "Give access to the possible event values of this modal keymap's items "
3029 "(#KeyMapItem.propvalue), for API introspection");
3030
3031 RNA_api_keymap(srna);
3032
3033 /* KeyMapItem */
3034 srna = RNA_def_struct(brna, "KeyMapItem", nullptr);
3035 RNA_def_struct_sdna(srna, "wmKeyMapItem");
3036 RNA_def_struct_ui_text(srna, "Key Map Item", "Item in a Key Map");
3037
3038 prop = RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
3039 RNA_def_property_string_sdna(prop, nullptr, "idname");
3040 RNA_def_property_ui_text(prop, "Identifier", "Identifier of operator to call on input event");
3042 "rna_wmKeyMapItem_idname_get",
3043 "rna_wmKeyMapItem_idname_length",
3044 "rna_wmKeyMapItem_idname_set");
3046 "WM_operatortype_idname_visit_for_search",
3048 RNA_def_struct_name_property(srna, prop);
3049 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3050
3051 /* this is in fact the operator name, but if the operator can't be found we
3052 * fall back on the operator ID */
3053 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
3055 RNA_def_property_ui_text(prop, "Name", "Name of operator (translated) to call on input event");
3057 prop, "rna_wmKeyMapItem_name_get", "rna_wmKeyMapItem_name_length", nullptr);
3058
3059 prop = RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
3060 RNA_def_property_struct_type(prop, "OperatorProperties");
3061 RNA_def_property_pointer_funcs(prop, "rna_KeyMapItem_properties_get", nullptr, nullptr, nullptr);
3062 RNA_def_property_ui_text(prop, "Properties", "Properties to set when the operator is called");
3063 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3064
3065 prop = RNA_def_property(srna, "map_type", PROP_ENUM, PROP_NONE);
3066 RNA_def_property_enum_sdna(prop, nullptr, "maptype");
3067 RNA_def_property_enum_items(prop, map_type_items);
3069 prop, "rna_wmKeyMapItem_map_type_get", "rna_wmKeyMapItem_map_type_set", nullptr);
3070 RNA_def_property_ui_text(prop, "Map Type", "Type of event mapping");
3071 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3072
3073 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
3074 RNA_def_property_enum_sdna(prop, nullptr, "type");
3077 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_KeyMapItem_type_itemf");
3078 RNA_def_property_ui_text(prop, "Type", "Type of event");
3079 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3080
3081 prop = RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
3082 RNA_def_property_enum_sdna(prop, nullptr, "val");
3084 RNA_def_property_ui_text(prop, "Value", "");
3085 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3086
3087 prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
3088 RNA_def_property_enum_sdna(prop, nullptr, "direction");
3090 RNA_def_property_ui_text(prop, "Direction", "The direction (only applies to drag events)");
3091 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3092
3093 prop = RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
3094 RNA_def_property_int_sdna(prop, nullptr, "id");
3096 RNA_def_property_ui_text(prop, "ID", "ID of the item");
3097 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3098
3099 prop = RNA_def_property(srna, "any", PROP_BOOLEAN, PROP_NONE);
3100 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_any_get", "rna_KeyMapItem_any_set");
3101 RNA_def_property_ui_text(prop, "Any", "Any modifier keys pressed");
3102 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3103
3104 prop = RNA_def_property(srna, "shift", PROP_INT, PROP_NONE);
3105 RNA_def_property_int_sdna(prop, nullptr, "shift");
3107 RNA_def_property_ui_text(prop, "Shift", "Shift key pressed, -1 for any state");
3109 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3110
3111 prop = RNA_def_property(srna, "ctrl", PROP_INT, PROP_NONE);
3112 RNA_def_property_int_sdna(prop, nullptr, "ctrl");
3114 RNA_def_property_ui_text(prop, "Ctrl", "Control key pressed, -1 for any state");
3115 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3116
3117 prop = RNA_def_property(srna, "alt", PROP_INT, PROP_NONE);
3118 RNA_def_property_int_sdna(prop, nullptr, "alt");
3120 RNA_def_property_ui_text(prop, "Alt", "Alt key pressed, -1 for any state");
3121 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3122
3123 prop = RNA_def_property(srna, "oskey", PROP_INT, PROP_NONE);
3124 RNA_def_property_int_sdna(prop, nullptr, "oskey");
3126 RNA_def_property_ui_text(prop, "OS Key", "Operating system key pressed, -1 for any state");
3127 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3128
3129 prop = RNA_def_property(srna, "hyper", PROP_INT, PROP_NONE);
3130 RNA_def_property_int_sdna(prop, nullptr, "hyper");
3132 RNA_def_property_ui_text(prop, "Hyper", "Hyper key pressed, -1 for any state");
3133 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3134
3135 /* XXX(@ideasman42): the `*_ui` suffix is only for the UI, may be removed,
3136 * since this is only exposed so the UI can show these settings as toggle-buttons. */
3137 prop = RNA_def_property(srna, "shift_ui", PROP_BOOLEAN, PROP_NONE);
3138 RNA_def_property_boolean_sdna(prop, nullptr, "shift", 0);
3139 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_shift_get", nullptr);
3140 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3141 RNA_def_property_ui_text(prop, "Shift", "Shift key pressed");
3143 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3144
3145 prop = RNA_def_property(srna, "ctrl_ui", PROP_BOOLEAN, PROP_NONE);
3146 RNA_def_property_boolean_sdna(prop, nullptr, "ctrl", 0);
3147 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_ctrl_get", nullptr);
3148 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3149 RNA_def_property_ui_text(prop, "Ctrl", "Control key pressed");
3150 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3151
3152 prop = RNA_def_property(srna, "alt_ui", PROP_BOOLEAN, PROP_NONE);
3153 RNA_def_property_boolean_sdna(prop, nullptr, "alt", 0);
3154 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_alt_get", nullptr);
3155 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3156 RNA_def_property_ui_text(prop, "Alt", "Alt key pressed");
3157 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3158
3159 prop = RNA_def_property(srna, "oskey_ui", PROP_BOOLEAN, PROP_NONE);
3160 RNA_def_property_boolean_sdna(prop, nullptr, "oskey", 0);
3161 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_oskey_get", nullptr);
3162 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3163 RNA_def_property_ui_text(prop, "OS Key", "Operating system key pressed");
3164 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3165
3166 prop = RNA_def_property(srna, "hyper_ui", PROP_BOOLEAN, PROP_NONE);
3167 RNA_def_property_boolean_sdna(prop, nullptr, "hyper", 0);
3168 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_hyper_get", nullptr);
3169 // RNA_def_property_enum_items(prop, keymap_modifiers_items);
3171 prop,
3172 "Hyper",
3173 "Hyper key pressed. "
3174 /* Additional info since this is not so widely known. */
3175 "An additional modifier which can be configured on Linux, typically replacing CapsLock");
3176 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3177 /* End `_ui` modifiers. */
3178
3179 prop = RNA_def_property(srna, "key_modifier", PROP_ENUM, PROP_NONE);
3180 RNA_def_property_enum_sdna(prop, nullptr, "keymodifier");
3183 RNA_def_property_enum_funcs(prop, nullptr, "rna_wmKeyMapItem_keymodifier_set", nullptr);
3184 RNA_def_property_ui_text(prop, "Key Modifier", "Regular key pressed as a modifier");
3185 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3186
3187 prop = RNA_def_property(srna, "repeat", PROP_BOOLEAN, PROP_NONE);
3190 RNA_def_property_ui_text(prop, "Repeat", "Active on key-repeat events (when a key is held)");
3191 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3192
3193 prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
3195 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KMI_EXPANDED);
3197 prop, "Expanded", "Show key map event and property details in the user interface");
3198 RNA_def_property_ui_icon(prop, ICON_RIGHTARROW, 1);
3199 /* Display only, no need to call `rna_KeyMapItem_update`. */
3200
3201 prop = RNA_def_property(srna, "propvalue", PROP_ENUM, PROP_NONE);
3202 RNA_def_property_enum_sdna(prop, nullptr, "propvalue");
3204 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_KeyMapItem_propvalue_itemf");
3206 prop, "Property Value", "The value this event translates to in a modal keymap");
3208 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3209
3210 prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
3212 RNA_def_property_ui_text(prop, "Active", "Activate or deactivate item");
3213 RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
3214 RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
3215
3216 prop = RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NONE);
3217 RNA_def_property_boolean_sdna(prop, nullptr, "flag", KMI_USER_MODIFIED);
3219 RNA_def_property_ui_text(prop, "User Modified", "Is this keymap item modified by the user");
3220
3221 prop = RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
3224 prop,
3225 "User Defined",
3226 "Is this keymap item user defined (doesn't just replace a builtin item)");
3227 RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_userdefined_get", nullptr);
3228
3229 RNA_api_keymapitem(srna);
3230}
3231
3251
3252#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
#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:427
bScreen * BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook) GETTER_ATTRS
Definition workspace.cc:612
WorkSpace * BKE_workspace_active_get(WorkSpaceInstanceHook *hook) GETTER_ATTRS
Definition workspace.cc:561
#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:688
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:51
#define BPy_END_ALLOW_THREADS
Definition BPY_extern.hh:55
ID and Library types, which are fundamental for SDNA.
@ ID_WM
@ S3D_INTERLACE_SWAP
@ S3D_SIDEBYSIDE_CROSSEYED
@ STATUSBAR_SHOW_EXTENSIONS_UPDATES
@ OP_IS_REPEAT_LAST
@ OP_IS_MODAL_CURSOR_REGION
@ OP_IS_MODAL_GRAB_CURSOR
@ OPERATOR_CANCELLED
@ OPERATOR_INTERFACE
@ OPERATOR_FINISHED
@ OPERATOR_RUNNING_MODAL
@ OPERATOR_PASS_THROUGH
#define OPERATOR_RETVAL_CHECK(ret)
#define OP_MAX_TYPENAME
@ KEYMAP_USER_MODIFIED
@ KEYMAP_CHILDREN_EXPANDED
@ RPT_ERROR_OUT_OF_MEMORY
@ RPT_ERROR_INVALID_INPUT
@ RPT_ERROR_INVALID_CONTEXT
Read Guarded memory(de)allocation.
#define RNA_DYN_DESCR_MAX
@ STRUCT_ID_REFCOUNT
Definition RNA_types.hh:845
@ STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID
Definition RNA_types.hh:868
@ STRUCT_NO_DATABLOCK_IDPROPERTIES
Definition RNA_types.hh:856
@ STRUCT_NO_IDPROPERTIES
Definition RNA_types.hh:854
@ STRUCT_PUBLIC_NAMESPACE_INHERIT
Definition RNA_types.hh:862
@ PROP_STRING_SEARCH_SUGGESTION
Definition RNA_types.hh:701
@ PROP_STRING_SEARCH_SORT
Definition RNA_types.hh:694
int(*)(PointerRNA *ptr, void *data, bool *have_function) StructValidateFunc
Definition RNA_types.hh:871
@ PROP_FLOAT
Definition RNA_types.hh:152
@ PROP_BOOLEAN
Definition RNA_types.hh:150
@ PROP_ENUM
Definition RNA_types.hh:154
@ PROP_INT
Definition RNA_types.hh:151
@ PROP_STRING
Definition RNA_types.hh:153
@ PROP_POINTER
Definition RNA_types.hh:155
@ PROP_COLLECTION
Definition RNA_types.hh:156
#define RNA_ENUM_ITEM_SEPR
Definition RNA_types.hh:645
int(*)(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *list) StructCallbackFunc
Definition RNA_types.hh:872
void(*)(void *data) StructFreeFunc
Definition RNA_types.hh:876
@ PROP_CONTEXT_UPDATE
Definition RNA_types.hh:381
@ PROP_EDITABLE
Definition RNA_types.hh:292
@ PROP_ENUM_FLAG
Definition RNA_types.hh:378
@ PROP_REGISTER_OPTIONAL
Definition RNA_types.hh:386
@ PROP_NEVER_NULL
Definition RNA_types.hh:351
@ PROP_NO_DEG_UPDATE
Definition RNA_types.hh:413
@ PROP_REGISTER
Definition RNA_types.hh:385
@ PROP_IDPROPERTY
Definition RNA_types.hh:400
@ PROP_TIME
Definition RNA_types.hh:241
@ PROP_XYZ
Definition RNA_types.hh:257
@ PROP_FILENAME
Definition RNA_types.hh:226
@ PROP_NONE
Definition RNA_types.hh:221
@ PROP_FACTOR
Definition RNA_types.hh:239
@ PROP_XYZ_LENGTH
Definition RNA_types.hh:258
@ PROP_UNSIGNED
Definition RNA_types.hh:237
#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:1727
@ WM_JOB_TYPE_OBJECT_BAKE
Definition WM_api.hh:1735
@ WM_JOB_TYPE_RENDER_PREVIEW
Definition WM_api.hh:1729
@ WM_JOB_TYPE_RENDER
Definition WM_api.hh:1728
@ WM_JOB_TYPE_SHADER_COMPILATION
Definition WM_api.hh:1750
#define NC_WINDOW
Definition WM_types.hh:372
#define ND_SPACE_INFO
Definition WM_types.hh:518
@ KM_CTRL
Definition WM_types.hh:276
@ KM_ALT
Definition WM_types.hh:277
@ KM_HYPER
Definition WM_types.hh:289
@ KM_OSKEY
Definition WM_types.hh:279
@ KM_SHIFT
Definition WM_types.hh:275
@ WM_EVENT_IS_CONSECUTIVE
Definition WM_types.hh:689
@ WM_EVENT_IS_REPEAT
Definition WM_types.hh:681
@ KM_DIRECTION_NW
Definition WM_types.hh:338
@ KM_DIRECTION_N
Definition WM_types.hh:331
@ KM_DIRECTION_SW
Definition WM_types.hh:336
@ KM_DIRECTION_NE
Definition WM_types.hh:332
@ KM_DIRECTION_E
Definition WM_types.hh:333
@ KM_DIRECTION_W
Definition WM_types.hh:337
@ KM_DIRECTION_SE
Definition WM_types.hh:334
@ KM_DIRECTION_S
Definition WM_types.hh:335
@ KM_NOTHING
Definition WM_types.hh:307
@ KM_ANY
Definition WM_types.hh:306
@ KM_PRESS
Definition WM_types.hh:308
@ KM_CLICK_DRAG
Definition WM_types.hh:316
@ KM_DBL_CLICK
Definition WM_types.hh:311
@ KM_RELEASE
Definition WM_types.hh:309
@ KM_CLICK
Definition WM_types.hh:310
#define NC_SCREEN
Definition WM_types.hh:374
#define NC_SCENE
Definition WM_types.hh:375
#define NA_EDITED
Definition WM_types.hh:581
ReportList * reports
Definition WM_types.hh:1025
#define OP_PROP_TAG_ADVANCED
Definition WM_types.hh:263
#define ND_LAYER
Definition WM_types.hh:447
#define ND_WORKSPACE_SET
Definition WM_types.hh:425
#define ND_LAYOUTBROWSE
Definition WM_types.hh:419
@ KM_TEXTINPUT
Definition WM_types.hh:301
#define ND_SCENEBROWSE
Definition WM_types.hh:429
@ P_IN_PROGRESS
Definition WM_types.hh:850
@ P_STARTING
Definition WM_types.hh:849
@ P_FINISHING
Definition WM_types.hh:851
@ 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 NC_SPACE
Definition WM_types.hh:389
#define KM_MOD_HELD
Definition WM_types.hh:323
#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 printf(...)
#define GS(a)
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)
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)
void rna_iterator_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr, void *data, int itemsize, int length, bool free_ptr, IteratorSkipFunc skip)
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)
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_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:497
const EnumPropertyItem rna_enum_stereo3d_anaglyph_type_items[]
Definition rna_scene.cc:529
const EnumPropertyItem rna_enum_stereo3d_interlace_type_items[]
Definition rna_scene.cc:536
const EnumPropertyItem rna_enum_region_type_items[]
Definition rna_screen.cc:21
const EnumPropertyItem rna_enum_space_type_items[]
Definition rna_space.cc:72
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:2880
void RNA_def_wm(BlenderRNA *brna)
Definition rna_wm.cc:3232
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:2287
static void rna_def_timer(BlenderRNA *brna)
Definition rna_wm.cc:2576
static void rna_def_keyconfig_prefs(BlenderRNA *brna)
Definition rna_wm.cc:2892
static void rna_def_operator_common(StructRNA *srna)
Definition rna_wm.cc:2131
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:2606
static void rna_def_event(BlenderRNA *brna)
Definition rna_wm.cc:2386
const EnumPropertyItem rna_enum_event_value_items[]
Definition rna_wm.cc:477
static void rna_def_window_stereo3d(BlenderRNA *brna)
Definition rna_wm.cc:2644
static void rna_def_macro_operator(BlenderRNA *brna)
Definition rna_wm.cc:2264
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:2634
static void rna_def_operator_filelist_element(BlenderRNA *brna)
Definition rna_wm.cc:2332
static void rna_def_windowmanager(BlenderRNA *brna)
Definition rna_wm.cc:2815
static void rna_def_wm_keyconfigs(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_wm.cc:2769
static void rna_def_event_ndof_motion(BlenderRNA *brna)
Definition rna_wm.cc:2345
static void rna_def_operator(BlenderRNA *brna)
Definition rna_wm.cc:2220
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:2095
static void rna_def_piemenu(BlenderRNA *brna)
Definition rna_wm.cc:2639
static void rna_def_window(BlenderRNA *brna)
Definition rna_wm.cc:2674
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:2915
static void rna_def_operator_utils(BlenderRNA *brna)
Definition rna_wm.cc:2313
static void rna_def_popupmenu(BlenderRNA *brna)
Definition rna_wm.cc:2629
static void rna_def_keymap_items(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_wm.cc:2868
const EnumPropertyItem rna_enum_window_cursor_items[]
Definition rna_wm_api.cc:30
StructRNA * srna
Definition RNA_types.hh:909
StructCallbackFunc call
Definition RNA_types.hh:910
StructFreeFunc free
Definition RNA_types.hh:911
Definition DNA_ID.h:404
void * first
ListBase wm
Definition BKE_main.hh:276
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:1030
wmOperatorStatus(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1046
std::string(* get_description)(bContext *C, wmOperatorType *ot, PointerRNA *ptr)
Definition WM_types.hh:1118
const char * idname
Definition WM_types.hh:1032
bool(* check)(bContext *C, wmOperator *op)
Definition WM_types.hh:1054
bool(* pyop_poll)(bContext *C, wmOperatorType *ot) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1145
ExtensionRNA rna_ext
Definition WM_types.hh:1148
const char * translation_context
Definition WM_types.hh:1034
const char * description
Definition WM_types.hh:1036
wmOperatorStatus(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1062
void(* ui)(bContext *C, wmOperator *op)
Definition WM_types.hh:1097
const char * undo_group
Definition WM_types.hh:1038
StructRNA * srna
Definition WM_types.hh:1124
wmOperatorStatus(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1078
void(* cancel)(bContext *C, wmOperator *op)
Definition WM_types.hh:1070
struct wmOperator * prev
struct wmOperatorType * type
struct PointerRNA * ptr
struct wmKeyConfig * defaultconf
struct WorkSpaceInstanceHook * workspace_hook
struct Scene * new_scene
uint len
void WM_operator_stack_clear(wmWindowManager *wm)
Definition wm.cc:374
void WM_operator_handlers_clear(wmWindowManager *wm, wmOperatorType *ot)
Definition wm.cc:383
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_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)
@ EVT_DATA_NDOF_MOTION
PointerRNA * ptr
Definition wm_files.cc:4227
wmOperatorType * ot
Definition wm_files.cc:4226
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)
wmXrSessionState * WM_xr_session_state_handle_get(const wmXrData *xr)