Blender  V2.59
space_sequencer.c
Go to the documentation of this file.
00001 /*
00002  * $Id: space_sequencer.c 36788 2011-05-20 05:27:31Z campbellbarton $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version. 
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2008 Blender Foundation.
00021  * All rights reserved.
00022  *
00023  * 
00024  * Contributor(s): Blender Foundation
00025  *
00026  * ***** END GPL LICENSE BLOCK *****
00027  */
00028 
00034 #include <string.h>
00035 #include <stdio.h>
00036 
00037 #include "DNA_scene_types.h"
00038 
00039 #include "MEM_guardedalloc.h"
00040 
00041 #include "BLI_blenlib.h"
00042 #include "BLI_math.h"
00043 #include "BLI_path_util.h"
00044 #include "BLI_utildefines.h"
00045 
00046 #include "BKE_context.h"
00047 #include "BKE_screen.h"
00048 #include "BKE_sequencer.h"
00049 #include "BKE_global.h"
00050 
00051 #include "ED_space_api.h"
00052 #include "ED_sequencer.h"
00053 #include "ED_screen.h"
00054 #include "ED_view3d.h" /* only for sequencer view3d drawing callback */
00055 
00056 #include "WM_api.h"
00057 #include "WM_types.h"
00058 
00059 #include "UI_resources.h"
00060 #include "UI_view2d.h"
00061 
00062 #include "sequencer_intern.h"   // own include
00063 
00064 /* ******************** manage regions ********************* */
00065 
00066 ARegion *sequencer_has_buttons_region(ScrArea *sa)
00067 {
00068         ARegion *ar, *arnew;
00069 
00070         ar= BKE_area_find_region_type(sa, RGN_TYPE_UI);
00071         if(ar) return ar;
00072         
00073         /* add subdiv level; after header */
00074         ar= BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
00075 
00076         /* is error! */
00077         if(ar==NULL) return NULL;
00078         
00079         arnew= MEM_callocN(sizeof(ARegion), "buttons for sequencer");
00080         
00081         BLI_insertlinkafter(&sa->regionbase, ar, arnew);
00082         arnew->regiontype= RGN_TYPE_UI;
00083         arnew->alignment= RGN_ALIGN_RIGHT;
00084         
00085         arnew->flag = RGN_FLAG_HIDDEN;
00086         
00087         return arnew;
00088 }
00089 
00090 static ARegion *sequencer_find_region(ScrArea *sa, short type)
00091 {
00092         ARegion *ar=NULL;
00093         
00094         for(ar= sa->regionbase.first; ar; ar= ar->next)
00095                 if(ar->regiontype==type)
00096                         return ar;
00097 
00098         return ar;
00099 }
00100 
00101 void ED_sequencer_update_view(bContext *C, int view)
00102 {
00103         ScrArea *sa= CTX_wm_area(C);
00104         
00105         ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW);
00106         ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW);
00107 
00108         switch (view) {
00109                 case SEQ_VIEW_SEQUENCE:
00110                         if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
00111                                 ar_main->flag &= ~RGN_FLAG_HIDDEN;
00112                                 ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
00113                         }
00114                         if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
00115                                 ar_preview->flag |= RGN_FLAG_HIDDEN;
00116                                 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
00117                                 WM_event_remove_handlers(C, &ar_preview->handlers);
00118                         }
00119                         if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
00120                         if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
00121                         break;
00122                 case SEQ_VIEW_PREVIEW:
00123                         if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
00124                                 ar_main->flag |= RGN_FLAG_HIDDEN;
00125                                 ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
00126                                 WM_event_remove_handlers(C, &ar_main->handlers);
00127                         }
00128                         if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
00129                                 ar_preview->flag &= ~RGN_FLAG_HIDDEN;
00130                                 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
00131                                 ar_preview->v2d.cur = ar_preview->v2d.tot;
00132                         }
00133                         if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
00134                         if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
00135                         break;
00136                 case SEQ_VIEW_SEQUENCE_PREVIEW:
00137                         if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
00138                                 ar_main->flag &= ~RGN_FLAG_HIDDEN;
00139                                 ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
00140                         }
00141                         if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
00142                                 ar_preview->flag &= ~RGN_FLAG_HIDDEN;
00143                                 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
00144                                 ar_preview->v2d.cur = ar_preview->v2d.tot;
00145                         }
00146                         if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
00147                         if (ar_preview) ar_preview->alignment= RGN_ALIGN_TOP;
00148                         break;
00149         }
00150 
00151         ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
00152         ED_area_tag_redraw(sa);
00153 }
00154 
00155 
00156 /* ******************** default callbacks for sequencer space ***************** */
00157 
00158 static SpaceLink *sequencer_new(const bContext *C)
00159 {
00160         Scene *scene= CTX_data_scene(C);
00161         ARegion *ar;
00162         SpaceSeq *sseq;
00163         
00164         sseq= MEM_callocN(sizeof(SpaceSeq), "initsequencer");
00165         sseq->spacetype= SPACE_SEQ;
00166         sseq->zoom= 4;
00167         sseq->chanshown = 0;
00168         sseq->view = SEQ_VIEW_SEQUENCE;
00169         sseq->mainb = SEQ_DRAW_IMG_IMBUF;
00170         /* header */
00171         ar= MEM_callocN(sizeof(ARegion), "header for sequencer");
00172         
00173         BLI_addtail(&sseq->regionbase, ar);
00174         ar->regiontype= RGN_TYPE_HEADER;
00175         ar->alignment= RGN_ALIGN_BOTTOM;
00176         
00177         /* buttons/list view */
00178         ar= MEM_callocN(sizeof(ARegion), "buttons for sequencer");
00179         
00180         BLI_addtail(&sseq->regionbase, ar);
00181         ar->regiontype= RGN_TYPE_UI;
00182         ar->alignment= RGN_ALIGN_RIGHT;
00183         ar->flag = RGN_FLAG_HIDDEN;
00184         
00185         /* preview area */
00186         /* NOTE: if you change values here, also change them in sequencer_init_preview_region */
00187         ar= MEM_callocN(sizeof(ARegion), "preview area for sequencer");
00188         BLI_addtail(&sseq->regionbase, ar);
00189         ar->regiontype= RGN_TYPE_PREVIEW;
00190         ar->alignment= RGN_ALIGN_TOP;
00191         ar->flag |= RGN_FLAG_HIDDEN;
00192         /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */
00193         ar->v2d.keepzoom= V2D_KEEPASPECT | V2D_KEEPZOOM;
00194         ar->v2d.minzoom= 0.00001f;
00195         ar->v2d.maxzoom= 100000.0f;
00196         ar->v2d.tot.xmin= -960.0f; /* 1920 width centered */
00197         ar->v2d.tot.ymin= -540.0f; /* 1080 height centered */
00198         ar->v2d.tot.xmax= 960.0f;
00199         ar->v2d.tot.ymax= 540.0f;
00200         ar->v2d.min[0]= 0.0f;
00201         ar->v2d.min[1]= 0.0f;
00202         ar->v2d.max[0]= 12000.0f;
00203         ar->v2d.max[1]= 12000.0f;
00204         ar->v2d.cur= ar->v2d.tot;
00205         ar->v2d.align= V2D_ALIGN_FREE; 
00206         ar->v2d.keeptot= V2D_KEEPTOT_FREE;
00207 
00208 
00209         /* main area */
00210         ar= MEM_callocN(sizeof(ARegion), "main area for sequencer");
00211         
00212         BLI_addtail(&sseq->regionbase, ar);
00213         ar->regiontype= RGN_TYPE_WINDOW;
00214         
00215         
00216         /* seq space goes from (0,8) to (0, efra) */
00217         
00218         ar->v2d.tot.xmin= 0.0f;
00219         ar->v2d.tot.ymin= 0.0f;
00220         ar->v2d.tot.xmax= scene->r.efra;
00221         ar->v2d.tot.ymax= 8.0f;
00222         
00223         ar->v2d.cur= ar->v2d.tot;
00224         
00225         ar->v2d.min[0]= 10.0f;
00226         ar->v2d.min[1]= 4.0f;
00227         
00228         ar->v2d.max[0]= MAXFRAMEF;
00229         ar->v2d.max[1]= MAXSEQ;
00230         
00231         ar->v2d.minzoom= 0.01f;
00232         ar->v2d.maxzoom= 100.0f;
00233         
00234         ar->v2d.scroll |= (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
00235         ar->v2d.scroll |= (V2D_SCROLL_LEFT|V2D_SCROLL_SCALE_VERTICAL);
00236         ar->v2d.keepzoom= 0;
00237         ar->v2d.keeptot= 0;
00238         ar->v2d.align= V2D_ALIGN_NO_NEG_Y;
00239 
00240         return (SpaceLink *)sseq;
00241 }
00242 
00243 /* not spacelink itself */
00244 static void sequencer_free(SpaceLink *UNUSED(sl))
00245 {       
00246 //      SpaceSeq *sseq= (SpaceSequencer*) sl;
00247         
00248 // XXX  if(sseq->gpd) free_gpencil_data(sseq->gpd);
00249 
00250 }
00251 
00252 
00253 /* spacetype; init callback */
00254 static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
00255 {
00256         
00257 }
00258 
00259 static SpaceLink *sequencer_duplicate(SpaceLink *sl)
00260 {
00261         SpaceSeq *sseqn= MEM_dupallocN(sl);
00262         
00263         /* clear or remove stuff from old */
00264 // XXX  sseq->gpd= gpencil_data_duplicate(sseq->gpd);
00265 
00266         return (SpaceLink *)sseqn;
00267 }
00268 
00269 
00270 
00271 /* *********************** sequencer (main) region ************************ */
00272 /* add handlers, stuff you only do once or on area/region changes */
00273 static void sequencer_main_area_init(wmWindowManager *wm, ARegion *ar)
00274 {
00275         wmKeyMap *keymap;
00276         ListBase *lb;
00277         
00278         UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
00279         
00280         keymap= WM_keymap_find(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
00281         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00282         
00283         /* own keymap */
00284         keymap= WM_keymap_find(wm->defaultconf, "Sequencer", SPACE_SEQ, 0);
00285         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00286         
00287         /* add drop boxes */
00288         lb= WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW);
00289         
00290         WM_event_add_dropbox_handler(&ar->handlers, lb);
00291         
00292 }
00293 
00294 static void sequencer_main_area_draw(const bContext *C, ARegion *ar)
00295 {
00296 //      ScrArea *sa= CTX_wm_area(C);
00297         
00298         /* NLE - strip editing timeline interface */
00299         draw_timeline_seq(C, ar);
00300 }
00301 
00302 /* ************* dropboxes ************* */
00303 
00304 static int image_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
00305 {
00306         if(drag->type==WM_DRAG_PATH)
00307                 if(ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK))  /* rule might not work? */
00308                         return 1;
00309         return 0;
00310 }
00311 
00312 static int movie_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
00313 {
00314         if(drag->type==WM_DRAG_PATH)
00315                 if(ELEM3(drag->icon, 0, ICON_FILE_MOVIE, ICON_FILE_BLANK))      /* rule might not work? */
00316                         return 1;
00317         return 0;
00318 }
00319 
00320 static int sound_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
00321 {
00322         if(drag->type==WM_DRAG_PATH)
00323                 if(ELEM(drag->icon, ICON_FILE_SOUND, ICON_FILE_BLANK))  /* rule might not work? */
00324                         return 1;
00325         return 0;
00326 }
00327 
00328 static void sequencer_drop_copy(wmDrag *drag, wmDropBox *drop)
00329 {
00330         /* copy drag path to properties */
00331         if(RNA_struct_find_property(drop->ptr, "filepath"))
00332                 RNA_string_set(drop->ptr, "filepath", drag->path);
00333 
00334         if(RNA_struct_find_property(drop->ptr, "directory")) {
00335                 PointerRNA itemptr;
00336                 char dir[FILE_MAX], file[FILE_MAX];
00337 
00338                 BLI_split_dirfile(drag->path, dir, file);
00339                 
00340                 RNA_string_set(drop->ptr, "directory", dir);
00341 
00342                 RNA_collection_clear(drop->ptr, "files");
00343                 RNA_collection_add(drop->ptr, "files", &itemptr);
00344                 RNA_string_set(&itemptr, "name", file);
00345         }
00346 }
00347 
00348 /* this region dropbox definition */
00349 static void sequencer_dropboxes(void)
00350 {
00351         ListBase *lb= WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW);
00352         
00353         WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy);
00354         WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy);
00355         WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy);
00356 }
00357 
00358 /* ************* end drop *********** */
00359 
00360 /* add handlers, stuff you only do once or on area/region changes */
00361 static void sequencer_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
00362 {
00363         ED_region_header_init(ar);
00364 }
00365 
00366 static void sequencer_header_area_draw(const bContext *C, ARegion *ar)
00367 {
00368         ED_region_header(C, ar);
00369 }
00370 
00371 static void sequencer_main_area_listener(ARegion *ar, wmNotifier *wmn)
00372 {
00373         /* context changes */
00374         switch(wmn->category) {
00375                 case NC_SCENE:
00376                         switch(wmn->data) {
00377                                 case ND_FRAME:
00378                                 case ND_FRAME_RANGE:
00379                                 case ND_MARKERS:
00380                                 case ND_RENDER_OPTIONS: /* for FPS and FPS Base */
00381                                 case ND_SEQUENCER:
00382                                         ED_region_tag_redraw(ar);
00383                                         break;
00384                         }
00385                         break;
00386                 case NC_SPACE:
00387                         if(wmn->data == ND_SPACE_SEQUENCER)
00388                                 ED_region_tag_redraw(ar);
00389                         break;
00390                 case NC_ID:
00391                         if(wmn->action == NA_RENAME)
00392                                 ED_region_tag_redraw(ar);
00393                         break;
00394         }
00395 }
00396 
00397 /* *********************** preview region ************************ */
00398 static void sequencer_preview_area_init(wmWindowManager *wm, ARegion *ar)
00399 {
00400         wmKeyMap *keymap;
00401 
00402         UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
00403         
00404         keymap= WM_keymap_find(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
00405         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00406 
00407         /* own keymap */
00408         keymap= WM_keymap_find(wm->defaultconf, "SequencerPreview", SPACE_SEQ, 0);
00409         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00410 }
00411 
00412 static void sequencer_preview_area_draw(const bContext *C, ARegion *ar)
00413 {
00414         ScrArea *sa= CTX_wm_area(C);
00415         SpaceSeq *sseq= sa->spacedata.first;
00416         Scene *scene= CTX_data_scene(C);
00417         
00418         /* XXX temp fix for wrong setting in sseq->mainb */
00419         if (sseq->mainb == SEQ_DRAW_SEQUENCE) sseq->mainb = SEQ_DRAW_IMG_IMBUF;
00420 
00421         draw_image_seq(C, scene, ar, sseq, scene->r.cfra, 0);
00422 
00423         if(scene->ed && scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW && sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
00424                 int over_cfra;
00425 
00426                 if(scene->ed->over_flag & SEQ_EDIT_OVERLAY_ABS)
00427                         over_cfra= scene->ed->over_cfra;
00428                 else
00429                         over_cfra= scene->r.cfra + scene->ed->over_ofs;
00430 
00431                 if(over_cfra != scene->r.cfra)
00432                         draw_image_seq(C, scene, ar, sseq, scene->r.cfra, over_cfra - scene->r.cfra);
00433         }
00434 
00435 }
00436 
00437 static void sequencer_preview_area_listener(ARegion *ar, wmNotifier *wmn)
00438 {
00439         /* context changes */
00440         switch(wmn->category) {
00441                 case NC_SCENE:
00442                         switch(wmn->data) {
00443                                 case ND_FRAME:
00444                                 case ND_MARKERS:
00445                                 case ND_SEQUENCER:
00446                                         ED_region_tag_redraw(ar);
00447                                         break;
00448                         }
00449                         break;
00450                 case NC_SPACE:
00451                         if(wmn->data == ND_SPACE_SEQUENCER)
00452                                 ED_region_tag_redraw(ar);
00453                         break;
00454                 case NC_ID:
00455                         switch(wmn->data) {
00456                                 case NA_RENAME:
00457                                         ED_region_tag_redraw(ar);
00458                                         break;
00459                         }
00460                         break;
00461         }
00462 }
00463 
00464 /* *********************** buttons region ************************ */
00465 
00466 /* add handlers, stuff you only do once or on area/region changes */
00467 static void sequencer_buttons_area_init(wmWindowManager *wm, ARegion *ar)
00468 {
00469         
00470         ED_region_panels_init(wm, ar);
00471         
00472 }
00473 
00474 static void sequencer_buttons_area_draw(const bContext *C, ARegion *ar)
00475 {
00476         ED_region_panels(C, ar, 1, NULL, -1);
00477 }
00478 
00479 static void sequencer_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
00480 {
00481         /* context changes */
00482         switch(wmn->category) {
00483                 case NC_SCENE:
00484                 switch(wmn->data) {
00485                         case ND_FRAME:
00486                         case ND_SEQUENCER:
00487                                 ED_region_tag_redraw(ar);
00488                                 break;
00489                 }
00490                 break;
00491                 case NC_SPACE:
00492                         if(wmn->data == ND_SPACE_SEQUENCER)
00493                                 ED_region_tag_redraw(ar);
00494                         break;
00495                 case NC_ID:
00496                         if(wmn->action == NA_RENAME)
00497                                 ED_region_tag_redraw(ar);
00498                         break;
00499         }
00500 }
00501 /* ************************************* */
00502 
00503 /* only called once, from space/spacetypes.c */
00504 void ED_spacetype_sequencer(void)
00505 {
00506         SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype sequencer");
00507         ARegionType *art;
00508         
00509         st->spaceid= SPACE_SEQ;
00510         strncpy(st->name, "Sequencer", BKE_ST_MAXNAME);
00511         
00512         st->new= sequencer_new;
00513         st->free= sequencer_free;
00514         st->init= sequencer_init;
00515         st->duplicate= sequencer_duplicate;
00516         st->operatortypes= sequencer_operatortypes;
00517         st->keymap= sequencer_keymap;
00518         st->dropboxes= sequencer_dropboxes;
00519 
00520         /* regions: main window */
00521         art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
00522         art->regionid = RGN_TYPE_WINDOW;
00523         art->init= sequencer_main_area_init;
00524         art->draw= sequencer_main_area_draw;
00525         art->listener= sequencer_main_area_listener;
00526         art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
00527 
00528         BLI_addhead(&st->regiontypes, art);
00529 
00530         /* preview */
00531         art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
00532         art->regionid = RGN_TYPE_PREVIEW;
00533         art->prefsizey = 240; // XXX
00534         art->init= sequencer_preview_area_init;
00535         art->draw= sequencer_preview_area_draw;
00536         art->listener= sequencer_preview_area_listener;
00537         art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
00538         BLI_addhead(&st->regiontypes, art);
00539         
00540         /* regions: listview/buttons */
00541         art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
00542         art->regionid = RGN_TYPE_UI;
00543         art->prefsizex= 220; // XXX
00544         art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
00545         art->listener= sequencer_buttons_area_listener;
00546         art->init= sequencer_buttons_area_init;
00547         art->draw= sequencer_buttons_area_draw;
00548         BLI_addhead(&st->regiontypes, art);
00549         
00550         /* Keep as python only for now
00551         sequencer_buttons_register(art);
00552         */
00553 
00554         /* regions: header */
00555         art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
00556         art->regionid = RGN_TYPE_HEADER;
00557         art->prefsizey= HEADERY;
00558         art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_HEADER;
00559         
00560         art->init= sequencer_header_area_init;
00561         art->draw= sequencer_header_area_draw;
00562         art->listener= sequencer_main_area_listener;
00563         
00564         BLI_addhead(&st->regiontypes, art);
00565         
00566         BKE_spacetype_register(st);
00567 
00568         /* set the sequencer callback when not in background mode */
00569         if(G.background==0) {
00570                 sequencer_view3d_cb= ED_view3d_draw_offscreen_imbuf_simple;
00571         }
00572 }
00573