void DeleteBlock_CurrPos( struct Tracker_Windows *window ){ struct WBlocks *wblock=window->wblock; NInt blockpos; PlayStop(); if(wblock->l.next==NULL && wblock==window->wblocks) return; blockpos=window->wblock->l.num; Undo_Block_Delete(blockpos); DeleteBlock(blockpos); wblock=ListFindElement1_r0(&window->wblocks->l,blockpos); if(wblock==NULL){ wblock=ListLast1(&window->wblocks->l); } SelectWBlock(window,wblock); BS_UpdateBlockList(); BS_UpdatePlayList(); }
void *Undo_Do_Block_Delete( struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, void *pointer ){ struct Undo_Block_InsertDelete *ubi=(struct Undo_Block_InsertDelete *)pointer; if(ubi->wblock==NULL){ return Undo_Do_Block_Insert(window,wblock,wtrack,realline,pointer); } InsertBlock_IncBlockNums(ubi->blockpos); ListAddElement1(&root->song->blocks,&ubi->wblock->block->l); ListAddElement1(&window->wblocks,&ubi->wblock->l); SEQUENCER_create_from_state(ubi->sequencer_state, root->song); BS_UpdateBlockList(); BS_UpdatePlayList(); ubi->wblock=NULL; return ubi; }
void Block_Properties_CurrPos( struct Tracker_Windows *window ){ NInt num_tracks; int num_lines; char seltext[500]; char *blockname; ReqType reqtype; struct WBlocks *wblock=window->wblock; struct Blocks *block=wblock->block; PlayStop(); reqtype=GFX_OpenReq(window,33,5,"Block Properties"); sprintf(seltext,"Number of tracks (now %d): ",wblock->block->num_tracks); num_tracks=GFX_GetInteger(window,reqtype,seltext,2,200); if(num_tracks==1) num_tracks=wblock->block->num_tracks; sprintf(seltext,"Number of lines (now %d): ",wblock->block->num_lines); num_lines=GFX_GetInteger(window,reqtype,seltext,2,2000); if(num_lines==1) num_lines=wblock->block->num_lines; sprintf(seltext,"Name (now: '%s'): ",wblock->block->name); blockname=GFX_GetString(window,reqtype,seltext); if(blockname!=NULL){ wblock->block->name=blockname; BS_UpdateBlockList(); BS_UpdatePlayList(); } GFX_CloseReq(window,reqtype); if(num_tracks==wblock->block->num_tracks && num_lines==wblock->block->num_lines){ return; } Undo_Block_CurrPos(window); Block_Properties(block,num_tracks,num_lines); window=root->song->tracker_windows; while(window!=NULL){ window->must_redraw = true; window=NextWindow(window); } }
static void *Undo_Do_Playlist( struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, void *pointer ){ int *ret = BL_copy(); BL_paste(pointer); BS_UpdateBlockList(); BS_UpdatePlayList(); return ret; }
void *Undo_Do_Block_Split( struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, void *pointer ){ struct Undo_Block_MergeSplit *ubm=(struct Undo_Block_MergeSplit *)pointer; struct WBlocks *wblocktemp=NULL; if(ubm->nwblock==NULL){ //Undo ubm->nwblock=CB_CopyBlock(wblock); // wblocktemp=CB_CopyBlock((struct WBlocks*)ListPrevElement1(&window->wblocks->l,&wblock->l)); wblocktemp=CB_CopyBlock(NextWBlock(wblock)); CB_PasteBlock(window,ubm->wblock,wblock); DeleteBlock(ubm->blockpos+1); ubm->wblock=wblocktemp; }else{ //Redo InsertBlock(ubm->blockpos,20,20,"n"); wblocktemp=CB_CopyBlock(wblock); CB_PasteBlock(window,ubm->wblock,wblock); CB_PasteBlock(window,ubm->nwblock,(struct WBlocks*)ListPrevElement1(&window->wblocks->l,&wblock->l)); ubm->wblock=wblocktemp; ubm->nwblock=NULL; } BS_UpdateBlockList(); BS_UpdatePlayList(); return ubm; }
void *Undo_Do_Block_Insert( struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, void *pointer ){ struct Undo_Block_InsertDelete *ubi=(struct Undo_Block_InsertDelete *)pointer; if(ubi->wblock!=NULL){ return Undo_Do_Block_Delete(window,wblock,wtrack,realline,pointer); } ubi->wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,ubi->blockpos); DeleteBlock(ubi->blockpos); SEQUENCER_create_from_state(ubi->sequencer_state); BS_UpdateBlockList(); BS_UpdatePlayList(); return ubi; }
struct Blocks *InsertBlock_CurrPos( struct Tracker_Windows *window ) { struct WBlocks *wblock=window->wblock; NInt blockpos=wblock->l.num; ADD_UNDO(Block_Insert(blockpos)); struct Blocks *ret; PC_Pause();{ ret = InsertBlock(blockpos,wblock->block->num_tracks,wblock->block->num_lines,"NN"); SelectWBlock(window,(struct WBlocks *)ListFindElement1(&window->wblocks->l,blockpos)); BS_UpdateBlockList(); BS_UpdatePlayList(); }PC_StopPause(window); return ret; }
int radium_main(char *arg){ struct Tracker_Windows *window; #if 0 // Seems to be some kind of problem when running givertcap? Try to uncomment and // see if you can start radium without segfaulting. I can't. -Kjetil. system("/usr/bin/givertcap"); #endif x11_display=XOpenDisplay(NULL); if(x11_display==NULL){ fprintf(stderr, "Unable to open display \"%s\"\n",XDisplayName(NULL)); return 1; } XSetIOErrorHandler (MySysErrorHandler); x11_screen=DefaultScreen(x11_display); printf("arg: -%s-\n",arg); printf("Width/Height: %d/%d\n",DisplayWidth(x11_display,x11_screen),DisplayHeight(x11_display,x11_screen)); X11_init_keyboard(); X11_StartBlockSelector(); X11_StartMidiProperties(); StartGuiThread(); posix_InitPlayer(); if(InitProgram()==true){ /* Here: More inits, receive events, other things. */ bool notend=true; printf("Inited\n"); XFlush(x11_display); // DrawUpTrackerWindow(root->song->tracker_windows); //XFlush(x11_display); window=root->song->tracker_windows; //GFX_StartFileRequester(); X11_StartQtStuff(); BS_UpdateBlockList(); BS_UpdatePlayList(); BS_SelectBlock(root->song->blocks); BS_SelectPlaylistPos(0); if(strlen(arg)>0) Load(arg); lockGUI(); while(notend==true){ int fd; fd_set fdset; XFlush(x11_display); fd=ConnectionNumber(x11_display); FD_ZERO(&fdset); FD_SET(fd,&fdset); unlockGUI(); while((fd=select(fd+1,&fdset,NULL,NULL,NULL)==-1)){ if(errno!=EINTR) break; } lockGUI(); while(XPending(x11_display)) { XEvent event; XNextEvent(x11_display, &event); //XNextEvent (x11_display, &event); window=root->song->tracker_windows; //P2MUpdateSongPosCallBack(); switch(event.type){ case KeyPress: if(X11_KeyPress((XKeyEvent *)&event,window)==1){ notend=false; } break; case KeyRelease: X11_KeyRelease((XKeyEvent *)&event,window); break; case ButtonPress: //printf("%d %d %d\n",((XButtonEvent *)&event)->x,((XButtonEvent *)&event)->y,((XButtonEvent *)&event)->button); switch(((XButtonEvent *)&event)->button){ case 1: tevent.ID=TR_LEFTMOUSEDOWN; break; case 2: tevent.ID=TR_MIDDLEMOUSEDOWN; break; case 3: tevent.ID=TR_RIGHTMOUSEDOWN; break; case 4: tevent.ID=TR_KEYBOARD; tevent.SubID=EVENT_UPARROW; break; case 5: tevent.ID=TR_KEYBOARD; tevent.SubID=EVENT_DOWNARROW; break; default: tevent.ID=TR_LEFTMOUSEDOWN; } tevent.x=((XButtonEvent *)&event)->x; tevent.y=((XButtonEvent *)&event)->y; EventReciever(&tevent,window); break; case ButtonRelease: //printf("%d %d %d\n",((XButtonEvent *)&event)->x,((XButtonEvent *)&event)->y,((XButtonEvent *)&event)->button); switch(((XButtonEvent *)&event)->button){ case 1: tevent.ID=TR_LEFTMOUSEUP; break; case 2: tevent.ID=TR_MIDDLEMOUSEUP; break; case 3: tevent.ID=TR_RIGHTMOUSEUP; break; default: tevent.ID=TR_LEFTMOUSEUP; } tevent.x=((XButtonEvent *)&event)->x; tevent.y=((XButtonEvent *)&event)->y; EventReciever(&tevent,window); break; case EnterNotify: case LeaveNotify: X11_ResetKeysUpDowns(); break; case MotionNotify: // printf("%d %d %d\n",((XMotionEvent *)&event)->x,((XMotionEvent *)&event)->y,((XMotionEvent *)&event)->state); tevent.ID=TR_MOUSEMOVE; tevent.x=((XButtonEvent *)&event)->x; tevent.y=((XButtonEvent *)&event)->y; EventReciever(&tevent,window); break; //case VisibilityNotify: // case ConfigureNotify: case ConfigureNotify: if( window->width!=((XConfigureEvent *)&event)->width || window->height!=((XConfigureEvent *)&event)->height ) { #if 0 fprintf(stderr,"Resized %d %d\n", ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height ); #endif XFreePixmap( x11_display, window->os_visual->pixmap ); XFreePixmap( x11_display, window->os_visual->cursorpixmap ); window->os_visual->pixmap=XCreatePixmap(x11_display, window->os_visual->window, ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height, (unsigned int)(DefaultDepth(x11_display,x11_screen)) ); XFillRectangle( x11_display, window->os_visual->pixmap, window->os_visual->gcs[0], 0, 0, ((XConfigureEvent *)&event)->width,((XConfigureEvent *)&event)->height ); window->os_visual->cursorpixmap=XCreatePixmap(x11_display, window->os_visual->window, ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height, (unsigned int)(DefaultDepth(x11_display,x11_screen)) ); XFillRectangle( x11_display, window->os_visual->cursorpixmap, window->os_visual->gcs[0], 0, 0, ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height ); Resize_resized( window, ((XConfigureEvent *)&event)->width-1, ((XConfigureEvent *)&event)->height-1, true ); } break; case Expose: printf("Expose\n"); //GFX_FilledBox(window,0,0,0,window->width,window->height); //DrawUpTrackerWindow(root->song->tracker_windows); Resize_resized(window,window->width,window->height,false); //XFlush(x11_display); break; case NoExpose: break; case GraphicsExpose: printf("GRaphicsExpose event.\n"); break; case ClientMessage: X11Event_ClientMessage((XClientMessageEvent *)&event,window); // printf("Received \"%s\"\n",((XClientMessageEvent *)&event)->data.b); break; default: printf("Unknown xevent %d\n",event.type); break; } } } EndProgram(); } posix_EndPlayer(); unlockGUI(); EndGuiThread(); XCloseDisplay(x11_display); return 0; }
void CB_PasteBlock( struct Tracker_Windows *window, struct WBlocks *wblock, struct WBlocks *towblock ){ R_ASSERT(is_playing()==false); struct Blocks *block=wblock->block; struct Blocks *toblock=towblock->block; struct WTracks *towtrack=towblock->wtracks; struct WTracks *towtrack_wtrack=towblock->wtrack; struct Tracks *totrack=toblock->tracks; struct WTracks *wtrack; NInt wblocknum=towblock->l.num; struct ListHeader1 *nextwblock=towblock->l.next; NInt blocknum=toblock->l.num; struct ListHeader1 *nextblock=toblock->l.next; unsigned int org_color = toblock->color; NInt org_num_tracks=toblock->num_tracks; memcpy(towblock,wblock,sizeof(struct WBlocks)); memcpy(toblock,block,sizeof(struct Blocks)); toblock->color = org_color; // Don't want to paste color. towblock->l.next=nextwblock; towblock->l.num=wblocknum; towblock->block=toblock; towblock->wtracks=towtrack; towblock->wtrack=towtrack_wtrack; toblock->tracks=totrack; toblock->l.next=nextblock; toblock->l.num=blocknum; //printf("org num_tracks: %d, before: %d\n",org_num_tracks,toblock->num_tracks); toblock->num_tracks=org_num_tracks; Block_Set_num_tracks(toblock,block->num_tracks); TIME_everything_in_block_has_changed(towblock->block); // UpdateReallines requires updated time values (for whether to show swing type track or not). toblock->name=block->name; towblock->localzooms=NULL; CB_UnpackLocalZooms(&towblock->localzooms,wblock->localzooms,block->num_lines); //towblock->reallines=NULL; UpdateRealLines_dont_change_curr_realline(window, towblock); //towblock->wtempos=NULL; //towblock->wlpbs=NULL; toblock->swings=CB_CopySwings(block->swings, NULL); toblock->signatures=CB_CopySignatures(block->signatures); toblock->lpbs=CB_CopyLPBs(block->lpbs); toblock->tempos=CB_CopyTempos(block->tempos); toblock->temponodes=CB_CopyTempoNodes(block->temponodes); toblock->lasttemponode=(struct TempoNodes *)ListLast3(&toblock->temponodes->l); UpdateReallinesDependens(window,towblock); wtrack=wblock->wtracks; towtrack=towblock->wtracks; while(wtrack!=NULL){ if(towtrack==NULL){ RError("Error in funtion CB_PasteBlock in file clipboard_block_paste.c; towtrack=NULL\n"); break; } if(towtrack->l.num!=wtrack->l.num){ RError("Error in funtion CB_PasteBlock in file clipboard_block_paste.c; towtrack->l.num!=wtrack->l.num\n"); break; } co_CB_PasteTrack(towblock,wtrack,towtrack); towtrack=NextWTrack(towtrack); wtrack=NextWTrack(wtrack); } if(towtrack!=NULL){ RError("Error in funtion CB_PasteBlock in file clipboard_block_paste.c; towtrack!=NULL when wtrack==NULL\n"); } g_editor_blocks_generation++; BS_UpdateBlockList(); BS_UpdatePlayList(); }