@@ -0,0 +1,52 @@ | |||
/*******************************************************************************/ | |||
/* 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. */ | |||
/*******************************************************************************/ | |||
static const char *event_names[] = | |||
{ | |||
"FL_NO_EVENT", | |||
"FL_PUSH", | |||
"FL_RELEASE", | |||
"FL_ENTER", | |||
"FL_LEAVE", | |||
"FL_DRAG", | |||
"FL_FOCUS", | |||
"FL_UNFOCUS", | |||
"FL_KEYDOWN", | |||
"FL_KEYUP", | |||
"FL_CLOSE", | |||
"FL_MOVE", | |||
"FL_SHORTCUT", | |||
"FL_DEACTIVATE", | |||
"FL_ACTIVATE", | |||
"FL_HIDE", | |||
"FL_SHOW", | |||
"FL_PASTE", | |||
"FL_SELECTIONCLEAR", | |||
"FL_MOUSEWHEEL", | |||
"FL_DND_ENTER", | |||
"FL_DND_DRAG", | |||
"FL_DND_LEAVE", | |||
"FL_DND_RELEASE", | |||
}; | |||
const char * | |||
event_name ( int m ) | |||
{ | |||
return event_names[ m ]; | |||
} |
@@ -0,0 +1,20 @@ | |||
/*******************************************************************************/ | |||
/* 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. */ | |||
/*******************************************************************************/ | |||
const char *event_name ( int m ); |
@@ -0,0 +1,37 @@ | |||
/*******************************************************************************/ | |||
/* 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. */ | |||
/*******************************************************************************/ | |||
/* Fl::test_shortcut() is broken for use in FL_PUSH handlers etc, | |||
* because it relies on Fl::event_text(), which isn't cleared as it | |||
* should be--and there's no official way to clear it. Therefore, we | |||
* provide a test_press() function instead, which, unlike | |||
* test_shortcut(), does not treat a missing FL_SHIFT as "don't care". */ | |||
#include <FL/Fl.H> | |||
int | |||
test_press ( unsigned long e ) | |||
{ | |||
((char *)Fl::event_text())[0] = '\0'; | |||
if ( ! ( e & FL_SHIFT ) ) | |||
return Fl::test_shortcut( e ) && ! Fl::event_shift(); | |||
else | |||
return Fl::test_shortcut( e ); | |||
} |
@@ -0,0 +1,20 @@ | |||
/*******************************************************************************/ | |||
/* 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. */ | |||
/*******************************************************************************/ | |||
int test_press ( unsigned long e ); |
@@ -90,22 +90,26 @@ Annotation_Region::draw ( void ) | |||
} | |||
#include "FL/Fl_Text_Edit_Window.H" | |||
#include "FL/test_press.H" | |||
int | |||
Annotation_Region::handle ( int m ) | |||
{ | |||
Logger _log( this ); | |||
if ( m == FL_PUSH && Fl::test_shortcut( FL_BUTTON3 ) && ! Fl::event_shift() ) | |||
if ( m == FL_PUSH ) | |||
{ | |||
char *s = fl_text_edit( "Annotation text:", "&Save", name() ); | |||
if ( test_press( FL_BUTTON3 ) ) | |||
{ | |||
char *s = fl_text_edit( "Annotation text:", "&Save", name() ); | |||
if ( s ) | |||
name( s ); | |||
if ( s ) | |||
name( s ); | |||
free( s ); | |||
free( s ); | |||
return 0; | |||
return 0; | |||
} | |||
} | |||
int r = Sequence_Region::handle( m ); | |||
@@ -193,6 +193,7 @@ Audio_Region::source_name ( void ) const | |||
} | |||
#include <FL/fl_show_colormap.H> | |||
#include "FL/test_press.H" | |||
int | |||
Audio_Region::handle ( int m ) | |||
@@ -244,7 +245,7 @@ Audio_Region::handle ( int m ) | |||
case FL_PUSH: | |||
{ | |||
/* splitting */ | |||
if ( Fl::test_shortcut( FL_BUTTON2 | FL_SHIFT ) ) | |||
if ( test_press( FL_BUTTON2 | FL_SHIFT ) ) | |||
{ | |||
/* split */ | |||
if ( ! copied ) | |||
@@ -272,13 +273,13 @@ Audio_Region::handle ( int m ) | |||
/* for panning */ | |||
os = _r->offset; | |||
if ( Fl::test_shortcut( FL_BUTTON2 | FL_CTRL ) && ! Fl::event_shift() ) | |||
if ( test_press( FL_BUTTON2 | FL_CTRL ) ) | |||
{ | |||
normalize(); | |||
redraw(); | |||
return 1; | |||
} | |||
else if ( Fl::test_shortcut( FL_BUTTON3 ) && ! Fl::event_shift() ) | |||
else if ( test_press( FL_BUTTON3 ) ) | |||
{ | |||
/* context menu */ | |||
@@ -344,7 +345,7 @@ Audio_Region::handle ( int m ) | |||
_log.hold(); | |||
} | |||
if ( Fl::test_shortcut( FL_BUTTON1 | FL_SHIFT | FL_CTRL ) ) | |||
if ( test_press( FL_BUTTON1 | FL_SHIFT | FL_CTRL ) ) | |||
{ | |||
/* panning */ | |||
int d = (ox + X) - x(); | |||
@@ -273,17 +273,29 @@ Sequence::snap ( Sequence_Widget *r ) | |||
r->start( f ); | |||
} | |||
#include "FL/event_name.H" | |||
int | |||
Sequence::handle ( int m ) | |||
{ | |||
/* if ( m != FL_NO_EVENT ) */ | |||
/* DMESSAGE( "%s", event_name( m ) ); */ | |||
switch ( m ) | |||
{ | |||
case FL_NO_EVENT: | |||
/* garbage from overlay window */ | |||
return 0; | |||
case FL_FOCUS: | |||
case FL_UNFOCUS: | |||
Fl_Widget::handle( m ); | |||
redraw(); | |||
return 1; | |||
case FL_LEAVE: | |||
// DMESSAGE( "leave" ); | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
Fl_Widget::handle( m ); | |||
return 1; | |||
case FL_DND_DRAG: | |||
return 1; | |||
@@ -306,6 +318,8 @@ Sequence::handle ( int m ) | |||
if ( ! event_widget() ) | |||
fl_cursor( cursor() ); | |||
Fl_Widget::handle( m ); | |||
return 1; | |||
case FL_DND_ENTER: | |||
case FL_DND_LEAVE: | |||
@@ -319,29 +333,41 @@ Sequence::handle ( int m ) | |||
{ | |||
if ( Sequence_Widget::belowmouse() ) | |||
Sequence_Widget::belowmouse()->handle( FL_LEAVE ); | |||
Sequence_Widget::belowmouse( r ); | |||
if ( r ) | |||
r->handle( FL_ENTER ); | |||
} | |||
return 0; | |||
return 1; | |||
} | |||
default: | |||
{ | |||
Sequence_Widget *r = Sequence_Widget::pushed() ? Sequence_Widget::pushed() : event_widget(); | |||
/* if ( this == Fl::focus() ) */ | |||
/* DMESSAGE( "Sequence widget = %p", r ); */ | |||
if ( r ) | |||
{ | |||
int retval = r->dispatch( m ); | |||
/* DMESSAGE( "retval = %d", retval ); */ | |||
if ( m == FL_PUSH ) | |||
take_focus(); | |||
if ( retval ) | |||
{ | |||
if ( m == FL_PUSH ) | |||
{ | |||
take_focus(); | |||
if ( Sequence_Widget::pushed() ) | |||
Sequence_Widget::pushed()->handle( FL_UNFOCUS ); | |||
Sequence_Widget::pushed( r ); | |||
r->handle( FL_FOCUS ); | |||
} | |||
else if ( m == FL_RELEASE ) | |||
Sequence_Widget::pushed( NULL ); | |||
@@ -368,7 +394,10 @@ Sequence::handle ( int m ) | |||
Loggable::block_end(); | |||
return retval; | |||
if ( m == FL_PUSH ) | |||
return 1; | |||
else | |||
return retval; | |||
} | |||
else | |||
return Fl_Widget::handle( m ); | |||
@@ -103,6 +103,9 @@ public: | |||
void remove_selected ( void ); | |||
Fl_Color color ( void ) const { return this == Fl::focus() ? fl_color_average( FL_FOREGROUND_COLOR, Fl_Widget::color(), 0.24f ) : Fl_Widget::color(); } | |||
void color ( Fl_Color v ) { Fl_Widget::color( v ); } | |||
const std::list <Sequence_Widget *> widgets ( void ) const { return _widgets; } | |||
void queue_delete ( Sequence_Widget *r ) | |||
@@ -127,7 +127,7 @@ Sequence_Region::trim ( enum trim_e t, int X ) | |||
} | |||
} | |||
#include "FL/test_press.H" | |||
int | |||
Sequence_Region::handle ( int m ) | |||
@@ -168,7 +168,7 @@ Sequence_Region::handle ( int m ) | |||
fl_cursor( FL_CURSOR_WE ); | |||
return 1; | |||
} | |||
else if ( Fl::test_shortcut( FL_BUTTON2 ) && ! Fl::event_shift() ) | |||
else if ( test_press( FL_BUTTON2 ) ) | |||
{ | |||
if ( Sequence_Widget::current() == this ) | |||
{ | |||
@@ -181,7 +181,7 @@ Sequence_Region::handle ( int m ) | |||
redraw(); | |||
return 1; | |||
} | |||
else if ( Fl::test_shortcut( FL_CTRL + FL_BUTTON1 ) && ! Fl::event_shift() ) | |||
else if ( test_press( FL_CTRL + FL_BUTTON1 ) ) | |||
{ | |||
/* duplication */ | |||
fl_cursor( FL_CURSOR_MOVE ); | |||
@@ -233,7 +233,7 @@ Sequence_Region::handle ( int m ) | |||
return 1; | |||
} | |||
} | |||
else if ( Fl::test_shortcut( FL_BUTTON1 ) && ! Fl::event_shift() && ! selected() ) | |||
else if ( test_press( FL_BUTTON1 ) && ! selected() ) | |||
{ | |||
/* track jumping */ | |||
if ( Y > y() + h() || Y < y() ) | |||
@@ -279,6 +279,8 @@ Sequence_Widget::draw_box ( void ) | |||
} | |||
#include "FL/test_press.H" | |||
/* base hanlde just does basic dragging */ | |||
int | |||
Sequence_Widget::handle ( int m ) | |||
@@ -288,7 +290,6 @@ Sequence_Widget::handle ( int m ) | |||
Logger _log( this ); | |||
switch ( m ) | |||
{ | |||
case FL_ENTER: | |||
@@ -301,13 +302,13 @@ Sequence_Widget::handle ( int m ) | |||
case FL_PUSH: | |||
{ | |||
/* deletion */ | |||
if ( Fl::test_shortcut( FL_CTRL + FL_BUTTON3 ) && ! Fl::event_shift() ) | |||
if ( test_press( FL_BUTTON3 + FL_CTRL ) ) | |||
{ | |||
redraw(); | |||
sequence()->queue_delete( this ); | |||
return 1; | |||
} | |||
else if ( Fl::test_shortcut( FL_BUTTON1 ) && ! Fl::event_shift() ) | |||
else if ( test_press( FL_BUTTON1 ) || test_press( FL_BUTTON1 + FL_CTRL ) ) | |||
{ | |||
fl_cursor( FL_CURSOR_MOVE ); | |||
@@ -318,6 +319,7 @@ Sequence_Widget::handle ( int m ) | |||
return 0; | |||
} | |||
case FL_RELEASE: | |||
if ( _drag ) | |||
{ | |||
end_drag(); | |||
@@ -329,17 +331,16 @@ Sequence_Widget::handle ( int m ) | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
Fl::event_key( 0 ); | |||
if ( ! _drag ) | |||
{ | |||
begin_drag ( Drag( x() - X, y() - Y, x_to_offset( X ) ) ); | |||
_log.hold(); | |||
} | |||
if ( ( Fl::test_shortcut( FL_BUTTON1 + FL_CTRL ) || | |||
Fl::test_shortcut( FL_BUTTON1 ) ) && ! Fl::event_shift() ) | |||
else if ( test_press( FL_BUTTON1 ) || test_press( FL_BUTTON1 + FL_CTRL ) ) | |||
{ | |||
// fl_cursor( FL_CURSOR_MOVE ); | |||
redraw(); | |||
const nframes_t of = timeline->x_to_offset( X ); | |||
@@ -382,7 +383,10 @@ Sequence_Widget::handle ( int m ) | |||
return 1; | |||
} | |||
else | |||
{ | |||
DMESSAGE( "unknown" ); | |||
return 0; | |||
} | |||
} | |||
default: | |||
return 0; | |||
@@ -947,6 +947,8 @@ Timeline::track_under ( int Y ) | |||
return NULL; | |||
} | |||
#include "FL/event_name.H" | |||
#include "FL/test_press.H" | |||
int | |||
Timeline::handle ( int m ) | |||
@@ -954,6 +956,12 @@ Timeline::handle ( int m ) | |||
static Drag *drag = NULL; | |||
static bool range = false; | |||
/* if ( m != FL_NO_EVENT ) */ | |||
/* DMESSAGE( "%s", event_name( m ) ); */ | |||
int r = Fl_Overlay_Window::handle( m ); | |||
switch ( m ) | |||
{ | |||
case FL_FOCUS: | |||
@@ -993,19 +1001,20 @@ Timeline::handle ( int m ) | |||
/* keep scrollbar from eating these. */ | |||
return 0; | |||
default: | |||
return Fl_Overlay_Window::handle( m ); | |||
return r; | |||
} | |||
return 0; | |||
} | |||
default: | |||
{ | |||
if ( m == FL_PUSH && this != Fl::focus() ) | |||
take_focus(); | |||
/* if ( m == FL_PUSH ) */ | |||
/* take_focus(); */ | |||
//Fl::focus( this ); | |||
int r = Fl_Overlay_Window::handle( m ); | |||
/* r = Fl_Overlay_Window::handle( m ); */ | |||
if ( m != FL_RELEASE && r ) | |||
return r; | |||
@@ -1017,7 +1026,7 @@ Timeline::handle ( int m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( Fl::test_shortcut( FL_BUTTON1 ) && ! Fl::event_shift() ) | |||
if ( test_press( FL_BUTTON1 ) ) | |||
{ | |||
assert( ! drag ); | |||
@@ -1027,7 +1036,7 @@ Timeline::handle ( int m ) | |||
return 1; | |||
} | |||
else if ( Fl::test_shortcut( FL_BUTTON3 ) && ! Fl::event_shift() ) | |||
else if ( test_press( FL_BUTTON3 ) ) | |||
{ | |||
const Fl_Menu_Item *r = menu->menu()->popup( X, Y, "Timeline" ); | |||
if ( r ) | |||
@@ -470,9 +470,16 @@ Track::draw ( void ) | |||
Fl_Group::draw(); | |||
} | |||
#include "FL/event_name.H" | |||
#include "FL/test_press.H" | |||
int | |||
Track::handle ( int m ) | |||
{ | |||
/* if ( m != FL_NO_EVENT ) */ | |||
/* DMESSAGE( "%s", event_name( m ) ); */ | |||
switch ( m ) | |||
{ | |||
case FL_MOUSEWHEEL: | |||
@@ -493,6 +500,8 @@ Track::handle ( int m ) | |||
} | |||
case FL_PUSH: | |||
{ | |||
Fl::event_key( 0 ); | |||
Logger log( this ); | |||
int X = Fl::event_x(); | |||
@@ -501,7 +510,7 @@ Track::handle ( int m ) | |||
if ( Fl_Group::handle( m ) ) | |||
return 1; | |||
if ( Fl::test_shortcut( FL_BUTTON3 ) && ! Fl::event_shift() && X < Track::width() ) | |||
if ( test_press( FL_BUTTON3 ) && X < Track::width() ) | |||
{ | |||
int c = output.size(); | |||