#include "wx/settings.h"
#include "wx/log.h"
#include "wx/fontutil.h"
+#include "wx/stattext.h"
#ifdef __WXDEBUG__
#include "wx/thread.h"
#include "wx/math.h"
#include <ctype.h>
+// FIXME: Due to a hack we use GtkCombo in here, which is deprecated since gtk2.3.0
+#include <gtk/gtkversion.h>
+#if defined(GTK_DISABLE_DEPRECATED) && GTK_CHECK_VERSION(2,3,0)
+#undef GTK_DISABLE_DEPRECATED
+#endif
+
#include "wx/gtk/private.h"
#include <gdk/gdkprivate.h>
#include <gdk/gdkkeysyms.h>
win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
}
+ if ( !g_captureWindow )
+ {
+ wxSetCursorEvent cevent( event.m_x, event.m_y );
+ if (win->GetEventHandler()->ProcessEvent( cevent ))
+ {
+ // Rewrite cursor handling here (away from idle).
+ }
+ }
+
if (win->GetEventHandler()->ProcessEvent( event ))
{
g_signal_stop_emission_by_name (widget, "motion_notify_event");
}
extern "C" {
-static gint gtk_window_focus_in_callback( GtkWidget *widget,
- GdkEvent *WXUNUSED(event),
- wxWindow *win )
+static gboolean gtk_window_focus_in_callback( GtkWidget *widget,
+ GdkEvent *WXUNUSED(event),
+ wxWindow *win )
{
DEBUG_MAIN_THREAD
}
#endif // wxUSE_CARET
+ gboolean ret = FALSE;
+
// does the window itself think that it has the focus?
if ( !win->m_hasFocus )
{
// not yet, notify it
win->m_hasFocus = true;
- if ( DoSendFocusEvents(win) )
- {
- g_signal_stop_emission_by_name (widget, "focus_in_event");
- return TRUE;
- }
+ (void)DoSendFocusEvents(win);
+
+ ret = true;
}
- return FALSE;
+ // Disable default focus handling for custom windows
+ // since the default GTK+ handler issues a repaint
+ if (win->m_wxwindow)
+ return ret;
+
+ return false;
}
}
//-----------------------------------------------------------------------------
extern "C" {
-static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk_event, wxWindowGTK *win )
+static gboolean gtk_window_focus_out_callback( GtkWidget *widget,
+ GdkEventFocus *gdk_event,
+ wxWindowGTK *win )
{
DEBUG_MAIN_THREAD
}
#endif // wxUSE_CARET
+ gboolean ret = FALSE;
+
// don't send the window a kill focus event if it thinks that it doesn't
// have focus already
if ( win->m_hasFocus )
wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() );
event.SetEventObject( win );
- // even if we did process the event in wx code, still let GTK itself
- // process it too as otherwise bad things happen, especially in GTK2
- // where the text control simply aborts the program if it doesn't get
- // the matching focus out event
(void)win->GetEventHandler()->ProcessEvent( event );
+
+ ret = true;
}
-
- return FALSE;
+
+ // Disable default focus handling for custom windows
+ // since the default GTK+ handler issues a repaint
+ if (win->m_wxwindow)
+ return ret;
+
+ return false;
}
}
//-----------------------------------------------------------------------------
extern "C" {
-static
-gint gtk_window_enter_callback( GtkWidget *widget,
- GdkEventCrossing *gdk_event,
- wxWindowGTK *win )
+static gboolean
+gtk_window_enter_callback( GtkWidget *widget,
+ GdkEventCrossing *gdk_event,
+ wxWindowGTK *win )
{
DEBUG_MAIN_THREAD
event.m_x = x + pt.x;
event.m_y = y + pt.y;
+ if ( !g_captureWindow )
+ {
+ wxSetCursorEvent cevent( event.m_x, event.m_y );
+ if (win->GetEventHandler()->ProcessEvent( cevent ))
+ {
+ // Rewrite cursor handling here (away from idle).
+ }
+ }
+
if (win->GetEventHandler()->ProcessEvent( event ))
{
g_signal_stop_emission_by_name (widget, "enter_notify_event");
//-----------------------------------------------------------------------------
extern "C" {
-static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindowGTK *win )
+static gboolean
+gtk_window_leave_callback( GtkWidget *widget,
+ GdkEventCrossing *gdk_event,
+ wxWindowGTK *win )
{
DEBUG_MAIN_THREAD
g_signal_connect (m_wxwindow, "expose_event",
G_CALLBACK (gtk_window_expose_callback), this);
- // gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), !HasFlag( wxFULL_REPAINT_ON_RESIZE ) );
+ gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), HasFlag( wxFULL_REPAINT_ON_RESIZE ) );
}
// Create input method handler
if (m_focusWidget == NULL)
m_focusWidget = m_widget;
- g_signal_connect (m_focusWidget, "focus_in_event",
+ if (m_wxwindow)
+ {
+ g_signal_connect (m_focusWidget, "focus_in_event",
G_CALLBACK (gtk_window_focus_in_callback), this);
- g_signal_connect_after (m_focusWidget, "focus_out_event",
+ g_signal_connect (m_focusWidget, "focus_out_event",
G_CALLBACK (gtk_window_focus_out_callback), this);
+ }
+ else
+ {
+ g_signal_connect_after (m_focusWidget, "focus_in_event",
+ G_CALLBACK (gtk_window_focus_in_callback), this);
+ g_signal_connect_after (m_focusWidget, "focus_out_event",
+ G_CALLBACK (gtk_window_focus_out_callback), this);
+ }
}
// connect to the various key and mouse handlers
{
if ( !m_children.empty() )
{
+#if wxUSE_STATTEXT
+ // we don't only construct the correct focus chain but also use
+ // this opportunity to update the mnemonic widgets for all labels
+ //
+ // it would be nice to extract this code from here and put it in
+ // stattext.cpp to reduce dependencies but there is no really easy
+ // way to do it unfortunately
+ wxStaticText *lastLabel = NULL;
+#endif // wxUSE_STATTEXT
+
GList *chain = NULL;
for ( wxWindowList::const_iterator i = m_children.begin();
i != m_children.end();
++i )
{
- chain = g_list_prepend(chain, (*i)->m_widget);
+ wxWindowGTK *win = *i;
+#if wxUSE_STATTEXT
+ if ( lastLabel )
+ {
+ if ( win->AcceptsFocusFromKeyboard() )
+ {
+ GtkLabel *l = GTK_LABEL(lastLabel->m_widget);
+ gtk_label_set_mnemonic_widget(l, win->m_widget);
+ lastLabel = NULL;
+ }
+ }
+ else // check if this one is a label
+ {
+ lastLabel = wxDynamicCast(win, wxStaticText);
+ }
+#endif // wxUSE_STATTEXT
+
+ chain = g_list_prepend(chain, win->m_widget);
}
chain = g_list_reverse(chain);
gdk_window_warp_pointer( window, x, y );
}
+static bool wxScrollAdjust(GtkAdjustment* adj, double change)
+{
+ double value_start = adj->value;
+ double value = value_start + change;
+ double upper = adj->upper - adj->page_size;
+ if (value > upper)
+ {
+ value = upper;
+ }
+ // Lower bound will be checked by gtk_adjustment_set_value
+ gtk_adjustment_set_value(adj, value);
+ return adj->value != value_start;
+}
+
+bool wxWindowGTK::ScrollLines(int lines)
+{
+ return
+ m_vAdjust != NULL &&
+ wxScrollAdjust(m_vAdjust, lines * m_vAdjust->step_increment);
+}
+
+bool wxWindowGTK::ScrollPages(int pages)
+{
+ return
+ m_vAdjust != NULL &&
+ wxScrollAdjust(m_vAdjust, pages * m_vAdjust->page_increment);
+}
+
+void wxWindowGTK::SetVScrollAdjustment(GtkAdjustment* adj)
+{
+ wxASSERT(m_vAdjust == NULL);
+ m_vAdjust = adj;
+}
void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
{