// must do shortcuts first or the scrollbar
will get them...
if (event == FL_ENTER || event == FL_LEAVE) return
1;
if (event == FL_KEYBOARD && type()
>= FL_HOLD_BROWSER) {
void* l1 = selection_;
void* l = l1; if (!l) l = top_; if (!l) l =
item_first();
if (l) {
if (type()==FL_HOLD_BROWSER) {
switch (Fl::event_key()) {
case FL_Down:
while ((l = item_next(l))) {
if (item_height(l)>0) {select_only(l,
when()); break;}
}
return 1;
case FL_Up:
while ((l = item_prev(l))) {
if (item_height(l)>0) {
select_only(l, when());
break; // no need to test wp (return 1)
}
}
return 1;
}
} else {
switch (Fl::event_key()) {
case FL_Enter:
case FL_KP_Enter:
select_only(l, when() &
~FL_WHEN_ENTER_KEY);
if (wp.deleted()) return 1;
if (when() & FL_WHEN_ENTER_KEY) {
set_changed();
do_callback();
}
The line "if (event == FL_ENTER || event == FL_LEAVE) return 1;
prohibits the execution of the later do_callback when FL_WHEN_ENTER_KEY
This prevents using the FL_Enter key in a
user callback.
David
I really wanted to process ENTER, DELETE, LEFT and RIGHT keyboard events at the callback level
header file:
#ifndef FL_BROWSER2_
#define FL_BROWSER2_
#include <FL/Fl_Browser.H>
class Fl_Browser2 : public Fl_Browser
{
public:
Fl_Browser2(int x, int y, int w, int h, const char* l = 0);
int handle(int event);
};
#endif // FL_BROWSER2_
class implementation:
Fl_Browser2::Fl_Browser2(int x, int y, int w, int h, const char*
l)
: Fl_Browser(x, y, w, h, l)
{
}
int Fl_Browser2::handle(int event)
{
int key = Fl::event_key();
if (event == FL_KEYUP &&
( key == FL_Enter ||
key == FL_Left ||
key == FL_Right ||
key == FL_Delete ) ) {
do_callback();
return 1;
}
return Fl_Browser::handle(event);
}