@@ -21,7 +21,7 @@ | |||
#include "Sequence.H" | |||
#include "Region.H" | |||
#include "Track.H" | |||
#include <FL/Fl_Input.H> | |||
@@ -30,15 +30,49 @@ class Audio_Sequence : public Sequence | |||
protected: | |||
void | |||
get ( Log_Entry &e ) | |||
{ | |||
Sequence::get( e ); | |||
e.add( ":t", _track ); | |||
} | |||
void | |||
set ( Log_Entry &e ) | |||
{ | |||
Sequence::set( e ); | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( ":t", s ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
Track *t = (Track*)Loggable::find( i ); | |||
assert( t ); | |||
t->track( this ); | |||
} | |||
} | |||
} | |||
Audio_Sequence ( ) : Sequence( 0, 0, 0, 0 ) | |||
{ | |||
} | |||
public: | |||
LOG_CREATE_FUNC( Audio_Sequence ); | |||
Audio_Sequence ( int X, int Y, int W, int H ) : Sequence( X, Y, W, H ) | |||
Audio_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0, track ) | |||
{ | |||
log_create(); | |||
} | |||
@@ -51,7 +85,7 @@ public: | |||
Sequence * clone_empty ( void ) | |||
{ | |||
Audio_Sequence *t = new Audio_Sequence( x(), y(), w(), h() ); | |||
Audio_Sequence *t = new Audio_Sequence( track() ); | |||
return t; | |||
} | |||
@@ -0,0 +1,135 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "Control_Sequence.H" | |||
#include "Track.H" | |||
void | |||
Control_Sequence::get ( Log_Entry &e ) | |||
{ | |||
Sequence::get( e ); | |||
e.add( ":t", _track ); | |||
} | |||
void | |||
Control_Sequence::set ( Log_Entry &e ) | |||
{ | |||
Sequence::set( e ); | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( ":t", s ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
Track *t = (Track*)Loggable::find( i ); | |||
assert( t ); | |||
t->add( this ); | |||
} | |||
} | |||
} | |||
void | |||
Control_Sequence::draw ( void ) | |||
{ | |||
if ( ! fl_not_clipped( x(), y(), w(), h() ) ) | |||
return; | |||
fl_push_clip( x(), y(), w(), h() ); | |||
draw_box(); | |||
int X, Y, W, H; | |||
fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); | |||
fl_line_style( FL_SOLID, 4 ); | |||
fl_color( fl_color_average( selection_color(), color(), 0.90f ) ); | |||
fl_begin_complex_polygon(); | |||
list <Sequence_Widget *>::const_iterator e = _widgets.end(); | |||
e--; | |||
if ( _widgets.size() ) | |||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); ; r++ ) | |||
{ | |||
if ( r == _widgets.begin() ) | |||
{ | |||
fl_vertex( x(), y() + h() ); | |||
fl_vertex( x(), (*r)->y() ); | |||
} | |||
fl_vertex( (*r)->x(), (*r)->y() ); | |||
if ( r == e ) | |||
{ | |||
fl_vertex( x() + w(), (*r)->y() ); | |||
fl_vertex( x() + w(), y() + h() ); | |||
break; | |||
} | |||
} | |||
fl_end_complex_polygon(); | |||
fl_line_style( FL_SOLID, 0 ); | |||
timeline->draw_measure_lines( x(), y(), w(), h(), color() ); | |||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) | |||
(*r)->draw_box(); | |||
fl_pop_clip(); | |||
} | |||
int | |||
Control_Sequence::handle ( int m ) | |||
{ | |||
int r = Sequence::handle( m ); | |||
if ( r ) | |||
return r; | |||
switch ( m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( Fl::event_button1() ) | |||
{ | |||
Control_Point *r = new Control_Point( this, timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() ), (float)(Fl::event_y() - y()) / h() ); | |||
add( r ); | |||
} | |||
return 1; | |||
} | |||
default: | |||
return 0; | |||
} | |||
} |
@@ -25,6 +25,12 @@ | |||
class Control_Sequence : public Sequence | |||
{ | |||
protected: | |||
void get ( Log_Entry &e ); | |||
void set ( Log_Entry &e ); | |||
Control_Sequence ( ) : Sequence( 0, 0, 1, 1 ) | |||
{ | |||
@@ -34,7 +40,7 @@ public: | |||
LOG_CREATE_FUNC( Control_Sequence ); | |||
Control_Sequence ( int X, int Y, int W, int H ) : Sequence( X, Y, W, H ) | |||
Control_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0, track ) | |||
{ | |||
color( fl_darker( FL_GREEN ) ); | |||
@@ -48,85 +54,7 @@ public: | |||
const char *class_name ( void ) { return "Control_Sequence"; } | |||
void | |||
draw ( void ) | |||
{ | |||
if ( ! fl_not_clipped( x(), y(), w(), h() ) ) | |||
return; | |||
fl_push_clip( x(), y(), w(), h() ); | |||
draw_box(); | |||
int X, Y, W, H; | |||
fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); | |||
fl_line_style( FL_SOLID, 4 ); | |||
fl_color( fl_color_average( selection_color(), color(), 0.90f ) ); | |||
fl_begin_complex_polygon(); | |||
list <Sequence_Widget *>::const_iterator e = _widgets.end(); | |||
e--; | |||
void draw ( void ); | |||
int handle ( int m ); | |||
if ( _widgets.size() ) | |||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); ; r++ ) | |||
{ | |||
if ( r == _widgets.begin() ) | |||
{ | |||
fl_vertex( x(), y() + h() ); | |||
fl_vertex( x(), (*r)->y() ); | |||
} | |||
fl_vertex( (*r)->x(), (*r)->y() ); | |||
if ( r == e ) | |||
{ | |||
fl_vertex( x() + w(), (*r)->y() ); | |||
fl_vertex( x() + w(), y() + h() ); | |||
break; | |||
} | |||
} | |||
fl_end_complex_polygon(); | |||
fl_line_style( FL_SOLID, 0 ); | |||
timeline->draw_measure_lines( x(), y(), w(), h(), color() ); | |||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) | |||
(*r)->draw_box(); | |||
fl_pop_clip(); | |||
} | |||
int | |||
handle ( int m ) | |||
{ | |||
int r = Sequence::handle( m ); | |||
if ( r ) | |||
return r; | |||
switch ( m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( Fl::event_button1() ) | |||
{ | |||
Control_Point *r = new Control_Point( this, timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() ), (float)(Fl::event_y() - y()) / h() ); | |||
add( r ); | |||
} | |||
return 1; | |||
} | |||
default: | |||
return 0; | |||
} | |||
} | |||
}; |
@@ -46,15 +46,20 @@ Loggable::open ( const char *filename ) | |||
return false; | |||
} | |||
/* TODO: replay log here */ | |||
/* FIXME: handle transactions!!! */ | |||
/* replay log */ | |||
{ | |||
char buf[BUFSIZ]; | |||
while ( fscanf( fp, "%[^\n]\n", buf ) == 1 ) | |||
{ | |||
do_this( buf, false ); | |||
if ( ! ( ! strcmp( buf, "{" ) || ! strcmp( buf, "}" ) ) ) | |||
{ | |||
if ( *buf == '\t' ) | |||
do_this( buf + 1, false ); | |||
else | |||
do_this( buf, false ); | |||
} | |||
} | |||
} | |||
@@ -113,8 +118,10 @@ parse_alist( const char *s ) | |||
if ( *v == '"' ) | |||
{ | |||
v++; | |||
// v++; | |||
v[ strlen( v ) - 2 ] = '\0'; | |||
memmove( v, v + 1, strlen( v ) + 1 ); | |||
} | |||
} | |||
@@ -191,13 +198,19 @@ Loggable::do_this ( const char *s, bool reverse ) | |||
} | |||
else if ( ! strcmp( command, create ) ) | |||
{ | |||
char **sa = parse_alist( arguments ); | |||
char **sa = NULL; | |||
if ( arguments ) | |||
sa = parse_alist( arguments ); | |||
Log_Entry e( sa ); | |||
if ( ! _class_map[ string( classname ) ] ) | |||
printf( "error class %s is unregistered!\n", classname ); | |||
else | |||
assert( _class_map[ string( classname ) ] ); | |||
/* if ( ! _class_map[ string( classname ) ] ) */ | |||
/* printf( "error class %s is unregistered!\n", classname ); */ | |||
/* else */ | |||
{ | |||
/* create */ | |||
Loggable *l = _class_map[ string( classname ) ]( e ); | |||
@@ -136,9 +136,11 @@ public: | |||
{ | |||
assert( _id == _log_id ); | |||
assert( _loggables[ _id - 1 ] == this ); | |||
_loggables[ _id - 1 ] = NULL; | |||
--_log_id; | |||
// --_log_id; | |||
_id = id; | |||
@@ -250,6 +252,7 @@ public: | |||
if ( _sa ) | |||
while ( _sa[ _i ] ) ++_i; | |||
} | |||
~Log_Entry ( ) | |||
@@ -5,6 +5,7 @@ SRCS= \ | |||
main.C \ | |||
Sequence.C \ | |||
Audio_Sequence.C \ | |||
Control_Sequence.C \ | |||
Timeline.C \ | |||
Track.C \ | |||
Sequence_Widget.C \ | |||
@@ -24,6 +24,7 @@ | |||
#include <FL/fl_draw.H> | |||
#include "Track.H" | |||
queue <Sequence_Widget *> Sequence::_delete_queue; | |||
@@ -32,6 +33,9 @@ Sequence::Sequence ( int X, int Y, int W, int H, Track *track ) : Fl_Widget( X, | |||
_name = NULL; | |||
_track = track; | |||
if ( track ) | |||
track->add( this ); | |||
box( FL_DOWN_BOX ); | |||
color( fl_darker( FL_GRAY ) ); | |||
align( FL_ALIGN_LEFT ); | |||
@@ -43,24 +43,40 @@ class Sequence_Widget; | |||
class Sequence : public Fl_Widget, public Loggable | |||
{ | |||
Track *_track; /* track this sequence belongs to */ | |||
char *_name; | |||
static queue <Sequence_Widget *> _delete_queue; | |||
protected: | |||
Track *_track; /* track this sequence belongs to */ | |||
char *_name; | |||
std::list <Sequence_Widget *> _widgets; | |||
Sequence_Widget *event_widget ( void ); | |||
virtual const char *class_name ( void ) { return "Sequence"; } | |||
virtual void set ( Log_Entry &e ) { return; } | |||
virtual void set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( ":n", s ) ) | |||
{ | |||
name( strdup( v ) ); | |||
} | |||
} | |||
} | |||
virtual void get ( Log_Entry &e ) | |||
{ | |||
e.add( ":n", name() ); | |||
// e.add( ":t", _track ); | |||
/* s += sprintf( s, ":items " ); */ | |||
/* for ( list <Sequence_Widget *>::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ ) */ | |||
@@ -81,10 +97,18 @@ public: | |||
virtual ~Sequence ( ); | |||
const char * name ( void ) const { return _name; } | |||
void name ( char *s ) { if ( _name ) free( _name ); _name = s; label( _name ); } | |||
void name ( const char *s ) | |||
{ | |||
if ( _name ) free( _name ); | |||
_name = strdup( s ); | |||
label( _name ); | |||
} | |||
void sort ( void ); | |||
Track *track ( void ) const { return _track; } | |||
void track ( Track *t ) { _track = t; } | |||
void remove ( Sequence_Widget *r ); | |||
void add ( Sequence_Widget *r ); | |||
@@ -109,7 +109,7 @@ protected: | |||
else | |||
deselect(); | |||
} | |||
else if ( ! strcmp( s, ":track" ) ) | |||
else if ( ! strcmp( s, ":t" ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
@@ -115,8 +115,8 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi | |||
o->color( FL_RED ); | |||
o->add( new Tempo_Point( 0, 120 ) ); | |||
o->add( new Tempo_Point( 56000, 250 ) ); | |||
/* o->add( new Tempo_Point( 0, 120 ) ); */ | |||
/* o->add( new Tempo_Point( 56000, 250 ) ); */ | |||
o->label( "Tempo" ); | |||
o->align( FL_ALIGN_LEFT ); | |||
@@ -131,8 +131,8 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi | |||
o->color( fl_color_average( FL_RED, FL_WHITE, 0.50f ) ); | |||
o->add( new Time_Point( 0, 4, 4 ) ); | |||
o->add( new Time_Point( 345344, 6, 8 ) ); | |||
/* o->add( new Time_Point( 0, 4, 4 ) ); */ | |||
/* o->add( new Time_Point( 345344, 6, 8 ) ); */ | |||
o->label( "Time" ); | |||
o->align( FL_ALIGN_LEFT ); | |||
@@ -748,21 +748,25 @@ Timeline::handle ( int m ) | |||
{ | |||
/* FIXME: prompt for I/O config? */ | |||
Loggable::block_start(); | |||
/* add audio track */ | |||
char *name = get_unique_track_name( "Audio" ); | |||
Track *t = new Track( 0, 0, tracks->w(), 30, name ); | |||
Track *t = new Track( name ); | |||
add_track( t ); | |||
Sequence *o = new Audio_Sequence( 0, 0, 1, 100 ); | |||
Sequence *o = new Audio_Sequence( t ); | |||
new Control_Sequence( t ); | |||
t->track( o ); | |||
// t->add( new Audio_Sequence( 0, 0, 1, 100 ) ); | |||
// t->add( new Audio_Sequence( 0, 0, 1, 100 ) ); | |||
t->add_control( new Control_Sequence( 0, 0, 1, 100 ) ); | |||
/* t->add( new Control_Sequence( t ); */ | |||
t->color( (Fl_Color)rand() ); | |||
Loggable::block_end(); | |||
} | |||
} | |||
@@ -809,18 +813,18 @@ Timeline::handle ( int m ) | |||
bool | |||
Timeline::track_name_exists ( const char *name ) | |||
Track * | |||
Timeline::track_by_name ( const char *name ) | |||
{ | |||
for ( int i = tracks->children(); i-- ; ) | |||
{ | |||
Track *t = (Track*)tracks->child( i ); | |||
if ( ! strcmp( name, t->name() ) ) | |||
return true; | |||
return t; | |||
} | |||
return false; | |||
return NULL; | |||
} | |||
char * | |||
@@ -830,7 +834,7 @@ Timeline::get_unique_track_name ( const char *name ) | |||
strcpy( pat, name ); | |||
for ( int i = 1; track_name_exists( pat ); ++i ) | |||
for ( int i = 1; track_by_name( pat ); ++i ) | |||
snprintf( pat, sizeof( pat ), "%s.%d", name, i ); | |||
return strdup( pat ); | |||
@@ -157,7 +157,7 @@ private: | |||
friend class Engine; // FIXME: only Engine::process() needs to be friended.x | |||
bool track_name_exists ( const char *name ); | |||
Track * track_by_name ( const char *name ); | |||
char * get_unique_track_name ( const char *name ); | |||
/* Engine */ | |||
@@ -96,8 +96,8 @@ Track::cb_button ( Fl_Widget *w ) | |||
} | |||
} | |||
Track::Track ( int X, int Y, int W, int H, const char *L ) : | |||
Fl_Group ( X, Y, W, H, L ) | |||
void | |||
Track::init ( void ) | |||
{ | |||
_capture = NULL; | |||
_track = NULL; | |||
@@ -108,8 +108,7 @@ Track::Track ( int X, int Y, int W, int H, const char *L ) : | |||
labeltype( FL_NO_LABEL ); | |||
Fl_Group::size( w(), height() ); | |||
Fl_Group::size( timeline->w(), height() ); | |||
Track *o = this; | |||
o->box( FL_THIN_UP_BOX ); | |||
@@ -204,15 +203,23 @@ Track::Track ( int X, int Y, int W, int H, const char *L ) : | |||
} | |||
end(); | |||
if ( L ) | |||
name( L ); | |||
/* FIXME: should be configurable, but where? */ | |||
create_outputs( 2 ); | |||
create_inputs( 2 ); | |||
playback_ds = new Playback_DS( this, engine->frame_rate(), engine->nframes(), output.size() ); | |||
record_ds = new Record_DS( this, engine->frame_rate(), engine->nframes(), input.size() ); | |||
} | |||
Track::Track ( const char *L ) : | |||
Fl_Group ( 0, 0, 0, 0, L ) | |||
{ | |||
init(); | |||
if ( L ) | |||
name( L ); | |||
log_create(); | |||
} | |||
@@ -278,14 +285,13 @@ Track::size ( int v ) | |||
} | |||
void | |||
Track::track( Sequence * t ) | |||
Track::track ( Sequence * t ) | |||
{ | |||
// t->size( 1, h() ); | |||
t->track( this ); | |||
if ( track() ) | |||
add( track() ); | |||
// takes->insert( *track(), 0 ); | |||
_track = t; | |||
pack->insert( *t, 0 ); | |||
@@ -293,14 +299,71 @@ Track::track( Sequence * t ) | |||
} | |||
void | |||
Track::add_control( Sequence *t ) | |||
Track::add ( Control_Sequence *t ) | |||
{ | |||
t->track( this ); | |||
control->add( t ); | |||
resize(); | |||
} | |||
void | |||
Track::draw ( void ) | |||
{ | |||
if ( _selected ) | |||
{ | |||
Fl_Color c = color(); | |||
color( FL_RED ); | |||
Fl_Group::draw(); | |||
color( c ); | |||
} | |||
else | |||
Fl_Group::draw(); | |||
if ( ! name_field->visible() ) | |||
{ | |||
fl_color( FL_WHITE ); | |||
fl_font( FL_HELVETICA, 14 ); | |||
fl_draw( name_field->value(), name_field->x(), name_field->y(), name_field->w(), name_field->h(), FL_ALIGN_CENTER ); | |||
} | |||
} | |||
int | |||
Track::handle ( int m ) | |||
{ | |||
Logger log( this ); | |||
switch ( m ) | |||
{ | |||
case FL_MOUSEWHEEL: | |||
{ | |||
if ( ! Fl::event_shift() ) | |||
return 0; | |||
int d = Fl::event_dy(); | |||
printf( "%d\n", d ); | |||
if ( d < 0 ) | |||
size( size() - 1 ); | |||
else | |||
size( size() + 1 ); | |||
return 1; | |||
} | |||
default: | |||
return Fl_Group::handle( m ); | |||
} | |||
} | |||
/**********/ | |||
/* Engine */ | |||
/**********/ | |||
@@ -38,6 +38,9 @@ using std::vector; | |||
#include "Port.H" | |||
#include "Timeline.H" | |||
#include "Control_Sequence.H" | |||
class Playback_DS; | |||
class Record_DS; | |||
class Port; | |||
@@ -48,7 +51,7 @@ class Track : public Fl_Group, public Loggable | |||
public: | |||
Track ( int X, int Y, int W, int H, const char *L = 0 ); | |||
Track ( const char *L ); | |||
~Track ( ); | |||
private: | |||
@@ -75,34 +78,38 @@ private: | |||
Track ( ) : Fl_Group( 0, 0, 1, 1 ) | |||
{ | |||
init(); | |||
timeline->add_track( this ); | |||
} | |||
void init ( void ); | |||
public: | |||
Fl_Input * name_field; | |||
Fl_Button *record_button; | |||
Fl_Button *mute_button; | |||
Fl_Button *solo_button; | |||
Fl_Input *name_field; | |||
Fl_Button *record_button; | |||
Fl_Button *mute_button; | |||
Fl_Button *solo_button; | |||
Fl_Menu_Button *take_menu; | |||
Fl_Group *controls; | |||
Fl_Group *controls; | |||
Fl_Pack *pack; | |||
Fl_Pack *control; | |||
Fl_Pack *takes; | |||
Fl_Pack *pack; | |||
Fl_Pack *control; | |||
Fl_Pack *takes; | |||
vector <Port> input; | |||
vector <Port> output; /* output ports... */ | |||
vector<Port> input; /* input ports... */ | |||
vector<Port> output; /* output ports... */ | |||
Playback_DS *playback_ds; | |||
Record_DS *record_ds; | |||
Playback_DS *playback_ds; | |||
Record_DS *record_ds; | |||
const char *class_name ( void ) { return "Track"; } | |||
void | |||
set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; e.size(); ++i ) | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
@@ -120,7 +127,9 @@ public: | |||
else if ( ! strcmp( s, ":n" ) ) | |||
{ | |||
_name = strdup( v ); | |||
name_field->value( _name ); | |||
/* FIXME: bogus */ | |||
if ( name_field ) | |||
name_field->value( _name ); | |||
} | |||
else if ( ! strcmp( s, ":t" ) ) | |||
{ | |||
@@ -152,31 +161,7 @@ public: | |||
/* for loggable */ | |||
LOG_CREATE_FUNC( Track ); | |||
void | |||
draw ( void ) | |||
{ | |||
if ( _selected ) | |||
{ | |||
Fl_Color c = color(); | |||
color( FL_RED ); | |||
Fl_Group::draw(); | |||
color( c ); | |||
} | |||
else | |||
Fl_Group::draw(); | |||
if ( ! name_field->visible() ) | |||
{ | |||
fl_color( FL_WHITE ); | |||
fl_font( FL_HELVETICA, 14 ); | |||
fl_draw( name_field->value(), name_field->x(), name_field->y(), name_field->w(), name_field->h(), FL_ALIGN_CENTER ); | |||
} | |||
} | |||
void add_control( Sequence *t ); | |||
void add ( Control_Sequence *t ); | |||
int size ( void ) const { return _size; } | |||
@@ -239,32 +224,9 @@ public: | |||
// take_menu->remove( t->name() ); | |||
} | |||
int handle ( int m ) | |||
{ | |||
switch ( m ) | |||
{ | |||
case FL_MOUSEWHEEL: | |||
{ | |||
if ( ! Fl::event_shift() ) | |||
return 0; | |||
int d = Fl::event_dy(); | |||
printf( "%d\n", d ); | |||
if ( d < 0 ) | |||
size( size() - 1 ); | |||
else | |||
size( size() + 1 ); | |||
return 1; | |||
} | |||
default: | |||
return Fl_Group::handle( m ); | |||
} | |||
} | |||
void draw ( void ); | |||
int handle ( int m ); | |||
/* Engine */ | |||
nframes_t process ( nframes_t nframes ); | |||