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')
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c13
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c156
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c6
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c7
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c60
-rw-r--r--source/blender/windowmanager/intern/wm_playanim.c194
-rw-r--r--source/blender/windowmanager/intern/wm_window.c13
7 files changed, 285 insertions, 164 deletions
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index ad19df3aaf6..97808d75dbe 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -718,14 +718,14 @@ static int wm_automatic_draw_method(wmWindow *win)
if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OPENSOURCE))
return USER_DRAW_OVERLAP;
/* also Intel drivers are slow */
- /* 2.64 BCon3 period, let's try if intel now works...
+#if 0 /* 2.64 BCon3 period, let's try if intel now works... */
else if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_UNIX, GPU_DRIVER_ANY))
return USER_DRAW_OVERLAP;
else if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_WIN, GPU_DRIVER_ANY))
return USER_DRAW_OVERLAP_FLIP;
else if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_MAC, GPU_DRIVER_ANY))
return USER_DRAW_OVERLAP_FLIP;
- */
+#endif
/* Windows software driver darkens color on each redraw */
else if (GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_WIN, GPU_DRIVER_SOFTWARE))
return USER_DRAW_OVERLAP_FLIP;
@@ -760,6 +760,15 @@ void wm_draw_update(bContext *C)
GPU_free_unused_buffers();
for (win = wm->windows.first; win; win = win->next) {
+ int state = GHOST_GetWindowState(win->ghostwin);;
+
+ 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
+ */
+ continue;
+ }
+
if (win->drawmethod != U.wmdrawmethod) {
wm_draw_window_clear(win);
win->drawmethod = U.wmdrawmethod;
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 551f9157dfe..4066c8d7f5a 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -341,7 +341,7 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
int retval;
/* UI code doesn't handle return values - it just always returns break.
- to make the DBL_CLICK conversion work, we just don't send this to UI */
+ * to make the DBL_CLICK conversion work, we just don't send this to UI */
if (event->val == KM_DBL_CLICK)
return WM_HANDLER_CONTINUE;
@@ -1280,74 +1280,6 @@ int WM_userdef_event_map(int kmitype)
return kmitype;
}
-static void wm_eventemulation(wmEvent *event)
-{
- /* Store last mmb event value to make emulation work when modifier keys are released first. */
- static int mmb_emulated = 0; /* this should be in a data structure somwhere */
-
- /* middlemouse emulation */
- if (U.flag & USER_TWOBUTTONMOUSE) {
- if (event->type == LEFTMOUSE) {
-
- if (event->val == KM_PRESS && event->alt) {
- event->type = MIDDLEMOUSE;
- event->alt = 0;
- mmb_emulated = 1;
- }
- else if (event->val == KM_RELEASE) {
- /* only send middle-mouse release if emulated */
- if (mmb_emulated) {
- event->type = MIDDLEMOUSE;
- event->alt = 0;
- }
- mmb_emulated = 0;
- }
- }
-
- }
-
-#ifdef __APPLE__
-
- /* rightmouse emulation */
- if (U.flag & USER_TWOBUTTONMOUSE) {
- if (event->type == LEFTMOUSE) {
-
- if (event->val == KM_PRESS && event->oskey) {
- event->type = RIGHTMOUSE;
- event->oskey = 0;
- mmb_emulated = 1;
- }
- else if (event->val == KM_RELEASE) {
- if (mmb_emulated) {
- event->oskey = RIGHTMOUSE;
- event->alt = 0;
- }
- mmb_emulated = 0;
- }
- }
-
- }
-#endif
-
- /* numpad emulation */
- if (U.flag & USER_NONUMPAD) {
- switch (event->type) {
- case ZEROKEY: event->type = PAD0; break;
- case ONEKEY: event->type = PAD1; break;
- case TWOKEY: event->type = PAD2; break;
- case THREEKEY: event->type = PAD3; break;
- case FOURKEY: event->type = PAD4; break;
- case FIVEKEY: event->type = PAD5; break;
- case SIXKEY: event->type = PAD6; break;
- case SEVENKEY: event->type = PAD7; break;
- case EIGHTKEY: event->type = PAD8; break;
- case NINEKEY: event->type = PAD9; break;
- case MINUSKEY: event->type = PADMINUS; break;
- case EQUALKEY: event->type = PADPLUSKEY; break;
- case BACKSLASHKEY: event->type = PADSLASHKEY; break;
- }
- }
-}
static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
{
@@ -1357,9 +1289,9 @@ static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
/* the matching rules */
if (kmitype == KM_TEXTINPUT)
- if (winevent->val == KM_PRESS) { // prevent double clicks
+ if (winevent->val == KM_PRESS) { /* prevent double clicks */
/* NOT using ISTEXTINPUT anymore because (at least on Windows) some key codes above 255
- could have printable ascii keys - BUG [#30479] */
+ * could have printable ascii keys - BUG [#30479] */
if (ISKEYBOARD(winevent->type) && (winevent->ascii || winevent->utf8_buf[0])) return 1;
}
@@ -1379,7 +1311,8 @@ static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
if (kmi->oskey != KM_ANY)
if (winevent->oskey != kmi->oskey && !(winevent->oskey & kmi->oskey)) return 0;
- if (winevent->keymodifier != kmi->keymodifier) return 0;
+ if (kmi->keymodifier)
+ if (winevent->keymodifier != kmi->keymodifier) return 0;
return 1;
@@ -1619,8 +1552,8 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
if (handler->op->reports->list.first) {
/* FIXME, temp setting window, this is really bad!
- * only have because lib linking errors need to be seen by users :(
- * it can be removed without breaking anything but then no linking errors - campbell */
+ * only have because lib linking errors need to be seen by users :(
+ * it can be removed without breaking anything but then no linking errors - campbell */
wmWindow *win_prev = CTX_wm_window(C);
ScrArea *area_prev = CTX_wm_area(C);
ARegion *ar_prev = CTX_wm_region(C);
@@ -2114,8 +2047,6 @@ void wm_event_do_handlers(bContext *C)
}
#endif
- wm_eventemulation(event);
-
CTX_wm_window_set(C, win);
/* we let modal handlers get active area/region, also wm_paintcursor_test needs it */
@@ -2617,6 +2548,75 @@ static int convert_key(GHOST_TKey key)
}
}
+static void wm_eventemulation(wmEvent *event)
+{
+ /* Store last mmb event value to make emulation work when modifier keys are released first. */
+ static int mmb_emulated = 0; /* this should be in a data structure somwhere */
+
+ /* middlemouse emulation */
+ if (U.flag & USER_TWOBUTTONMOUSE) {
+ if (event->type == LEFTMOUSE) {
+
+ if (event->val == KM_PRESS && event->alt) {
+ event->type = MIDDLEMOUSE;
+ event->alt = 0;
+ mmb_emulated = 1;
+ }
+ else if (event->val == KM_RELEASE) {
+ /* only send middle-mouse release if emulated */
+ if (mmb_emulated) {
+ event->type = MIDDLEMOUSE;
+ event->alt = 0;
+ }
+ mmb_emulated = 0;
+ }
+ }
+
+ }
+
+#ifdef __APPLE__
+
+ /* rightmouse emulation */
+ if (U.flag & USER_TWOBUTTONMOUSE) {
+ if (event->type == LEFTMOUSE) {
+
+ if (event->val == KM_PRESS && event->oskey) {
+ event->type = RIGHTMOUSE;
+ event->oskey = 0;
+ mmb_emulated = 1;
+ }
+ else if (event->val == KM_RELEASE) {
+ if (mmb_emulated) {
+ event->oskey = RIGHTMOUSE;
+ event->alt = 0;
+ }
+ mmb_emulated = 0;
+ }
+ }
+
+ }
+#endif
+
+ /* numpad emulation */
+ if (U.flag & USER_NONUMPAD) {
+ switch (event->type) {
+ case ZEROKEY: event->type = PAD0; break;
+ case ONEKEY: event->type = PAD1; break;
+ case TWOKEY: event->type = PAD2; break;
+ case THREEKEY: event->type = PAD3; break;
+ case FOURKEY: event->type = PAD4; break;
+ case FIVEKEY: event->type = PAD5; break;
+ case SIXKEY: event->type = PAD6; break;
+ case SEVENKEY: event->type = PAD7; break;
+ case EIGHTKEY: event->type = PAD8; break;
+ case NINEKEY: event->type = PAD9; break;
+ case MINUSKEY: event->type = PADMINUS; break;
+ case EQUALKEY: event->type = PADPLUSKEY; break;
+ case BACKSLASHKEY: event->type = PADSLASHKEY; break;
+ }
+ }
+}
+
/* adds customdata to event */
static void update_tablet_data(wmWindow *win, wmEvent *event)
{
@@ -2826,6 +2826,8 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
else
event.type = MIDDLEMOUSE;
+ wm_eventemulation(&event);
+
/* copy previous state to prev event state (two old!) */
evt->prevval = evt->val;
evt->prevtype = evt->type;
@@ -2891,6 +2893,8 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
memcpy(event.utf8_buf, kd->utf8_buf, sizeof(event.utf8_buf)); /* might be not null terminated*/
event.val = (type == GHOST_kEventKeyDown) ? KM_PRESS : KM_RELEASE;
+ wm_eventemulation(&event);
+
/* copy previous state to prev event state (two old!) */
evt->prevval = evt->val;
evt->prevtype = evt->type;
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index f5c83d48cb9..7481c01d72b 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -405,9 +405,11 @@ void WM_jobs_kill_all(wmWindowManager *wm)
/* wait until every job ended, except for one owner (used in undo to keep screen job alive) */
void WM_jobs_kill_all_except(wmWindowManager *wm, void *owner)
{
- wmJob *wm_job;
+ wmJob *wm_job, *next_job;
- for (wm_job = wm->jobs.first; wm_job; wm_job = wm_job->next) {
+ for (wm_job = wm->jobs.first; wm_job; wm_job = next_job) {
+ next_job = wm_job->next;
+
if (wm_job->owner != owner)
wm_jobs_kill_job(wm, wm_job);
}
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 7aa2b403897..4fe1e3b64ab 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -101,11 +101,8 @@ static int wm_keymap_item_equals_result(wmKeyMapItem *a, wmKeyMapItem *b)
if (strcmp(a->idname, b->idname) != 0)
return 0;
- if (!((a->ptr == NULL && b->ptr == NULL) ||
- (a->ptr && b->ptr && IDP_EqualsProperties(a->ptr->data, b->ptr->data))))
- {
+ if (!RNA_struct_equals(a->ptr, b->ptr))
return 0;
- }
if ((a->flag & KMI_INACTIVE) != (b->flag & KMI_INACTIVE))
return 0;
@@ -545,7 +542,7 @@ static wmKeyMap *wm_keymap_patch_update(ListBase *lb, wmKeyMap *defaultmap, wmKe
/* copy new keymap from an existing one */
if (usermap && !(usermap->flag & KEYMAP_DIFF)) {
- /* for compatibiltiy with old user preferences with non-diff
+ /* for compatibility with old user preferences with non-diff
* keymaps we override the original entirely */
wmKeyMapItem *kmi, *orig_kmi;
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 962eb55996d..69b2d5326a4 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -625,7 +625,7 @@ void WM_operator_properties_sanitize(PointerRNA *ptr, const short no_context)
/** set all props to their default,
* \param do_update Only update un-initialized props.
*
- * \note, theres nothing spesific to operators here.
+ * \note, theres nothing specific to operators here.
* this could be made a general function.
*/
int WM_operator_properties_default(PointerRNA *ptr, const int do_update)
@@ -1187,6 +1187,8 @@ static void wm_operator_ui_popup_ok(struct bContext *C, void *arg, int retval)
if (op && retval > 0)
WM_operator_call(C, op);
+
+ MEM_freeN(data);
}
int WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height)
@@ -1200,8 +1202,11 @@ int WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height)
return OPERATOR_RUNNING_MODAL;
}
-/* operator menu needs undo, for redo callback */
-int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+/**
+ * For use by #WM_operator_props_popup_call, #WM_operator_props_popup only.
+ *
+ * \note operator menu needs undo flag enabled , for redo callback */
+static int wm_operator_props_popup_ex(bContext *C, wmOperator *op, const int do_call)
{
if ((op->type->flag & OPTYPE_REGISTER) == 0) {
@@ -1209,15 +1214,34 @@ int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
"Operator '%s' does not have register enabled, incorrect invoke function", op->type->idname);
return OPERATOR_CANCELLED;
}
-
+
ED_undo_push_op(C, op);
+
wm_operator_register(C, op);
uiPupBlock(C, wm_block_create_redo, op);
+ if (do_call) {
+ WM_operator_repeat(C, op);
+ }
+
return OPERATOR_RUNNING_MODAL;
}
+/* Same as WM_operator_props_popup but call the operator first,
+ * This way - the button values correspond to the result of the operator.
+ * Without this, first access to a button will make the result jump,
+ * see [#32452] */
+int WM_operator_props_popup_call(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ return wm_operator_props_popup_ex(C, op, TRUE);
+}
+
+int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ return wm_operator_props_popup_ex(C, op, FALSE);
+}
+
int WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, int height)
{
wmOpPopUp *data = MEM_callocN(sizeof(wmOpPopUp), "WM_operator_props_dialog_popup");
@@ -1281,6 +1305,31 @@ static void WM_OT_debug_menu(wmOperatorType *ot)
RNA_def_int(ot->srna, "debug_value", 0, SHRT_MIN, SHRT_MAX, "Debug Value", "", -10000, 10000);
}
+/* ***************** Operator defaults ************************* */
+static int wm_operator_defaults_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "active_operator", &RNA_Operator);
+
+ if (!ptr.data) {
+ BKE_report(op->reports, RPT_ERROR, "No operator in context");
+ return OPERATOR_CANCELLED;
+ }
+
+ WM_operator_properties_reset((wmOperator *)ptr.data);
+ return OPERATOR_FINISHED;
+}
+
+/* used by operator preset menu. pre-2.65 this was a 'Reset' button */
+static void WM_OT_operator_defaults(wmOperatorType *ot)
+{
+ ot->name = "Restore Defaults";
+ ot->idname = "WM_OT_operator_defaults";
+ ot->description = "Set the active operator to its default values";
+
+ ot->exec = wm_operator_defaults_exec;
+
+ ot->flag = OPTYPE_INTERNAL;
+}
/* ***************** Splash Screen ************************* */
@@ -1402,7 +1451,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
uiItemL(col, "Links", ICON_NONE);
uiItemStringO(col, IFACE_("Donations"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment");
uiItemStringO(col, IFACE_("Credits"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/credits");
- uiItemStringO(col, IFACE_("Release Log"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-264");
+ uiItemStringO(col, IFACE_("Release Log"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-265");
uiItemStringO(col, IFACE_("Manual"), ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:2.6/Manual");
uiItemStringO(col, IFACE_("Blender Website"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org");
uiItemStringO(col, IFACE_("User Community"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community");
@@ -3766,6 +3815,7 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_memory_statistics);
WM_operatortype_append(WM_OT_dependency_relations);
WM_operatortype_append(WM_OT_debug_menu);
+ WM_operatortype_append(WM_OT_operator_defaults);
WM_operatortype_append(WM_OT_splash);
WM_operatortype_append(WM_OT_search_menu);
WM_operatortype_append(WM_OT_call_menu);
diff --git a/source/blender/windowmanager/intern/wm_playanim.c b/source/blender/windowmanager/intern/wm_playanim.c
index b323f9d70a8..41f6a7e5ab0 100644
--- a/source/blender/windowmanager/intern/wm_playanim.c
+++ b/source/blender/windowmanager/intern/wm_playanim.c
@@ -61,6 +61,7 @@
#include "BKE_blender.h"
#include "BKE_global.h"
+#include "BKE_image.h"
#include "GPU_colors.h"
#include "GPU_compatibility.h"
@@ -76,6 +77,9 @@
#include "WM_api.h" /* only for WM_main_playanim */
+struct PlayState;
+static void playanim_window_zoom(const struct PlayState *ps, const float zoom_offset);
+
typedef struct PlayState {
/* playback state */
@@ -86,7 +90,6 @@ typedef struct PlayState {
short pingpong;
short noskip;
short sstep;
- short pause;
short wait2;
short stopped;
short go;
@@ -134,6 +137,7 @@ typedef enum eWS_Qual {
WS_QUAL_ALT = (WS_QUAL_LALT | WS_QUAL_RALT),
WS_QUAL_LCTRL = (1 << 4),
WS_QUAL_RCTRL = (1 << 5),
+ WS_QUAL_CTRL = (WS_QUAL_LCTRL | WS_QUAL_RCTRL),
WS_QUAL_LMOUSE = (1 << 16),
WS_QUAL_MMOUSE = (1 << 17),
WS_QUAL_RMOUSE = (1 << 18),
@@ -181,27 +185,12 @@ static void playanim_event_qual_update(void)
/* Alt */
GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyLeftAlt, &val);
- if (val) g_WS.qual |= WS_QUAL_LCTRL;
- else g_WS.qual &= ~WS_QUAL_LCTRL;
+ if (val) g_WS.qual |= WS_QUAL_LALT;
+ else g_WS.qual &= ~WS_QUAL_LALT;
GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyRightAlt, &val);
- if (val) g_WS.qual |= WS_QUAL_RCTRL;
- else g_WS.qual &= ~WS_QUAL_RCTRL;
-
- /* LMB */
- GHOST_GetButtonState(g_WS.ghost_system, GHOST_kButtonMaskLeft, &val);
- if (val) g_WS.qual |= WS_QUAL_LMOUSE;
- else g_WS.qual &= ~WS_QUAL_LMOUSE;
-
- /* MMB */
- GHOST_GetButtonState(g_WS.ghost_system, GHOST_kButtonMaskMiddle, &val);
- if (val) g_WS.qual |= WS_QUAL_MMOUSE;
- else g_WS.qual &= ~WS_QUAL_MMOUSE;
-
- /* RMB */
- GHOST_GetButtonState(g_WS.ghost_system, GHOST_kButtonMaskRight, &val);
- if (val) g_WS.qual |= WS_QUAL_RMOUSE;
- else g_WS.qual &= ~WS_QUAL_RMOUSE;
+ if (val) g_WS.qual |= WS_QUAL_RALT;
+ else g_WS.qual &= ~WS_QUAL_RALT;
}
typedef struct PlayAnimPict {
@@ -236,7 +225,7 @@ static void playanim_toscreen(PlayAnimPict *picture, struct ImBuf *ibuf, int fon
{
if (ibuf == NULL) {
- printf("no ibuf !\n");
+ printf("%s: no ibuf for picture '%s'\n", __func__, picture ? picture->name : "<NIL>");
return;
}
if (ibuf->rect == NULL && ibuf->rect_float) {
@@ -434,6 +423,11 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
ps->stopped = FALSE;
}
+ if (ps->wait2) {
+ pupdate_time();
+ ptottime = 0;
+ }
+
switch (type) {
case GHOST_kEventKeyDown:
case GHOST_kEventKeyUp:
@@ -448,33 +442,42 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
case GHOST_kKeyP:
if (val) ps->pingpong = !ps->pingpong;
break;
+ case GHOST_kKey1:
case GHOST_kKeyNumpad1:
if (val) swaptime = ps->fstep / 60.0;
break;
+ case GHOST_kKey2:
case GHOST_kKeyNumpad2:
if (val) swaptime = ps->fstep / 50.0;
break;
+ case GHOST_kKey3:
case GHOST_kKeyNumpad3:
if (val) swaptime = ps->fstep / 30.0;
break;
+ case GHOST_kKey4:
case GHOST_kKeyNumpad4:
if (g_WS.qual & WS_QUAL_SHIFT)
swaptime = ps->fstep / 24.0;
else
swaptime = ps->fstep / 25.0;
break;
+ case GHOST_kKey5:
case GHOST_kKeyNumpad5:
if (val) swaptime = ps->fstep / 20.0;
break;
+ case GHOST_kKey6:
case GHOST_kKeyNumpad6:
if (val) swaptime = ps->fstep / 15.0;
break;
+ case GHOST_kKey7:
case GHOST_kKeyNumpad7:
if (val) swaptime = ps->fstep / 12.0;
break;
+ case GHOST_kKey8:
case GHOST_kKeyNumpad8:
if (val) swaptime = ps->fstep / 10.0;
break;
+ case GHOST_kKey9:
case GHOST_kKeyNumpad9:
if (val) swaptime = ps->fstep / 6.0;
break;
@@ -541,28 +544,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
}
}
break;
- case GHOST_kKeyEqual:
- if (val) {
- if (g_WS.qual & WS_QUAL_SHIFT) {
- ps->pause++;
- printf("pause:%d\n", ps->pause);
- }
- else {
- swaptime /= 1.1;
- }
- }
- break;
- case GHOST_kKeyMinus:
- if (val) {
- if (g_WS.qual & WS_QUAL_SHIFT) {
- ps->pause--;
- printf("pause:%d\n", ps->pause);
- }
- else {
- swaptime *= 1.1;
- }
- }
- break;
+ case GHOST_kKey0:
case GHOST_kKeyNumpad0:
if (val) {
if (ps->once) {
@@ -581,6 +563,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
ps->wait2 = ps->sstep = FALSE;
}
break;
+ case GHOST_kKeyPeriod:
case GHOST_kKeyNumpadPeriod:
if (val) {
if (ps->sstep) ps->wait2 = FALSE;
@@ -590,29 +573,28 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
}
}
break;
+ case GHOST_kKeyEqual:
case GHOST_kKeyNumpadPlus:
+ {
if (val == 0) break;
- zoomx += 2.0f;
- zoomy += 2.0f;
- /* no break??? - is this intentional? - campbell XXX25 */
+ if (g_WS.qual & WS_QUAL_CTRL) {
+ playanim_window_zoom(ps, 1.0f);
+ }
+ else {
+ swaptime /= 1.1;
+ }
+ break;
+ }
+ case GHOST_kKeyMinus:
case GHOST_kKeyNumpadMinus:
{
- int sizex, sizey;
- /* int ofsx, ofsy; */ /* UNUSED */
-
if (val == 0) break;
- if (zoomx > 1.0f) zoomx -= 1.0f;
- if (zoomy > 1.0f) zoomy -= 1.0f;
- // playanim_window_get_position(&ofsx, &ofsy);
- playanim_window_get_size(&sizex, &sizey);
- /* ofsx += sizex / 2; */ /* UNUSED */
- /* ofsy += sizey / 2; */ /* UNUSED */
- sizex = zoomx * ps->ibufx;
- sizey = zoomy * ps->ibufy;
- /* ofsx -= sizex / 2; */ /* UNUSED */
- /* ofsy -= sizey / 2; */ /* UNUSED */
- // window_set_position(g_WS.ghost_window,sizex,sizey);
- GHOST_SetClientSize(g_WS.ghost_window, sizex, sizey);
+ if (g_WS.qual & WS_QUAL_CTRL) {
+ playanim_window_zoom(ps, -1.0f);
+ }
+ else {
+ swaptime *= 1.1;
+ }
break;
}
case GHOST_kKeyEsc:
@@ -623,6 +605,44 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
}
break;
}
+ case GHOST_kEventButtonDown:
+ case GHOST_kEventButtonUp:
+ {
+ GHOST_TEventButtonData *bd = GHOST_GetEventData(evt);
+ int cx, cy, sizex, sizey, inside_window;
+
+ GHOST_GetCursorPosition(g_WS.ghost_system, &cx, &cy);
+ GHOST_ScreenToClient(g_WS.ghost_window, cx, cy, &cx, &cy);
+ playanim_window_get_size(&sizex, &sizey);
+
+ inside_window = (cx >= 0 && cx < sizex && cy >= 0 && cy <= sizey);
+
+ if (bd->button == GHOST_kButtonMaskLeft) {
+ if (type == GHOST_kEventButtonDown) {
+ if (inside_window)
+ g_WS.qual |= WS_QUAL_LMOUSE;
+ }
+ else
+ g_WS.qual &= ~WS_QUAL_LMOUSE;
+ }
+ else if (bd->button == GHOST_kButtonMaskMiddle) {
+ if (type == GHOST_kEventButtonDown) {
+ if (inside_window)
+ g_WS.qual |= WS_QUAL_MMOUSE;
+ }
+ else
+ g_WS.qual &= ~WS_QUAL_MMOUSE;
+ }
+ else if (bd->button == GHOST_kButtonMaskRight) {
+ if (type == GHOST_kEventButtonDown) {
+ if (inside_window)
+ g_WS.qual |= WS_QUAL_RMOUSE;
+ }
+ else
+ g_WS.qual &= ~WS_QUAL_RMOUSE;
+ }
+ break;
+ }
case GHOST_kEventCursorMove:
{
if (g_WS.qual & WS_QUAL_LMOUSE) {
@@ -654,6 +674,11 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
}
break;
}
+ case GHOST_kEventWindowActivate:
+ case GHOST_kEventWindowDeactivate: {
+ g_WS.qual &= ~WS_QUAL_MOUSE;
+ break;
+ }
case GHOST_kEventWindowSize:
case GHOST_kEventWindowMove:
{
@@ -718,6 +743,25 @@ static void playanim_window_open(const char *title, int posx, int posy, int size
FALSE /* no stereo */, FALSE);
}
+static void playanim_window_zoom(const PlayState *ps, const float zoom_offset)
+{
+ int sizex, sizey;
+ /* int ofsx, ofsy; */ /* UNUSED */
+
+ if (zoomx + zoom_offset > 0.0f) zoomx += zoom_offset;
+ if (zoomy + zoom_offset > 0.0f) zoomy += zoom_offset;
+
+ // playanim_window_get_position(&ofsx, &ofsy);
+ playanim_window_get_size(&sizex, &sizey);
+ /* ofsx += sizex / 2; */ /* UNUSED */
+ /* ofsy += sizey / 2; */ /* UNUSED */
+ sizex = zoomx * ps->ibufx;
+ sizey = zoomy * ps->ibufy;
+ /* ofsx -= sizex / 2; */ /* UNUSED */
+ /* ofsy -= sizey / 2; */ /* UNUSED */
+ // window_set_position(g_WS.ghost_window,sizex,sizey);
+ GHOST_SetClientSize(g_WS.ghost_window, sizex, sizey);
+}
void WM_main_playanim(int argc, const char **argv)
{
@@ -738,13 +782,12 @@ void WM_main_playanim(int argc, const char **argv)
/* ps.doubleb = TRUE;*/ /* UNUSED */
ps.go = TRUE;
ps.direction = TRUE;
- ps.next = TRUE;
+ ps.next = 1;
ps.once = FALSE;
ps.turbo = FALSE;
ps.pingpong = FALSE;
ps.noskip = FALSE;
ps.sstep = FALSE;
- ps.pause = FALSE;
ps.wait2 = FALSE;
ps.stopped = FALSE;
ps.picture = NULL;
@@ -941,6 +984,7 @@ void WM_main_playanim(int argc, const char **argv)
if (ptottime > 0.0) ptottime = 0.0;
while (ps.picture) {
+ int hasevent;
#ifndef USE_IMB_CACHE
if (ibuf != NULL && ibuf->ftype == 0) IMB_freeImBuf(ibuf);
#endif
@@ -994,19 +1038,22 @@ void WM_main_playanim(int argc, const char **argv)
ps.next = ps.direction;
- {
- int hasevent = GHOST_ProcessEvents(g_WS.ghost_system, 0);
+ while ((hasevent = GHOST_ProcessEvents(g_WS.ghost_system, 0) || ps.wait2 != 0)) {
if (hasevent) {
GHOST_DispatchEvents(g_WS.ghost_system);
}
- }
-
- /* XXX25 - we should not have to do this, but it makes scrubbing functional! */
- if (g_WS.qual & WS_QUAL_LMOUSE) {
- ps.next = 0;
- }
- else {
- ps.sstep = 0;
+ if (ps.wait2) {
+ if (hasevent) {
+ if (ibuf) {
+ while (pupdate_time()) PIL_sleep_ms(1);
+ ptottime -= swaptime;
+ playanim_toscreen(ps.picture, ibuf, ps.fontid, ps.fstep);
+ }
+ }
+ }
+ if (!ps.go) {
+ break;
+ }
}
ps.wait2 = ps.sstep;
@@ -1084,6 +1131,7 @@ void WM_main_playanim(int argc, const char **argv)
/* we still miss freeing a lot!,
* but many areas could skip initialization too for anim play */
IMB_exit();
+ BKE_images_exit();
BLF_exit();
#endif
GHOST_DisposeWindow(g_WS.ghost_system, g_WS.ghost_window);
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 1da6328d7c8..6864624e163 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -333,8 +333,14 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win)
static void wm_window_add_ghostwindow(const char *title, wmWindow *win)
{
GHOST_WindowHandle ghostwin;
+ static int multisamples = -1;
int scr_w, scr_h, posy;
+ /* force setting multisamples only once, it requires restart - and you cannot
+ * mix it, either all windows have it, or none (tested in OSX opengl) */
+ if (multisamples == -1)
+ multisamples = U.ogl_multisamples;
+
wm_get_screensize(&scr_w, &scr_h);
posy = (scr_h - win->posy - win->sizey);
@@ -345,7 +351,7 @@ static void wm_window_add_ghostwindow(const char *title, wmWindow *win)
(GHOST_TWindowState)win->windowstate,
GHOST_kDrawingContextTypeOpenGL,
0 /* no stereo */,
- U.ogl_multisamples /* AA */);
+ multisamples /* AA */);
if (ghostwin) {
/* needed so we can detect the graphics card below */
@@ -748,6 +754,11 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
state = GHOST_GetWindowState(win->ghostwin);
win->windowstate = state;
+ /* stop screencast if resize */
+ if (type == GHOST_kEventWindowSize) {
+ WM_jobs_stop(CTX_wm_manager(C), win->screen, NULL);
+ }
+
/* win32: gives undefined window size when minimized */
if (state != GHOST_kWindowStateMinimized) {
GHOST_RectangleHandle client_rect;