15#include <fmt/format.h>
107#define USE_GIZMO_MOUSE_PRIORITY_HACK
111 "These structs must match exactly!");
125#define WM_HANDLER_CONTINUE ((eHandlerActionFlag)0)
135 const bool poll_only,
145 uint64_t *event_state_prev_press_time_ms_p,
146 const bool is_keyboard,
147 const bool check_double_click);
186 *
event = *event_to_add;
216 uint64_t eventstate_prev_press_time_ms = 0;
220 &eventstate_prev_press_time_ms,
246 event->customdata =
nullptr;
247 event->customdata_free =
false;
256 printf(
"%s: 'is_repeat=true' for non-keyboard event, this should not happen.\n", __func__);
260 printf(
"%s: 'val != NOTHING' for a cursor motion event, this should not happen.\n", __func__);
290 event->next =
event->prev =
nullptr;
302 if (event !=
nullptr) {
368 if (wm->
runtime->notifier_queue_set ==
nullptr) {
419 if (note->reference == reference) {
428 if (wm->
runtime->notifier_current == note) {
442 if (wm->
runtime->message_bus) {
465 if (
wmMsgBus *mbus = wm->runtime->message_bus) {
466 mappings.
iter([&](
ID *old_id,
ID *new_id) {
467 if (new_id !=
nullptr) {
483 memset(((
char *)note) +
sizeof(
Link), 0,
sizeof(*note) -
sizeof(
Link));
497 if (wm->
runtime->is_interface_locked) {
517 if (sequencer_scene && sequencer_scene != scene) {
520 if (is_after_open_file) {
538 if (is_after_open_file) {
557 if (area->do_refresh) {
603 bool do_anim =
false;
604 bool clear_info_stats =
false;
611 *note_next =
nullptr;
616 note_next = note->next;
621 wm->
runtime->notifier_current = note;
623 if (note->category ==
NC_WM) {
631 else if (note->data ==
ND_UNDO) {
635 if (note->window == win) {
644 printf(
"%s: Workspace set %p\n", __func__, note->reference);
653 printf(
"%s: Workspace delete %p\n", __func__, workspace);
665 printf(
"%s: screen set %p\n", __func__, note->reference);
674 printf(
"%s: screen delete %p\n", __func__, note->reference);
680 if (note->window == win ||
681 (note->window ==
nullptr &&
ELEM(note->reference,
nullptr, scene)))
690 clear_info_stats =
true;
693 wm->
runtime->notifier_current =
nullptr;
695 note_next = note->next;
702 if (clear_info_stats) {
714 if (
G.is_rendering ==
false) {
744 if (note->category ==
NC_SCREEN && note->reference && note->reference != screen &&
749 else if (note->category ==
NC_SCENE && note->reference &&
759 printf(
"notifier win %d screen %s cat %x\n",
761 win->screen->id.name + 2,
769 region_params.
window = win;
770 region_params.
area =
nullptr;
771 region_params.
region = region;
772 region_params.
scene = scene;
779 if ((note->category ==
NC_SPACE) && note->reference) {
782 if (!
ELEM(note->reference, area->spacedata.first, screen, scene)) {
788 area_params.
area = area;
790 area_params.
scene = scene;
794 region_params.
window = win;
795 region_params.
area = area;
796 region_params.
region = region;
797 region_params.
scene = scene;
863 "Return value for events that should always pass should never be BREAK.");
878 const bool always_pass)
883 static bool do_wheel_ui =
true;
896 if (do_wheel_ui ==
false) {
954 bool reactivate_button)
991 if (win ==
nullptr) {
993 if (win ==
nullptr) {
1017#ifdef WITH_INPUT_NDOF
1018void WM_ndof_deadzone_set(
float deadzone)
1020 GHOST_setNDOFDeadZone(deadzone);
1081 if (wm->
runtime->undo_stack) {
1082 return intptr_t(wm->
runtime->undo_stack->step_active);
1089 if (wm->
runtime->operators.last) {
1090 return intptr_t(wm->
runtime->operators.last);
1107 if (
ot->pyop_poll) {
1108 return ot->pyop_poll(
C,
ot);
1123 bool msg_free =
false;
1128 "Invalid context: \"%s\", %s",
1130 msg ? msg :
IFACE_(
"poll failed"));
1145 if (
ot->macro.first !=
nullptr) {
1194 const bool caller_owns_reports)
1196 if (
G.background == 0 && caller_owns_reports ==
false) {
1203 if (win_prev ==
nullptr) {
1218 if (caller_owns_reports ==
false) {
1226 if (
G.background == 0) {
1269 const bool has_undo_step,
1270 const bool has_register)
1302 else if (has_undo_step) {
1307 if (!(has_register || do_register)) {
1338 if (hud_status != NOP) {
1339 if (hud_status ==
SET) {
1345 else if (hud_status == CLEAR) {
1367 if (op ==
nullptr || op->
type ==
nullptr) {
1403 C, op, repeat, store && wm->
op_undo_depth == 0, has_undo_step, has_register);
1405 else if (repeat == 0) {
1422 if (op ==
nullptr || op->
type ==
nullptr || op->
type->
exec ==
nullptr) {
1450 op->
flag |= op_flag;
1452 op->
flag &= ~op_flag;
1458 op->
flag |= op_flag;
1460 op->
flag &= ~op_flag;
1472 if (otm && otm->
exec ==
nullptr) {
1486 if (op->
prev ==
nullptr && op->
next ==
nullptr) {
1493 return (op_prev && (op->
type == op_prev->
type));
1510 op->
ptr = MEM_new<PointerRNA>(
"wmOperatorPtrRNA");
1511 if (properties && properties->
data) {
1529 if (
ot->macro.first) {
1534 if (motherop ==
nullptr) {
1545 if (otmacro ==
nullptr) {
1558 opm->
opm = motherop;
1560 otmacro = otmacro->
next;
1571 opm->
opm = motherop;
1599 if (region->runtime->gizmo_map !=
nullptr) {
1613 event->mval[0] =
event->xy[0] - region->
winrct.
xmin;
1614 event->mval[1] =
event->xy[1] - region->
winrct.
ymin;
1618 event->mval[0] = -1;
1619 event->mval[1] = -1;
1631 const bool poll_only,
1632 bool use_last_properties)
1658 if (event !=
nullptr) {
1663 if (!is_nested_call && use_last_properties) {
1669 "Handle event %d win %p op %s",
1670 event ? event->
type : 0,
1721 const bool store = !is_nested_call && use_last_properties;
1732 const rcti *wrap_region =
nullptr;
1761 wrap_region = ®ion->
winrct;
1764 wrap_region = &area->
totrct;
1795 const bool poll_only,
1806 if (event ==
nullptr) {
1815 if (window ==
nullptr) {
1876 if (!(region && region->
regiontype == type) && area) {
1936 const char *opstring,
1960 const char *opstring,
1993 if (!is_undo && wm) {
2032 if (opwait->
area !=
nullptr) {
2045 enum { CONTINUE = 0, EXECUTE, CANCEL }
state = CONTINUE;
2048 switch (event->
type) {
2081 if (
state != CONTINUE) {
2085 if (
state == EXECUTE) {
2121 depends_on_cursor =
true;
2126 if (!depends_on_cursor) {
2138 std::string header_text = fmt::format(
2140 IFACE_(
"Input pending "),
2142 if (area !=
nullptr) {
2157 opwait->
area = area;
2162 if (properties->
data !=
nullptr) {
2211 *r_region =
nullptr;
2213 if (screen ==
nullptr || handler->
op ==
nullptr) {
2230 if (area ==
nullptr) {
2233 if (handler->
op ==
nullptr) {
2235 "internal error: handler (%s) has invalid area",
2355 region_popup_prev =
nullptr;
2407 if (winevent->
type != kmitype) {
2414 if (winevent->
val != kmi->
val) {
2522 const wmEvent *event_match =
nullptr;
2526 event_match = event;
2529 event_no_dbl_click = *event;
2532 event_match = &event_no_dbl_click;
2536 if (event_match !=
nullptr) {
2537 event_backup->
prev_type =
event->prev_type;
2538 event_backup->
prev_val =
event->prev_val;
2540 event->prev_type = event_match->
type;
2541 event->prev_val = event_match->
val;
2574 event->type =
event->prev_type;
2575 event->val =
event->prev_val;
2577 event->prev_type = event_backup->
prev_type;
2578 event->prev_val = event_backup->
prev_val;
2597 if (handler_iter_op->
op !=
nullptr) {
2599 last_priority_handler = handler_iter;
2605 if (last_priority_handler) {
2622 const char *kmi_idname)
2638 else if (
ot->modal) {
2658 retval =
ot->modal(
C, op, event);
2694 handler->
op =
nullptr;
2698 handler->
op =
nullptr;
2735 bool use_last_properties =
true;
2750 const bool is_tool = (keymap_tool !=
nullptr);
2751 const bool use_tool_properties = is_tool;
2753 if (use_tool_properties) {
2755 keymap_tool, &tool_properties, properties,
ot);
2756 properties = &tool_properties;
2757 use_last_properties =
false;
2762 if (use_tool_properties) {
2773 if (gzgt !=
nullptr) {
2776 if (region !=
nullptr) {
2780 gzmap_type, gzgt, region);
2817 if (sfile->
op == file_operator) {
2818 sfile->
op =
nullptr;
2857 sfile->
op = handler->
op;
2894 if (file_area->
full) {
2919 wm->
runtime->winactive = root_win;
2921 else if (file_area->
full) {
2932 if (!temp_win && ctx_area->
full) {
2987 if (win_prev ==
nullptr) {
3067 return "handled (and pass on)";
3069 return "un-handled";
3083 std::optional<std::string> kmi_props;
3095 return fmt::format(
"{}({})", kmi->
idname, kmi_props.value_or(
""));
3099 if (do_debug_handler) \
3110 const bool do_debug_handler)
3114 if (keymap ==
nullptr) {
3119 PRINT(
"%s: checking '%s' ...", __func__, keymap->
idname);
3130 C, handlers, &handler->
head, event, kmi->ptr, kmi->idname);
3133 "Keymap '%s', %s, %s, event: %s",
3141 if (keymap_post.
post_fn !=
nullptr) {
3166 const bool do_debug_handler,
3167 bool *r_keymap_poll)
3170 bool keymap_poll =
false;
3172 PRINT(
"%s: checking '%s' ...", __func__, keymap->
idname);
3179 PRINT(
"%s: item matched '%s'\n", __func__, kmi->idname);
3185 C, handlers, &handler->
head, event, kmi->ptr, kmi->idname);
3191 printf(
"%s: handled - and pass on! '%s'\n", __func__, kmi->idname);
3197 printf(
"%s: handled - and pass on! '%s'\n", __func__, kmi->idname);
3201 PRINT(
"%s: un-handled '%s'\n", __func__, kmi->idname);
3210 if (r_keymap_poll) {
3211 *r_keymap_poll = keymap_poll;
3221 const bool always_pass,
3223 const bool do_debug_handler)
3253 const bool restore_highlight_unless_activated = is_event_drag;
3269 if (region->
runtime->type->clip_gizmo_events_by_ui) {
3272 if (restore_highlight_unless_activated ==
false) {
3281 struct PrevGizmoData {
3286 PrevGizmoData prev{};
3298 bool handle_highlight =
false;
3299 bool handle_keymap =
false;
3302 if ((prev.gz_modal ==
nullptr) &&
3303 ((event->
type ==
MOUSEMOVE) || is_event_modifier || is_event_drag))
3305 handle_highlight =
true;
3306 if (is_event_modifier || is_event_drag) {
3307 handle_keymap =
true;
3311 handle_keymap =
true;
3316 if (restore_highlight_unless_activated) {
3317 if ((handle_highlight ==
true) && (handle_keymap ==
false)) {
3322 if (prev.gz_modal ==
nullptr) {
3324 handle_highlight =
true;
3328 if (handle_highlight) {
3333 if (gz || prev.gz) {
3334 if ((prev.gz != gz) || (prev.part != part)) {
3340 if (gz !=
nullptr) {
3353 if (handle_keymap) {
3356 bool keymap_poll =
false;
3360 C, event, handlers, handler, gzgroup, keymap, do_debug_handler, &keymap_poll);
3362#ifdef USE_GIZMO_MOUSE_PRIORITY_HACK
3363 if (((action &
WM_HANDLER_BREAK) == 0) && !is_event_handle_all && keymap_poll) {
3366 wmEvent event_test_click = *event;
3369 wmEvent event_test_press_drag = *event;
3381 is_event_handle_all =
true;
3403 C, event, handlers, handler, gzgroup, keymap, do_debug_handler,
nullptr);
3413 if (handle_highlight) {
3414 if (restore_highlight_unless_activated) {
3417 if (!(gz_modal && (gz_modal != prev.gz_modal))) {
3423 if (is_event_handle_all) {
3447 const bool do_debug_handler =
3455 if (handlers ==
nullptr) {
3468 handler_base && handlers->
first;
3469 handler_base = handler_base_next)
3471 handler_base_next = handler_base->next;
3477 else if (handler_base->poll ==
nullptr ||
3496 for (
int km_index = 0; km_index < km_result.
keymaps_len; km_index++) {
3499 C, event, handlers, handler, keymap, do_debug_handler);
3504 action |= action_iter;
3518 if (!wm->
runtime->is_interface_locked) {
3530 if (drop->poll(
C, drag, event)) {
3537 event->customdata = &single_lb;
3542 C, drop->ot, drop->ptr,
nullptr, opcontext,
false, event) :
3578 C, wm, handler, event, always_pass, handlers, do_debug_handler);
3583 if (!wm->
runtime->is_interface_locked) {
3643 if (win ==
nullptr) {
3665 const short prev_val =
event->val;
3668 const wmEventType prev_keymodifier =
event->keymodifier;
3671 event->type =
event->prev_press_type;
3672 event->modifier =
event->prev_press_modifier;
3673 event->keymodifier =
event->prev_press_keymodifier;
3674 event->direction = direction;
3680 event->direction = 0;
3681 event->keymodifier = prev_keymodifier;
3682 event->modifier = prev_modifier;
3683 event->val = prev_val;
3684 event->type = prev_type;
3742 "Canceling CLICK_DRAG (key-release exceeds drag threshold)");
3781 "Canceling CLICK_DRAG (button event was handled: value=%d)",
3843 if (screen && area) {
3857 if (pc->poll ==
nullptr || pc->poll(
C)) {
3874 if (wm->
runtime->paintcursors.first) {
3931 event->customdata = &wm->
runtime->drags;
3932 event->customdata_free =
true;
3986#ifdef WITH_XR_OPENXR
3993static void wm_event_handle_xrevent(
bContext *
C,
4017 wmXrActionData *actiondata =
static_cast<wmXrActionData *
>(
event->customdata);
4023 properties.
type = actiondata->ot->srna;
4024 properties.
data = actiondata->op_properties;
4025 if (actiondata->ot->invoke) {
4031 actiondata->op_properties ? &properties :
nullptr,
4039 wm, actiondata->ot, actiondata->op_properties ? &properties :
nullptr,
nullptr);
4054 if (region->
runtime->type->do_lock) {
4106 if (!region_hovered) {
4133 if (screen ==
nullptr) {
4138 while ((event =
static_cast<wmEvent *
>(win->
runtime->event_queue.first))) {
4168 else if (is_consecutive) {
4181 printf(
"\n%s: Handling event\n", __func__);
4197#ifdef WITH_XR_OPENXR
4199 wm_event_handle_xrevent(
C, wm, win, event);
4260#ifdef WITH_INPUT_NDOF
4387 event.val = eventval;
4389 event.customdata = ophandle;
4417 for (
wmWindow *ctx_win_or_parent = ctx_win; ctx_win_or_parent;
4418 ctx_win_or_parent = ctx_win_or_parent->
parent)
4423 return ctx_win_or_parent;
4426 if (file_area->
full) {
4427 return ctx_win_or_parent;
4451 ARegion *root_region =
nullptr;
4464 const char *prefix =
"fileselect_add";
4466 const char *prop_id;
4468 prop_id =
"filepath";
4475 "%s: \"%s\" expected a string with a 'FILE_PATH' subtype.",
4480 prop_id =
"directory";
4487 "%s: \"%s\" expected a string with a 'DIR_PATH' subtype.",
4493 prop_id =
"filename";
4500 "%s: \"%s\" expected a string with a 'FILE_NAME' subtype.",
4511 if (ctx_win != root_win) {
4525 C, handler, ctx_win->
eventstate, &root_area, &root_region);
4544 if (!root_area && ctx_win == root_win) {
4568 if (ctx_win != root_win) {
4589 if (cdata &&
STREQ(cdata->
id,
id)) {
4601 const size_t id_size = strlen(
id) + 1;
4605 memcpy((cdata + 1),
id, id_size);
4612 if (cdata ==
nullptr) {
4648 handler->
op = op->
opm;
4650 handler->
op->
opm = op;
4683 if ((handler->
op == op) || (op->
opm && (handler->
op == op->
opm))) {
4763 if (handler->
keymap == keymap) {
4772 handler->
keymap = keymap;
4794 const bool with_gizmos)
4796 memset(km_result, 0x0,
sizeof(*km_result));
4798 const char *keymap_id_list[BOUNDED_ARRAY_TYPE_SIZE<
decltype(km_result->
keymaps)>()];
4799 int keymap_id_list_len = 0;
4805 BLI_assert_msg(win !=
nullptr,
"The window should always be set for tool interactions!");
4806 const Scene *scene = win ? win->
scene :
nullptr;
4812 if (tref_rt && tref_rt->
keymap[0]) {
4813 keymap_id_list[keymap_id_list_len++] = tref_rt->
keymap;
4816 bool is_gizmo_visible =
false;
4817 bool is_gizmo_highlight =
false;
4822 bool add_keymap =
false;
4829 if (with_gizmos && (tref_rt->
gizmo_group[0] !=
'\0')) {
4833 if (region->
runtime->gizmo_map !=
nullptr) {
4834 gzmap = region->
runtime->gizmo_map;
4836 if (gzgroup !=
nullptr) {
4841 if (gzgroup !=
nullptr) {
4844 is_gizmo_visible =
true;
4847 is_gizmo_highlight =
true;
4859 if (is_gizmo_visible && !is_gizmo_highlight) {
4860 if (keymap_id_list_len == 2) {
4861 std::swap(keymap_id_list[0], keymap_id_list[1]);
4865 for (
int i = 0;
i < keymap_id_list_len;
i++) {
4866 const char *keymap_id = keymap_id_list[
i];
4872 if (km ==
nullptr) {
4936 handler->
keymap = keymap;
5019 if (handler ==
nullptr) {
5037 if (handler->
keymap == keymap) {
5091 const bool postpone)
5174 if (handler->
op && handler->
op->
type ==
ot) {
5200#ifdef WITH_INPUT_NDOF
5206# define CASE_NDOF_BUTTON(button) \
5207 case GHOST_NDOF_BUTTON_##button: \
5208 return NDOF_BUTTON_##button
5210# define CASE_NDOF_BUTTON_IGNORE(button) \
5211 case GHOST_NDOF_BUTTON_##button: \
5215 CASE_NDOF_BUTTON(MENU);
5216 CASE_NDOF_BUTTON(FIT);
5217 CASE_NDOF_BUTTON(
TOP);
5218 CASE_NDOF_BUTTON(
LEFT);
5219 CASE_NDOF_BUTTON(
RIGHT);
5220 CASE_NDOF_BUTTON(
FRONT);
5221 CASE_NDOF_BUTTON(BOTTOM);
5222 CASE_NDOF_BUTTON(
BACK);
5223 CASE_NDOF_BUTTON(ROLL_CW);
5224 CASE_NDOF_BUTTON(ROLL_CCW);
5225 CASE_NDOF_BUTTON(ISO1);
5226 CASE_NDOF_BUTTON(ISO2);
5227 CASE_NDOF_BUTTON(1);
5228 CASE_NDOF_BUTTON(2);
5229 CASE_NDOF_BUTTON(3);
5230 CASE_NDOF_BUTTON(4);
5231 CASE_NDOF_BUTTON(5);
5232 CASE_NDOF_BUTTON(6);
5233 CASE_NDOF_BUTTON(7);
5234 CASE_NDOF_BUTTON(8);
5235 CASE_NDOF_BUTTON(9);
5236 CASE_NDOF_BUTTON(10);
5237 CASE_NDOF_BUTTON(11);
5238 CASE_NDOF_BUTTON(12);
5239 CASE_NDOF_BUTTON(ROTATE);
5240 CASE_NDOF_BUTTON(PANZOOM);
5241 CASE_NDOF_BUTTON(DOMINANT);
5242 CASE_NDOF_BUTTON(PLUS);
5243 CASE_NDOF_BUTTON(MINUS);
5244 CASE_NDOF_BUTTON(SPIN_CW);
5245 CASE_NDOF_BUTTON(SPIN_CCW);
5246 CASE_NDOF_BUTTON(TILT_CW);
5247 CASE_NDOF_BUTTON(TILT_CCW);
5248 CASE_NDOF_BUTTON(V1);
5249 CASE_NDOF_BUTTON(V2);
5250 CASE_NDOF_BUTTON(V3);
5251 CASE_NDOF_BUTTON(SAVE_V1);
5252 CASE_NDOF_BUTTON(SAVE_V2);
5253 CASE_NDOF_BUTTON(SAVE_V3);
5258 CASE_NDOF_BUTTON_IGNORE(ESC);
5259 CASE_NDOF_BUTTON_IGNORE(ENTER);
5260 CASE_NDOF_BUTTON_IGNORE(DELETE);
5261 CASE_NDOF_BUTTON_IGNORE(TAB);
5262 CASE_NDOF_BUTTON_IGNORE(SPACE);
5263 CASE_NDOF_BUTTON_IGNORE(ALT);
5264 CASE_NDOF_BUTTON_IGNORE(SHIFT);
5265 CASE_NDOF_BUTTON_IGNORE(CTRL);
5267 CASE_NDOF_BUTTON_IGNORE(KBP_F1);
5268 CASE_NDOF_BUTTON_IGNORE(KBP_F2);
5269 CASE_NDOF_BUTTON_IGNORE(KBP_F3);
5270 CASE_NDOF_BUTTON_IGNORE(KBP_F4);
5271 CASE_NDOF_BUTTON_IGNORE(KBP_F5);
5272 CASE_NDOF_BUTTON_IGNORE(KBP_F6);
5273 CASE_NDOF_BUTTON_IGNORE(KBP_F7);
5274 CASE_NDOF_BUTTON_IGNORE(KBP_F8);
5275 CASE_NDOF_BUTTON_IGNORE(KBP_F9);
5276 CASE_NDOF_BUTTON_IGNORE(KBP_F10);
5277 CASE_NDOF_BUTTON_IGNORE(KBP_F11);
5278 CASE_NDOF_BUTTON_IGNORE(KBP_F12);
5280 CASE_NDOF_BUTTON_IGNORE(NP_F1);
5281 CASE_NDOF_BUTTON_IGNORE(NP_F2);
5282 CASE_NDOF_BUTTON_IGNORE(NP_F3);
5283 CASE_NDOF_BUTTON_IGNORE(NP_F4);
5286 CASE_NDOF_BUTTON_IGNORE(
NONE);
5287 CASE_NDOF_BUTTON_IGNORE(INVALID);
5288 CASE_NDOF_BUTTON_IGNORE(USER);
5291# undef CASE_NDOF_BUTTON
5292# undef CASE_NDOF_BUTTON_IGNORE
5444#if defined(__GNUC__) || defined(__clang__)
5471#define CASE_BUTTON(ghost_button, type) \
5472 case ghost_button: \
5516 event->modifier &= ~mod_test;
5528 event->modifier &= ~mod_test;
5540 switch (event->
type) {
5592 tablet_data.
tilt.x = 0.0f;
5593 tablet_data.
tilt.y = 0.0f;
5619#ifdef WITH_INPUT_NDOF
5621static void attach_ndof_data(
wmEvent *event,
const GHOST_TEventNDOFMotionData *ghost)
5625 const float ts =
U.ndof_translation_sensitivity;
5626 const float rs =
U.ndof_rotation_sensitivity;
5631 data->time_delta = ghost->dt;
5636 event->customdata =
data;
5637 event->customdata_free =
true;
5647 if (!supports_window_position) {
5660 if (event_xy[0] < 0 || event_xy[1] < 0 || event_xy[0] > win_size[0] ||
5661 event_xy[1] > win_size[1] + 30)
5673 if (win_other && win_other != win) {
5683 const uint64_t event_prev_press_time_ms)
5692 if ((event_time_ms - event_prev_press_time_ms) <
uint64_t(
U.dbl_click_time)) {
5706 event->prev_val = event_state->
prev_val = event_state->
val;
5707 event->prev_type = event_state->
prev_type = event_state->
type;
5712 uint64_t *r_event_state_prev_press_time_ms)
5719 *r_event_state_prev_press_time_ms = event_time_ms;
5735 if (event_last ==
nullptr) {
5752 tevent = *event_last;
5760 memset(&tevent, 0x0,
sizeof(tevent));
5779 if (event_last && event_last->
type == event->
type) {
5780 deltax += event_last->
xy[0] - event_last->
prev_xy[0];
5781 deltay += event_last->
xy[1] - event_last->
prev_xy[1];
5788 event_new->
prev_xy[0] = event_new->
xy[0] - deltax;
5789 event_new->
prev_xy[1] = event_new->
xy[1] - deltay;
5803 uint64_t *event_state_prev_press_time_ms_p,
5804 const bool is_keyboard,
5805 const bool check_double_click)
5816 event_state->
val =
event->val;
5817 event_state->
type =
event->type;
5822 event_state->
modifier =
event->modifier;
5824 event_state->
flag = (
event->flag & event_state_flag_mask);
5829 if (check_double_click &&
5845 uint64_t *event_state_prev_press_time_ms_p,
5849 const bool check_double_click =
true;
5853 event_state_prev_press_time_ms_p,
5855 check_double_click);
5908 const void *customdata,
5929 event = *event_state;
5942 event.prev_type =
event.type;
5943 event.prev_val =
event.val;
5947 if ((wm->
runtime->winactive != win) &&
5950 event.modifier = wm->
runtime->winactive->eventstate->modifier;
5951 event.keymodifier = wm->
runtime->winactive->eventstate->keymodifier;
5959 if ((event_state->
type || event_state->
val) &&
5963 "Non-keyboard/mouse button found in 'win->eventstate->type = %d'",
5970 "Non-keyboard/mouse button found in 'win->eventstate->prev_type = %d'",
5992 event_state->
tablet.
tilt =
event.tablet.tilt;
6002 event_other.
modifier =
event.modifier;
6029 delta[0] = -delta[0];
6030 delta[1] = -delta[1];
6054#if !defined(WIN32) && !defined(__APPLE__)
6056 char trackpad_scroll_direction =
U.trackpad_scroll_direction;
6093 event_state_prev_press_time_ms_p,
6102 event_other.
modifier =
event.modifier;
6111 event_other.
type =
event.type;
6112 event_other.
val =
event.val;
6113 event_other.
tablet =
event.tablet;
6146 "ghost on your platform is misbehaving, utf8 events on key up!");
6148 event.utf8_buf[0] =
'\0';
6154 event.utf8_buf[0] =
'\0';
6167 "ghost detected non-ASCII single byte character '%u', converting to utf8 "
6168 "('%.*s', length=%d)",
6176 if (utf8_buf_len == -1) {
6178 "ghost detected an invalid unicode character '%d'",
6180 event.utf8_buf[0] =
'\0';
6186 if (utf8_buf_len > 0) {
6188 event.utf8_buf[
i] = 0xff;
6214 switch (event.
type) {
6272 event_state_prev_press_time_ms_p,
6299 if (wheelData->
value > 0) {
6301 click_step = wheelData->
value;
6305 click_step = -wheelData->
value;
6309 if (wheelData->
value > 0) {
6311 click_step = wheelData->
value;
6315 click_step = -wheelData->
value;
6323 click_step = std::min(click_step, 32);
6328 for (
int i = 0;
i < click_step;
i++) {
6335#ifdef WITH_INPUT_NDOF
6336 case GHOST_kEventNDOFMotion: {
6339 attach_ndof_data(&event,
static_cast<const GHOST_TEventNDOFMotionData *
>(customdata));
6346 case GHOST_kEventNDOFButton: {
6347 const GHOST_TEventNDOFButtonData *
e =
static_cast<const GHOST_TEventNDOFButtonData *
>(
6351 switch (
e->action) {
6355 case GHOST_kRelease:
6363 event.customdata =
nullptr;
6368 event_state_prev_press_time_ms_p,
6388#ifdef WITH_INPUT_IME
6393 MEM_delete(win->
runtime->ime_data);
6398 const wmIMEData *ghost_event_data =
static_cast<const wmIMEData *
>(customdata);
6399 win->
runtime->ime_data = MEM_new<wmIMEData>(__func__, *ghost_event_data);
6401 win->
runtime->ime_data_is_composing =
true;
6411 MEM_delete(win->
runtime->ime_data);
6412 const wmIMEData *ghost_event_data =
static_cast<const wmIMEData *
>(customdata);
6413 win->
runtime->ime_data = MEM_new<wmIMEData>(__func__, *ghost_event_data);
6420 win->
runtime->ime_data_is_composing =
false;
6433#ifdef WITH_XR_OPENXR
6434void wm_event_add_xrevent(
wmWindow *win, wmXrActionData *actiondata,
short val)
6443 event.customdata = actiondata;
6444 event.customdata_free =
true;
6464 if (wm->
runtime->is_interface_locked) {
6482 wm->
runtime->is_interface_locked = (lock_flags != 0);
6508 memset(km_result, 0x0,
sizeof(*km_result));
6511 if (keymap !=
nullptr) {
6538 else if (handler_base->poll ==
nullptr ||
6545 for (
int km_index = 0; km_index < km_result.
keymaps_len; km_index++) {
6549 if (kmi !=
nullptr) {
6601 state->modifier =
event->modifier;
6602 state->space_type = space_type;
6603 state->region_type = region_type;
6613 const char *msg = cd->
text[button_index][type_index];
6626 ScrArea *area_statusbar =
nullptr;
6629 area_statusbar = area;
6633 return area_statusbar;
6640 if (area !=
nullptr) {
6649 if (area_statusbar ==
nullptr) {
6672 if (region ==
nullptr) {
6683 if (area ==
nullptr) {
6746 for (
int button_index = 0; button_index < 3; button_index++) {
6747 cd->
text[button_index][0][0] =
'\0';
6748 cd->
text[button_index][1][0] =
'\0';
6762 for (
int data_index = 0; data_index <
ARRAY_SIZE(event_data); data_index++) {
6763 const int button_index = event_data[data_index].button_index;
6764 const int type_index = event_data[data_index].type_index;
6765 if (cd->
text[button_index][type_index][0] != 0) {
6769 test_event.
type = event_data[data_index].event_type;
6770 test_event.
val = event_data[data_index].event_value;
6774 for (
int handler_index = 0; handler_index <
ARRAY_SIZE(handlers); handler_index++) {
6776 C, wm, win, handlers[handler_index], &test_event);
6786 STR_ELEM(kmi->
idname,
"WM_OT_call_menu",
"WM_OT_call_menu_pie",
"WM_OT_call_panel"))
6805 if (memcmp(&cd_prev.
text, &cd->
text,
sizeof(cd_prev.
text)) != 0) {
6826 if (handler->
op !=
nullptr) {
6831 keymap = keymap_test;
6838 if (keymap ==
nullptr || keymap->
modal_items ==
nullptr) {
6845 if (!items[
i].identifier[0]) {
6855 if (num_items_used > 0) {
6857 i += num_items_used - 1;
6863 row->
label(fmt::format(
"{}: {}", *
str, items[
i].
name), ICON_NONE);
void AS_asset_library_remap_ids(const blender::bke::id::IDRemapper &mappings)
void CTX_wm_gizmo_group_set(bContext *C, wmGizmoGroup *gzgroup)
ReportList * CTX_wm_reports(const bContext *C)
bScreen * CTX_wm_screen(const bContext *C)
ARegion * CTX_wm_region_popup(const bContext *C)
void CTX_wm_operator_poll_msg_clear(bContext *C)
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
void CTX_wm_window_set(bContext *C, wmWindow *win)
Main * CTX_data_main(const bContext *C)
const bContextStore * CTX_store_get(const bContext *C)
const char * CTX_wm_operator_poll_msg_get(bContext *C, bool *r_free)
void CTX_store_set(bContext *C, const bContextStore *store)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
Scene * CTX_data_sequencer_scene(const bContext *C)
void CTX_wm_region_popup_set(bContext *C, ARegion *region_popup)
ViewLayer * CTX_data_view_layer(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
char * IDP_reprN(const IDProperty *prop, uint *r_len)
void IDP_FreeProperty(IDProperty *prop)
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_ReplaceGroupInGroup(IDProperty *dest, const IDProperty *src) ATTR_NONNULL()
ViewLayer * BKE_view_layer_default_render(const Scene *scene)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_reports_free(ReportList *reports)
void BKE_report_print_level_set(ReportList *reports, eReportType level)
void BKE_reports_log(ReportList *reports, eReportType level, CLG_LogRef *log)
void BKE_reports_clear(ReportList *reports)
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_reports_init(ReportList *reports, int flag)
void BKE_reports_move_to_reports(ReportList *reports_dst, ReportList *reports_src)
Depsgraph * BKE_scene_ensure_depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer)
void BKE_scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain)
ARegion * BKE_area_find_region_xy(const ScrArea *area, int regiontype, const int xy[2]) ATTR_NONNULL(3)
ARegion * BKE_area_find_region_active_win(const ScrArea *area)
void BKE_spacedata_draw_locks(ARegionDrawLockFlags lock_flags)
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
bScreen * BKE_workspace_layout_screen_get(const WorkSpaceLayout *layout) GETTER_ATTRS
#define BLI_assert_unreachable()
#define BLI_STATIC_ASSERT(a, msg)
#define BLI_assert_msg(a, msg)
bool BLI_gset_ensure_p_ex(GSet *gs, const void *key, void ***r_key)
unsigned int BLI_ghashutil_ptrhash(const void *key)
GSet * BLI_gset_new_ex(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_gset_remove(GSet *gs, const void *key, GSetKeyFreeFP keyfreefp)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void * BLI_poptail(ListBase *listbase) ATTR_NONNULL(1)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
bool BLI_remlink_safe(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
void void BLI_INLINE bool BLI_listbase_is_single(const ListBase *lb)
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
MINLINE int len_manhattan_v2v2_int(const int a[2], const int b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
bool BLI_rcti_isect_pt_v(const struct rcti *rect, const int xy[2])
void BLI_rcti_translate(struct rcti *rect, int x, int y)
char char * BLI_vsprintfN(const char *__restrict format, va_list args) ATTR_NONNULL(1
char * STRNCPY(char(&dst)[N], const char *src)
#define STRNCPY_UTF8(dst, src)
size_t BLI_str_utf8_from_unicode(unsigned int c, char *dst, size_t dst_maxncpy) ATTR_NONNULL(2)
const char int BLI_str_utf8_size_or_error(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_timer_execute(void)
#define ENUM_OPERATORS(_type, _max)
#define UNUSED_VARS_NDEBUG(...)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define CTX_IFACE_(context, msgid)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_DEBUG(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
#define CLOG_AT_LEVEL(clg_ref, verbose_level,...)
#define CLOG_INFO(clg_ref,...)
void DEG_graph_tag_on_visible_update(Depsgraph *depsgraph, bool do_time)
void DEG_tag_on_visible_update(Main *bmain, bool do_time)
void DEG_make_active(Depsgraph *depsgraph)
void DEG_graph_relations_update(Depsgraph *graph)
These structs are the foundation for all linked lists in the library system.
@ SCE_WORKSPACE_TOOL_FALLBACK
@ AREA_FLAG_ACTIONZONES_UPDATE
@ RGN_TYPE_ASSET_SHELF_HEADER
#define RGN_TYPE_IS_HEADER_ANY(regiontype)
eUserpref_TrackpadScrollDir
@ USER_TRACKPAD_SCROLL_DIR_TRADITIONAL
@ USER_TRACKPAD_SCROLL_DIR_NATURAL
@ OP_IS_MODAL_CURSOR_REGION
@ OP_IS_MODAL_GRAB_CURSOR
#define OPERATOR_RETVAL_CHECK(ret)
@ TOOLREF_FLAG_FALLBACK_KEYMAP
void ED_fileselect_params_to_userdef(SpaceFile *sfile)
ScrArea * ED_fileselect_handler_area_find(const wmWindow *win, const wmOperator *file_operator)
ScrArea * ED_fileselect_handler_area_find_any_with_op(const wmWindow *win)
void ED_fileselect_set_params_from_userdef(SpaceFile *sfile)
void ED_info_stats_clear(wmWindowManager *wm, ViewLayer *view_layer)
void ED_preview_restart_queue_work(const bContext *C)
void ED_area_tag_redraw(ScrArea *area)
void ED_region_do_listen(wmRegionListenerParams *params)
ARegion * ED_area_find_region_xy_visual(const ScrArea *area, int regiontype, const int event_xy[2])
#define ED_screen_areas_iter(win, screen, area_name)
void ED_area_status_text(ScrArea *area, const char *str)
void ED_workspace_do_listen(bContext *C, const wmNotifier *note)
void ED_area_do_listen(wmSpaceTypeListenerParams *params)
void ED_screen_do_listen(bContext *C, const wmNotifier *note)
bool ED_screen_change(bContext *C, bScreen *screen)
Change the active screen.
bool ED_workspace_layout_delete(WorkSpace *workspace, WorkSpaceLayout *layout_old, bContext *C) ATTR_NONNULL()
bool ED_workspace_delete(WorkSpace *workspace, Main *bmain, bContext *C, wmWindowManager *wm) ATTR_NONNULL()
void ED_area_type_hud_clear(wmWindowManager *wm, ScrArea *area_keep)
void ED_area_exit(bContext *C, ScrArea *area)
void ED_screen_set_active_region(bContext *C, wmWindow *win, const int xy[2])
void ED_area_do_refresh(bContext *C, ScrArea *area)
ScrArea * ED_screen_temp_space_open(bContext *C, const char *title, eSpace_Type space_type, int display_type, bool dialog) ATTR_NONNULL(1)
AZone * ED_area_azones_update(ScrArea *area, const int mouse_xy[2])
void ED_workspace_status_text(bContext *C, const char *str)
void ED_update_for_newframe(Main *bmain, Depsgraph *depsgraph)
void ED_region_tag_redraw(ARegion *region)
void ED_area_prevspace(bContext *C, ScrArea *area)
void ED_screen_full_prevspace(bContext *C, ScrArea *area)
void ED_area_type_hud_ensure(bContext *C, ScrArea *area)
void ED_undo_push_op(bContext *C, wmOperator *op)
bool ED_undo_is_state_valid(bContext *C)
void ED_undo_grouped_push_op(bContext *C, wmOperator *op)
void ED_spacedata_id_remap(ScrArea *area, SpaceLink *sl, const blender::bke::id::IDRemapper &mappings)
void ED_view3d_screen_datamask(const Scene *scene, ViewLayer *view_layer, const bScreen *screen, CustomData_MeshMasks *r_cddata_masks)
GHOST C-API function and type declarations.
@ GHOST_kEventWheelAxisVertical
@ GHOST_kTrackpadEventMagnify
@ GHOST_kTrackpadEventSmartMagnify
@ GHOST_kTrackpadEventRotate
@ GHOST_kTrackpadEventScroll
@ GHOST_kEventImeComposition
@ GHOST_kEventWindowDeactivate
@ GHOST_kEventImeCompositionStart
@ GHOST_kEventImeCompositionEnd
@ GHOST_kKeyNumpadAsterisk
#define GHOST_kNumEventTypes
@ GHOST_kButtonMaskButton4
@ GHOST_kButtonMaskButton7
@ GHOST_kButtonMaskButton6
@ GHOST_kButtonMaskButton5
@ GHOST_kButtonMaskMiddle
Read Guarded memory(de)allocation.
#define RNA_STRUCT_BEGIN(sptr, prop)
uiBlock * UI_region_block_find_mouse_over(const ARegion *region, const int xy[2], bool only_clip)
void UI_popup_menu_reports(bContext *C, ReportList *reports) ATTR_NONNULL()
int uiTemplateStatusBarModalItem(uiLayout *layout, const wmKeyMap *keymap, const EnumPropertyItem *item)
void UI_popup_handlers_remove_all(bContext *C, ListBase *handlers)
#define UI_MARKER_MARGIN_Y
void(*)(wmWindowManager *wm, wmWindow *win, wmEventHandler_Keymap *handler, wmEventHandler_KeymapResult *km_result) wmEventHandler_KeymapDynamicFn
int(*)(bContext *C, const wmEvent *event, void *userdata) wmUIHandlerFunc
@ WM_HANDLER_ACCEPT_DBL_CLICK
@ WM_CAPABILITY_WINDOW_POSITION
@ WM_CAPABILITY_TRACKPAD_PHYSICAL_DIRECTION
bool(*)(const wmWindow *win, const ScrArea *area, const ARegion *region, const wmEvent *event) EventHandlerPoll
void(*)(bContext *C, void *userdata) wmUIHandlerRemoveFunc
@ WM_GIZMO_EVENT_HANDLE_ALL
@ WM_GIZMO_OPERATOR_TOOL_INIT
@ WM_GIZMOGROUPTYPE_TOOL_INIT
@ WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP
#define WM_UI_HANDLER_CONTINUE
@ WM_EVENT_FORCE_DRAG_THRESHOLD
@ WM_EVENT_IS_CONSECUTIVE
CLG_LogRef * WM_LOG_OPERATORS
#define WM_OP_CONTEXT_HAS_AREA(type)
CLG_LogRef * WM_LOG_EVENTS
#define ND_WORKSPACE_DELETE
#define ND_SPACE_INFO_REPORT
#define WM_EVENT_CURSOR_MOTION_THRESHOLD
#define NOTE_CATEGORY_TAG_CLEARED
#define WM_UI_HANDLER_BREAK
ListBase * ED_scene_markers_get_from_area(Scene *scene, ViewLayer *view_layer, const ScrArea *area)
bool ED_markers_region_visible(const ScrArea *area, const ARegion *region)
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
BPy_StructRNA * depsgraph
unsigned long long int uint64_t
constexpr bool is_empty() const
void iter(FunctionRef< void(ID *old_id, ID *new_id)> func) const
void * MEM_mallocN(size_t len, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
#define SET(a, b, c, d, k, s, Ti)
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
void storage_id_remap(ID *id_old, ID *id_new)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
float wrap(float value, float max, float min)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
PropertyType RNA_property_type(PropertyRNA *prop)
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
std::string RNA_pointer_as_string_keywords(bContext *C, PointerRNA *ptr, const bool as_function, const bool all_args, const bool nested_args, const int max_prop_length)
int RNA_property_flag(PropertyRNA *prop)
PropertySubType RNA_property_subtype(PropertyRNA *prop)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
const char * RNA_property_identifier(const PropertyRNA *prop)
void RE_FreeUnusedGPUResources()
ARegionRuntimeHandle * runtime
CursorKeymapInfo_State state
GHOST_TTrackpadEventSubTypes subtype
GHOST_TEventWheelAxis axis
struct CustomData_MeshMasks customdata_mask
struct ToolSettings * toolsettings
struct CustomData_MeshMasks customdata_mask_modal
struct Scene * sequencer_scene
struct wmTooltipState * tool_tip
struct ARegion * active_region
void label(blender::StringRef name, int icon)
uiLayout & row(bool align)
struct wmGizmoMap * gizmo_map
wmEventHandler_KeymapDynamicFn keymap_fn
void(* post_fn)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data)
wmEventHandler_KeymapDynamic dynamic
wmEventHandler_KeymapPost post
struct wmEventHandler_Op::@143214277125013224360266000304213254210030120033 context
wmUIHandlerRemoveFunc remove_fn
struct wmEventHandler_UI::@074045212224200350041021375036051334004230215220 context
wmUIHandlerFunc handle_fn
eWM_EventHandlerType type
eWM_EventHandlerFlag flag
wmEventModifierFlag modifier
wmEventType prev_press_type
wmEventType prev_press_keymodifier
wmEventModifierFlag prev_press_modifier
wmGizmoMapType_Params gzmap_params
eWM_GizmoFlagGroupTypeFlag flag
wmGizmoGroup * parent_gzgroup
bool(* poll_modal_item)(const struct wmOperator *op, int value)
blender::wm::OpCallContext opcontext
struct wmOperatorTypeMacro * next
struct IDProperty * properties
wmOperatorStatus(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
bool(* check)(bContext *C, wmOperator *op)
wmOperatorStatus(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
void(* cancel)(bContext *C, wmOperator *op)
struct ReportList * reports
struct wmOperatorType * type
const wmNotifier * notifier
const wmNotifier * notifier
WindowManagerRuntimeHandle * runtime
WindowRuntimeHandle * runtime
short pie_event_type_lock
uint64_t eventstate_prev_press_time_ms
struct wmEvent * eventstate
struct wmEvent * event_last_handled
char event_queue_check_click
int event_queue_consecutive_gesture_xy[2]
char event_queue_check_drag_handled
short event_queue_consecutive_gesture_type
struct wmEvent_ConsecutiveData * event_queue_consecutive_gesture_data
void * cursor_keymap_status
char event_queue_check_drag
void wm_operator_register(bContext *C, wmOperator *op)
void WM_operator_free(wmOperator *op)
void WM_cursor_modal_set(wmWindow *win, int val)
bool wm_cursor_arrow_move(wmWindow *win, const wmEvent *event)
void WM_cursor_modal_restore(wmWindow *win)
void WM_cursor_grab_enable(wmWindow *win, const eWM_CursorWrapAxis wrap, const rcti *wrap_region, const bool hide)
void WM_cursor_grab_disable(wmWindow *win, const int mouse_ungrab_xy[2])
void wm_drop_prepare(bContext *C, wmDrag *drag, wmDropBox *drop)
void wm_drop_end(bContext *C, wmDrag *, wmDropBox *)
void wm_drags_check_ops(bContext *C, const wmEvent *event)
void wm_drags_exit(wmWindowManager *wm, wmWindow *win)
void WM_drag_free_list(ListBase *lb)
blender::wm::OpCallContext wm_drop_operator_context_get(const wmDropBox *)
static ListBase dropboxes
bool WM_region_use_viewport(ScrArea *area, ARegion *region)
void WM_paint_cursor_tag_redraw(wmWindow *win, ARegion *)
float wm_pressure_curve(float raw_pressure)
bool WM_event_consecutive_gesture_test_break(const wmWindow *win, const wmEvent *event)
int WM_event_drag_direction(const wmEvent *event)
void WM_event_print(const wmEvent *event)
bool WM_event_drag_test(const wmEvent *event, const int prev_xy[2])
int WM_userdef_event_map(int kmitype)
bool WM_event_consecutive_gesture_test(const wmEvent *event)
static eHandlerActionFlag wm_handler_fileselect_do(bContext *C, ListBase *handlers, wmEventHandler_Op *handler, int val)
bool WM_window_modal_keymap_status_draw(bContext *C, wmWindow *win, uiLayout *layout)
constexpr wmTabletData wm_event_tablet_data_default()
wmEventHandler_Dropbox * WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes)
static void wm_event_custom_free(wmEvent *event)
wmOperatorStatus WM_operator_call_notest(bContext *C, wmOperator *op)
void WM_operator_name_call_ptr_with_depends_on_cursor(bContext *C, wmOperatorType *ot, blender::wm::OpCallContext opcontext, PointerRNA *properties, const wmEvent *event, const StringRef drawstr)
wmEventHandler_Keymap * WM_event_add_keymap_handler_poll(ListBase *handlers, wmKeyMap *keymap, EventHandlerPoll poll)
static void wm_handler_op_context_get_if_valid(bContext *C, wmEventHandler_Op *handler, const wmEvent *event, ScrArea **r_area, ARegion **r_region)
wmEventHandler_Keymap * WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
bool WM_operator_ui_poll(wmOperatorType *ot, PointerRNA *ptr)
static void wm_eventemulation(wmEvent *event, bool test_only)
static bool wm_operator_register_check(wmWindowManager *wm, wmOperatorType *ot)
static void wm_operator_reports(bContext *C, wmOperator *op, const wmOperatorStatus retval, const bool caller_owns_reports)
static wmEvent * wm_event_add_mousemove_to_head(wmWindow *win)
wmOperatorStatus WM_operator_name_call_ptr(bContext *C, wmOperatorType *ot, blender::wm::OpCallContext context, PointerRNA *properties, const wmEvent *event)
static wmEvent * wm_event_add_intern(wmWindow *win, const wmEvent *event_to_add)
void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
static void wm_handler_operator_insert(wmWindow *win, wmEventHandler_Op *handler)
void wm_event_do_handlers(bContext *C)
bool WM_operator_poll(bContext *C, wmOperatorType *ot)
bool WM_operator_repeat_check(const bContext *, wmOperator *op)
void WM_locked_interface_set(wmWindowManager *wm, bool lock)
static eHandlerActionFlag wm_event_do_handlers_area_regions(bContext *C, wmEvent *event, ScrArea *area)
static intptr_t wm_operator_undo_active_id(const wmWindowManager *wm)
static ScrArea * area_event_inside(bContext *C, const int xy[2])
void WM_window_status_area_tag_redraw(wmWindow *win)
wmEvent * WM_event_add_simulate(wmWindow *win, const wmEvent *event_to_add)
BLI_INLINE bool wm_eventmatch(const wmEvent *winevent, const wmKeyMapItem *kmi)
void WM_event_add_fileselect(bContext *C, wmOperator *op)
bool WM_operator_poll_or_report_error(bContext *C, wmOperatorType *ot, ReportList *reports)
void * WM_event_consecutive_data_get(wmWindow *win, const char *id)
wmEventHandler_UI * WM_event_add_ui_handler(const bContext *C, ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn, void *user_data, const eWM_EventHandlerFlag flag)
static void wm_event_modalkeymap_end(wmEvent *event, const wmEvent_ModalMapStore *event_backup)
static std::string keymap_handler_log_kmi_op_str(bContext *C, const wmKeyMapItem *kmi)
void WM_main_remap_editor_id_reference(const blender::bke::id::IDRemapper &mappings)
static eHandlerActionFlag wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHandler_Op *handler, const wmEvent *event)
static bool wm_event_is_ignorable_key_press(const wmWindow *win, const wmEvent &event)
void wm_event_do_refresh_wm_and_depsgraph(bContext *C)
void WM_report_banners_cancel(Main *bmain)
#define CASE_BUTTON(ghost_button, type)
bool WM_operator_name_poll(bContext *C, const char *opstring)
static void ui_handler_wait_for_input_remove(bContext *C, void *userdata)
wmOperatorStatus WM_operator_repeat_last(bContext *C, wmOperator *op)
void WM_locked_interface_set_with_flags(wmWindowManager *wm, short lock_flags)
static eHandlerActionFlag wm_handlers_do_intern(bContext *C, wmWindow *win, wmEvent *event, ListBase *handlers)
static void wm_event_add_notifier_intern(wmWindowManager *wm, const wmWindow *win, uint type, void *reference)
wmOperator * WM_operator_find_modal_by_type(wmWindow *win, const wmOperatorType *ot)
static void wm_region_tag_draw_on_gizmo_delay_refresh_for_tweak(wmWindow *win)
static eHandlerActionFlag wm_handlers_do_gizmo_handler(bContext *C, wmWindowManager *wm, wmEventHandler_Gizmo *handler, wmEvent *event, const bool always_pass, ListBase *handlers, const bool do_debug_handler)
void wm_event_do_depsgraph(bContext *C, bool is_after_open_file)
void WM_event_add_notifier_ex(wmWindowManager *wm, const wmWindow *win, uint type, void *reference)
void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win)
static void wm_event_get_keymap_from_toolsystem_ex(wmWindowManager *wm, wmWindow *win, wmEventHandler_Keymap *handler, wmEventHandler_KeymapResult *km_result, const bool with_gizmos)
bool WM_event_handler_region_marker_poll(const wmWindow *win, const ScrArea *area, const ARegion *region, const wmEvent *event)
static void wm_operator_finished(bContext *C, wmOperator *op, const bool repeat, const bool store, const bool has_undo_step, const bool has_register)
static void wm_event_prev_values_set(wmEvent *event, wmEvent *event_state)
void WM_global_report(eReportType type, const char *message)
void wm_tablet_data_from_ghost(const GHOST_TabletData *tablet_data, wmTabletData *wmtab)
static eHandlerActionFlag wm_handlers_do_keymap_with_gizmo_handler(bContext *C, wmEvent *event, ListBase *handlers, wmEventHandler_Gizmo *handler, wmGizmoGroup *gzgroup, wmKeyMap *keymap, const bool do_debug_handler, bool *r_keymap_poll)
void WM_event_consecutive_data_free(wmWindow *win)
static eHandlerActionFlag wm_event_drag_and_drop_test(wmWindowManager *wm, wmWindow *win, wmEvent *event)
static bool wm_action_not_handled(const eHandlerActionFlag action)
static int ui_handler_wait_for_input(bContext *C, const wmEvent *event, void *userdata)
void WM_event_get_keymaps_from_handler(wmWindowManager *wm, wmWindow *win, wmEventHandler_Keymap *handler, wmEventHandler_KeymapResult *km_result)
wmOperatorStatus WM_operator_call(bContext *C, wmOperator *op)
void WM_event_free_ui_handler_all(bContext *C, ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn)
void WM_reports_from_reports_move(wmWindowManager *wm, ReportList *reports)
static wmWindow * wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *win, wmEvent *event)
void WM_main_add_notifier(uint type, void *reference)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
static ARegion * region_event_inside(bContext *C, const int xy[2])
void wm_event_free_all(wmWindow *win)
void WM_event_get_keymap_from_toolsystem(wmWindowManager *wm, wmWindow *win, wmEventHandler_Keymap *handler, wmEventHandler_KeymapResult *km_result)
void WM_event_tablet_data_default_set(wmTabletData *tablet_data)
static void wm_event_cursor_store(CursorKeymapInfo_State *state, const wmEvent *event, short space_type, short region_type, const bToolRef *tref)
static void wm_region_mouse_co(bContext *C, wmEvent *event)
static wmOperatorStatus wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, const blender::wm::OpCallContext context, const bool poll_only, const wmEvent *event)
static void wm_handler_op_context(bContext *C, wmEventHandler_Op *handler, const wmEvent *event)
void WM_event_modal_handler_region_replace(wmWindow *win, const ARegion *old_region, ARegion *new_region)
static uint note_hash_for_queue_fn(const void *ptr)
wmOperatorStatus WM_operator_call_ex(bContext *C, wmOperator *op, const bool store)
static bool wm_event_pie_filter(wmWindow *win, const wmEvent *event)
wmEventHandler_Keymap * WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int)
void WM_event_remove_modal_handler_all(const wmOperator *op, const bool postpone)
static eHandlerActionFlag wm_handler_ui_call(bContext *C, wmEventHandler_UI *handler, const wmEvent *event, const bool always_pass)
wmEventHandler_Op * WM_event_add_modal_handler_ex(wmWindow *win, ScrArea *area, ARegion *region, wmOperator *op)
const char * WM_window_cursor_keymap_status_get(const wmWindow *win, int button_index, int type_index)
void WM_event_fileselect_event(wmWindowManager *wm, void *ophandle, const int eventval)
static void wm_event_free_last(wmWindow *win)
static eHandlerActionFlag wm_handlers_do_keymap_with_keymap_handler(bContext *C, wmEvent *event, ListBase *handlers, wmEventHandler_Keymap *handler, wmKeyMap *keymap, const bool do_debug_handler)
static void wm_event_state_update_and_click_set(wmEvent *event, uint64_t event_time_ms, wmEvent *event_state, uint64_t *event_state_prev_press_time_ms_p, const GHOST_TEventType type)
static void wm_paintcursor_tag(bContext *C, wmWindowManager *wm, ARegion *region)
static eHandlerActionFlag wm_event_do_region_handlers(bContext *C, wmEvent *event, ARegion *region)
static bool wm_event_is_double_click(const wmEvent *event, const uint64_t event_time_ms, const uint64_t event_prev_press_time_ms)
wmOperatorStatus WM_operator_repeat(bContext *C, wmOperator *op)
void WM_operator_region_active_win_set(bContext *C)
static wmKeyMapItem * wm_eventmatch_modal_keymap_items(const wmKeyMap *keymap, wmOperator *op, const wmEvent *event)
wmKeyMapItem * WM_event_match_keymap_item_from_handlers(bContext *C, wmWindowManager *wm, wmWindow *win, ListBase *handlers, const wmEvent *event)
wmEvent * WM_event_add(wmWindow *win, const wmEvent *event_to_add)
static wmEventType wm_event_type_from_ghost_key(GHOST_TKey key)
static bool wm_operator_check_locked_interface(bContext *C, wmOperatorType *ot)
static void wm_event_prev_click_set(uint64_t event_time_ms, wmEvent *event_state, uint64_t *r_event_state_prev_press_time_ms)
static std::optional< std::string > keymap_handler_log_kmi_event_str(const wmKeyMapItem *kmi)
static bool wm_event_is_same_key_press(const wmEvent &event_a, const wmEvent &event_b)
static wmOperatorStatus wm_operator_exec(bContext *C, wmOperator *op, const bool repeat, const bool store)
static void wm_event_timers_execute(bContext *C)
static void wm_event_handler_ui_cancel(bContext *C)
wmEventHandler_Keymap * WM_event_add_keymap_handler_v2d_mask(ListBase *handlers, wmKeyMap *keymap)
static bool note_cmp_for_queue_fn(const void *a, const void *b)
void WM_event_remove_ui_handler(ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn, void *user_data, const bool postpone)
static void wm_notifier_clear(wmNotifier *note)
void WM_event_modal_handler_area_replace(wmWindow *win, const ScrArea *old_area, ScrArea *new_area)
static eHandlerActionFlag wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHandler *handler_base, wmEvent *event, PointerRNA *properties, const char *kmi_idname)
bool WM_operator_poll_context(bContext *C, wmOperatorType *ot, blender::wm::OpCallContext context)
bool WM_operator_is_repeat(const bContext *C, const wmOperator *op)
static void wm_event_free_last_handled(wmWindow *win, wmEvent *event)
static eHandlerActionFlag wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
void WM_global_reportf(eReportType type, const char *format,...)
void WM_event_remove_model_handler(ListBase *handlers, const wmOperator *op, const bool postpone)
void WM_main_remove_notifier_reference(const void *reference)
static void wm_event_state_update_and_click_set_ex(wmEvent *event, uint64_t event_time_ms, wmEvent *event_state, uint64_t *event_state_prev_press_time_ms_p, const bool is_keyboard, const bool check_double_click)
void WM_report_banner_show(wmWindowManager *wm, wmWindow *win)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void wm_event_handler_ui_cancel_ex(bContext *C, wmWindow *win, ARegion *region, bool reactivate_button)
bool WM_event_handler_region_v2d_mask_poll(const wmWindow *, const ScrArea *, const ARegion *region, const wmEvent *event)
wmEventHandler_Keymap * WM_event_add_keymap_handler_dynamic(ListBase *handlers, wmEventHandler_KeymapDynamicFn keymap_fn, void *user_data)
static void wm_paintcursor_test(bContext *C, const wmEvent *event)
void wm_event_free(wmEvent *event)
static wmWindow * wm_event_find_fileselect_root_window_from_context(const bContext *C)
static wmEvent * wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int deltax, int deltay)
static bool event_or_prev_in_rect(const wmEvent *event, const rcti *rect)
wmOperatorStatus WM_operator_call_py(bContext *C, wmOperatorType *ot, blender::wm::OpCallContext context, PointerRNA *properties, ReportList *reports, const bool is_undo)
ScrArea * WM_window_status_area_find(wmWindow *win, bScreen *screen)
static bool wm_notifier_is_clear(const wmNotifier *note)
static wmEventType wm_event_type_from_ghost_button(const GHOST_TButton button, const wmEventType fallback)
void WM_event_set_keymap_handler_post_callback(wmEventHandler_Keymap *handler, void(keymap_tag)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data), void *user_data)
static void wm_operator_free_for_fileselect(wmOperator *file_operator)
BLI_INLINE void wm_event_handler_return_value_check(const bContext *C, const wmEvent *event, const eHandlerActionFlag action)
#define WM_HANDLER_CONTINUE
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, blender::wm::OpCallContext context, PointerRNA *properties, const wmEvent *event)
static intptr_t wm_operator_register_active_id(const wmWindowManager *wm)
static bool screen_temp_region_exists(const ARegion *region)
wmOperatorStatus WM_operator_name_call_with_properties(bContext *C, const char *opstring, blender::wm::OpCallContext context, IDProperty *properties, const wmEvent *event)
static wmOperator * wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, PointerRNA *properties, ReportList *reports)
wmKeyMapItem * WM_event_match_keymap_item(bContext *C, wmKeyMap *keymap, const wmEvent *event)
void wm_event_free_handler(wmEventHandler *handler)
static void wm_event_modalkeymap_begin(const bContext *C, wmOperator *op, wmEvent *event, wmEvent_ModalMapStore *event_backup)
void wm_event_do_notifiers(bContext *C)
void WM_menu_name_call(bContext *C, const char *menu_name, blender::wm::OpCallContext context)
void WM_event_consecutive_data_set(wmWindow *win, const char *id, void *custom_data)
static const char * keymap_handler_log_action_str(const eHandlerActionFlag action)
static wmOperatorStatus wm_operator_invoke(bContext *C, wmOperatorType *ot, const wmEvent *event, PointerRNA *properties, ReportList *reports, const bool poll_only, bool use_last_properties)
static wmOperatorStatus wm_operator_exec_notest(bContext *C, wmOperator *op)
static void wm_event_free_and_remove_from_queue_if_valid(wmEvent *event)
void WM_event_ui_handler_region_popup_replace(wmWindow *win, const ARegion *old_region, ARegion *new_region)
static void wm_event_custom_clear(wmEvent *event)
void WM_event_remove_handlers_by_area(ListBase *handlers, const ScrArea *area)
void WM_event_get_keymap_from_toolsystem_with_gizmos(wmWindowManager *wm, wmWindow *win, wmEventHandler_Keymap *handler, wmEventHandler_KeymapResult *km_result)
bool WM_event_match(const wmEvent *winevent, const wmKeyMapItem *kmi)
bool WM_event_handler_region_v2d_mask_no_marker_poll(const wmWindow *win, const ScrArea *area, const ARegion *region, const wmEvent *event)
static wmEvent * wm_event_add_mousemove(wmWindow *win, const wmEvent *event)
void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, const int type, const void *customdata, const uint64_t event_time_ms)
static bool wm_event_always_pass(const wmEvent *event)
void wm_event_init_from_window(wmWindow *win, wmEvent *event)
void WM_event_remove_handlers(bContext *C, ListBase *handlers)
void WM_event_add_mousemove(wmWindow *win)
static bool wm_event_inside_rect(const wmEvent *event, const rcti *rect)
@ WM_HANDLER_TYPE_DROPBOX
#define ISMOUSE_BUTTON(event_type)
@ EVT_FILESELECT_FULL_OPEN
@ EVT_FILESELECT_EXTERNAL_CANCEL
#define ISKEYBOARD_OR_BUTTON(event_type)
#define ISMOUSE_MOTION(event_type)
#define ISMOUSE_WHEEL(event_type)
#define ISKEYMODIFIER(event_type)
#define ISTIMER(event_type)
#define ISMOUSE_GESTURE(event_type)
#define ISKEYBOARD(event_type)
#define ISMOUSE(event_type)
void wm_test_foreign_file_warning(bContext *C)
void wm_test_autorun_warning(bContext *C)
void WM_gizmogroup_ensure_init(const bContext *C, wmGizmoGroup *gzgroup)
bool WM_gizmo_group_type_ensure_ptr_ex(wmGizmoGroupType *gzgt, wmGizmoMapType *gzmap_type)
wmGizmoGroup * WM_gizmomaptype_group_init_runtime_with_region(wmGizmoMapType *gzmap_type, wmGizmoGroupType *gzgt, ARegion *region)
bool wm_gizmogroup_is_any_selected(const wmGizmoGroup *gzgroup)
wmGizmoGroupType * WM_gizmogrouptype_find(const StringRef idname, bool quiet)
const ListBase * WM_gizmomap_group_list(wmGizmoMap *gzmap)
bool WM_gizmomap_is_any_selected(const wmGizmoMap *gzmap)
bool wm_gizmomap_highlight_handled(wmGizmoMap *gzmap)
void wm_gizmomaps_handled_modal_update(bContext *C, wmEvent *event, wmEventHandler_Op *handler)
bool wm_gizmomap_highlight_set(wmGizmoMap *gzmap, const bContext *C, wmGizmo *gz, int part)
wmGizmoGroup * WM_gizmomap_group_find(wmGizmoMap *gzmap, const char *idname)
bool WM_gizmomap_tag_delay_refresh_for_tweak_check(wmGizmoMap *gzmap)
wmGizmo * wm_gizmomap_highlight_find(wmGizmoMap *gzmap, bContext *C, const wmEvent *event, int *r_part)
void WM_gizmomap_tag_refresh(wmGizmoMap *gzmap)
wmGizmo * wm_gizmomap_highlight_get(wmGizmoMap *gzmap)
void WM_gizmoconfig_update(Main *bmain)
ARegion * WM_gizmomap_tooltip_init(bContext *C, ARegion *region, int *, double *, bool *r_exit_on_event)
bool wm_gizmomap_highlight_pending(const wmGizmoMap *gzmap)
wmGizmoMapType * WM_gizmomaptype_ensure(const wmGizmoMapType_Params *gzmap_params)
void wm_gizmomap_handler_context_gizmo(bContext *, wmEventHandler_Gizmo *)
wmGizmo * wm_gizmomap_modal_get(wmGizmoMap *gzmap)
std::optional< std::string > WM_modalkeymap_operator_items_to_string(wmOperatorType *ot, const int propvalue, const bool compact)
wmKeyMap * WM_keymap_list_find_spaceid_or_empty(ListBase *lb, const char *idname, int spaceid, int regionid)
void WM_keyconfig_update(wmWindowManager *wm)
bool WM_keymap_poll(bContext *C, wmKeyMap *keymap)
wmKeyMap * WM_keymap_active(const wmWindowManager *wm, wmKeyMap *keymap)
std::optional< std::string > WM_keymap_item_to_string(const wmKeyMapItem *kmi, const bool compact)
void WM_msg_id_update(wmMsgBus *mbus, ID *id_src, ID *id_dst)
void WM_msgbus_handle(wmMsgBus *mbus, bContext *C)
void WM_msg_id_remove(wmMsgBus *mbus, const ID *id)
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)
bool WM_operator_depends_on_cursor(bContext &C, wmOperatorType &ot, PointerRNA *properties)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
bool WM_operator_last_properties_store(wmOperator *op)
wmOperator * WM_operator_last_redo(const bContext *C)
bool WM_operator_last_properties_init(wmOperator *op)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
std::string WM_operator_pystring(bContext *C, wmOperator *op, const bool all_args, const bool macro_args)
void WM_operator_properties_free(PointerRNA *ptr)
void WM_operator_properties_sanitize(PointerRNA *ptr, const bool no_context)
void wm_stereo3d_mouse_offset_apply(wmWindow *win, int r_mouse_xy[2])
void wm_surfaces_do_depsgraph(bContext *C)
blender::int2 WM_window_native_pixel_size(const wmWindow *win)
void wm_cursor_position_from_ghost_screen_coords(wmWindow *win, int *x, int *y)
void WM_window_set_active_workspace(bContext *C, wmWindow *win, WorkSpace *workspace)
void wm_test_gpu_backend_fallback(bContext *C)
WorkSpaceLayout * WM_window_get_active_layout(const wmWindow *win)
bool wm_cursor_position_get(wmWindow *win, int *r_x, int *r_y)
void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const wmEventType event_type, const double time_step)
void wm_window_make_drawable(wmWindowManager *wm, wmWindow *win)
bool WM_window_is_temp_screen(const wmWindow *win)
wmWindow * WM_window_find_under_cursor(wmWindow *win, const int event_xy[2], int r_event_xy_other[2])
eWM_CapabilitiesFlag WM_capabilities_flag()
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Scene * WM_window_get_active_scene(const wmWindow *win)
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)
void WM_window_title(wmWindowManager *wm, wmWindow *win, const char *title)
WorkSpace * WM_window_get_active_workspace(const wmWindow *win)
bScreen * WM_window_get_active_screen(const wmWindow *win)
ScrArea * WM_xr_session_area_get(const wmXrData *xr)