Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c195
1 files changed, 99 insertions, 96 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 411ecb1cac8..fe503167f8d 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -126,12 +126,12 @@ wmEvent *wm_event_add_ex(wmWindow *win,
*event = *event_to_add;
if (event_to_add_after == NULL) {
- BLI_addtail(&win->queue, event);
+ BLI_addtail(&win->event_queue, event);
}
else {
/* Note: strictly speaking this breaks const-correctness,
* however we're only changing 'next' member. */
- BLI_insertlinkafter(&win->queue, (void *)event_to_add_after, event);
+ BLI_insertlinkafter(&win->event_queue, (void *)event_to_add_after, event);
}
return event;
}
@@ -205,7 +205,7 @@ void wm_event_free(wmEvent *event)
static void wm_event_free_last(wmWindow *win)
{
- wmEvent *event = BLI_poptail(&win->queue);
+ wmEvent *event = BLI_poptail(&win->event_queue);
if (event != NULL) {
wm_event_free(event);
}
@@ -214,7 +214,7 @@ static void wm_event_free_last(wmWindow *win)
void wm_event_free_all(wmWindow *win)
{
wmEvent *event;
- while ((event = BLI_pophead(&win->queue))) {
+ while ((event = BLI_pophead(&win->event_queue))) {
wm_event_free(event);
}
}
@@ -232,7 +232,7 @@ void wm_event_init_from_window(wmWindow *win, wmEvent *event)
static bool wm_test_duplicate_notifier(const wmWindowManager *wm, uint type, void *reference)
{
- LISTBASE_FOREACH (wmNotifier *, note, &wm->queue) {
+ LISTBASE_FOREACH (wmNotifier *, note, &wm->notifier_queue) {
if ((note->category | note->data | note->subtype | note->action) == type &&
note->reference == reference) {
return true;
@@ -250,7 +250,7 @@ void WM_event_add_notifier_ex(wmWindowManager *wm, const wmWindow *win, uint typ
wmNotifier *note = MEM_callocN(sizeof(wmNotifier), "notifier");
- BLI_addtail(&wm->queue, note);
+ BLI_addtail(&wm->notifier_queue, note);
note->window = win;
@@ -279,7 +279,7 @@ void WM_main_add_notifier(unsigned int type, void *reference)
wmNotifier *note = MEM_callocN(sizeof(wmNotifier), "notifier");
- BLI_addtail(&wm->queue, note);
+ BLI_addtail(&wm->notifier_queue, note);
note->category = type & NOTE_CATEGORY;
note->data = type & NOTE_DATA;
@@ -298,7 +298,7 @@ void WM_main_remove_notifier_reference(const void *reference)
wmWindowManager *wm = bmain->wm.first;
if (wm) {
- LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->queue) {
+ LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->notifier_queue) {
if (note->reference == reference) {
/* Don't remove because this causes problems for #wm_event_do_notifiers
* which may be looping on the data (deleting screens). */
@@ -450,7 +450,7 @@ void wm_event_do_notifiers(bContext *C)
CTX_wm_window_set(C, win);
- LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->queue) {
+ LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->notifier_queue) {
if (note->category == NC_WM) {
if (ELEM(note->data, ND_FILEREAD, ND_FILESAVE)) {
wm->file_saved = 1;
@@ -539,7 +539,7 @@ void wm_event_do_notifiers(bContext *C)
/* The notifiers are sent without context, to keep it clean. */
wmNotifier *note;
- while ((note = BLI_pophead(&wm->queue))) {
+ while ((note = BLI_pophead(&wm->notifier_queue))) {
LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
Scene *scene = WM_window_get_active_scene(win);
bScreen *screen = WM_window_get_active_screen(win);
@@ -2960,8 +2960,8 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
/* Test for CLICK_DRAG events. */
if (wm_action_not_handled(action)) {
- if (event->check_drag) {
- wmWindow *win = CTX_wm_window(C);
+ wmWindow *win = CTX_wm_window(C);
+ if (win->event_queue_check_drag) {
if (WM_event_drag_test(event, &event->prevclickx)) {
int x = event->x;
int y = event->y;
@@ -2982,15 +2982,18 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
event->x = x;
event->y = y;
- win->eventstate->check_click = false;
- win->eventstate->check_drag = false;
+ win->event_queue_check_click = false;
+ if (!wm_action_not_handled(action)) {
+ /* Only disable when handled as other handlers may use this drag event. */
+ win->event_queue_check_drag = false;
+ }
}
}
}
else {
wmWindow *win = CTX_wm_window(C);
if (win) {
- win->eventstate->check_drag = false;
+ win->event_queue_check_drag = false;
}
}
}
@@ -3006,11 +3009,13 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
if (win != NULL) {
if (event->val == KM_PRESS) {
- win->eventstate->check_click = true;
- win->eventstate->check_drag = true;
+ if (event->prevval != KM_PRESS) {
+ win->event_queue_check_click = true;
+ win->event_queue_check_drag = true;
+ }
}
else if (event->val == KM_RELEASE) {
- win->eventstate->check_drag = false;
+ win->event_queue_check_drag = false;
}
}
@@ -3018,10 +3023,10 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
if (event->val == KM_RELEASE) {
if (event->prevval == KM_PRESS) {
- if (win->eventstate->check_click == true) {
+ if (win->event_queue_check_click == true) {
if (WM_event_drag_test(event, &event->prevclickx)) {
- win->eventstate->check_click = 0;
- win->eventstate->check_drag = 0;
+ win->event_queue_check_click = false;
+ win->event_queue_check_drag = false;
}
else {
/* Position is where the actual click happens, for more
@@ -3059,8 +3064,8 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
else {
wmWindow *win = CTX_wm_window(C);
if (win) {
- win->eventstate->check_click = 0;
- win->eventstate->check_drag = 0;
+ win->event_queue_check_click = false;
+ win->event_queue_check_drag = false;
}
}
}
@@ -3074,7 +3079,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
wmWindow *win = CTX_wm_window(C);
if (win) {
if (ISKEYMODIFIER(event->prevtype)) {
- win->eventstate->check_click = 0;
+ win->event_queue_check_click = false;
}
}
}
@@ -3221,9 +3226,9 @@ static void wm_event_drag_and_drop_test(wmWindowManager *wm, wmWindow *win, wmEv
/* Filter out all events of the pie that spawned the last pie unless it's a release event. */
static bool wm_event_pie_filter(wmWindow *win, const wmEvent *event)
{
- if (win->lock_pie_event && win->lock_pie_event == event->type) {
+ if (win->pie_event_type_lock && win->pie_event_type_lock == event->type) {
if (event->val == KM_RELEASE) {
- win->lock_pie_event = EVENT_NONE;
+ win->pie_event_type_lock = EVENT_NONE;
return false;
}
return true;
@@ -3234,7 +3239,7 @@ static bool wm_event_pie_filter(wmWindow *win, const wmEvent *event)
/**
* Account for the special case when events are being handled and a file is loaded.
* In this case event handling exits early, however when "Load UI" is disabled
- * the even will still be in #wmWindow.queue.
+ * the even will still be in #wmWindow.event_queue.
*
* Without this it's possible to continuously handle the same event, see: T76484.
*/
@@ -3242,7 +3247,7 @@ static void wm_event_free_and_remove_from_queue_if_valid(wmEvent *event)
{
LISTBASE_FOREACH (wmWindowManager *, wm, &G_MAIN->wm) {
LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
- if (BLI_remlink_safe(&win->queue, event)) {
+ if (BLI_remlink_safe(&win->event_queue, event)) {
wm_event_free(event);
return;
}
@@ -3331,7 +3336,7 @@ void wm_event_do_handlers(bContext *C)
}
wmEvent *event;
- while ((event = win->queue.first)) {
+ while ((event = win->event_queue.first)) {
int action = WM_HANDLER_CONTINUE;
/* Active screen might change during handlers, update pointer. */
@@ -3348,7 +3353,7 @@ void wm_event_do_handlers(bContext *C)
if (!ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
CLOG_INFO(WM_LOG_HANDLERS, 1, "event filtered due to pie button pressed");
}
- BLI_remlink(&win->queue, event);
+ BLI_remlink(&win->event_queue, event);
wm_event_free(event);
continue;
}
@@ -3497,7 +3502,7 @@ void wm_event_do_handlers(bContext *C)
* press in tool keymap can override click in editor keymap.*/
if (ISMOUSE_BUTTON(event->type) && event->val == KM_PRESS &&
!wm_action_not_handled(action)) {
- win->eventstate->check_click = false;
+ win->event_queue_check_click = false;
}
/* Update previous mouse position for following events to use. */
@@ -3505,11 +3510,11 @@ void wm_event_do_handlers(bContext *C)
win->eventstate->prevy = event->y;
/* Unlink and free here, blender-quit then frees all. */
- BLI_remlink(&win->queue, event);
+ BLI_remlink(&win->event_queue, event);
wm_event_free(event);
}
- /* Only add mousemove when queue was read entirely. */
+ /* Only add mouse-move when the event queue was read entirely. */
if (win->addmousemove && win->eventstate) {
wmEvent tevent = *(win->eventstate);
// printf("adding MOUSEMOVE %d %d\n", tevent.x, tevent.y);
@@ -4350,11 +4355,11 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi
}
}
- wmWindow *owin;
- if (WM_window_find_under_cursor(wm, win, win, mval, &owin, mval)) {
+ wmWindow *win_other;
+ if (WM_window_find_under_cursor(wm, win, win, mval, &win_other, mval)) {
event->x = mval[0];
event->y = mval[1];
- return owin;
+ return win_other;
}
}
return NULL;
@@ -4395,7 +4400,7 @@ static void wm_event_prev_click_set(wmEvent *event, wmEvent *event_state)
static wmEvent *wm_event_add_mousemove(wmWindow *win, const wmEvent *event)
{
- wmEvent *event_last = win->queue.last;
+ wmEvent *event_last = win->event_queue.last;
/* Some painting operators want accurate mouse events, they can
* handle in between mouse move moves, others can happily ignore
@@ -4417,7 +4422,7 @@ static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int d
{
/* Ignore in between trackpad events for performance, we only need high accuracy
* for painting with mouse moves, for navigation using the accumulated value is ok. */
- wmEvent *event_last = win->queue.last;
+ wmEvent *event_last = win->event_queue.last;
if (event_last && event_last->type == event->type) {
deltax += event_last->x - event_last->prevx;
deltay += event_last->y - event_last->prevy;
@@ -4434,7 +4439,7 @@ static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int d
}
/**
- * Windows store own event queues #wmWindow.queue (no #bContext here).
+ * Windows store own event queues #wmWindow.event_queue (no #bContext here).
*/
void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void *customdata)
{
@@ -4443,19 +4448,19 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
}
/**
- * Having both, \a event and \a evt, can be highly confusing to work with,
+ * Having both, \a event and \a event_state, can be highly confusing to work with,
* but is necessary for our current event system, so let's clear things up a bit:
*
* - Data added to event only will be handled immediately,
* but will not be copied to the next event.
- * - Data added to \a evt only stays,
+ * - Data added to \a event_state only stays,
* but is handled with the next event -> execution delay.
- * - Data added to event and \a evt stays and is handled immediately.
+ * - Data added to event and \a event_state stays and is handled immediately.
*/
- wmEvent event, *evt = win->eventstate;
+ wmEvent event, *event_state = win->eventstate;
/* Initialize and copy state (only mouse x y and modifiers). */
- event = *evt;
+ event = *event_state;
event.is_repeat = false;
/**
@@ -4473,17 +4478,17 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
/* Ensure the event state is correct, any deviation from this may cause bugs. */
#ifndef NDEBUG
- if ((evt->type || evt->val) && /* Ignore cleared event state. */
- !(ISMOUSE_BUTTON(evt->type) || ISKEYBOARD(evt->type))) {
+ if ((event_state->type || event_state->val) && /* Ignore cleared event state. */
+ !(ISMOUSE_BUTTON(event_state->type) || ISKEYBOARD(event_state->type))) {
CLOG_WARN(WM_LOG_HANDLERS,
"Non-keyboard/mouse button found in 'win->eventstate->type = %d'",
- evt->type);
+ event_state->type);
}
- if ((evt->prevtype || evt->prevval) && /* Ignore cleared event state. */
- !(ISMOUSE_BUTTON(evt->prevtype) || ISKEYBOARD(evt->prevtype))) {
+ if ((event_state->prevtype || event_state->prevval) && /* Ignore cleared event state. */
+ !(ISMOUSE_BUTTON(event_state->prevtype) || ISKEYBOARD(event_state->prevtype))) {
CLOG_WARN(WM_LOG_HANDLERS,
"Non-keyboard/mouse button found in 'win->eventstate->prevtype = %d'",
- evt->prevtype);
+ event_state->prevtype);
}
#endif
@@ -4499,28 +4504,26 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
event.type = MOUSEMOVE;
{
wmEvent *event_new = wm_event_add_mousemove(win, &event);
- copy_v2_v2_int(&evt->x, &event_new->x);
- evt->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute;
+ copy_v2_v2_int(&event_state->x, &event_new->x);
+ event_state->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute;
}
/* Also add to other window if event is there, this makes overdraws disappear nicely. */
/* It remaps mousecoord to other window in event. */
- wmWindow *owin = wm_event_cursor_other_windows(wm, win, &event);
- if (owin) {
- wmEvent oevent, *oevt = owin->eventstate;
-
- oevent = *oevt;
+ wmWindow *win_other = wm_event_cursor_other_windows(wm, win, &event);
+ if (win_other) {
+ wmEvent event_other = *win_other->eventstate;
/* See comment for this operation on `event` for details. */
- oevent.prevtype = oevent.type;
- oevent.prevval = oevent.val;
+ event_other.prevtype = event_other.type;
+ event_other.prevval = event_other.val;
- copy_v2_v2_int(&oevent.x, &event.x);
- oevent.type = MOUSEMOVE;
+ copy_v2_v2_int(&event_other.x, &event.x);
+ event_other.type = MOUSEMOVE;
{
- wmEvent *event_new = wm_event_add_mousemove(owin, &oevent);
- copy_v2_v2_int(&oevt->x, &event_new->x);
- oevt->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute;
+ wmEvent *event_new = wm_event_add_mousemove(win_other, &event_other);
+ copy_v2_v2_int(&win_other->eventstate->x, &event_new->x);
+ win_other->eventstate->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute;
}
}
@@ -4546,8 +4549,8 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
break;
}
- event.x = evt->x = pd->x;
- event.y = evt->y = pd->y;
+ event.x = event_state->x = pd->x;
+ event.y = event_state->y = pd->y;
event.val = KM_NOTHING;
/* The direction is inverted from the device due to system preferences. */
@@ -4590,11 +4593,11 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
wm_tablet_data_from_ghost(&bd->tablet, &event.tablet);
wm_eventemulation(&event, false);
- wm_event_prev_values_set(&event, evt);
+ wm_event_prev_values_set(&event, event_state);
/* Copy to event state. */
- evt->val = event.val;
- evt->type = event.type;
+ event_state->val = event.val;
+ event_state->type = event.type;
/* Double click test. */
if (wm_event_is_double_click(&event)) {
@@ -4602,25 +4605,25 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
event.val = KM_DBL_CLICK;
}
if (event.val == KM_PRESS) {
- wm_event_prev_click_set(&event, evt);
+ wm_event_prev_click_set(&event, event_state);
}
/* Add to other window if event is there (not to both!). */
- wmWindow *owin = wm_event_cursor_other_windows(wm, win, &event);
- if (owin) {
- wmEvent oevent = *(owin->eventstate);
+ wmWindow *win_other = wm_event_cursor_other_windows(wm, win, &event);
+ if (win_other) {
+ wmEvent event_other = *win_other->eventstate;
/* See comment for this operation on `event` for details. */
- oevent.prevtype = oevent.type;
- oevent.prevval = oevent.val;
+ event_other.prevtype = event_other.type;
+ event_other.prevval = event_other.val;
- copy_v2_v2_int(&oevent.x, &event.x);
+ copy_v2_v2_int(&event_other.x, &event.x);
- oevent.type = event.type;
- oevent.val = event.val;
- oevent.tablet = event.tablet;
+ event_other.type = event.type;
+ event_other.val = event.val;
+ event_other.tablet = event.tablet;
- wm_event_add(owin, &oevent);
+ wm_event_add(win_other, &event_other);
}
else {
wm_event_add(win, &event);
@@ -4641,12 +4644,12 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
event.val = (type == GHOST_kEventKeyDown) ? KM_PRESS : KM_RELEASE;
wm_eventemulation(&event, false);
- wm_event_prev_values_set(&event, evt);
+ wm_event_prev_values_set(&event, event_state);
/* Copy to event state. */
- evt->val = event.val;
- evt->type = event.type;
- evt->is_repeat = event.is_repeat;
+ event_state->val = event.val;
+ event_state->type = event.type;
+ event_state->is_repeat = event.is_repeat;
/* Exclude arrow keys, esc, etc from text input. */
if (type == GHOST_kEventKeyUp) {
@@ -4682,57 +4685,57 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
case EVT_LEFTSHIFTKEY:
case EVT_RIGHTSHIFTKEY:
if (event.val == KM_PRESS) {
- if (evt->ctrl || evt->alt || evt->oskey) {
+ if (event_state->ctrl || event_state->alt || event_state->oskey) {
keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND);
}
else {
keymodifier = KM_MOD_FIRST;
}
}
- event.shift = evt->shift = keymodifier;
+ event.shift = event_state->shift = keymodifier;
break;
case EVT_LEFTCTRLKEY:
case EVT_RIGHTCTRLKEY:
if (event.val == KM_PRESS) {
- if (evt->shift || evt->alt || evt->oskey) {
+ if (event_state->shift || event_state->alt || event_state->oskey) {
keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND);
}
else {
keymodifier = KM_MOD_FIRST;
}
}
- event.ctrl = evt->ctrl = keymodifier;
+ event.ctrl = event_state->ctrl = keymodifier;
break;
case EVT_LEFTALTKEY:
case EVT_RIGHTALTKEY:
if (event.val == KM_PRESS) {
- if (evt->ctrl || evt->shift || evt->oskey) {
+ if (event_state->ctrl || event_state->shift || event_state->oskey) {
keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND);
}
else {
keymodifier = KM_MOD_FIRST;
}
}
- event.alt = evt->alt = keymodifier;
+ event.alt = event_state->alt = keymodifier;
break;
case EVT_OSKEY:
if (event.val == KM_PRESS) {
- if (evt->ctrl || evt->alt || evt->shift) {
+ if (event_state->ctrl || event_state->alt || event_state->shift) {
keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND);
}
else {
keymodifier = KM_MOD_FIRST;
}
}
- event.oskey = evt->oskey = keymodifier;
+ event.oskey = event_state->oskey = keymodifier;
break;
default:
if (event.val == KM_PRESS && event.keymodifier == 0) {
/* Only set in eventstate, for next event. */
- evt->keymodifier = event.type;
+ event_state->keymodifier = event.type;
}
else if (event.val == KM_RELEASE && event.keymodifier == event.type) {
- event.keymodifier = evt->keymodifier = 0;
+ event.keymodifier = event_state->keymodifier = 0;
}
break;
}
@@ -4755,7 +4758,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
* Since it's impossible to map a key modifier to an unknown key,
* it shouldn't harm to clear it. */
if (event.keymodifier == EVT_UNKNOWNKEY) {
- evt->keymodifier = event.keymodifier = 0;
+ event_state->keymodifier = event.keymodifier = 0;
}
/* If test_break set, it catches this. Do not set with modifier presses.
@@ -4770,7 +4773,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
if (event.val == KM_PRESS) {
/* Don't reset timer & location when holding the key generates repeat events. */
if (event.is_repeat == false) {
- wm_event_prev_click_set(&event, evt);
+ wm_event_prev_click_set(&event, event_state);
}
}