X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2FDropDown.C;h=6d8791e12a78f0b6f658a236aca0ab2b6534f689;hb=27652900a60fd078f161ce866ddaed21dba21eff;hp=455b20e22023efd97ee089d596654e9275f0fa87;hpb=fcee90ebd5070ca5fbc21ec3eb28d741ebacdbf9;p=lyx.git diff --git a/src/frontends/xforms/DropDown.C b/src/frontends/xforms/DropDown.C index 455b20e220..6d8791e12a 100644 --- a/src/frontends/xforms/DropDown.C +++ b/src/frontends/xforms/DropDown.C @@ -6,23 +6,31 @@ * \author John Levon */ +#include + #include "DropDown.h" +#include "xforms_helpers.h" #include +#include -extern "C" void C_DropDownCompletedCB(FL_OBJECT * ob, long) +namespace { + +extern "C" void C_CompletedCB(FL_OBJECT * ob, long) { - DropDown * d = static_cast(ob->form->u_vdata); + DropDown * d = static_cast(ob->u_vdata); d->completed(); } -extern "C" int C_DropDownPeekEventCB(FL_FORM * form, void *xev) +extern "C" int C_PeekCB(FL_FORM * form, void *xev) { DropDown * d = static_cast(form->u_vdata); return d->peek(static_cast(xev)); } +} // namespace anon + DropDown::DropDown(LyXView * lv, FL_OBJECT * ob) : lv_(lv) @@ -31,8 +39,9 @@ DropDown::DropDown(LyXView * lv, FL_OBJECT * ob) fl_add_box(FL_UP_BOX, 0, 0, ob->w, 100, ""); browser_ = fl_add_browser(FL_SELECT_BROWSER, 0, 0, ob->w, 100, ""); form_->u_vdata = this; - fl_set_browser_dblclick_callback(browser_, C_DropDownCompletedCB, 0); - fl_register_raw_callback(form_, KeyPressMask|ButtonPressMask, C_DropDownPeekEventCB); + browser_->u_vdata = this; + fl_set_object_callback(browser_, C_CompletedCB, 0); + fl_register_raw_callback(form_, KeyPressMask|ButtonPressMask, C_PeekCB); fl_end_form(); } @@ -47,12 +56,16 @@ DropDown::~DropDown() void DropDown::select(std::vector const & choices, int x, int y, int w) { - fl_set_form_geometry(form_, x, y, w, 100); + if (choices.empty()) + return; + + fl_set_form_geometry(form_, x, y-100, w, 100); fl_clear_browser(browser_); for (std::vector::const_iterator cit = choices.begin(); cit != choices.end(); ++cit) { fl_add_browser_line(browser_, cit->c_str()); } + fl_select_browser_line(browser_, 1); fl_show_form(form_, FL_PLACE_POSITION, FL_NOBORDER, ""); XGrabPointer(fl_get_display(), form_->window, false, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, @@ -116,7 +129,7 @@ int DropDown::peek(XEvent * xev) completed(); return 1; case XK_Escape: - fl_select_browser_line(browser_, 0); + fl_deselect_browser(browser_); completed(); return 1; default: @@ -124,9 +137,13 @@ int DropDown::peek(XEvent * xev) // convince the event to fall back to the // minibuffer, I'm glad to hear it. // fl_XPutBackEvent() doesn't work. - fl_select_browser_line(browser_, 0); - completed(); - return 1; + + // This is a bit less elegant perhaps, but works + // well enough. Angus 11 Jan 2002 + if (s_r[0] && isprint(s_r[0])) { + key_pressed(s_r[0]); + return 1; + } } } return 0; @@ -136,13 +153,14 @@ int DropDown::peek(XEvent * xev) void DropDown::completed() { XUngrabPointer(fl_get_display(), CurrentTime); - string selection; - int i = fl_get_browser(browser_); - if (i < 1) - selection = ""; - else - selection = fl_get_browser_line(browser_, i); fl_hide_form(form_); + result.emit(getSelectedStringFromBrowser(browser_)); +} + - result.emit(selection); +void DropDown::key_pressed(char c) +{ + XUngrabPointer(fl_get_display(), CurrentTime); + fl_hide_form(form_); + keypress.emit(c); }