diff --git a/release/ui/space_info.py b/release/ui/space_info.py index 55ce80e857f..96494ccdb14 100644 --- a/release/ui/space_info.py +++ b/release/ui/space_info.py @@ -7,6 +7,7 @@ class INFO_HT_header(bpy.types.Header): def draw(self, context): st = context.space_data + rd = context.scene.render_data layout = self.layout layout.template_header() @@ -15,7 +16,6 @@ class INFO_HT_header(bpy.types.Header): row = layout.row() row.itemM("INFO_MT_file") row.itemM("INFO_MT_add") - row.itemM("INFO_MT_timeline") row.itemM("INFO_MT_game") row.itemM("INFO_MT_render") row.itemM("INFO_MT_help") @@ -36,21 +36,49 @@ class INFO_MT_file(bpy.types.Menu): layout = self.layout layout.operator_context = "EXEC_AREA" - layout.itemO("wm.read_homefile") + layout.itemO("wm.read_homefile", text="New") layout.operator_context = "INVOKE_AREA" - layout.itemO("wm.open_mainfile") + layout.itemO("wm.open_mainfile", text="Open...") + layout.item_menu_enumO("wm.open_recentfile", "file", text="Open Recent") + layout.itemO("wm.recover_last_session") layout.itemS() layout.operator_context = "EXEC_AREA" - layout.itemO("wm.save_mainfile") + layout.itemO("wm.save_mainfile", text="Save") layout.operator_context = "INVOKE_AREA" - layout.itemO("wm.save_as_mainfile") + layout.itemO("wm.save_as_mainfile", text="Save As...") + + layout.itemS() + + layout.itemM("INFO_MT_file_import") + layout.itemM("INFO_MT_file_export") layout.itemS() layout.itemM("INFO_MT_file_external_data") + layout.itemS() + + layout.operator_context = "EXEC_AREA" + layout.itemO("wm.exit_blender", text="Quit") + +class INFO_MT_file_import(bpy.types.Menu): + __space_type__ = "USER_PREFERENCES" + __label__ = "Import" + + def draw(self, context): + layout = self.layout + +class INFO_MT_file_export(bpy.types.Menu): + __space_type__ = "USER_PREFERENCES" + __label__ = "Export" + + def draw(self, context): + layout = self.layout + + layout.itemO("export.ply", text="PLY") + class INFO_MT_file_external_data(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" __label__ = "External Data" @@ -74,15 +102,25 @@ class INFO_MT_add(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") -class INFO_MT_timeline(bpy.types.Menu): - __space_type__ = "USER_PREFERENCES" - __label__ = "Timeline" + layout.operator_context = "EXEC_SCREEN" - def draw(self, context): - layout = self.layout - layout.itemL(text="Nothing yet") + layout.item_menu_enumO( "OBJECT_OT_mesh_add", "type", text="Mesh", icon="ICON_OUTLINER_OB_MESH") + layout.item_menu_enumO( "OBJECT_OT_curve_add", "type", text="Curve", icon="ICON_OUTLINER_OB_CURVE") + layout.item_menu_enumO( "OBJECT_OT_surface_add", "type", text="Surface", icon="ICON_OUTLINER_OB_SURFACE") + layout.item_enumO("OBJECT_OT_object_add", "type", "META", icon="ICON_OUTLINER_OB_META") + layout.itemO("OBJECT_OT_text_add", text="Text", icon="ICON_OUTLINER_OB_FONT") + + layout.itemS() + + layout.itemO("OBJECT_OT_armature_add", text="Armature", icon="ICON_OUTLINER_OB_ARMATURE") + layout.item_enumO("OBJECT_OT_object_add", "type", "LATTICE", icon="ICON_OUTLINER_OB_LATTICE") + layout.item_enumO("OBJECT_OT_object_add", "type", "EMPTY", icon="ICON_OUTLINER_OB_EMPTY") + + layout.itemS() + + layout.item_enumO("OBJECT_OT_object_add", "type", "CAMERA", icon="ICON_OUTLINER_OB_CAMERA") + layout.item_enumO("OBJECT_OT_object_add", "type", "LAMP", icon="ICON_OUTLINER_OB_LAMP") class INFO_MT_game(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" @@ -90,7 +128,8 @@ class INFO_MT_game(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") + + layout.itemO("view3d.game_start") class INFO_MT_render(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" @@ -98,7 +137,14 @@ class INFO_MT_render(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") + rd = context.scene.render_data + + layout.itemO("screen.render", text="Render Image") + layout.item_booleanO("screen.render", "animation", True, text="Render Animation") + + layout.itemS() + + layout.itemO("screen.render_view_show") class INFO_MT_help(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" @@ -106,7 +152,16 @@ class INFO_MT_help(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") + + layout.itemO("help.manual") + layout.itemO("help.release_logs") + + layout.itemS() + + layout.itemO("help.blender_website") + layout.itemO("help.blender_eshop") + layout.itemO("help.developer_community") + layout.itemO("help.user_community") class INFO_PT_tabs(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" @@ -477,12 +532,12 @@ class INFO_PT_bottombar(bpy.types.Panel): split.itemL(text="") split.itemO("wm.save_homefile", text="Save As Default") - bpy.types.register(INFO_HT_header) bpy.types.register(INFO_MT_file) +bpy.types.register(INFO_MT_file_import) +bpy.types.register(INFO_MT_file_export) bpy.types.register(INFO_MT_file_external_data) bpy.types.register(INFO_MT_add) -bpy.types.register(INFO_MT_timeline) bpy.types.register(INFO_MT_game) bpy.types.register(INFO_MT_render) bpy.types.register(INFO_MT_help) @@ -495,3 +550,57 @@ bpy.types.register(INFO_PT_autosave) bpy.types.register(INFO_PT_language) bpy.types.register(INFO_PT_bottombar) +# Help operators + +import bpy_ops # XXX - should not need to do this +del bpy_ops + +class HelpOperator(bpy.types.Operator): + def execute(self, context): + try: import webbrowser + except: webbrowser = None + + if webbrowser: + webbrowser.open(self.__URL__) + else: + raise Exception("Operator requires a full Python installation") + + return ('FINISHED',) + +class HELP_OT_manual(HelpOperator): + __idname__ = "help.manual" + __label__ = "Manual" + __URL__ = 'http://wiki.blender.org/index.php/Manual' + +class HELP_OT_release_logs(HelpOperator): + __idname__ = "help.release_logs" + __label__ = "Release Logs" + __URL__ = 'http://www.blender.org/development/release-logs/' + +class HELP_OT_blender_website(HelpOperator): + __idname__ = "help.blender_website" + __label__ = "Blender Website" + __URL__ = 'http://www.blender.org/' + +class HELP_OT_blender_eshop(HelpOperator): + __idname__ = "help.blender_eshop" + __label__ = "Blender e-Shop" + __URL__ = 'http://www.blender3d.org/e-shop' + +class HELP_OT_developer_community(HelpOperator): + __idname__ = "help.developer_community" + __label__ = "Developer Community" + __URL__ = 'http://www.blender.org/community/get-involved/' + +class HELP_OT_user_community(HelpOperator): + __idname__ = "help.user_community" + __label__ = "User Community" + __URL__ = 'http://www.blender.org/community/user-community/' + +bpy.ops.add(HELP_OT_manual) +bpy.ops.add(HELP_OT_release_logs) +bpy.ops.add(HELP_OT_blender_website) +bpy.ops.add(HELP_OT_blender_eshop) +bpy.ops.add(HELP_OT_developer_community) +bpy.ops.add(HELP_OT_user_community) + diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 2bf5d357e5c..28a9d3ac7c9 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -4724,11 +4724,13 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname) Mat3MulMat3(cmat, imat, mat); Mat3Inv(imat, cmat); } + else + Mat3One(imat); + setflagsNurb(editnurb, 0); } - else { + else return NULL; - } /* these types call this function to return a Nurb */ if (stype!=CU_PRIM_TUBE && stype!=CU_PRIM_DONUT) { diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 37453039cf5..cf37b0dd812 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -3587,10 +3587,11 @@ void ED_object_enter_editmode(bContext *C, int flag) if(scene->id.lib) return; if(base==NULL) return; - if(sa->spacetype==SPACE_VIEW3D) + if(sa && sa->spacetype==SPACE_VIEW3D) v3d= sa->spacedata.first; - if((v3d==NULL || (base->lay & v3d->lay))==0) return; + if(v3d && (base->lay & v3d->lay)==0) return; + else if(!v3d && (base->lay & scene->lay)==0) return; ob = base->object; diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index 19750833b4d..2dc2cf9f293 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -93,7 +93,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult } else if(CTX_data_equals(member, "active_base")) { if(scene->basact) - CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, &scene->basact); + CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, scene->basact); return 1; } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 4a42d1ed369..3032bff18df 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -206,6 +206,7 @@ int ED_operator_object_active(bContext *C) int ED_operator_editmesh(bContext *C) { Object *obedit= CTX_data_edit_object(C); + printf("em %p %d\n", obedit, (obedit)? obedit->type == OB_MESH: -1); if(obedit && obedit->type==OB_MESH) return NULL != ((Mesh *)obedit->data)->edit_mesh; return 0; diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index cb20b3dc93e..20e0a79f0c7 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1425,7 +1425,7 @@ static void RestoreState(bContext *C) } /* maybe we need this defined somewhere else */ -extern void StartKetsjiShell(struct bContext *C,int always_use_expand_framing); +extern void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing); #endif // GAMEBLENDER == 1 @@ -1433,13 +1433,40 @@ static int game_engine_exec(bContext *C, wmOperator *unused) { #if GAMEBLENDER == 1 Scene *startscene = CTX_data_scene(C); + bScreen *sc= CTX_wm_screen(C); + ScrArea *sa, *prevsa= CTX_wm_area(C); + ARegion *ar, *prevar= CTX_wm_region(C); + + sa= prevsa; + if(sa->spacetype != SPACE_VIEW3D) { + for(sa=sc->areabase.first; sa; sa= sa->next) + if(sa->spacetype==SPACE_VIEW3D) + break; + } + + if(!sa) + return OPERATOR_CANCELLED; + for(ar=sa->regionbase.first; ar; ar=ar->next) + if(ar->regiontype == RGN_TYPE_WINDOW) + break; + + if(!ar) + return OPERATOR_CANCELLED; + + // bad context switch .. + CTX_wm_area_set(C, sa); + CTX_wm_region_set(C, ar); + view3d_operator_needs_opengl(C); SaveState(C); - StartKetsjiShell(C, 1); + StartKetsjiShell(C, ar, 1); RestoreState(C); + CTX_wm_region_set(C, prevar); + CTX_wm_area_set(C, prevsa); + //XXX restore_all_scene_cfra(scene_cfra_store); set_scene_bg(startscene); //XXX scene_update_for_newframe(G.scene, G.scene->lay); @@ -1461,7 +1488,7 @@ void VIEW3D_OT_game_start(wmOperatorType *ot) /* api callbacks */ ot->exec= game_engine_exec; - ot->poll= ED_operator_view3d_active; + //ot->poll= ED_operator_view3d_active; } /* ************************************** */ diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 542a747d454..56ae220f7f0 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -57,7 +57,7 @@ struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect); int WM_read_homefile (struct bContext *C, struct wmOperator *op); int WM_write_homefile (struct bContext *C, struct wmOperator *op); void WM_read_file (struct bContext *C, char *name, struct ReportList *reports); -void WM_write_file (struct bContext *C, char *target, struct ReportList *reports); +void WM_write_file (struct bContext *C, char *target, int compress, struct ReportList *reports); void WM_read_autosavefile(struct bContext *C); void WM_write_autosave (struct bContext *C); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 5377e351ff0..11b8f7f8c6f 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -451,7 +451,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe CTX_wm_region_set(C, NULL); CTX_wm_area_set(C, NULL); - retval= wm_operator_invoke(C, ot, window->eventstate, properties); + retval= wm_operator_invoke(C, ot, event, properties); CTX_wm_region_set(C, ar); CTX_wm_area_set(C, area); diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index c3b317590f1..2019906bd5e 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -539,7 +539,7 @@ static void do_history(char *name, ReportList *reports) BKE_report(reports, RPT_ERROR, "Unable to make version backup"); } -void WM_write_file(bContext *C, char *target, ReportList *reports) +void WM_write_file(bContext *C, char *target, int compress, ReportList *reports) { Library *li; int writeflags, len; @@ -580,10 +580,11 @@ void WM_write_file(bContext *C, char *target, ReportList *reports) do_history(di, reports); - /* we use the UserDef to define compression flag */ - writeflags= G.fileflags & ~G_FILE_COMPRESS; - if(U.flag & USER_FILECOMPRESS) - writeflags |= G_FILE_COMPRESS; + writeflags= G.fileflags; + + /* set compression flag */ + if(compress) writeflags |= G_FILE_COMPRESS; + else writeflags &= ~G_FILE_COMPRESS; if (BLO_write_file(CTX_data_main(C), di, writeflags, reports)) { strcpy(G.sce, di); @@ -591,6 +592,9 @@ void WM_write_file(bContext *C, char *target, ReportList *reports) strcpy(G.main->name, di); /* is guaranteed current file */ G.save_over = 1; /* disable untitled.blend convention */ + + if(compress) G.fileflags |= G_FILE_COMPRESS; + else G.fileflags &= ~G_FILE_COMPRESS; writeBlog(); } diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 5e60207f62d..5c484dfa322 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -571,7 +571,7 @@ static void WM_OT_read_homefile(wmOperatorType *ot) static int recentfile_exec(bContext *C, wmOperator *op) { - int event= RNA_int_get(op->ptr, "nr"); + int event= RNA_enum_get(op->ptr, "file"); // XXX wm in context is not set correctly after WM_read_file -> crash // do it before for now, but is this correct with multiple windows? @@ -594,30 +594,54 @@ static int recentfile_exec(bContext *C, wmOperator *op) static int wm_recentfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { - struct RecentFile *recent; uiPopupMenu *pup; uiLayout *layout; - int i, ofs= 0; pup= uiPupMenuBegin(C, "Open Recent", 0); layout= uiPupMenuLayout(pup); - - if(G.sce[0]) { - uiItemIntO(layout, G.sce, 0, op->type->idname, "nr", 1); - ofs = 1; - } - - for(recent = G.recent_files.first, i=0; (inext, i++) - if(strcmp(recent->filename, G.sce)) - uiItemIntO(layout, recent->filename, 0, op->type->idname, "nr", i+ofs+1); - + uiItemsEnumO(layout, op->type->idname, "file"); uiPupMenuEnd(C, pup); return OPERATOR_CANCELLED; } +static EnumPropertyItem *open_recentfile_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + EnumPropertyItem tmp = {0, "", 0, "", ""}; + EnumPropertyItem *item= NULL; + struct RecentFile *recent; + int totitem= 0, i, ofs= 0; + + if(G.sce[0]) { + tmp.value= 1; + tmp.identifier= G.sce; + tmp.name= G.sce; + RNA_enum_item_add(&item, &totitem, &tmp); + ofs = 1; + } + + /* dynamically construct enum */ + for(recent = G.recent_files.first, i=0; (inext, i++) { + if(strcmp(recent->filename, G.sce)) { + tmp.value= i+ofs+1; + tmp.identifier= recent->filename; + tmp.name= recent->filename; + RNA_enum_item_add(&item, &totitem, &tmp); + } + } + + RNA_enum_item_end(&item, &totitem); + *free= 1; + + return item; +} + static void WM_OT_open_recentfile(wmOperatorType *ot) { + PropertyRNA *prop; + static EnumPropertyItem file_items[]= { + {0, NULL, 0, NULL, NULL}}; + ot->name= "Open Recent File"; ot->idname= "WM_OT_open_recentfile"; @@ -625,7 +649,8 @@ static void WM_OT_open_recentfile(wmOperatorType *ot) ot->exec= recentfile_exec; ot->poll= WM_operator_winactive; - RNA_def_property(ot->srna, "nr", PROP_INT, PROP_UNSIGNED); + prop= RNA_def_enum(ot->srna, "file", file_items, 1, "File", ""); + RNA_def_enum_funcs(prop, open_recentfile_itemf); } /* ********* main file *********** */ @@ -675,15 +700,57 @@ static void WM_OT_open_mainfile(wmOperatorType *ot) ot->exec= wm_open_mainfile_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); +} +static int wm_recover_last_session_exec(bContext *C, wmOperator *op) +{ + char scestr[FILE_MAX], filename[FILE_MAX]; + int save_over; + + /* back up some values */ + BLI_strncpy(scestr, G.sce, sizeof(scestr)); + save_over = G.save_over; + + // XXX wm in context is not set correctly after WM_read_file -> crash + // do it before for now, but is this correct with multiple windows? + WM_event_add_notifier(C, NC_WINDOW, NULL); + + /* load file */ + BLI_make_file_string("/", filename, btempdir, "quit.blend"); + WM_read_file(C, filename, op->reports); + + /* restore */ + G.save_over = save_over; + BLI_strncpy(G.sce, scestr, sizeof(G.sce)); + + return 0; +} + +static void WM_OT_recover_last_session(wmOperatorType *ot) +{ + ot->name= "Recover Last Session"; + ot->idname= "WM_OT_recover_last_session"; + + ot->exec= wm_recover_last_session_exec; + ot->poll= WM_operator_winactive; +} + +static void save_set_compress(wmOperator *op) +{ + if(!RNA_property_is_set(op->ptr, "compress")) { + if(G.save_over) /* keep flag for existing file */ + RNA_boolean_set(op->ptr, "compress", G.fileflags & G_FILE_COMPRESS); + else /* use userdef for new file */ + RNA_boolean_set(op->ptr, "compress", U.flag & USER_FILECOMPRESS); + } } static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { char name[FILE_MAX]; + + save_set_compress(op); BLI_strncpy(name, G.sce, FILE_MAX); untitled(name); @@ -698,6 +765,10 @@ static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *even static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; + int compress; + + save_set_compress(op); + compress= RNA_boolean_get(op->ptr, "compress"); if(RNA_property_is_set(op->ptr, "filename")) RNA_string_get(op->ptr, "filename", filename); @@ -705,7 +776,8 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) BLI_strncpy(filename, G.sce, FILE_MAX); untitled(filename); } - WM_write_file(C, filename, op->reports); + + WM_write_file(C, filename, compress, op->reports); WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL); @@ -721,10 +793,8 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot) ot->exec= wm_save_as_mainfile_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; - - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); - + RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", ""); + RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file."); } /* *************** Save file directly ******** */ @@ -732,6 +802,8 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot) static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { char name[FILE_MAX]; + + save_set_compress(op); BLI_strncpy(name, G.sce, FILE_MAX); untitled(name); @@ -750,10 +822,8 @@ static void WM_OT_save_mainfile(wmOperatorType *ot) ot->exec= wm_save_as_mainfile_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; - - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); - + RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", ""); + RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file."); } @@ -1590,6 +1660,7 @@ void wm_operatortype_init(void) WM_operatortype_append(WM_OT_exit_blender); WM_operatortype_append(WM_OT_open_recentfile); WM_operatortype_append(WM_OT_open_mainfile); + WM_operatortype_append(WM_OT_recover_last_session); WM_operatortype_append(WM_OT_jobs_timer); WM_operatortype_append(WM_OT_save_as_mainfile); WM_operatortype_append(WM_OT_save_mainfile); diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp index 03dd5d07eb0..6e6531c9b5f 100644 --- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp +++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp @@ -118,11 +118,10 @@ static BlendFileData *load_game_data(char *filename) return bfd; } -extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_framing) +extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing) { /* context values */ struct wmWindow *win= CTX_wm_window(C); - struct ARegion *ar= CTX_wm_region(C); struct Scene *scene= CTX_data_scene(C); struct Main* maggie1= CTX_data_main(C);