X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ed2fbeb835854c97d176f8bdfd6f06a84273f5d7..c7c6e54baed01937426239dd38164ee0326fa172:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 78ea9235ac..12b9216ad7 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -30,10 +30,11 @@ #include "wx/textctrl.h" #include "wx/combobox.h" #include "wx/layout.h" + #include "wx/statusbr.h" + #include "wx/math.h" + #include "wx/module.h" #endif -#include "wx/module.h" - #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" #endif @@ -46,14 +47,12 @@ #include "wx/caret.h" #endif // wxUSE_CARET -#include "wx/statusbr.h" #include "wx/fontutil.h" #ifdef __WXDEBUG__ #include "wx/thread.h" #endif -#include "wx/math.h" #include #include "wx/gtk1/private.h" @@ -226,6 +225,11 @@ wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL; // the last click here (extern: used from gtk/menu.cpp) guint32 wxGtkTimeLastClick = 0; +// global variables because GTK+ DnD want to have the +// mouse event that caused it +GdkEvent *g_lastMouseEvent = (GdkEvent*) NULL; +int g_lastButtonNumber = 0; + extern bool g_mainThreadLocked; //----------------------------------------------------------------------------- @@ -826,7 +830,7 @@ static long wxTranslateKeySymToWXKey(KeySym keysym, bool isChar) break; case GDK_KP_Next: // == GDK_KP_Page_Down - key_code = isChar ? WXK_NEXT : WXK_NUMPAD_PAGEDOWN; + key_code = isChar ? WXK_PAGEDOWN : WXK_NUMPAD_PAGEDOWN; break; case GDK_KP_End: @@ -1469,6 +1473,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE; + g_lastButtonNumber = gdk_event->button; + if (win->m_wxwindow && (g_focusWindow != win) && win->AcceptsFocus()) { gtk_widget_grab_focus( win->m_wxwindow ); @@ -1576,6 +1582,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, return FALSE; } + g_lastMouseEvent = (GdkEvent*) gdk_event; + wxMouseEvent event( event_type ); InitMouseEvent( win, event, gdk_event ); @@ -1608,8 +1616,10 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, if (win->GetEventHandler()->ProcessEvent( event )) { gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_press_event" ); + g_lastMouseEvent = NULL; return TRUE; } + g_lastMouseEvent = NULL; if (event_type == wxEVT_RIGHT_DOWN) { @@ -1652,6 +1662,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE; + g_lastButtonNumber = 0; + wxEventType event_type = wxEVT_NULL; switch (gdk_event->button) @@ -1673,6 +1685,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, return FALSE; } + g_lastMouseEvent = (GdkEvent*) gdk_event; + wxMouseEvent event( event_type ); InitMouseEvent( win, event, gdk_event ); @@ -1724,6 +1738,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, gdk_event->y = y; } + g_lastMouseEvent = (GdkEvent*) gdk_event; + /* printf( "OnMotion from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) @@ -1760,13 +1776,15 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, win = FindWindowForMouseEvent(win, event.m_x, event.m_y); } - if (win->GetEventHandler()->ProcessEvent( event )) + bool ret = win->GetEventHandler()->ProcessEvent( event ); + g_lastMouseEvent = NULL; + + if ( ret ) { gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "motion_notify_event" ); - return TRUE; } - return FALSE; + return ret ? TRUE : FALSE; } } @@ -2932,13 +2950,11 @@ void wxWindowGTK::OnInternalIdle() gdk_window_set_cursor( window, cursor.GetCursor() ); } - else + else if ( m_widget ) { - GdkWindow *window = m_widget->window; - if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget))) + if ( window && !GTK_WIDGET_NO_WINDOW(m_widget) ) gdk_window_set_cursor( window, cursor.GetCursor() ); - } } @@ -3415,16 +3431,14 @@ bool wxWindowGTK::SetCursor( const wxCursor &cursor ) { wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") ); - if (cursor == m_cursor) + if ( cursor.IsSameAs(m_cursor) ) return false; if (g_isIdle) wxapp_install_idle_handler(); - if (cursor == wxNullCursor) - return wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ); - else - return wxWindowBase::SetCursor( cursor ); + return wxWindowBase::SetCursor( cursor.IsOk() ? cursor + : *wxSTANDARD_CURSOR ); } void wxWindowGTK::WarpPointer( int x, int y )