Hello,
Thank you for the reply. After reading through your code, I still can't 
figure out a solution to my problem.

In your code you dismiss the popup window as soon as the user interacts 
outside the popups area, and release the grab. That is not the behaviour 
I'm looking for.

I am trying to let the user interact both with the green and yellow 
window (in my example application) at the same time. And more, at the 
same time I want the green window act like a modal window to the rest of 
the application (the grey window).

I don't understand how I can use grab to let the user interact with both 
windows. Got time to explain a little more in detail how I could solve 
it? I am unable to figure it out when reading the code you posted, but 
maybe it's in there and I'm just not "getting it"..

Thank you in advance for any help!
/Daniel

matthiasm skrev:
> 
> On Jul 8, 2007, at 3:50 PM, Daniel Polski wrote:
> 
>>
>> Hello,
>> I am trying to create a menu-like window which pops up when the user
>> interacts with a search field in a modal window.
> 
> You have to do some trickery with grab(). Here is some working code (LGPL):
> 
> 
> ------- Flmm_Popup_Window.H ------
> 
> /** \class Flmm_Popup_Window
> *  A container for Menu Windows that are more complex than a menu pulldown.
> *
> * The Popup Window behaves like a popup menu, but will vanish as
> * soon as the user clicks outside of the menu area. This way, the
> * Popup can contain a rather complex UI without the overhead of
> * a full fledged dialog box.
> *
> * \todo add a 'popup()' function that will set all needed attributes
> *
> * \author Matthias Melcher
> */
> 
> #include "../FL/Flmm_Popup_Window.H"
> 
> 
> Flmm_Popup_Window::Flmm_Popup_Window( int W, int H, char *L)
> : Fl_Window(0, 0, W, H, L)
> {
>   done = 0;
>   focus_x = focus_y = 0;
>   clear_border();
>   box(FL_UP_BOX);
>   set_non_modal();
> }
> 
> 
> char Flmm_Popup_Window::popup(int x, int y)
> {
>   if (x==999999)
>     x = Fl::event_x_root();
>   if (y==999999)
>     y = Fl::event_y_root();
>   position(x-focus_x, y-focus_y);
>   Fl_Window::show();
>   Fl::grab(this);
>   while (visible()) {
>     Fl::wait();
>   }
>   Fl::release();
>   return 1;
> }
> 
> 
> void Flmm_Popup_Window::show() {
>   popup();
> }
> 
> 
> void Flmm_Popup_Window::focus(int x, int y)
> {
>   focus_x = x;
>   focus_y = y;
> }
> 
> 
> void Flmm_Popup_Window::focus(Fl_Widget const* const w)
> {
>   if (w)
>     focus(w->x()+w->w()/2, w->y()+w->h()/2);
> }
> 
> 
> int Flmm_Popup_Window::handle(int ev)
> {
>   if (ev == FL_KEYBOARD && Fl::focus()) {
>     if (Fl::focus()->handle(ev)==1)
>       return 1;
>     if (Fl::focus()->handle(FL_SHORTCUT)==1)
>       return 1;
>     if (Fl::event_key()==FL_Escape) {
>       if (callback())
>         do_callback();
>       return 1;
>     }
>   } else if (ev == FL_PUSH) {
>     int ex = Fl::event_x(), ey = Fl::event_y();
>     if ( ex<0 || ey<0 || ex>w() || ey>h() ) {
>       hide();
>       if (callback())
>         do_callback();
>       return 1;
>     }
>     Fl_Window *pg = Fl::grab_;
>     Fl::grab_ = 0;
>     Fl_Window::handle(ev);
>     Fl::grab_ = pg;
>     return 1;
>   }
>   return Fl_Window::handle(ev);
> }
> 
> ------- Flmm_Popup_Window.H ------
> 
> #ifndef _FLMM_POPUP_WINDOW_H_
> #define _FLMM_POPUP_WINDOW_H_
> 
> #include <Fl/Fl.H>
> #include <Fl/Fl_Window.H>
> 
> class Flmm_Popup_Window : public Fl_Window
> {
> public:
>   Flmm_Popup_Window( int W, int H, char *L = 0L );
>   char popup(int x=999999, int y=999999);
>   void focus(int x, int y);
>   void focus(Fl_Widget const* const w);
> 
> protected:
>   int handle( int );
>   void show();
>   char done;
>   int focus_x, focus_y;
> };
> 
> #endif
> 
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to