fix [#30087] operator_context is different for popup and submenu's *TODO, after 2.62*
having context different for menu vs submenu is quite confusing, now they are both: WM_OP_INVOKE_REGION_WIN this changes WM_menu_invoke behavior.
This commit is contained in:
@@ -1450,6 +1450,11 @@ static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
|
|||||||
|
|
||||||
menu.type = mt;
|
menu.type = mt;
|
||||||
menu.layout = layout;
|
menu.layout = layout;
|
||||||
|
|
||||||
|
if (G.debug & G_DEBUG_WM) {
|
||||||
|
printf("%s: opening menu \"%s\"\n", __func__, mt->idname);
|
||||||
|
}
|
||||||
|
|
||||||
mt->draw(C, &menu);
|
mt->draw(C, &menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
|
|
||||||
#include "BKE_context.h"
|
#include "BKE_context.h"
|
||||||
#include "BKE_screen.h"
|
#include "BKE_screen.h"
|
||||||
|
#include "BKE_global.h"
|
||||||
|
|
||||||
#include "WM_api.h"
|
#include "WM_api.h"
|
||||||
#include "WM_types.h"
|
#include "WM_types.h"
|
||||||
@@ -2510,6 +2511,9 @@ uiPopupMenu *uiPupMenuBegin(bContext *C, const char *title, int icon)
|
|||||||
pup->block->flag |= UI_BLOCK_POPUP_MEMORY;
|
pup->block->flag |= UI_BLOCK_POPUP_MEMORY;
|
||||||
pup->block->puphash = ui_popup_menu_hash(title);
|
pup->block->puphash = ui_popup_menu_hash(title);
|
||||||
pup->layout = uiBlockLayout(pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style);
|
pup->layout = uiBlockLayout(pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style);
|
||||||
|
|
||||||
|
/* note, this intentionally differs from the menu & submenu default because many operators
|
||||||
|
* use popups like this to select one of their options - where having invoke doesn't make sense */
|
||||||
uiLayoutSetOperatorContext(pup->layout, WM_OP_EXEC_REGION_WIN);
|
uiLayoutSetOperatorContext(pup->layout, WM_OP_EXEC_REGION_WIN);
|
||||||
|
|
||||||
/* create in advance so we can let buttons point to retval already */
|
/* create in advance so we can let buttons point to retval already */
|
||||||
@@ -2721,6 +2725,10 @@ void uiPupMenuInvoke(bContext *C, const char *idname)
|
|||||||
menu.layout = layout;
|
menu.layout = layout;
|
||||||
menu.type = mt;
|
menu.type = mt;
|
||||||
|
|
||||||
|
if (G.debug & G_DEBUG_WM) {
|
||||||
|
printf("%s: opening menu \"%s\"\n", __func__, idname);
|
||||||
|
}
|
||||||
|
|
||||||
mt->draw(C, &menu);
|
mt->draw(C, &menu);
|
||||||
|
|
||||||
uiPupMenuEnd(C, pup);
|
uiPupMenuEnd(C, pup);
|
||||||
|
|||||||
@@ -3082,6 +3082,9 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (sync) {
|
if (sync) {
|
||||||
|
/* note: this is very simplistic,
|
||||||
|
* its has problem that it may skip too many frames.
|
||||||
|
* however at least this gives a less jittery playback */
|
||||||
const int step = max_ii(1, floor((wt->duration - sad->last_duration) * FPS));
|
const int step = max_ii(1, floor((wt->duration - sad->last_duration) * FPS));
|
||||||
|
|
||||||
/* skip frames */
|
/* skip frames */
|
||||||
|
|||||||
@@ -674,6 +674,8 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
|
|||||||
else {
|
else {
|
||||||
pup = uiPupMenuBegin(C, RNA_struct_ui_name(op->type->srna), ICON_NONE);
|
pup = uiPupMenuBegin(C, RNA_struct_ui_name(op->type->srna), ICON_NONE);
|
||||||
layout = uiPupMenuLayout(pup);
|
layout = uiPupMenuLayout(pup);
|
||||||
|
/* set this so the default execution context is the same as submenus */
|
||||||
|
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
|
||||||
uiItemsFullEnumO(layout, op->type->idname, RNA_property_identifier(prop), op->ptr->data, WM_OP_EXEC_REGION_WIN, 0);
|
uiItemsFullEnumO(layout, op->type->idname, RNA_property_identifier(prop), op->ptr->data, WM_OP_EXEC_REGION_WIN, 0);
|
||||||
uiPupMenuEnd(C, pup);
|
uiPupMenuEnd(C, pup);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1080,7 +1080,7 @@ char *WM_clipboard_text_get(int selection)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* always convert from \r\n to \n */
|
/* always convert from \r\n to \n */
|
||||||
newbuf = MEM_callocN(strlen(buf) + 1, "WM_clipboard_text_get");
|
newbuf = MEM_callocN(strlen(buf) + 1, __func__);
|
||||||
|
|
||||||
for (p = buf, p2 = newbuf; *p; p++) {
|
for (p = buf, p2 = newbuf; *p; p++) {
|
||||||
if (*p != '\r')
|
if (*p != '\r')
|
||||||
|
|||||||
Reference in New Issue
Block a user