]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/combox.C
fix crash with "save as"
[lyx.git] / src / frontends / xforms / combox.C
index d181c92061f3ca3a4a75faac3c5770caf85fa607..6100cdf17e5bafab854e57832d335b49d543155d 100644 (file)
@@ -1,10 +1,12 @@
 /**
  * \file combox.C
- * Copyright 1996-2002 The LyX Team.
  * Copyright 1996Alejandro Aguilar Sierra
- * See the file COPYING.
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
  * \author Alejandro Aguilar Sierra
+ *
+ * Full author contact details are available in file CREDITS
  */
 
 /* A combination of two objects (a button and a browser) is encapsulated to
@@ -69,7 +71,7 @@ extern "C" {
 
 
 Combox::Combox(combox_type t)
-       : type(t), tabfolder1(0), tabfolder2(0)
+       : type(t)
 {
    browser = button = 0;
    callback = 0;
@@ -84,7 +86,8 @@ Combox::Combox(combox_type t)
 
 Combox::~Combox()
 {
-   remove();
+       // This is now handled by the XFormsView destructor (Lgb)
+       // remove();
 }
 
 
@@ -176,13 +179,8 @@ void Combox::select(int i)
 }
 
 
-void Combox::add(int x, int y, int w, int hmin, int hmax,
-                FL_OBJECT * tabfolder1_, FL_OBJECT * tabfolder2_)
+void Combox::add(int x, int y, int w, int hmin, int hmax)
 {
-       // Store these for later use in working round an xforms bug in show()
-       tabfolder1 = tabfolder1_;
-       tabfolder2 = tabfolder2_;
-
        FL_OBJECT * obj;
 
        switch (type) {
@@ -284,36 +282,20 @@ void Combox::show()
                fl_redraw_object(button);
        }
 
-       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;
+       // This fix ensures that, even if label lies on a tabfolder,
+       // the x,y coords of the underlying form are up to date.
+       // It should be rendered redundant by a similar fix in the
+       // tabfolder prehandler, but apparently "enter" events are not always
+       // caught...
+       // Angus 4 Oct, 2002.
+       if (label->form->window) {
+               FL_FORM * lf = label->form;
+               fl_get_winorigin(lf->window, &(lf->x), &(lf->y));
        }
 
+       int const x = label->form->x + label->x;
+       int const y = label->form->y + label->y + label->h;
+
        fl_set_form_position(form, x, y);
        fl_show_form(form, FL_PLACE_POSITION, FL_NOBORDER, "");
        if (sel > 0) {
@@ -459,6 +441,9 @@ int Combox::peek_event(FL_FORM * form, void * xev)
        XFlush(fl_get_display());
        switch (keysym_return) {
        case XK_Down:
+#ifdef XK_KP_Down
+       case XK_KP_Down:
+#endif
                if (fl_get_browser(combo->browser) <
                    fl_get_browser_maxline(combo->browser))
                        fl_select_browser_line(combo->browser,
@@ -475,6 +460,9 @@ int Combox::peek_event(FL_FORM * form, void * xev)
                                               fl_get_browser(combo->browser));
                return 1;
        case XK_Up:
+#ifdef XK_KP_Up
+       case XK_KP_Up:
+#endif
                if (fl_get_browser(combo->browser) > 1)
                        fl_select_browser_line(combo->browser,
                                               fl_get_browser(combo->browser)-1);
@@ -490,6 +478,9 @@ int Combox::peek_event(FL_FORM * form, void * xev)
                                               fl_get_browser(combo->browser));
                return 1;
        case XK_Return:
+#ifdef XK_KP_Enter
+       case XK_KP_Enter:
+#endif
                combo->hide();
                return 1;
        case XK_Escape: