Beispiel #1
0
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;
}
Beispiel #3
0
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);
	}

}
Beispiel #4
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}
Beispiel #8
0
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();
}