diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-02-16 22:38:03 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-02-16 22:38:03 +0400 |
commit | 92436c94d3adbbfc285bd7b3041db36e66dae5d5 (patch) | |
tree | 2083c8ad4fa810a781e9631161aa88b12008453d /source/blender/windowmanager | |
parent | 90ed5ea4ea278b4aadf9187e4e2b92ef3221001b (diff) | |
parent | fda8927d01ba719963154a56b45952ee541a869d (diff) |
Merged changes in the trunk up to revision 54594.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_keymap.h | 3 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 23 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_gesture.c | 12 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_keymap.c | 33 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 20 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 3 |
8 files changed, 67 insertions, 31 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index e91d4f388af..a1437b70090 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -171,7 +171,7 @@ int WM_modal_tweak_exit(struct wmEvent *evt, int tweak_event); void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference); void WM_main_add_notifier(unsigned int type, void *reference); -void wm_event_add (struct wmWindow *win, struct wmEvent *event_to_add); /* XXX only for warning */ +void wm_event_add(struct wmWindow *win, const struct wmEvent *event_to_add); /* at maximum, every timestep seconds it triggers event_type events */ struct wmTimer *WM_event_add_timer(struct wmWindowManager *wm, struct wmWindow *win, int event_type, double timestep); diff --git a/source/blender/windowmanager/WM_keymap.h b/source/blender/windowmanager/WM_keymap.h index 43369154dbb..49ee759bbf2 100644 --- a/source/blender/windowmanager/WM_keymap.h +++ b/source/blender/windowmanager/WM_keymap.h @@ -64,7 +64,7 @@ wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, const char *idname, in int val, int modifier, int keymodifier); int WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi); -char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len); +int WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, const int len); wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid); wmKeyMap *WM_keymap_find(struct wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid); @@ -81,6 +81,7 @@ wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, const char *idname, st wmKeyMap *WM_modalkeymap_get(struct wmKeyConfig *keyconf, const char *idname); wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value); wmKeyMapItem *WM_modalkeymap_add_item_str(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value); +wmKeyMapItem *WM_modalkeymap_find_propvalue(wmKeyMap *km, const int propvalue); void WM_modalkeymap_assign(struct wmKeyMap *km, const char *opname); /* Keymap Editor */ diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 91be03986c1..6044e3fb771 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -800,7 +800,7 @@ void wm_draw_update(bContext *C) if (state == GHOST_kWindowStateMinimized) { /* do not update minimized windows, it gives issues on intel drivers (see [#33223]) - * anyway, it seems logical to skip update for invisile windows + * anyway, it seems logical to skip update for invisible windows */ continue; } diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 9e3722777ba..206297d2c95 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -91,9 +91,9 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA /* ************ event management ************** */ -void wm_event_add(wmWindow *win, wmEvent *event_to_add) +void wm_event_add(wmWindow *win, const wmEvent *event_to_add) { - wmEvent *event = MEM_callocN(sizeof(wmEvent), "wmEvent"); + wmEvent *event = MEM_mallocN(sizeof(wmEvent), "wmEvent"); *event = *event_to_add; @@ -590,6 +590,9 @@ static void wm_operator_finished(bContext *C, wmOperator *op, int repeat) } if (wm_operator_register_check(wm, op->type)) { + /* take ownership of reports (in case python provided own) */ + op->reports->flag |= RPT_FREE; + wm_operator_register(C, op); WM_operator_region_active_win_set(C); } @@ -935,6 +938,9 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, wm_operator_finished(C, op, 0); } else if (retval & OPERATOR_RUNNING_MODAL) { + /* take ownership of reports (in case python provided own) */ + op->reports->flag |= RPT_FREE; + /* grab cursor during blocking modal ops (X11) * Also check for macro */ @@ -1170,13 +1176,6 @@ int WM_operator_call_py(bContext *C, wmOperatorType *ot, short context, if (!is_undo && wm && (wm == CTX_wm_manager(C))) wm->op_undo_depth--; - /* keep the reports around if needed later */ - if ((retval & OPERATOR_RUNNING_MODAL) || - ((retval & OPERATOR_FINISHED) && wm_operator_register_check(CTX_wm_manager(C), ot))) - { - reports->flag |= RPT_FREE; /* let blender manage freeing */ - } - return retval; } @@ -1766,6 +1765,10 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers break; } else { + if (action & WM_HANDLER_HANDLED) + if (G.debug & (G_DEBUG_EVENTS | G_DEBUG_HANDLERS)) + printf("%s: handled - and pass on! '%s'\n", __func__, kmi->idname); + #ifndef NDEBUG if (do_debug_handler) { printf("%s: un-handled '%s'...", __func__, kmi->idname); @@ -3042,7 +3045,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U event.keymodifier = 0; /* this case happened with an external numpad, it's not really clear - * why, but it's also impossible to map a key modifier to an unknwon + * why, but it's also impossible to map a key modifier to an unknown * key, so it shouldn't harm */ if (event.keymodifier == UNKNOWNKEY) event.keymodifier = 0; diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c index 168c2312d9f..302bf61756a 100644 --- a/source/blender/windowmanager/intern/wm_gesture.c +++ b/source/blender/windowmanager/intern/wm_gesture.c @@ -309,17 +309,19 @@ static void wm_gesture_draw_lasso(wmGesture *gt) static void wm_gesture_draw_cross(wmWindow *win, wmGesture *gt) { rcti *rect = (rcti *)gt->customdata; - + int winsizex = WM_window_pixels_x(win); + int winsizey = WM_window_pixels_y(win); + glEnable(GL_LINE_STIPPLE); glColor3ub(96, 96, 96); glLineStipple(1, 0xCCCC); - sdrawline(rect->xmin - win->sizex, rect->ymin, rect->xmin + win->sizex, rect->ymin); - sdrawline(rect->xmin, rect->ymin - win->sizey, rect->xmin, rect->ymin + win->sizey); + sdrawline(rect->xmin - winsizex, rect->ymin, rect->xmin + winsizex, rect->ymin); + sdrawline(rect->xmin, rect->ymin - winsizey, rect->xmin, rect->ymin + winsizey); glColor3ub(255, 255, 255); glLineStipple(1, 0x3333); - sdrawline(rect->xmin - win->sizex, rect->ymin, rect->xmin + win->sizex, rect->ymin); - sdrawline(rect->xmin, rect->ymin - win->sizey, rect->xmin, rect->ymin + win->sizey); + sdrawline(rect->xmin - winsizex, rect->ymin, rect->xmin + winsizex, rect->ymin); + sdrawline(rect->xmin, rect->ymin - winsizey, rect->xmin, rect->ymin + winsizey); glDisable(GL_LINE_STIPPLE); } diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 3739462ac2c..92a310ac34e 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -126,10 +126,13 @@ static int wm_keymap_item_equals(wmKeyMapItem *a, wmKeyMapItem *b) /* properties can be NULL, otherwise the arg passed is used and ownership is given to the kmi */ void WM_keymap_properties_reset(wmKeyMapItem *kmi, struct IDProperty *properties) { - WM_operator_properties_free(kmi->ptr); - MEM_freeN(kmi->ptr); + if (LIKELY(kmi->ptr)) { + WM_operator_properties_free(kmi->ptr); + MEM_freeN(kmi->ptr); + + kmi->ptr = NULL; + } - kmi->ptr = NULL; kmi->properties = properties; wm_keymap_item_properties_set(kmi); @@ -734,6 +737,24 @@ wmKeyMapItem *WM_modalkeymap_add_item_str(wmKeyMap *km, int type, int val, int m return kmi; } +wmKeyMapItem *WM_modalkeymap_find_propvalue(wmKeyMap *km, const int propvalue) +{ + + if (km->flag & KEYMAP_MODAL) { + wmKeyMapItem *kmi; + for (kmi = km->items.first; kmi; kmi = kmi->next) { + if (kmi->propvalue == propvalue) { + return kmi; + } + } + } + else { + BLI_assert(!"called with non modal keymap"); + } + + return NULL; +} + void WM_modalkeymap_assign(wmKeyMap *km, const char *opname) { wmOperatorType *ot = WM_operatortype_find(opname, 0); @@ -782,7 +803,7 @@ const char *WM_key_event_string(short type) return ""; } -char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len) +int WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len) { char buf[128]; @@ -815,9 +836,7 @@ char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len) } strcat(buf, WM_key_event_string(kmi->type)); - BLI_strncpy(str, buf, len); - - return str; + return BLI_snprintf(str, len, "%s", buf); } static wmKeyMapItem *wm_keymap_item_find_handlers( diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index e22694a6560..41dd618caa5 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -1204,8 +1204,13 @@ void WM_operator_properties_gesture_straightline(wmOperatorType *ot, int cursor) RNA_def_int(ot->srna, "ystart", 0, INT_MIN, INT_MAX, "Y Start", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "yend", 0, INT_MIN, INT_MAX, "Y End", "", INT_MIN, INT_MAX); - if (cursor) - RNA_def_int(ot->srna, "cursor", cursor, 0, INT_MAX, "Cursor", "Mouse cursor style to use during the modal operator", 0, INT_MAX); + if (cursor) { + PropertyRNA *prop; + + prop = RNA_def_int(ot->srna, "cursor", cursor, 0, INT_MAX, + "Cursor", "Mouse cursor style to use during the modal operator", 0, INT_MAX); + RNA_def_property_flag(prop, PROP_HIDDEN); + } } @@ -1341,7 +1346,7 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *ar, void *userData) block = uiBeginBlock(C, ar, __func__, UI_EMBOSS); uiBlockClearFlag(block, UI_BLOCK_LOOP); - /* intentionally don't use 'UI_BLOCK_MOVEMOUSE_QUIT', some dialogs have many items + /* intentionally don't use 'UI_BLOCK_MOVEMOUSE_QUIT', some dialogues have many items * where quitting by accident is very annoying */ uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN); @@ -1998,7 +2003,7 @@ static int wm_link_append_poll(bContext *C) if (WM_operator_winactive(C)) { /* linking changes active object which is pretty useful in general, * but which totally confuses edit mode (i.e. it becoming not so obvious - * to leave from edit mode and inwalid tools in toolbar might be displayed) + * to leave from edit mode and invalid tools in toolbar might be displayed) * so disable link/append when in edit mode (sergey) */ if (CTX_data_edit_object(C)) return 0; @@ -3256,6 +3261,7 @@ static void radial_control_set_initial_mouse(RadialControl *rc, wmEvent *event) rc->initial_mouse[1] = event->y; switch (rc->subtype) { + case PROP_NONE: case PROP_DISTANCE: d[0] = rc->initial_value; break; @@ -3355,6 +3361,7 @@ static void radial_control_paint_cursor(bContext *C, int x, int y, void *customd float zoom[2], col[3] = {1, 1, 1}; switch (rc->subtype) { + case PROP_NONE: case PROP_DISTANCE: r1 = rc->current_value; r2 = rc->initial_value; @@ -3593,8 +3600,8 @@ static int radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event) /* get subtype of property */ rc->subtype = RNA_property_subtype(rc->prop); - if (!ELEM3(rc->subtype, PROP_DISTANCE, PROP_FACTOR, PROP_ANGLE)) { - BKE_report(op->reports, RPT_ERROR, "Property must be a distance, a factor, or an angle"); + if (!ELEM4(rc->subtype, PROP_NONE, PROP_DISTANCE, PROP_FACTOR, PROP_ANGLE)) { + BKE_report(op->reports, RPT_ERROR, "Property must be a none, distance, a factor, or an angle"); MEM_freeN(rc); return OPERATOR_CANCELLED; } @@ -3678,6 +3685,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, wmEvent *event) /* calculate new value and apply snapping */ switch (rc->subtype) { + case PROP_NONE: case PROP_DISTANCE: new_value = dist; if (snap) new_value = ((int)new_value + 5) / 10 * 10; diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index d8b987a196c..a1ab0de49cf 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -763,6 +763,9 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr // window_handle(win, INPUTCHANGE, win->active); /* bad ghost support for modifier keys... so on activate we set the modifiers again */ + + /* TODO: This is not correct since a modifier may be held when a window is activated... + * better solve this at ghost level. attempted fix r54450 but it caused bug [#34255] */ kdata.ascii = '\0'; kdata.utf8_buf[0] = '\0'; if (win->eventstate->shift && !query_qual(SHIFT)) { |