diff options
| -rw-r--r-- | fluid/Fl_Type.h | 2 | ||||
| -rw-r--r-- | fluid/Fl_Window_Type.cxx | 5 | ||||
| -rw-r--r-- | fluid/factory.cxx | 11 |
3 files changed, 16 insertions, 2 deletions
diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h index 2ba7e3047..4dedece5e 100644 --- a/fluid/Fl_Type.h +++ b/fluid/Fl_Type.h @@ -643,6 +643,8 @@ public: void copy_properties(); int sr_min_w, sr_min_h, sr_max_w, sr_max_h; + + static int popupx, popupy; }; class Fl_Widget_Class_Type : private Fl_Window_Type { diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx index 62ed479f8..ff196d2e1 100644 --- a/fluid/Fl_Window_Type.cxx +++ b/fluid/Fl_Window_Type.cxx @@ -1176,6 +1176,9 @@ void Fl_Window_Type::moveallchildren() update_xywh(); } +int Fl_Window_Type::popupx = 0x7FFFFFFF; // mark as invalid (MAXINT) +int Fl_Window_Type::popupy = 0x7FFFFFFF; + int Fl_Window_Type::handle(int event) { static Fl_Type* selection; switch (event) { @@ -1187,8 +1190,10 @@ int Fl_Window_Type::handle(int event) { if (Fl::event_button() >= 3) { in_this_only = this; // modifies how some menu items work. static const Fl_Menu_Item* myprev; + popupx = mx; popupy = my; const Fl_Menu_Item* m = New_Menu->popup(mx,my,"New",myprev); if (m && m->callback()) {myprev = m; m->do_callback(this->o);} + popupx = 0x7FFFFFFF; popupy = 0x7FFFFFFF; // mark as invalid (MAXINT) in_this_only = 0; return 1; } diff --git a/fluid/factory.cxx b/fluid/factory.cxx index ecbecef90..803411d3a 100644 --- a/fluid/factory.cxx +++ b/fluid/factory.cxx @@ -979,8 +979,15 @@ static void cb(Fl_Widget *, void *v) { // Move and resize the menubar across the top of the window... wt->o->resize(0, 0, w, h); } else { - // Just resize to the ideal size... - wt->o->size(w, h); + if (Fl_Window_Type::popupx != 0x7FFFFFFF) { + // If this callback was called from the RMB popup menu in a window, + // popupx and popupy will contain the mouse coordinates at RMB event. + wt->o->resize(Fl_Window_Type::popupx, Fl_Window_Type::popupy, w, h); + } else { + // If popupx is invalid, use the default position and find a good + // size for the widget. + wt->o->size(w, h); + } } } select_only(t); |
