1 /* 2 * This program is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU General Public License 4 * as published by the Free Software Foundation; either version 2 5 * of the License, or (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software Foundation, 14 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 15 * 16 * The Original Code is Copyright (C) 2007 Blender Foundation. 17 * All rights reserved. 18 */ 19 #pragma once 20 21 /** \file 22 * \ingroup wm 23 * 24 * \page wmpage windowmanager 25 * \section wmabout About windowmanager 26 * \ref wm handles events received from \ref GHOST and manages 27 * the screens, areas and input for Blender 28 * \section wmnote NOTE 29 * \todo document 30 */ 31 32 /* dna-savable wmStructs here */ 33 #include "BLI_compiler_attrs.h" 34 #include "DNA_windowmanager_types.h" 35 #include "WM_keymap.h" 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 struct ARegion; 42 struct GHashIterator; 43 struct GPUViewport; 44 struct ID; 45 struct IDProperty; 46 struct ImBuf; 47 struct ImageFormatData; 48 struct Main; 49 struct MenuType; 50 struct PointerRNA; 51 struct PropertyRNA; 52 struct ScrArea; 53 struct View3D; 54 struct ViewLayer; 55 struct bContext; 56 struct rcti; 57 struct wmDrag; 58 struct wmDropBox; 59 struct wmEvent; 60 struct wmEventHandler_Keymap; 61 struct wmEventHandler_UI; 62 struct wmGenericUserData; 63 struct wmGesture; 64 struct wmJob; 65 struct wmOperator; 66 struct wmOperatorType; 67 struct wmPaintCursor; 68 struct wmTabletData; 69 70 #ifdef WITH_INPUT_NDOF 71 struct wmNDOFMotionData; 72 #endif 73 74 typedef struct wmGizmo wmGizmo; 75 typedef struct wmGizmoMap wmGizmoMap; 76 typedef struct wmGizmoMapType wmGizmoMapType; 77 typedef struct wmJob wmJob; 78 79 /* general API */ 80 void WM_init_state_app_template_set(const char *app_template); 81 const char *WM_init_state_app_template_get(void); 82 83 void WM_init_state_size_set(int stax, int stay, int sizx, int sizy); 84 void WM_init_state_fullscreen_set(void); 85 void WM_init_state_normal_set(void); 86 void WM_init_state_maximized_set(void); 87 void WM_init_state_start_with_console_set(bool value); 88 void WM_init_window_focus_set(bool do_it); 89 void WM_init_native_pixels(bool do_it); 90 void WM_init_tablet_api(void); 91 92 void WM_init(struct bContext *C, int argc, const char **argv); 93 void WM_exit_ex(struct bContext *C, const bool do_python); 94 95 void WM_exit(struct bContext *C) ATTR_NORETURN; 96 97 void WM_main(struct bContext *C) ATTR_NORETURN; 98 99 void WM_init_splash(struct bContext *C); 100 101 void WM_init_opengl(void); 102 103 void WM_check(struct bContext *C); 104 void WM_reinit_gizmomap_all(struct Main *bmain); 105 106 void WM_script_tag_reload(void); 107 108 bool WM_window_find_under_cursor(const wmWindowManager *wm, 109 const wmWindow *win_ignore, 110 const wmWindow *win, 111 const int mval[2], 112 wmWindow **r_win, 113 int r_mval[2]); 114 void WM_window_pixel_sample_read(const wmWindowManager *wm, 115 const wmWindow *win, 116 const int pos[2], 117 float r_col[3]); 118 119 uint *WM_window_pixels_read(struct wmWindowManager *wm, struct wmWindow *win, int r_size[2]); 120 121 int WM_window_pixels_x(const struct wmWindow *win); 122 int WM_window_pixels_y(const struct wmWindow *win); 123 void WM_window_rect_calc(const struct wmWindow *win, struct rcti *r_rect); 124 void WM_window_screen_rect_calc(const struct wmWindow *win, struct rcti *r_rect); 125 bool WM_window_is_fullscreen(const struct wmWindow *win); 126 bool WM_window_is_maximized(const struct wmWindow *win); 127 128 void WM_windows_scene_data_sync(const ListBase *win_lb, struct Scene *scene) ATTR_NONNULL(); 129 struct Scene *WM_windows_scene_get_from_screen(const struct wmWindowManager *wm, 130 const struct bScreen *screen) 131 ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; 132 struct WorkSpace *WM_windows_workspace_get_from_screen(const wmWindowManager *wm, 133 const struct bScreen *screen) 134 ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; 135 136 struct Scene *WM_window_get_active_scene(const struct wmWindow *win) 137 ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; 138 void WM_window_set_active_scene(struct Main *bmain, 139 struct bContext *C, 140 struct wmWindow *win, 141 struct Scene *scene_new) ATTR_NONNULL(); 142 struct WorkSpace *WM_window_get_active_workspace(const struct wmWindow *win) 143 ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; 144 void WM_window_set_active_workspace(struct bContext *C, 145 struct wmWindow *win, 146 struct WorkSpace *workspace) ATTR_NONNULL(1); 147 struct WorkSpaceLayout *WM_window_get_active_layout(const struct wmWindow *win) 148 ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; 149 void WM_window_set_active_layout(struct wmWindow *win, 150 struct WorkSpace *workspace, 151 struct WorkSpaceLayout *layout) ATTR_NONNULL(1); 152 struct bScreen *WM_window_get_active_screen(const struct wmWindow *win) 153 ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; 154 void WM_window_set_active_screen(struct wmWindow *win, 155 struct WorkSpace *workspace, 156 struct bScreen *screen) ATTR_NONNULL(1); 157 158 struct ViewLayer *WM_window_get_active_view_layer(const struct wmWindow *win) 159 ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT; 160 void WM_window_set_active_view_layer(struct wmWindow *win, struct ViewLayer *view_layer) 161 ATTR_NONNULL(1); 162 void WM_window_ensure_active_view_layer(struct wmWindow *win) ATTR_NONNULL(1); 163 164 bool WM_window_is_temp_screen(const struct wmWindow *win) ATTR_WARN_UNUSED_RESULT; 165 166 void *WM_opengl_context_create(void); 167 void WM_opengl_context_dispose(void *context); 168 void WM_opengl_context_activate(void *context); 169 void WM_opengl_context_release(void *context); 170 171 struct wmWindow *WM_window_open(struct bContext *C, const struct rcti *rect); 172 struct wmWindow *WM_window_open_temp(struct bContext *C, 173 const char *title, 174 int x, 175 int y, 176 int sizex, 177 int sizey, 178 int space_type, 179 bool dialog); 180 void WM_window_set_dpi(const wmWindow *win); 181 182 bool WM_stereo3d_enabled(struct wmWindow *win, bool only_fullscreen_test); 183 184 /* files */ 185 void WM_file_autoexec_init(const char *filepath); 186 bool WM_file_read(struct bContext *C, const char *filepath, struct ReportList *reports); 187 void WM_autosave_init(struct wmWindowManager *wm); 188 void WM_recover_last_session(struct bContext *C, struct ReportList *reports); 189 void WM_file_tag_modified(void); 190 191 struct ID *WM_file_append_datablock(struct Main *bmain, 192 struct Scene *scene, 193 struct ViewLayer *view_layer, 194 struct View3D *v3d, 195 const char *filepath, 196 const short id_code, 197 const char *id_name); 198 void WM_lib_reload(struct Library *lib, struct bContext *C, struct ReportList *reports); 199 200 /* mouse cursors */ 201 void WM_cursor_set(struct wmWindow *win, int curs); 202 bool WM_cursor_set_from_tool(struct wmWindow *win, const ScrArea *area, const ARegion *region); 203 void WM_cursor_modal_set(struct wmWindow *win, int val); 204 void WM_cursor_modal_restore(struct wmWindow *win); 205 void WM_cursor_wait(bool val); 206 void WM_cursor_grab_enable(struct wmWindow *win, int wrap, bool hide, int bounds[4]); 207 void WM_cursor_grab_disable(struct wmWindow *win, const int mouse_ungrab_xy[2]); 208 void WM_cursor_time(struct wmWindow *win, int nr); 209 210 struct wmPaintCursor *WM_paint_cursor_activate( 211 short space_type, 212 short region_type, 213 bool (*poll)(struct bContext *C), 214 void (*draw)(struct bContext *C, int, int, void *customdata), 215 void *customdata); 216 217 bool WM_paint_cursor_end(struct wmPaintCursor *handle); 218 void WM_paint_cursor_tag_redraw(struct wmWindow *win, struct ARegion *region); 219 220 void WM_cursor_warp(struct wmWindow *win, int x, int y); 221 void WM_cursor_compatible_xy(wmWindow *win, int *x, int *y); 222 223 /* handlers */ 224 225 typedef bool (*EventHandlerPoll)(const ARegion *region, const struct wmEvent *event); 226 struct wmEventHandler_Keymap *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap); 227 struct wmEventHandler_Keymap *WM_event_add_keymap_handler_poll(ListBase *handlers, 228 wmKeyMap *keymap, 229 EventHandlerPoll poll); 230 struct wmEventHandler_Keymap *WM_event_add_keymap_handler_v2d_mask(ListBase *handlers, 231 wmKeyMap *keymap); 232 /* priority not implemented, it adds in begin */ 233 struct wmEventHandler_Keymap *WM_event_add_keymap_handler_priority(ListBase *handlers, 234 wmKeyMap *keymap, 235 int priority); 236 237 typedef struct wmKeyMap *(wmEventHandler_KeymapDynamicFn)( 238 wmWindowManager *wm, struct wmEventHandler_Keymap *handler)ATTR_WARN_UNUSED_RESULT; 239 240 struct wmKeyMap *WM_event_get_keymap_from_toolsystem_fallback( 241 struct wmWindowManager *wm, struct wmEventHandler_Keymap *handler); 242 struct wmKeyMap *WM_event_get_keymap_from_toolsystem(struct wmWindowManager *wm, 243 struct wmEventHandler_Keymap *handler); 244 245 struct wmEventHandler_Keymap *WM_event_add_keymap_handler_dynamic( 246 ListBase *handlers, wmEventHandler_KeymapDynamicFn *keymap_fn, void *user_data); 247 248 void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap); 249 250 void WM_event_set_keymap_handler_post_callback(struct wmEventHandler_Keymap *handler, 251 void(keymap_tag)(wmKeyMap *keymap, 252 wmKeyMapItem *kmi, 253 void *user_data), 254 void *user_data); 255 wmKeyMap *WM_event_get_keymap_from_handler(wmWindowManager *wm, 256 struct wmEventHandler_Keymap *handler); 257 258 wmKeyMapItem *WM_event_match_keymap_item(struct bContext *C, 259 wmKeyMap *keymap, 260 const struct wmEvent *event); 261 262 wmKeyMapItem *WM_event_match_keymap_item_from_handlers(struct bContext *C, 263 struct wmWindowManager *wm, 264 struct ListBase *handlers, 265 const struct wmEvent *event); 266 267 typedef int (*wmUIHandlerFunc)(struct bContext *C, const struct wmEvent *event, void *userdata); 268 typedef void (*wmUIHandlerRemoveFunc)(struct bContext *C, void *userdata); 269 270 struct wmEventHandler_UI *WM_event_add_ui_handler(const struct bContext *C, 271 ListBase *handlers, 272 wmUIHandlerFunc handle_fn, 273 wmUIHandlerRemoveFunc remove_fn, 274 void *user_data, 275 const char flag); 276 void WM_event_remove_ui_handler(ListBase *handlers, 277 wmUIHandlerFunc handle_fn, 278 wmUIHandlerRemoveFunc remove_fn, 279 void *user_data, 280 const bool postpone); 281 void WM_event_remove_area_handler(struct ListBase *handlers, void *area); 282 void WM_event_free_ui_handler_all(struct bContext *C, 283 ListBase *handlers, 284 wmUIHandlerFunc handle_fn, 285 wmUIHandlerRemoveFunc remove_fn); 286 287 struct wmEventHandler_Op *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op); 288 void WM_event_modal_handler_area_replace(wmWindow *win, 289 const struct ScrArea *old_area, 290 struct ScrArea *new_area); 291 void WM_event_modal_handler_region_replace(wmWindow *win, 292 const struct ARegion *old_region, 293 struct ARegion *new_region); 294 295 void WM_event_remove_handlers(struct bContext *C, ListBase *handlers); 296 297 /* handler flag */ 298 enum { 299 WM_HANDLER_BLOCKING = (1 << 0), /* after this handler all others are ignored */ 300 WM_HANDLER_ACCEPT_DBL_CLICK = (1 << 1), /* handler accepts double key press events */ 301 302 /* internal */ 303 WM_HANDLER_DO_FREE = (1 << 7), /* handler tagged to be freed in wm_handlers_do() */ 304 }; 305 306 struct wmEventHandler_Dropbox *WM_event_add_dropbox_handler(ListBase *handlers, 307 ListBase *dropboxes); 308 309 /* mouse */ 310 void WM_event_add_mousemove(wmWindow *win); 311 312 #ifdef WITH_INPUT_NDOF 313 /* 3D mouse */ 314 void WM_ndof_deadzone_set(float deadzone); 315 #endif 316 /* notifiers */ 317 void WM_event_add_notifier_ex(struct wmWindowManager *wm, 318 const struct wmWindow *win, 319 unsigned int type, 320 void *reference); 321 void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference); 322 void WM_main_add_notifier(unsigned int type, void *reference); 323 void WM_main_remove_notifier_reference(const void *reference); 324 void WM_main_remap_editor_id_reference(struct ID *old_id, struct ID *new_id); 325 326 /* reports */ 327 void WM_report_banner_show(void); 328 void WM_report_banners_cancel(struct Main *bmain); 329 void WM_report(ReportType type, const char *message); 330 void WM_reportf(ReportType type, const char *format, ...) ATTR_PRINTF_FORMAT(2, 3); 331 332 struct wmEvent *wm_event_add_ex(struct wmWindow *win, 333 const struct wmEvent *event_to_add, 334 const struct wmEvent *event_to_add_after) ATTR_NONNULL(1, 2); 335 struct wmEvent *wm_event_add(struct wmWindow *win, const struct wmEvent *event_to_add) 336 ATTR_NONNULL(1, 2); 337 338 void wm_event_init_from_window(struct wmWindow *win, struct wmEvent *event); 339 340 /* at maximum, every timestep seconds it triggers event_type events */ 341 struct wmTimer *WM_event_add_timer(struct wmWindowManager *wm, 342 struct wmWindow *win, 343 int event_type, 344 double timestep); 345 struct wmTimer *WM_event_add_timer_notifier(struct wmWindowManager *wm, 346 struct wmWindow *win, 347 unsigned int type, 348 double timestep); 349 void WM_event_remove_timer(struct wmWindowManager *wm, 350 struct wmWindow *win, 351 struct wmTimer *timer); 352 void WM_event_remove_timer_notifier(struct wmWindowManager *wm, 353 struct wmWindow *win, 354 struct wmTimer *timer); 355 void WM_event_timer_sleep(struct wmWindowManager *wm, 356 struct wmWindow *win, 357 struct wmTimer *timer, 358 bool do_sleep); 359 360 /* operator api, default callbacks */ 361 /* invoke callback, uses enum property named "type" */ 362 int WM_generic_select_modal(struct bContext *C, 363 struct wmOperator *op, 364 const struct wmEvent *event); 365 int WM_generic_select_invoke(struct bContext *C, 366 struct wmOperator *op, 367 const struct wmEvent *event); 368 void WM_operator_view3d_unit_defaults(struct bContext *C, struct wmOperator *op); 369 int WM_operator_smooth_viewtx_get(const struct wmOperator *op); 370 int WM_menu_invoke_ex(struct bContext *C, struct wmOperator *op, int opcontext); 371 int WM_menu_invoke(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 372 void WM_menu_name_call(struct bContext *C, const char *menu_name, short context); 373 int WM_enum_search_invoke_previews(struct bContext *C, 374 struct wmOperator *op, 375 short prv_cols, 376 short prv_rows); 377 int WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 378 /* invoke callback, confirm menu + exec */ 379 int WM_operator_confirm(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 380 int WM_operator_confirm_or_exec(struct bContext *C, 381 struct wmOperator *op, 382 const struct wmEvent *event); 383 /* invoke callback, file selector "filepath" unset + exec */ 384 int WM_operator_filesel(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 385 bool WM_operator_filesel_ensure_ext_imtype(wmOperator *op, 386 const struct ImageFormatData *im_format); 387 /* poll callback, context checks */ 388 bool WM_operator_winactive(struct bContext *C); 389 /* invoke callback, exec + redo popup */ 390 int WM_operator_props_popup_confirm(struct bContext *C, 391 struct wmOperator *op, 392 const struct wmEvent *event); 393 int WM_operator_props_popup_call(struct bContext *C, 394 struct wmOperator *op, 395 const struct wmEvent *event); 396 int WM_operator_props_popup(struct bContext *C, 397 struct wmOperator *op, 398 const struct wmEvent *event); 399 int WM_operator_props_dialog_popup(struct bContext *C, struct wmOperator *op, int width); 400 int WM_operator_redo_popup(struct bContext *C, struct wmOperator *op); 401 int WM_operator_ui_popup(struct bContext *C, struct wmOperator *op, int width); 402 403 int WM_operator_confirm_message_ex(struct bContext *C, 404 struct wmOperator *op, 405 const char *title, 406 const int icon, 407 const char *message, 408 const short opcontext); 409 int WM_operator_confirm_message(struct bContext *C, struct wmOperator *op, const char *message); 410 411 /* operator api */ 412 void WM_operator_free(struct wmOperator *op); 413 void WM_operator_free_all_after(wmWindowManager *wm, struct wmOperator *op); 414 void WM_operator_type_set(struct wmOperator *op, struct wmOperatorType *ot); 415 void WM_operator_stack_clear(struct wmWindowManager *wm); 416 void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot); 417 418 bool WM_operator_poll(struct bContext *C, struct wmOperatorType *ot); 419 bool WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, short context); 420 int WM_operator_call_ex(struct bContext *C, struct wmOperator *op, const bool store); 421 int WM_operator_call(struct bContext *C, struct wmOperator *op); 422 int WM_operator_call_notest(struct bContext *C, struct wmOperator *op); 423 int WM_operator_repeat(struct bContext *C, struct wmOperator *op); 424 int WM_operator_repeat_last(struct bContext *C, struct wmOperator *op); 425 bool WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op); 426 bool WM_operator_is_repeat(const struct bContext *C, const struct wmOperator *op); 427 int WM_operator_name_call_ptr(struct bContext *C, 428 struct wmOperatorType *ot, 429 short context, 430 struct PointerRNA *properties); 431 int WM_operator_name_call(struct bContext *C, 432 const char *opstring, 433 short context, 434 struct PointerRNA *properties); 435 int WM_operator_name_call_with_properties(struct bContext *C, 436 const char *opstring, 437 short context, 438 struct IDProperty *properties); 439 int WM_operator_call_py(struct bContext *C, 440 struct wmOperatorType *ot, 441 short context, 442 struct PointerRNA *properties, 443 struct ReportList *reports, 444 const bool is_undo); 445 446 /* Used for keymap and macro items. */ 447 void WM_operator_properties_alloc(struct PointerRNA **ptr, 448 struct IDProperty **properties, 449 const char *opstring); 450 451 /* Make props context sensitive or not. */ 452 void WM_operator_properties_sanitize(struct PointerRNA *ptr, const bool no_context); 453 454 bool WM_operator_properties_default(struct PointerRNA *ptr, const bool do_update); 455 void WM_operator_properties_reset(struct wmOperator *op); 456 void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring); 457 void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperatorType *ot); 458 void WM_operator_properties_clear(struct PointerRNA *ptr); 459 void WM_operator_properties_free(struct PointerRNA *ptr); 460 461 bool WM_operator_check_ui_empty(struct wmOperatorType *ot); 462 bool WM_operator_check_ui_enabled(const struct bContext *C, const char *idname); 463 464 IDProperty *WM_operator_last_properties_ensure_idprops(struct wmOperatorType *ot); 465 void WM_operator_last_properties_ensure(struct wmOperatorType *ot, struct PointerRNA *ptr); 466 wmOperator *WM_operator_last_redo(const struct bContext *C); 467 ID *WM_operator_drop_load_path(struct bContext *C, struct wmOperator *op, const short idcode); 468 469 bool WM_operator_last_properties_init(struct wmOperator *op); 470 bool WM_operator_last_properties_store(struct wmOperator *op); 471 472 /* wm_operator_props.c */ 473 void WM_operator_properties_confirm_or_exec(struct wmOperatorType *ot); 474 void WM_operator_properties_filesel(struct wmOperatorType *ot, 475 int filter, 476 short type, 477 short action, 478 short flag, 479 short display, 480 short sort); 481 void WM_operator_properties_use_cursor_init(struct wmOperatorType *ot); 482 void WM_operator_properties_border(struct wmOperatorType *ot); 483 void WM_operator_properties_border_to_rcti(struct wmOperator *op, struct rcti *rect); 484 void WM_operator_properties_border_to_rctf(struct wmOperator *op, rctf *rect); 485 void WM_operator_properties_gesture_box_ex(struct wmOperatorType *ot, bool deselect, bool extend); 486 void WM_operator_properties_gesture_box(struct wmOperatorType *ot); 487 void WM_operator_properties_gesture_box_select(struct wmOperatorType *ot); 488 void WM_operator_properties_gesture_box_zoom(struct wmOperatorType *ot); 489 void WM_operator_properties_gesture_lasso(struct wmOperatorType *ot); 490 void WM_operator_properties_gesture_straightline(struct wmOperatorType *ot, int cursor); 491 void WM_operator_properties_gesture_circle(struct wmOperatorType *ot); 492 void WM_operator_properties_mouse_select(struct wmOperatorType *ot); 493 void WM_operator_properties_select_all(struct wmOperatorType *ot); 494 void WM_operator_properties_select_action(struct wmOperatorType *ot, 495 int default_action, 496 bool hide_gui); 497 void WM_operator_properties_select_action_simple(struct wmOperatorType *ot, 498 int default_action, 499 bool hide_gui); 500 void WM_operator_properties_select_random(struct wmOperatorType *ot); 501 int WM_operator_properties_select_random_seed_increment_get(wmOperator *op); 502 void WM_operator_properties_select_operation(struct wmOperatorType *ot); 503 void WM_operator_properties_select_operation_simple(struct wmOperatorType *ot); 504 void WM_operator_properties_select_walk_direction(struct wmOperatorType *ot); 505 void WM_operator_properties_generic_select(struct wmOperatorType *ot); 506 struct CheckerIntervalParams { 507 int nth; /* bypass when set to zero */ 508 int skip; 509 int offset; 510 }; 511 void WM_operator_properties_checker_interval(struct wmOperatorType *ot, bool nth_can_disable); 512 void WM_operator_properties_checker_interval_from_op(struct wmOperator *op, 513 struct CheckerIntervalParams *op_params); 514 bool WM_operator_properties_checker_interval_test(const struct CheckerIntervalParams *op_params, 515 int depth); 516 517 /* flags for WM_operator_properties_filesel */ 518 #define WM_FILESEL_RELPATH (1 << 0) 519 520 #define WM_FILESEL_DIRECTORY (1 << 1) 521 #define WM_FILESEL_FILENAME (1 << 2) 522 #define WM_FILESEL_FILEPATH (1 << 3) 523 #define WM_FILESEL_FILES (1 << 4) 524 /* Show the properties sidebar by default. */ 525 #define WM_FILESEL_SHOW_PROPS (1 << 5) 526 527 /* operator as a python command (resultuing string must be freed) */ 528 char *WM_operator_pystring_ex(struct bContext *C, 529 struct wmOperator *op, 530 const bool all_args, 531 const bool macro_args, 532 struct wmOperatorType *ot, 533 struct PointerRNA *opptr); 534 char *WM_operator_pystring(struct bContext *C, 535 struct wmOperator *op, 536 const bool all_args, 537 const bool macro_args); 538 bool WM_operator_pystring_abbreviate(char *str, int str_len_max); 539 char *WM_prop_pystring_assign(struct bContext *C, 540 struct PointerRNA *ptr, 541 struct PropertyRNA *prop, 542 int index); 543 void WM_operator_bl_idname(char *to, const char *from); 544 void WM_operator_py_idname(char *to, const char *from); 545 bool WM_operator_py_idname_ok_or_report(struct ReportList *reports, 546 const char *classname, 547 const char *idname); 548 const char *WM_context_member_from_ptr(struct bContext *C, const struct PointerRNA *ptr); 549 550 /* wm_operator_type.c */ 551 struct wmOperatorType *WM_operatortype_find(const char *idname, bool quiet); 552 void WM_operatortype_iter(struct GHashIterator *ghi); 553 void WM_operatortype_append(void (*opfunc)(struct wmOperatorType *)); 554 void WM_operatortype_append_ptr(void (*opfunc)(struct wmOperatorType *, void *), void *userdata); 555 void WM_operatortype_append_macro_ptr(void (*opfunc)(struct wmOperatorType *, void *), 556 void *userdata); 557 void WM_operatortype_remove_ptr(struct wmOperatorType *ot); 558 bool WM_operatortype_remove(const char *idname); 559 void WM_operatortype_last_properties_clear_all(void); 560 void WM_operatortype_props_advanced_begin(struct wmOperatorType *ot); 561 void WM_operatortype_props_advanced_end(struct wmOperatorType *ot); 562 563 #define WM_operatortype_prop_tag(property, tags) \ 564 { \ 565 CHECK_TYPE(tags, eOperatorPropTags); \ 566 RNA_def_property_tags(prop, tags); \ 567 } \ 568 (void)0 569 570 struct wmOperatorType *WM_operatortype_append_macro(const char *idname, 571 const char *name, 572 const char *description, 573 int flag); 574 struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *ot, 575 const char *idname); 576 577 const char *WM_operatortype_name(struct wmOperatorType *ot, struct PointerRNA *properties); 578 char *WM_operatortype_description(struct bContext *C, 579 struct wmOperatorType *ot, 580 struct PointerRNA *properties); 581 char *WM_operatortype_description_or_name(struct bContext *C, 582 struct wmOperatorType *ot, 583 struct PointerRNA *properties); 584 585 /* wm_operator_utils.c */ 586 void WM_operator_type_modal_from_exec_for_object_edit_coords(struct wmOperatorType *ot); 587 588 /* wm_uilist_type.c */ 589 void WM_uilisttype_init(void); 590 struct uiListType *WM_uilisttype_find(const char *idname, bool quiet); 591 bool WM_uilisttype_add(struct uiListType *ult); 592 void WM_uilisttype_freelink(struct uiListType *ult); 593 void WM_uilisttype_free(void); 594 595 /* wm_menu_type.c */ 596 void WM_menutype_init(void); 597 struct MenuType *WM_menutype_find(const char *idname, bool quiet); 598 void WM_menutype_iter(struct GHashIterator *ghi); 599 bool WM_menutype_add(struct MenuType *mt); 600 void WM_menutype_freelink(struct MenuType *mt); 601 void WM_menutype_free(void); 602 bool WM_menutype_poll(struct bContext *C, struct MenuType *mt); 603 604 /* wm_panel_type.c */ 605 void WM_paneltype_init(void); 606 void WM_paneltype_clear(void); 607 struct PanelType *WM_paneltype_find(const char *idname, bool quiet); 608 bool WM_paneltype_add(struct PanelType *pt); 609 void WM_paneltype_remove(struct PanelType *pt); 610 611 /* wm_gesture_ops.c */ 612 int WM_gesture_box_invoke(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 613 int WM_gesture_box_modal(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 614 void WM_gesture_box_cancel(struct bContext *C, struct wmOperator *op); 615 int WM_gesture_circle_invoke(struct bContext *C, 616 struct wmOperator *op, 617 const struct wmEvent *event); 618 int WM_gesture_circle_modal(struct bContext *C, 619 struct wmOperator *op, 620 const struct wmEvent *event); 621 void WM_gesture_circle_cancel(struct bContext *C, struct wmOperator *op); 622 int WM_gesture_lines_invoke(struct bContext *C, 623 struct wmOperator *op, 624 const struct wmEvent *event); 625 int WM_gesture_lines_modal(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 626 void WM_gesture_lines_cancel(struct bContext *C, struct wmOperator *op); 627 int WM_gesture_lasso_invoke(struct bContext *C, 628 struct wmOperator *op, 629 const struct wmEvent *event); 630 int WM_gesture_lasso_modal(struct bContext *C, struct wmOperator *op, const struct wmEvent *event); 631 void WM_gesture_lasso_cancel(struct bContext *C, struct wmOperator *op); 632 const int (*WM_gesture_lasso_path_to_array(struct bContext *C, 633 struct wmOperator *op, 634 int *mcoords_len))[2]; 635 636 int WM_gesture_straightline_invoke(struct bContext *C, 637 struct wmOperator *op, 638 const struct wmEvent *event); 639 int WM_gesture_straightline_active_side_invoke(struct bContext *C, 640 struct wmOperator *op, 641 const struct wmEvent *event); 642 int WM_gesture_straightline_modal(struct bContext *C, 643 struct wmOperator *op, 644 const struct wmEvent *event); 645 int WM_gesture_straightline_oneshot_modal(struct bContext *C, 646 struct wmOperator *op, 647 const struct wmEvent *event); 648 void WM_gesture_straightline_cancel(struct bContext *C, struct wmOperator *op); 649 650 /* Gesture manager API */ 651 struct wmGesture *WM_gesture_new(struct wmWindow *window, 652 const struct ARegion *region, 653 const struct wmEvent *event, 654 int type); 655 void WM_gesture_end(struct wmWindow *win, struct wmGesture *gesture); 656 void WM_gestures_remove(struct wmWindow *win); 657 void WM_gestures_free_all(struct wmWindow *win); 658 bool WM_gesture_is_modal_first(const struct wmGesture *gesture); 659 660 /* fileselecting support */ 661 void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op); 662 void WM_event_fileselect_event(struct wmWindowManager *wm, void *ophandle, int eventval); 663 664 void WM_operator_region_active_win_set(struct bContext *C); 665 666 /* drag and drop */ 667 struct wmDrag *WM_event_start_drag( 668 struct bContext *C, int icon, int type, void *poin, double value, unsigned int flags); 669 void WM_event_drag_image(struct wmDrag *, struct ImBuf *, float scale, int sx, int sy); 670 void WM_drag_free(struct wmDrag *drag); 671 void WM_drag_free_list(struct ListBase *lb); 672 673 struct wmDropBox *WM_dropbox_add( 674 ListBase *lb, 675 const char *idname, 676 bool (*poll)(struct bContext *, struct wmDrag *, const struct wmEvent *event, const char **), 677 void (*copy)(struct wmDrag *, struct wmDropBox *)); 678 ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid); 679 680 /* ID drag and drop */ 681 void WM_drag_add_ID(struct wmDrag *drag, struct ID *id, struct ID *from_parent); 682 struct ID *WM_drag_ID(const struct wmDrag *drag, short idcode); 683 struct ID *WM_drag_ID_from_event(const struct wmEvent *event, short idcode); 684 685 /* Set OpenGL viewport and scissor */ 686 void wmViewport(const struct rcti *winrct); 687 void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct); 688 void wmWindowViewport(struct wmWindow *win); 689 690 /* OpenGL utilities with safety check */ 691 void wmOrtho2(float x1, float x2, float y1, float y2); 692 /* use for conventions (avoid hard-coded offsets all over) */ 693 void wmOrtho2_region_pixelspace(const struct ARegion *region); 694 void wmOrtho2_pixelspace(const float x, const float y); 695 void wmGetProjectionMatrix(float mat[4][4], const struct rcti *winrct); 696 697 /* threaded Jobs Manager */ 698 enum { 699 WM_JOB_PRIORITY = (1 << 0), 700 WM_JOB_EXCL_RENDER = (1 << 1), 701 WM_JOB_PROGRESS = (1 << 2), 702 }; 703 704 /** 705 * Identifying jobs by owner alone is unreliable, this isnt saved, 706 * order can change (keep 0 for 'any'). 707 */ 708 enum { 709 WM_JOB_TYPE_ANY = 0, 710 WM_JOB_TYPE_COMPOSITE, 711 WM_JOB_TYPE_RENDER, 712 WM_JOB_TYPE_RENDER_PREVIEW, /* UI preview */ 713 WM_JOB_TYPE_OBJECT_SIM_OCEAN, 714 WM_JOB_TYPE_OBJECT_SIM_FLUID, 715 WM_JOB_TYPE_OBJECT_BAKE_TEXTURE, 716 WM_JOB_TYPE_OBJECT_BAKE, 717 WM_JOB_TYPE_FILESEL_READDIR, 718 WM_JOB_TYPE_CLIP_BUILD_PROXY, 719 WM_JOB_TYPE_CLIP_TRACK_MARKERS, 720 WM_JOB_TYPE_CLIP_SOLVE_CAMERA, 721 WM_JOB_TYPE_CLIP_PREFETCH, 722 WM_JOB_TYPE_SEQ_BUILD_PROXY, 723 WM_JOB_TYPE_SEQ_BUILD_PREVIEW, 724 WM_JOB_TYPE_POINTCACHE, 725 WM_JOB_TYPE_DPAINT_BAKE, 726 WM_JOB_TYPE_ALEMBIC, 727 WM_JOB_TYPE_SHADER_COMPILATION, 728 WM_JOB_TYPE_STUDIOLIGHT, 729 WM_JOB_TYPE_LIGHT_BAKE, 730 WM_JOB_TYPE_FSMENU_BOOKMARK_VALIDATE, 731 WM_JOB_TYPE_QUADRIFLOW_REMESH, 732 /* add as needed, bake, seq proxy build 733 * if having hard coded values is a problem */ 734 }; 735 736 struct wmJob *WM_jobs_get(struct wmWindowManager *wm, 737 struct wmWindow *win, 738 void *owner, 739 const char *name, 740 int flag, 741 int job_type); 742 743 bool WM_jobs_test(struct wmWindowManager *wm, void *owner, int job_type); 744 float WM_jobs_progress(struct wmWindowManager *wm, void *owner); 745 char *WM_jobs_name(struct wmWindowManager *wm, void *owner); 746 double WM_jobs_starttime(struct wmWindowManager *wm, void *owner); 747 void *WM_jobs_customdata(struct wmWindowManager *wm, void *owner); 748 void *WM_jobs_customdata_from_type(struct wmWindowManager *wm, int job_type); 749 750 bool WM_jobs_is_running(struct wmJob *); 751 bool WM_jobs_is_stopped(wmWindowManager *wm, void *owner); 752 void *WM_jobs_customdata_get(struct wmJob *); 753 void WM_jobs_customdata_set(struct wmJob *, void *customdata, void (*free)(void *)); 754 void WM_jobs_timer(struct wmJob *, double timestep, unsigned int note, unsigned int endnote); 755 void WM_jobs_delay_start(struct wmJob *, double delay_time); 756 757 typedef void (*wm_jobs_start_callback)(void *custom_data, 758 short *stop, 759 short *do_update, 760 float *progress); 761 void WM_jobs_callbacks(struct wmJob *, 762 wm_jobs_start_callback startjob, 763 void (*initjob)(void *), 764 void (*update)(void *), 765 void (*endjob)(void *)); 766 767 void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *); 768 void WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob); 769 void WM_jobs_kill(struct wmWindowManager *wm, 770 void *owner, 771 void (*)(void *, short int *, short int *, float *)); 772 void WM_jobs_kill_all(struct wmWindowManager *wm); 773 void WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner); 774 void WM_jobs_kill_type(struct wmWindowManager *wm, void *owner, int job_type); 775 776 bool WM_jobs_has_running(struct wmWindowManager *wm); 777 778 void WM_job_main_thread_lock_acquire(struct wmJob *job); 779 void WM_job_main_thread_lock_release(struct wmJob *job); 780 781 /* clipboard */ 782 char *WM_clipboard_text_get(bool selection, int *r_len); 783 char *WM_clipboard_text_get_firstline(bool selection, int *r_len); 784 void WM_clipboard_text_set(const char *buf, bool selection); 785 786 /* progress */ 787 void WM_progress_set(struct wmWindow *win, float progress); 788 void WM_progress_clear(struct wmWindow *win); 789 790 /* Draw (for screenshot) */ 791 void *WM_draw_cb_activate(struct wmWindow *win, 792 void (*draw)(const struct wmWindow *, void *), 793 void *customdata); 794 void WM_draw_cb_exit(struct wmWindow *win, void *handle); 795 void WM_redraw_windows(struct bContext *C); 796 797 void WM_draw_region_viewport_ensure(struct ARegion *region, short space_type); 798 void WM_draw_region_viewport_bind(struct ARegion *region); 799 void WM_draw_region_viewport_unbind(struct ARegion *region); 800 801 /* Region drawing */ 802 void WM_draw_region_free(struct ARegion *region, bool hide); 803 struct GPUViewport *WM_draw_region_get_viewport(struct ARegion *region); 804 struct GPUViewport *WM_draw_region_get_bound_viewport(struct ARegion *region); 805 806 void WM_main_playanim(int argc, const char **argv); 807 808 /* debugging only, convenience function to write on crash */ 809 bool write_crash_blend(void); 810 811 /* Lock the interface for any communication */ 812 void WM_set_locked_interface(struct wmWindowManager *wm, bool lock); 813 814 void WM_event_tablet_data_default_set(struct wmTabletData *tablet_data); 815 816 /* For testing only 'G_FLAG_EVENT_SIMULATE' */ 817 struct wmEvent *WM_event_add_simulate(struct wmWindow *win, const struct wmEvent *event_to_add); 818 819 const char *WM_window_cursor_keymap_status_get(const struct wmWindow *win, 820 int button_index, 821 int type_index); 822 void WM_window_cursor_keymap_status_refresh(struct bContext *C, struct wmWindow *win); 823 824 void WM_window_status_area_tag_redraw(struct wmWindow *win); 825 struct ScrArea *WM_window_status_area_find(struct wmWindow *win, struct bScreen *screen); 826 bool WM_window_modal_keymap_status_draw(struct bContext *C, 827 struct wmWindow *win, 828 struct uiLayout *layout); 829 830 /* wm_event_query.c */ 831 void WM_event_print(const struct wmEvent *event); 832 833 int WM_event_modifier_flag(const struct wmEvent *event); 834 835 bool WM_event_is_modal_tweak_exit(const struct wmEvent *event, int tweak_event); 836 bool WM_event_is_last_mousemove(const struct wmEvent *event); 837 838 int WM_event_drag_threshold(const struct wmEvent *event); 839 bool WM_event_drag_test(const struct wmEvent *event, const int prev_xy[2]); 840 bool WM_event_drag_test_with_delta(const struct wmEvent *event, const int delta[2]); 841 842 /* event map */ 843 int WM_userdef_event_map(int kmitype); 844 int WM_userdef_event_type_from_keymap_type(int kmitype); 845 846 #ifdef WITH_INPUT_NDOF 847 void WM_event_ndof_pan_get(const struct wmNDOFMotionData *ndof, 848 float r_pan[3], 849 const bool use_zoom); 850 void WM_event_ndof_rotate_get(const struct wmNDOFMotionData *ndof, float r_rot[3]); 851 852 float WM_event_ndof_to_axis_angle(const struct wmNDOFMotionData *ndof, float axis[3]); 853 void WM_event_ndof_to_quat(const struct wmNDOFMotionData *ndof, float q[4]); 854 #endif /* WITH_INPUT_NDOF */ 855 856 float WM_event_tablet_data(const struct wmEvent *event, int *pen_flip, float tilt[2]); 857 bool WM_event_is_tablet(const struct wmEvent *event); 858 859 #ifdef WITH_INPUT_IME 860 bool WM_event_is_ime_switch(const struct wmEvent *event); 861 #endif 862 863 /* wm_tooltip.c */ 864 typedef struct ARegion *(*wmTooltipInitFn)(struct bContext *C, 865 struct ARegion *region, 866 int *pass, 867 double *r_pass_delay, 868 bool *r_exit_on_event); 869 870 void WM_tooltip_immediate_init(struct bContext *C, 871 struct wmWindow *win, 872 struct ScrArea *area, 873 struct ARegion *region, 874 wmTooltipInitFn init); 875 void WM_tooltip_timer_init_ex(struct bContext *C, 876 struct wmWindow *win, 877 struct ScrArea *area, 878 struct ARegion *region, 879 wmTooltipInitFn init, 880 double delay); 881 void WM_tooltip_timer_init(struct bContext *C, 882 struct wmWindow *win, 883 struct ScrArea *area, 884 struct ARegion *region, 885 wmTooltipInitFn init); 886 void WM_tooltip_timer_clear(struct bContext *C, struct wmWindow *win); 887 void WM_tooltip_clear(struct bContext *C, struct wmWindow *win); 888 void WM_tooltip_init(struct bContext *C, struct wmWindow *win); 889 void WM_tooltip_refresh(struct bContext *C, struct wmWindow *win); 890 double WM_tooltip_time_closed(void); 891 892 /* wm_utils.c */ 893 struct wmGenericCallback *WM_generic_callback_steal(struct wmGenericCallback *callback); 894 void WM_generic_callback_free(struct wmGenericCallback *callback); 895 896 void WM_generic_user_data_free(struct wmGenericUserData *wm_userdata); 897 898 bool WM_region_use_viewport(struct ScrArea *area, struct ARegion *region); 899 900 #ifdef WITH_XR_OPENXR 901 /* wm_xr.c */ 902 bool WM_xr_session_exists(const wmXrData *xr); 903 bool WM_xr_session_is_ready(const wmXrData *xr); 904 struct wmXrSessionState *WM_xr_session_state_handle_get(const wmXrData *xr); 905 void WM_xr_session_base_pose_reset(wmXrData *xr); 906 bool WM_xr_session_state_viewer_pose_location_get(const wmXrData *xr, float r_location[3]); 907 bool WM_xr_session_state_viewer_pose_rotation_get(const wmXrData *xr, float r_rotation[4]); 908 bool WM_xr_session_state_viewer_pose_matrix_info_get(const wmXrData *xr, 909 float r_viewmat[4][4], 910 float *r_focal_len); 911 #endif 912 913 #ifdef __cplusplus 914 } 915 #endif 916