X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8f9850dd777bea1b661d9a0aa94c1fa42e05bbfd..0d045709bcd64c28a155a2a9fb29d95f56a0ff7b:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index a772737691..a9a67e6c68 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -210,9 +210,10 @@ wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL; // yet, defer setting the focus to idle time. wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL; -// Save the last mouse event for drag start -GdkEvent *g_lastMouseEvent = (GdkEvent*) NULL; -int g_lastButtonNumber = 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; @@ -330,13 +331,13 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win ) int x = dx; int y = dy; - + int dw = 0; int dh = 0; if (win->m_hasScrolling) { GetScrollbarWidth(widget, dw, dh); - + if (win->GetLayoutDirection() == wxLayout_RightToLeft) { // This is actually wrong for old GTK+ version @@ -450,7 +451,7 @@ void wxgtk_combo_size_request_callback(GtkWidget *widget, button_req.height = 2; (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(gcombo->button) )->size_request ) (gcombo->button, &button_req ); - + requisition->width = w - button_req.width; requisition->height = entry_req.height; } @@ -1157,7 +1158,7 @@ gtk_wxwindow_commit_cb (GtkIMContext *context, window, window->m_imData->lastKeyEvent); } - const wxWxCharBuffer data(wxGTK_CONV_BACK(str)); + const wxWxCharBuffer data(wxGTK_CONV_BACK_SYS(str)); if( !data ) return; @@ -1276,7 +1277,7 @@ template void InitMouseEvent(wxWindowGTK *win, wxPoint pt = win->GetClientAreaOrigin(); event.m_x = (wxCoord)gdk_event->x - pt.x; event.m_y = (wxCoord)gdk_event->y - pt.y; - + if ((win->m_wxwindow) && (win->GetLayoutDirection() == wxLayout_RightToLeft)) { // origin in the upper right corner @@ -1585,7 +1586,7 @@ gtk_window_button_press_callback( GtkWidget *widget, } g_lastMouseEvent = (GdkEvent*) gdk_event; - + wxMouseEvent event( event_type ); InitMouseEvent( win, event, gdk_event ); @@ -1605,10 +1606,10 @@ gtk_window_button_press_callback( GtkWidget *widget, event.SetEventObject( win ); event.SetId( win->GetId() ); - if (win->GTKProcessEvent( event )) - { + bool ret = win->GTKProcessEvent( event ); + g_lastMouseEvent = NULL; + if ( ret ) return TRUE; - } if (event_type == wxEVT_RIGHT_DOWN) { @@ -1665,7 +1666,7 @@ gtk_window_button_release_callback( GtkWidget *widget, } g_lastMouseEvent = (GdkEvent*) gdk_event; - + wxMouseEvent event( event_type ); InitMouseEvent( win, event, gdk_event ); @@ -1681,7 +1682,11 @@ gtk_window_button_release_callback( GtkWidget *widget, event.SetEventObject( win ); event.SetId( win->GetId() ); - return win->GTKProcessEvent(event); + bool ret = win->GTKProcessEvent(event); + + g_lastMouseEvent = NULL; + + return ret; } //----------------------------------------------------------------------------- @@ -1749,7 +1754,11 @@ gtk_window_motion_notify_callback( GtkWidget *widget, } } - return win->GTKProcessEvent(event); + bool ret = win->GTKProcessEvent(event); + + g_lastMouseEvent = NULL; + + return ret; } //----------------------------------------------------------------------------- @@ -2128,17 +2137,12 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget), if ((client_width == win->m_oldClientWidth) && (client_height == win->m_oldClientHeight)) return; -#if 0 - wxPrintf( wxT("size_allocate ") ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - wxPrintf( win->GetClassInfo()->GetClassName() ); - wxPrintf( wxT(" %d %d %d %d\n"), - alloc->x, - alloc->y, - alloc->width, - alloc->height ); -#endif - + if ( !client_width && !client_height ) + { + // the window is currently unmapped, don't generate size events + return; + } + win->m_oldClientWidth = client_width; win->m_oldClientHeight = client_height; @@ -2339,7 +2343,7 @@ bool wxWindowGTK::Create( wxWindow *parent, scrolledWindow->hscrollbar_visible = TRUE; scrolledWindow->vscrollbar_visible = TRUE; - } + } else { gtk_scrolled_window_set_policy( scrolledWindow, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); @@ -2547,7 +2551,7 @@ void wxWindowGTK::PostCreation() // FIXME: what should be done here ? } #endif - else + else if ( !IsTopLevel() ) // top level windows use their own callback { // This is needed if we want to add our windows into native // GTK controls, such as the toolbar. With this callback, the @@ -2605,7 +2609,7 @@ void wxWindowGTK::DoMoveWindow(int x, int y, int width, int height) { // inform the parent to perform the move gtk_pizza_set_size( GTK_PIZZA(m_parent->m_wxwindow), m_widget, x, y, width, height ); - + } void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags ) @@ -2944,10 +2948,10 @@ void wxWindowGTK::DoClientToScreen( int *x, int *y ) const { if (GetLayoutDirection() == wxLayout_RightToLeft) *x = (GetClientSize().x - *x) + org_x; - else + else *x += org_x; } - + if (y) *y += org_y; } @@ -2980,7 +2984,7 @@ void wxWindowGTK::DoScreenToClient( int *x, int *y ) const { if (GetLayoutDirection() == wxLayout_RightToLeft) *x = (GetClientSize().x - *x) - org_x; - else + else *x -= org_x; } if (y) *y -= org_y; @@ -3205,7 +3209,7 @@ void wxWindowGTK::SetFocus() gtk_widget_grab_focus (m_widget); return; } - + gtk_widget_child_focus( m_widget, GTK_DIR_TAB_FORWARD ); } else @@ -3364,7 +3368,7 @@ void wxWindowGTK::SetLayoutDirection(wxLayoutDirection dir) return; GTKSetLayout(m_widget, dir); - + if (m_wxwindow) GTKSetLayout(m_wxwindow, dir); } @@ -3613,7 +3617,7 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect ) { p = NULL; } - + gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, p, TRUE ); } } @@ -3678,11 +3682,11 @@ void wxWindowGTK::GtkSendPaintEvents() { // Transform m_updateRegion under RTL m_updateRegion.Clear(); - + gint width; gdk_window_get_geometry( GTK_PIZZA(m_wxwindow)->bin_window, NULL, NULL, &width, NULL, NULL ); - + wxRegionIterator upd( m_nativeUpdateRegion ); while (upd) { @@ -3691,14 +3695,14 @@ void wxWindowGTK::GtkSendPaintEvents() rect.y = upd.GetY(); rect.width = upd.GetWidth(); rect.height = upd.GetHeight(); - + rect.x = width - rect.x - rect.width; m_updateRegion.Union( rect ); - + ++upd; } } - + // widget to draw on GtkPizza *pizza = GTK_PIZZA (m_wxwindow); @@ -4142,7 +4146,7 @@ void wxWindowGTK::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) if (pos < 0) pos = 0; m_scrollPos[dir] = adj->value = pos; - + // If a "value_changed" signal emission is not already in progress if (!m_blockValueChanged[dir]) { @@ -4195,9 +4199,9 @@ wxEventType wxWindowGTK::GetScrollEventType(GtkRange* range) const int barIndex = range == m_scrollBar[1]; GtkAdjustment* adj = range->adjustment; - + const int value = int(adj->value + 0.5); - + // save previous position const double oldPos = m_scrollPos[barIndex]; // update current position @@ -4258,19 +4262,19 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) if (dx > 0) caretRect.width += dx; else - { + { caretRect.x += dx; caretRect.width -= dx; - } + } if (dy > 0) caretRect.height += dy; else - { + { caretRect.y += dy; caretRect.height -= dy; - } - + } + RefreshRect(caretRect); } -#endif +#endif // wxUSE_CARET } void wxWindowGTK::GtkScrolledWindowSetBorder(GtkWidget* w, int wxstyle)