diff options
author | Andrea Weikert <elubie@gmx.net> | 2008-06-19 23:09:21 +0400 |
---|---|---|
committer | Andrea Weikert <elubie@gmx.net> | 2008-06-19 23:09:21 +0400 |
commit | a06f4f3817647793073da79a7f80d8ff784288e8 (patch) | |
tree | 72fa64769b5900738b6aad162bb8af2f5af487e1 /source/blender/windowmanager | |
parent | 7097c8a51e0f30339a2c1198b395522075ce3efd (diff) |
== Rip Area into new Window Operator ==
- operator that rips current area into new window
- implemented on the window level.
- sets C->area in current context if necessary
== fix ==
- small bugfix: missing return in WM_event_add_keymap_handler
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/intern/wm.c | 1 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 25 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 39 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_window.h | 2 |
5 files changed, 61 insertions, 8 deletions
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index d40fd751162..9727aa0f4ca 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -80,6 +80,7 @@ static void wm_window_keymap(wmWindowManager *wm) { /* note, this doesn't replace existing keymap items */ WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_duplicate", AKEY, KM_PRESS, 0, 0); + WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_rip", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_fullscreen_toggle", FKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index af61b787462..c33ac0cd342 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -479,7 +479,7 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers /* only allow same keymap once */ for(handler= handlers->first; handler; handler= handler->next) if(handler->keymap==keymap) - return; + return handler; handler= MEM_callocN(sizeof(wmEventHandler), "event handler"); BLI_addtail(handlers, handler); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 8b4a167365d..3c7465e1912 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -98,6 +98,16 @@ static void WM_OT_window_duplicate(wmOperatorType *ot) ot->poll= WM_operator_winactive; } +static void WM_OT_window_rip(wmOperatorType *ot) +{ + ot->name= "Rip Area into New Window"; + ot->idname= "WM_OT_window_rip"; + + ot->invoke= wm_window_rip_op; //WM_operator_confirm; + ot->exec= NULL; + ot->poll= WM_operator_winactive; +} + static void WM_OT_save_homefile(wmOperatorType *ot) { ot->name= "Save User Settings"; @@ -256,6 +266,7 @@ void wm_operatortype_free(void) void wm_operatortype_init(void) { WM_operatortype_append(WM_OT_window_duplicate); + WM_operatortype_append(WM_OT_window_rip); WM_operatortype_append(WM_OT_save_homefile); WM_operatortype_append(WM_OT_window_fullscreen_toggle); WM_operatortype_append(WM_OT_exit_blender); @@ -291,13 +302,13 @@ void op_init_property(wmOperator *op) void OP_free_property(wmOperator *op) { if(op->properties) { - IDP_FreeProperty(op->properties); - /* - * This need change, when the idprop code only - * need call IDP_FreeProperty. (check BKE_idprop.h) - */ - MEM_freeN(op->properties); - op->properties= NULL; + IDP_FreeProperty(op->properties); + /* + * This need change, when the idprop code only + * need call IDP_FreeProperty. (check BKE_idprop.h) + */ + MEM_freeN(op->properties); + op->properties= NULL; } } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index dd481cef1c0..9425dd6cf58 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -167,6 +167,45 @@ int wm_window_duplicate_op(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +wmWindow *wm_window_rip(bContext *C, wmWindow *winorig) +{ + wmWindow *win= wm_window_new(C, winorig->screen); + + win->posx= winorig->posx+10; + win->posy= winorig->posy; + win->sizex= C->area->winx; + win->sizey= C->area->winy; + + win->screen= ED_screen_riparea(win, win->screen, C->area); + C->area = NULL; /* is removed */ + win->screen->do_refresh= 1; + win->screen->do_draw= 1; + + return win; +} +/* operator callback */ +int wm_window_rip_op(bContext *C, wmOperator *op, wmEvent *event) +{ + /* need to make sure area is set in the current context */ + if (!C->area) { + ScrArea *sa= C->window->screen->areabase.first; + for(; sa; sa= sa->next) { + if(BLI_in_rcti(&sa->totrct, event->x, event->y)) { + C->area = sa; + break; + } + } + if(C->area==NULL) + return OPERATOR_CANCELLED; + } + + wm_window_rip(C, C->window); + wm_check(C); + WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0, NULL); + return OPERATOR_FINISHED; +} + + /* fullscreen operator callback */ int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op) { diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index a9953725d80..df77bdc0082 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -50,9 +50,11 @@ void wm_window_set_title (wmWindow *win, char *title); void wm_window_swap_buffers (wmWindow *win); wmWindow *wm_window_copy (bContext *C, wmWindow *winorig); +wmWindow *wm_window_rip (bContext *C, wmWindow *winorig); /* *************** window operators ************** */ int wm_window_duplicate_op (bContext *C, wmOperator *op); +int wm_window_rip_op (bContext *C, wmOperator *op, struct wmEvent *event); int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op); int wm_exit_blender_op(bContext *C, wmOperator *op); |