Re: propogating events not handled by the grab window



for what it's worth, I was forgetting the need for widget.add_grab(),
apparently grab_pointer is insufficient by itself.

--
Darren

On Tue, Oct 21, 2008 at 9:56 PM, Darren Hart <darren dvhart com> wrote:
> I've written a custom widget which pops up a
> gtk.Window(gtk.WINDOW_POPUP) when the toggle button is pressed.  I'm
> struggling with the owner_events argument to pointer_grab.  If I set
> it to True, then my window will stay popped up if I click on active
> areas of my main window (i/e/ widgets and not just dead space between
> widgets).  If I set it to False, then it disappears as it should, but
> if I click on any of the controls in the popup, nothing happens.  I
> thought that by returning False from the popup_button_press handler,
> that the event should be propogated to the child widgets... but
> apparently not.
>
> What can I do so that if I click anywhere outside the popup the
> window, the popup window will close, and if I click inside the popup
> window, the appropriate child widget will receive the event?  I've
> pasted what I believe to be the relevant buts below:
>
> (my example is in python, but I think the concept applies to any
> language binding, and I'm not getting a response in pygtk-landia)
>
>   def _hide_popup(self):
>       self._popup.hide()
>       self._popup.grab_remove()
>       self.set_active(False)
>
>   def _show_popup(self):
>       x, y = self.window.get_origin()
>       x += self.get_allocation().x
>       y += self.get_allocation().y + self.get_allocation().height
>       self._popup.move(x, y)
>       self._popup.show_all()
>       # FIXME: would like second arg to be False, but then the event
> doesn't get
>       # handled if it lands on the popup window... weird...
>       gdk.pointer_grab(self._popup.window, True,
>                        gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK)
>
>   def _on_popup_button_press(self, popup, event):
>       w, h = popup.get_size()
>       x = event.x
>       y = event.y
>       if x < 0 or x > w or y < 0 or y > h:
>           self._hide_popup()
>           return True
>       # FIXME: this doesn't seem to propogate the events...
>       return False
>
>
> Thanks for looking!
>
> --
> Darren Hart
>



-- 
Darren Hart


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]