extern "C" int C_Combox_peek_event(FL_FORM * form, void *xev);
Combox::Combox(combox_type t)
- : type(t)
+ : type(t), tabfolder1(0), tabfolder2(0)
{
browser = button = 0;
callback = 0;
}
-void Combox::add(int x, int y, int w, int hmin, int hmax)
-{
+void Combox::add(int x, int y, int w, int hmin, int hmax,
+ FL_OBJECT * tabfolder1_, FL_OBJECT * tabfolder2_)
+{
+ // Store these for later use in working round an xforms bug in Show()
+ tabfolder1 = tabfolder1_;
+ tabfolder2 = tabfolder2_;
+
FL_OBJECT * obj;
- switch(type) {
+ switch (type) {
case FL_COMBOX_DROPLIST:
{
button = obj = fl_add_button(FL_NORMAL_BUTTON,
fl_set_object_label(button, "@2<-");
fl_redraw_object(button);
}
- int x = label->form->x + label->x, y = label->form->y + label->y;
- fl_set_form_position(form, x, y + label->h);
+
+ int x = label->x;
+ int y = label->y + label->h;
+ if (tabfolder1) {
+ // This is a bug work around suggested by Steve Lamont on the
+ // xforms mailing list. It correctly positions the browser form
+ // after the main window has been moved.
+ // The bug only occurs in tabbed folders.
+ int folder_x, folder_y, folder_w, folder_h;
+ fl_get_folder_area( tabfolder1,
+ &folder_x, &folder_y,
+ &folder_w, &folder_h );
+ x += folder_x;
+ y += folder_y;
+
+ if (tabfolder2) {
+ fl_get_folder_area( tabfolder2,
+ &folder_x, &folder_y,
+ &folder_w, &folder_h );
+ x += tabfolder2->form->x + folder_x;
+ y += tabfolder2->form->y + folder_y;
+ } else {
+ x += tabfolder1->form->x;
+ y += tabfolder1->form->y;
+ }
+
+ } else {
+ x += label->form->x;
+ y += label->form->y;
+ }
+
+ fl_set_form_position(form, x, y);
fl_show_form(form, FL_PLACE_POSITION, FL_NOBORDER, "");
if (sel>0) {
fl_set_browser_topline(browser, sel);
if (static_cast<XEvent*>(xev)->type != KeyPress) return 0;
char s_r[10]; s_r[9] = '\0';
- static int num_bytes;
KeySym keysym_return;
- num_bytes = XLookupString(&static_cast<XEvent*>(xev)->xkey, s_r, 10,
- &keysym_return, 0);
+ XLookupString(&static_cast<XEvent*>(xev)->xkey, s_r, 10,
+ &keysym_return, 0);
XFlush(fl_get_display());
switch (keysym_return) {
case XK_Down: