}
};
+namespace
+{
+
+// Send wxEVT_CHAR_HOOK event to the parent of the window and if it wasn't
+// processed, send wxEVT_CHAR to the window itself. Return true if either of
+// them was handled.
+bool
+SendCharHookAndCharEvents(const wxKeyEvent& event, wxWindow *win)
+{
+ // wxEVT_CHAR_HOOK must be sent to the top level parent window to allow it
+ // to handle key events in all of its children.
+ wxWindow * const parent = wxGetTopLevelParent(win);
+ if ( parent )
+ {
+ // We need to make a copy of the event object because it is
+ // modified while it's handled, notably its WasProcessed() flag
+ // is set after it had been processed once.
+ wxKeyEvent eventCharHook(event);
+ eventCharHook.SetEventType(wxEVT_CHAR_HOOK);
+ if ( parent->HandleWindowEvent(eventCharHook) )
+ return true;
+ }
+
+ // As above, make a copy of the event first.
+ wxKeyEvent eventChar(event);
+ eventChar.SetEventType(wxEVT_CHAR);
+ return win->HandleWindowEvent(eventChar);
+}
+
+} // anonymous namespace
+
extern "C" {
static gboolean
gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget),
#endif
}
- // Implement OnCharHook by checking ancestor top level windows
- wxWindow *parent = win;
- while (parent && !parent->IsTopLevel())
- parent = parent->GetParent();
- if (parent)
- {
- event.SetEventType( wxEVT_CHAR_HOOK );
- ret = parent->HandleWindowEvent( event );
- }
-
- if (!ret)
- {
- event.SetEventType(wxEVT_CHAR);
- ret = win->HandleWindowEvent( event );
- }
+ ret = SendCharHookAndCharEvents(event, win);
}
}
if( data.empty() )
return;
- bool ret = false;
-
- // Implement OnCharHook by checking ancestor top level windows
- wxWindow *parent = window;
- while (parent && !parent->IsTopLevel())
- parent = parent->GetParent();
-
for( wxString::const_iterator pstr = data.begin(); pstr != data.end(); ++pstr )
{
#if wxUSE_UNICODE
#endif
}
- if (parent)
- {
- event.SetEventType( wxEVT_CHAR_HOOK );
- ret = parent->HandleWindowEvent( event );
- }
-
- if (!ret)
- {
- event.SetEventType(wxEVT_CHAR);
- ret = window->HandleWindowEvent( event );
- }
+ SendCharHookAndCharEvents(event, window);
}
}
}
}
}
- int border_x, border_y;
- WX_PIZZA(m_wxwindow)->get_border_widths(border_x, border_y);
- w -= 2 * border_x;
- h -= 2 * border_y;
+ const wxSize sizeBorders = DoGetBorderSize();
+ w -= sizeBorders.x;
+ h -= sizeBorders.y;
if (w < 0)
w = 0;
if (height) *height = h;
}
+wxSize wxWindowGTK::DoGetBorderSize() const
+{
+ if ( !m_wxwindow )
+ return wxWindowBase::DoGetBorderSize();
+
+ int x, y;
+ WX_PIZZA(m_wxwindow)->get_border_widths(x, y);
+
+ return 2*wxSize(x, y);
+}
+
void wxWindowGTK::DoGetPosition( int *x, int *y ) const
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );