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:
authorAndrea Weikert <elubie@gmx.net>2008-06-19 23:09:21 +0400
committerAndrea Weikert <elubie@gmx.net>2008-06-19 23:09:21 +0400
commita06f4f3817647793073da79a7f80d8ff784288e8 (patch)
tree72fa64769b5900738b6aad162bb8af2f5af487e1 /source/blender/windowmanager
parent7097c8a51e0f30339a2c1198b395522075ce3efd (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.c1
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c2
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c25
-rw-r--r--source/blender/windowmanager/intern/wm_window.c39
-rw-r--r--source/blender/windowmanager/wm_window.h2
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);