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:
authorTon Roosendaal <ton@blender.org>2008-12-11 18:38:16 +0300
committerTon Roosendaal <ton@blender.org>2008-12-11 18:38:16 +0300
commitd39b43aa2010c9b5262428b4afedebd1686307ba (patch)
tree92fb3ad78b42bb9c858af84c7887e850bc68f65d /source/blender
parent045306ae499661d585bf989f7b6504caadd2a219 (diff)
2.5
TimeLine window pulldowns work sorta (for the options that were coded :) Still trying to bring back code without recoding uiDefButs. In future these will get directly operator stuff linked. For time being made a simple operator call function, like: WM_operator_call(C, "ED_MARKER_OT_add"); and for forcing operator to run in the main region-window: WM_operator_call_rwin(C, "ED_MARKER_OT_add"); These calls also work for modal operators, like marker grab in this case.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/include/ED_util.h2
-rw-r--r--source/blender/editors/include/UI_view2d.h1
-rw-r--r--source/blender/editors/interface/view2d.c16
-rw-r--r--source/blender/editors/space_time/time_header.c285
-rw-r--r--source/blender/editors/util/ed_util.c38
-rw-r--r--source/blender/windowmanager/WM_api.h2
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c43
7 files changed, 247 insertions, 140 deletions
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 82af517b1e9..10e9c0473a2 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -34,8 +34,8 @@
#define YIC 20
void apply_keyb_grid(float *val, float fac1, float fac2, float fac3, int invert);
-
int GetButStringLength(char *str);
+char *windowtype_pup(void);
#endif /* ED_UTIL_H */
diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h
index 757f38aba1e..ea47150f50e 100644
--- a/source/blender/editors/include/UI_view2d.h
+++ b/source/blender/editors/include/UI_view2d.h
@@ -115,6 +115,7 @@ void UI_view2d_to_region_no_clip(struct View2D *v2d, float x, float y, short *re
/* utilities */
struct View2D *UI_view2d_fromcontext(const struct bContext *C);
+struct View2D *UI_view2d_fromcontext_rwin(const struct bContext *C);
void UI_view2d_getscale(struct View2D *v2d, float *x, float *y);
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index bdbda0087b0..d8d8c9194ea 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -1226,6 +1226,22 @@ View2D *UI_view2d_fromcontext(const bContext *C)
return &(C->region->v2d);
}
+/* same as above, but it returns regionwindow. Utility for pulldowns or buttons */
+View2D *UI_view2d_fromcontext_rwin(const bContext *C)
+{
+ if (C->area == NULL) return NULL;
+ if (C->region == NULL) return NULL;
+ if (C->region->regiontype!=RGN_TYPE_WINDOW) {
+ ARegion *ar= C->area->regionbase.first;
+ for(; ar; ar= ar->next)
+ if(ar->regiontype==RGN_TYPE_WINDOW)
+ return &(ar->v2d);
+ return NULL;
+ }
+ return &(C->region->v2d);
+}
+
+
/* Calculate the scale per-axis of the drawing-area
* - Is used to inverse correct drawing of icons, etc. that need to follow view
* but not be affected by scale
diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c
index 2552f26256e..913946ad376 100644
--- a/source/blender/editors/space_time/time_header.c
+++ b/source/blender/editors/space_time/time_header.c
@@ -62,92 +62,6 @@
/* ************************ header time area region *********************** */
-static void start_animated_screen(SpaceTime *stime)
-{
-// XXX add_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM, stime->redraws);
-
-// if(stime->redraws & TIME_WITH_SEQ_AUDIO)
-// audiostream_start( CFRA );
-
-// BKE_ptcache_set_continue_physics((stime->redraws & TIME_CONTINUE_PHYSICS));
-}
-
-static void end_animated_screen(SpaceTime *stime)
-{
-// rem_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM);
-
-// audiostream_stop();
-// BKE_ptcache_set_continue_physics(0);
-}
-
-#define B_TL_REW 751
-#define B_TL_PLAY 752
-#define B_TL_FF 753
-#define B_TL_PREVKEY 754
-#define B_TL_NEXTKEY 755
-#define B_TL_STOP 756
-#define B_TL_PREVIEWON 757
-#define B_TL_INSERTKEY 758
-#define B_TL_DELETEKEY 759
-
-void do_time_buttons(bContext *C, void *arg, int event)
-{
- SpaceTime *stime= C->area->spacedata.first;
-
- switch(event) {
-
- case B_TL_REW:
- CFRA= PSFRA;
- //update_for_newframe();
- break;
- case B_TL_PLAY:
- start_animated_screen(stime);
- break;
- case B_TL_STOP:
- end_animated_screen(stime);
- //allqueue(REDRAWALL, 0);
- break;
- case B_TL_FF:
- /* end frame */
- CFRA= PEFRA;
- //update_for_newframe();
- break;
- case B_TL_PREVKEY:
- /* previous keyframe */
- //nextprev_timeline_key(-1);
- break;
- case B_TL_NEXTKEY:
- /* next keyframe */
- //nextprev_timeline_key(1);
- break;
-
- case B_TL_PREVIEWON:
- if (G.scene->r.psfra) {
- /* turn on preview range */
- G.scene->r.psfra= G.scene->r.sfra;
- G.scene->r.pefra= G.scene->r.efra;
- }
- else {
- /* turn off preview range */
- G.scene->r.psfra= 0;
- G.scene->r.pefra= 0;
- }
- //BIF_undo_push("Set anim-preview range");
- //allqueue(REDRAWALL, 0);
- break;
-
- case B_TL_INSERTKEY:
- /* insert keyframe */
- //common_insertkey();
- //allqueue(REDRAWTIME, 1);
- break;
- case B_TL_DELETEKEY:
- /* delete keyframe */
- //common_deletekey();
- //allqueue(REDRAWTIME, 1);
- break;
- }
-}
static void do_time_redrawmenu(bContext *C, void *arg, int event)
{
@@ -162,7 +76,7 @@ static void do_time_redrawmenu(bContext *C, void *arg, int event)
}
else {
if(event==1001) {
-// button(&G.scene->r.frs_sec,1,120,"FPS:");
+// button(&C->scene->r.frs_sec,1,120,"FPS:");
}
}
}
@@ -206,7 +120,7 @@ static uiBlock *time_redrawmenu(bContext *C, uiMenuBlockHandle *handle, void *ar
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- sprintf(str, "Set Frames/Sec (%d/%f)", G.scene->r.frs_sec, G.scene->r.frs_sec_base);
+ sprintf(str, "Set Frames/Sec (%d/%f)", C->scene->r.frs_sec, C->scene->r.frs_sec_base);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1001, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -234,6 +148,7 @@ static void do_time_viewmenu(bContext *C, void *arg, int event)
{
ScrArea *curarea= C->area;
SpaceTime *stime= curarea->spacedata.first;
+ View2D *v2d= UI_view2d_fromcontext_rwin(C);
int first;
switch(event) {
@@ -242,19 +157,21 @@ static void do_time_viewmenu(bContext *C, void *arg, int event)
// start_animated_screen(stime);
break;
case 3: /* View All */
- first= G.scene->r.sfra;
- if(first >= G.scene->r.efra) first= G.scene->r.efra;
- G.v2d->cur.xmin=G.v2d->tot.xmin= (float)first-2;
- G.v2d->cur.xmax=G.v2d->tot.xmax= (float)G.scene->r.efra+2;
+ if(v2d) {
+ first= C->scene->r.sfra;
+ if(first >= C->scene->r.efra) first= C->scene->r.efra;
+ v2d->cur.xmin=v2d->tot.xmin= (float)first-2;
+ v2d->cur.xmax=v2d->tot.xmax= (float)C->scene->r.efra+2;
- //test_view2d(G.v2d, curarea->winx, curarea->winy);
- //scrarea_queue_winredraw(curarea);
+ WM_event_add_notifier(C, WM_NOTE_AREA_REDRAW, 0, NULL);
+ }
break;
case 4: /* Maximize Window */
/* using event B_FULL */
break;
case 5: /* show time or frames */
stime->flag ^= TIME_DRAWFRAMES;
+ WM_event_add_notifier(C, WM_NOTE_AREA_REDRAW, 0, NULL);
break;
case 6:
//nextprev_marker(1);
@@ -272,21 +189,24 @@ static void do_time_viewmenu(bContext *C, void *arg, int event)
//timeline_frame_to_center();
break;
case 11:
- //G.v2d->flag ^= V2D_VIEWSYNC_X;
- //if(G.v2d->flag & V2D_VIEWSYNC_X)
+ if(v2d) {
+ //v2d->flag ^= V2D_VIEWSYNC_X;
+ //if(v2d->flag & V2D_VIEWSYNC_X)
// view2d_do_locks(curarea, 0);
+ }
break;
case 12: /* only show keyframes from selected data */
stime->flag ^= TIME_ONLYACTSEL;
+ WM_event_add_notifier(C, WM_NOTE_AREA_REDRAW, 0, NULL);
break;
}
- //allqueue(REDRAWVIEW3D, 0);
}
static uiBlock *time_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
{
ScrArea *curarea= C->area;
SpaceTime *stime= curarea->spacedata.first;
+ View2D *v2d= UI_view2d_fromcontext_rwin(C);
uiBlock *block;
short yco= 0, menuwidth=120;
@@ -317,7 +237,7 @@ static uiBlock *time_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, (handle->region->v2d.flag & V2D_VIEWSYNC_X)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
+ uiDefIconTextBut(block, BUTM, 1, (v2d->flag & V2D_VIEWSYNC_X)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
"Lock Time to Other Windows|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
// if (!curarea->full)
@@ -343,46 +263,41 @@ static void do_time_framemenu(bContext *C, void *arg, int event)
{
switch(event) {
case 1: /*Set as Start */
- if (G.scene->r.psfra) {
- if (G.scene->r.pefra < CFRA)
- G.scene->r.pefra= CFRA;
- G.scene->r.psfra= CFRA;
+ if (C->scene->r.psfra) {
+ if (C->scene->r.pefra < CFRA)
+ C->scene->r.pefra= CFRA;
+ C->scene->r.psfra= CFRA;
}
else
- G.scene->r.sfra = CFRA;
- //allqueue(REDRAWALL, 1);
+ C->scene->r.sfra = CFRA;
+ WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
break;
case 2: /* Set as End */
- if (G.scene->r.psfra) {
- if (CFRA < G.scene->r.psfra)
- G.scene->r.psfra= CFRA;
- G.scene->r.pefra= CFRA;
+ if (C->scene->r.psfra) {
+ if (CFRA < C->scene->r.psfra)
+ C->scene->r.psfra= CFRA;
+ C->scene->r.pefra= CFRA;
}
else
- G.scene->r.efra = CFRA;
- //allqueue(REDRAWALL, 1);
+ C->scene->r.efra = CFRA;
+ WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
break;
case 3: /* Add Marker */
- //add_marker(CFRA);
+ WM_operator_call_rwin(C, "ED_MARKER_OT_add");
break;
case 4: /* Remove Marker */
- //remove_marker();
+ WM_operator_call_rwin(C, "ED_MARKER_OT_delete");
break;
case 5: /* Rename Marker */
//rename_marker();
break;
case 6: /* Grab Marker */
- //transform_markers('g', 0);
+ WM_operator_call_rwin(C, "ED_MARKER_OT_move");
break;
case 7: /* duplicate marker */
- //duplicate_marker();
+ WM_operator_call_rwin(C, "ED_MARKER_OT_duplicate");
break;
}
- //allqueue(REDRAWTIME, 0);
- //allqueue(REDRAWIPO, 0);
- //allqueue(REDRAWACTION, 0);
- //allqueue(REDRAWNLA, 0);
- //allqueue(REDRAWSOUND, 0);
}
static uiBlock *time_framemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
@@ -429,12 +344,104 @@ static uiBlock *time_framemenu(bContext *C, uiMenuBlockHandle *handle, void *arg
return block;
}
+static void start_animated_screen(SpaceTime *stime)
+{
+ // XXX add_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM, stime->redraws);
+
+ // if(stime->redraws & TIME_WITH_SEQ_AUDIO)
+ // audiostream_start( CFRA );
+
+ // BKE_ptcache_set_continue_physics((stime->redraws & TIME_CONTINUE_PHYSICS));
+}
+
+static void end_animated_screen(SpaceTime *stime)
+{
+ // rem_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM);
+
+ // audiostream_stop();
+ // BKE_ptcache_set_continue_physics(0);
+}
+
+#define B_REDRAWALL 750
+#define B_TL_REW 751
+#define B_TL_PLAY 752
+#define B_TL_FF 753
+#define B_TL_PREVKEY 754
+#define B_TL_NEXTKEY 755
+#define B_TL_STOP 756
+#define B_TL_PREVIEWON 757
+#define B_TL_INSERTKEY 758
+#define B_TL_DELETEKEY 759
+
#define B_NEWSPACE 0
#define B_FLIPINFOMENU 0
#define B_NEWFRAME 0
#define AUTOKEY_ON 0
#define B_DIFF 0
+
+void do_time_buttons(bContext *C, void *arg, int event)
+{
+ SpaceTime *stime= C->area->spacedata.first;
+
+ switch(event) {
+ case B_REDRAWALL:
+ WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
+ break;
+ case B_TL_REW:
+ CFRA= PSFRA;
+ //update_for_newframe();
+ break;
+ case B_TL_PLAY:
+ start_animated_screen(stime);
+ break;
+ case B_TL_STOP:
+ end_animated_screen(stime);
+ WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
+ break;
+ case B_TL_FF:
+ /* end frame */
+ CFRA= PEFRA;
+ //update_for_newframe();
+ break;
+ case B_TL_PREVKEY:
+ /* previous keyframe */
+ //nextprev_timeline_key(-1);
+ break;
+ case B_TL_NEXTKEY:
+ /* next keyframe */
+ //nextprev_timeline_key(1);
+ break;
+
+ case B_TL_PREVIEWON:
+ if (C->scene->r.psfra) {
+ /* turn on preview range */
+ C->scene->r.psfra= C->scene->r.sfra;
+ C->scene->r.pefra= C->scene->r.efra;
+ }
+ else {
+ /* turn off preview range */
+ C->scene->r.psfra= 0;
+ C->scene->r.pefra= 0;
+ }
+ //BIF_undo_push("Set anim-preview range");
+ WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
+ break;
+
+ case B_TL_INSERTKEY:
+ /* insert keyframe */
+ //common_insertkey();
+ //allqueue(REDRAWTIME, 1);
+ break;
+ case B_TL_DELETEKEY:
+ /* delete keyframe */
+ //common_deletekey();
+ //allqueue(REDRAWTIME, 1);
+ break;
+ }
+}
+
+
void time_header_buttons(const bContext *C, ARegion *ar)
{
ScrArea *sa= C->area;
@@ -450,11 +457,11 @@ void time_header_buttons(const bContext *C, ARegion *ar)
xco = 8;
-// uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D,
-// windowtype_pup(), xco, 0, XIC+10, YIC,
-// &(C->area->butspacetype), 1.0, SPACEICONMAX, 0, 0,
-// "Displays Current Window Type. "
-// "Click for menu of available types.");
+ uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D,
+ windowtype_pup(), xco, yco, XIC+10, YIC,
+ &(C->area->butspacetype), 1.0, SPACEICONMAX, 0, 0,
+ "Displays Current Window Type. "
+ "Click for menu of available types.");
xco += XIC + 14;
@@ -503,35 +510,35 @@ void time_header_buttons(const bContext *C, ARegion *ar)
uiDefButI(block, TOG, B_TL_PREVIEWON,"Preview",
xco,yco, XIC, YIC,
- &G.scene->r.psfra,0, 1, 0, 0,
+ &C->scene->r.psfra,0, 1, 0, 0,
"Show settings for frame range of animation preview");
xco += XIC;
- if (G.scene->r.psfra) {
- uiDefButI(block, NUM, REDRAWALL,"Start:",
+ if (C->scene->r.psfra) {
+ uiDefButI(block, NUM, B_REDRAWALL,"Start:",
xco,yco, 4.5*XIC, YIC,
- &G.scene->r.psfra,MINFRAMEF, MAXFRAMEF, 0, 0,
+ &C->scene->r.psfra,MINFRAMEF, MAXFRAMEF, 0, 0,
"The start frame of the animation preview (inclusive)");
xco += (short)(4.5*XIC);
- uiDefButI(block, NUM, REDRAWALL,"End:",
+ uiDefButI(block, NUM, B_REDRAWALL,"End:",
xco,yco,4.5*XIC,YIC,
- &G.scene->r.pefra,PSFRA,MAXFRAMEF, 0, 0,
+ &C->scene->r.pefra,PSFRA,MAXFRAMEF, 0, 0,
"The end frame of the animation preview (inclusive)");
}
else {
- uiDefButI(block, NUM, REDRAWALL,"Start:",
+ uiDefButI(block, NUM, B_REDRAWALL,"Start:",
xco,yco, 4.5*XIC, YIC,
- &G.scene->r.sfra,MINFRAMEF, MAXFRAMEF, 0, 0,
+ &C->scene->r.sfra,MINFRAMEF, MAXFRAMEF, 0, 0,
"The start frame of the animation (inclusive)");
xco += (short)(4.5*XIC);
- uiDefButI(block, NUM, REDRAWALL,"End:",
+ uiDefButI(block, NUM, B_REDRAWALL,"End:",
xco,yco,4.5*XIC,YIC,
- &G.scene->r.efra,(float)SFRA,MAXFRAMEF, 0, 0,
+ &C->scene->r.efra,(float)SFRA,MAXFRAMEF, 0, 0,
"The end frame of the animation (inclusive)");
}
uiBlockEndAlign(block);
@@ -540,7 +547,7 @@ void time_header_buttons(const bContext *C, ARegion *ar)
uiDefButI(block, NUM, B_NEWFRAME, "",
xco,yco,3.5*XIC,YIC,
- &(G.scene->r.cfra), MINFRAMEF, MAXFRAMEF, 0, 0,
+ &(C->scene->r.cfra), MINFRAMEF, MAXFRAMEF, 0, 0,
"Displays Current Frame of animation");
xco += (short)(3.5 * XIC + 16);
@@ -556,8 +563,8 @@ void time_header_buttons(const bContext *C, ARegion *ar)
// uiDefIconBut(block, BUT, B_TL_STOP, ICON_PAUSE,
// xco, 0, XIC, YIC, 0, 0, 0, 0, 0, "Stop Playing Timeline");
// else
-// uiDefIconBut(block, BUT, B_TL_PLAY, ICON_PLAY,
-// xco, 0, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline ");
+ uiDefIconBut(block, BUT, B_TL_PLAY, ICON_PLAY,
+ xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline ");
xco+= XIC+4;
uiDefIconBut(block, BUT, B_TL_NEXTKEY, ICON_NEXT_KEYFRAME,
@@ -568,12 +575,12 @@ void time_header_buttons(const bContext *C, ARegion *ar)
xco+= XIC+8;
uiDefIconButBitS(block, TOG, AUTOKEY_ON, REDRAWINFO, ICON_REC,
- xco, yco, XIC, YIC, &(G.scene->autokey_mode), 0, 0, 0, 0, "Automatic keyframe insertion for Objects and Bones");
+ xco, yco, XIC, YIC, &(C->scene->autokey_mode), 0, 0, 0, 0, "Automatic keyframe insertion for Objects and Bones");
xco+= XIC;
if (C->scene->autokey_mode & AUTOKEY_ON) {
uiDefButS(block, MENU, REDRAWINFO,
"Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5",
- xco, yco, 3.5*XIC, YIC, &(G.scene->autokey_mode), 0, 1, 0, 0,
+ xco, yco, 3.5*XIC, YIC, &(C->scene->autokey_mode), 0, 1, 0, 0,
"Mode of automatic keyframe insertion for Objects and Bones");
xco+= (4*XIC);
}
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 78cc5495864..94579c5e91f 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -78,3 +78,41 @@ int GetButStringLength(char *str)
return rt + 15;
}
+char *windowtype_pup(void)
+{
+ return(
+ "Window type:%t" //14
+ "|3D View %x1" //30
+
+ "|%l" // 33
+
+ "|Ipo Curve Editor %x2" //54
+ "|Action Editor %x12" //73
+ "|NLA Editor %x13" //94
+
+ "|%l" //97
+
+ "|UV/Image Editor %x6" //117
+
+ "|Video Sequence Editor %x8" //143
+ "|Timeline %x15" //163
+ "|Audio Window %x11" //163
+ "|Text Editor %x9" //179
+
+ "|%l" //192
+
+
+ "|User Preferences %x7" //213
+ "|Outliner %x3" //232
+ "|Buttons Window %x4" //251
+ "|Node Editor %x16"
+ "|%l" //254
+
+ "|Image Browser %x10" //273
+ "|File Browser %x5" //290
+
+ "|%l" //293
+
+ "|Scripts Window %x14"//313
+ );
+}
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 08c6a786f69..908070d33fa 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -105,6 +105,8 @@ wmOperatorType *WM_operatortype_find(const char *idname);
void WM_operatortype_append (void (*opfunc)(wmOperatorType*));
int WM_operator_invoke (struct bContext *C, wmOperatorType *ot, struct wmEvent *event);
+int WM_operator_call (struct bContext *C, const char *opstring);
+int WM_operator_call_rwin (struct bContext *C, const char *opstring);
/* default operator callbacks for border/lasso */
int WM_border_select_invoke (struct bContext *C, wmOperator *op, struct wmEvent *event);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 54fbbacfaaa..ff0d6b83b34 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -305,6 +305,49 @@ int WM_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event)
return retval;
}
+/* forces event to go to the region window, for header menus */
+int WM_operator_call_rwin(bContext *C, const char *opstring)
+{
+ wmOperatorType *ot= WM_operatortype_find(opstring);
+
+ /* dummie test */
+ if(ot && C && C->window) {
+ ARegion *ar= C->region;
+ int retval;
+
+ if(C->area) {
+ ARegion *ar1= C->area->regionbase.first;
+ for(; ar1; ar1= ar1->next)
+ if(ar1->regiontype==RGN_TYPE_WINDOW)
+ break;
+ if(ar1)
+ C->region= ar1;
+ }
+
+ retval= WM_operator_invoke(C, ot, C->window->eventstate);
+
+ /* set region back */
+ C->region= ar;
+
+ return retval;
+ }
+
+ return 0;
+}
+
+/* invokes operator in context */
+int WM_operator_call(bContext *C, const char *opstring)
+{
+ wmOperatorType *ot= WM_operatortype_find(opstring);
+
+ /* dummie test */
+ if(ot && C && C->window) {
+ return WM_operator_invoke(C, ot, C->window->eventstate);
+ }
+
+ return 0;
+}
+
/* ********************* handlers *************** */