X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/788f963310416aebe5bad900b29f07ca2f327d21..1c1ad00573fc825322af8e5174c52a10a17385c9:/src/gtk/window.cpp?ds=sidebyside diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 00ad8466f5..e8b8ed1719 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -424,6 +424,8 @@ void wxgtk_window_size_request_callback(GtkWidget *widget, } } +#if wxUSE_COMBOBOX + extern "C" { static void wxgtk_combo_size_request_callback(GtkWidget *widget, @@ -459,6 +461,8 @@ void wxgtk_combo_size_request_callback(GtkWidget *widget, } } +#endif // wxUSE_COMBOBOX + //----------------------------------------------------------------------------- // "expose_event" of m_wxwindow //----------------------------------------------------------------------------- @@ -1233,22 +1237,15 @@ template void InitMouseEvent(wxWindowGTK *win, T *gdk_event) { event.SetTimestamp( gdk_event->time ); - event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); - event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); - event.m_altDown = (gdk_event->state & GDK_MOD1_MASK); - event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); - event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK); - event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK); - event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK); - if (event.GetEventType() == wxEVT_MOUSEWHEEL) - { - event.m_linesPerAction = 3; - event.m_wheelDelta = 120; - if (((GdkEventButton*)gdk_event)->button == 4) - event.m_wheelRotation = 120; - else if (((GdkEventButton*)gdk_event)->button == 5) - event.m_wheelRotation = -120; - } + event.m_shiftDown = gdk_event->state & GDK_SHIFT_MASK; + event.m_controlDown = gdk_event->state & GDK_CONTROL_MASK; + event.m_altDown = gdk_event->state & GDK_MOD1_MASK; + event.m_metaDown = gdk_event->state & GDK_MOD2_MASK; + event.m_leftDown = gdk_event->state & GDK_BUTTON1_MASK; + event.m_middleDown = gdk_event->state & GDK_BUTTON2_MASK; + event.m_rightDown = gdk_event->state & GDK_BUTTON3_MASK; + event.m_aux1Down = gdk_event->state & GDK_BUTTON4_MASK; + event.m_aux2Down = gdk_event->state & GDK_BUTTON5_MASK; wxPoint pt = win->GetClientAreaOrigin(); event.m_x = (wxCoord)gdk_event->x - pt.x; @@ -1443,11 +1440,6 @@ gtk_window_button_press_callback( GtkWidget *widget, g_lastButtonNumber = gdk_event->button; - if (win->m_wxwindow && (g_focusWindow != win) && win->CanAcceptFocus()) - { - gtk_widget_grab_focus( win->m_wxwindow ); - } - // GDK sends surplus button down events // before a double click event. We // need to filter these out. @@ -1545,13 +1537,6 @@ gtk_window_button_press_callback( GtkWidget *widget, ; } } - else if (gdk_event->button == 4 || gdk_event->button == 5) - { - if (gdk_event->type == GDK_BUTTON_PRESS ) - { - event_type = wxEVT_MOUSEWHEEL; - } - } if ( event_type == wxEVT_NULL ) { @@ -1586,9 +1571,9 @@ gtk_window_button_press_callback( GtkWidget *widget, return TRUE; if ((event_type == wxEVT_LEFT_DOWN) && !win->IsOfStandardClass() && - (g_focusWindow != win) && win->CanAcceptFocus()) + (g_focusWindow != win) /* && win->IsFocusable() */) { - gtk_widget_grab_focus( win->m_wxwindow ); + win->SetFocus(); } if (event_type == wxEVT_RIGHT_DOWN) @@ -1742,7 +1727,7 @@ gtk_window_motion_notify_callback( GtkWidget *widget, } //----------------------------------------------------------------------------- -// "scroll_event", (mouse wheel event) +// "scroll_event" (mouse wheel event) //----------------------------------------------------------------------------- static gboolean @@ -1757,15 +1742,7 @@ window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) } wxMouseEvent event(wxEVT_MOUSEWHEEL); - // Can't use InitMouse macro because scroll events don't have button - event.SetTimestamp( gdk_event->time ); - event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); - event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); - event.m_altDown = (gdk_event->state & GDK_MOD1_MASK); - event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); - event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK); - event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK); - event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK); + InitMouseEvent(win, event, gdk_event); event.m_linesPerAction = 3; event.m_wheelDelta = 120; if (gdk_event->direction == GDK_SCROLL_UP) @@ -1773,14 +1750,6 @@ window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) else event.m_wheelRotation = -120; - wxPoint pt = win->GetClientAreaOrigin(); - event.m_x = (wxCoord)gdk_event->x - pt.x; - event.m_y = (wxCoord)gdk_event->y - pt.y; - - event.SetEventObject( win ); - event.SetId( win->GetId() ); - event.SetTimestamp( gdk_event->time ); - return win->GTKProcessEvent(event); } @@ -1896,7 +1865,9 @@ gtk_window_focus_out_callback( GtkWidget *widget, // Disable default focus handling for custom windows // since the default GTK+ handler issues a repaint if ( has_wxwindow ) + { return TRUE; + } } // continue with normal processing @@ -1975,8 +1946,6 @@ gtk_window_leave_callback( GtkWidget *widget, if (gdk_event->mode != GDK_CROSSING_NORMAL) return FALSE; wxMouseEvent event( wxEVT_LEAVE_WINDOW ); - event.SetTimestamp( gdk_event->time ); - event.SetEventObject( win ); int x = 0; int y = 0; @@ -1984,17 +1953,7 @@ gtk_window_leave_callback( GtkWidget *widget, gdk_window_get_pointer( widget->window, &x, &y, &state ); - event.m_shiftDown = (state & GDK_SHIFT_MASK) != 0; - event.m_controlDown = (state & GDK_CONTROL_MASK) != 0; - event.m_altDown = (state & GDK_MOD1_MASK) != 0; - event.m_metaDown = (state & GDK_MOD2_MASK) != 0; - event.m_leftDown = (state & GDK_BUTTON1_MASK) != 0; - event.m_middleDown = (state & GDK_BUTTON2_MASK) != 0; - event.m_rightDown = (state & GDK_BUTTON3_MASK) != 0; - - wxPoint pt = win->GetClientAreaOrigin(); - event.m_x = x + pt.x; - event.m_y = y + pt.y; + InitMouseEvent(win, event, gdk_event); return win->GTKProcessEvent(event); } @@ -2020,9 +1979,7 @@ gtk_scrollbar_value_changed(GtkRange* range, wxWindow* win) wxScrollWinEvent event(eventType, win->GetScrollPos(orient), orient); event.SetEventObject(win); - win->m_blockValueChanged[dir] = true; win->GTKProcessEvent(event); - win->m_blockValueChanged[dir] = false; } } @@ -2147,6 +2104,27 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget), } } +//----------------------------------------------------------------------------- +// "grab_broken" +//----------------------------------------------------------------------------- + +#ifdef __WXGTK210__ +static void +gtk_window_grab_broken( GtkWidget *m_widget, + GdkEventGrabBroken *event, + wxWindow *win ) +{ + // Mouse capture has been lost involuntarily, notify the application + if( !event->keyboard && win && wxWindow::GetCapture() == win ) + { + wxMouseCaptureLostEvent evt( win->GetId() ); + evt.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( evt ); + } +} +#endif + + } // extern "C" // ---------------------------------------------------------------------------- @@ -2212,6 +2190,8 @@ wxMouseState wxGetMouseState() ms.SetLeftDown(mask & GDK_BUTTON1_MASK); ms.SetMiddleDown(mask & GDK_BUTTON2_MASK); ms.SetRightDown(mask & GDK_BUTTON3_MASK); + ms.SetAux1Down(mask & GDK_BUTTON4_MASK); + ms.SetAux2Down(mask & GDK_BUTTON5_MASK); ms.SetControlDown(mask & GDK_CONTROL_MASK); ms.SetShiftDown(mask & GDK_SHIFT_MASK); @@ -2264,7 +2244,6 @@ void wxWindowGTK::Init() { m_scrollBar[dir] = NULL; m_scrollPos[dir] = 0; - m_blockValueChanged[dir] = false; } m_oldClientWidth = @@ -2400,7 +2379,7 @@ bool wxWindowGTK::Create( wxWindow *parent, g_signal_handler_block(m_scrollBar[dir], handler_id); // these handlers get notified when scrollbar slider moves - g_signal_connect(m_scrollBar[dir], "value_changed", + g_signal_connect_after(m_scrollBar[dir], "value_changed", G_CALLBACK(gtk_scrollbar_value_changed), this); } @@ -2560,8 +2539,29 @@ void wxWindowGTK::PostCreation() // Catch native resize events g_signal_connect (m_wxwindow, "size_allocate", G_CALLBACK (gtk_window_size_callback), this); +#ifdef __WXGTK210__ + if (!gtk_check_version(2,8,0)) + { + // Make sure we can notify the app when mouse capture is lost + g_signal_connect (m_wxwindow, "grab_broken_event", + G_CALLBACK (gtk_window_grab_broken), this); + } +#endif } + if ( connect_widget != m_wxwindow ) + { +#ifdef __WXGTK210__ + if (!gtk_check_version(2,8,0)) + { + // Make sure we can notify app code when mouse capture is lost + g_signal_connect (connect_widget, "grab_broken_event", + G_CALLBACK (gtk_window_grab_broken), this); + } +#endif + } + +#if wxUSE_COMBOBOX if (GTK_IS_COMBO(m_widget)) { GtkCombo *gcombo = GTK_COMBO(m_widget); @@ -2569,17 +2569,18 @@ void wxWindowGTK::PostCreation() g_signal_connect (gcombo->entry, "size_request", G_CALLBACK (wxgtk_combo_size_request_callback), this); - } + } else +#endif // wxUSE_COMBOBOX #ifdef GTK_IS_FILE_CHOOSER_BUTTON - else if (!gtk_check_version(2,6,0) && GTK_IS_FILE_CHOOSER_BUTTON(m_widget)) + if (!gtk_check_version(2,6,0) && GTK_IS_FILE_CHOOSER_BUTTON(m_widget)) { // If we connect to the "size_request" signal of a GtkFileChooserButton // then that control won't be sized properly when placed inside sizers // (this can be tested removing this elseif and running XRC or WIDGETS samples) // FIXME: what should be done here ? - } + } else #endif - else if ( !IsTopLevel() ) // top level windows use their own callback + 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 @@ -3198,11 +3199,13 @@ void wxWindowGTK::SetFocus() { if (GTK_IS_CONTAINER(m_widget)) { +#if wxUSE_RADIOBTN if (IsKindOf(CLASSINFO(wxRadioButton))) { gtk_widget_grab_focus (m_widget); return; } +#endif // wxUSE_RADIOBTN gtk_widget_child_focus( m_widget, GTK_DIR_TAB_FORWARD ); } @@ -3399,7 +3402,7 @@ bool wxWindowGTK::DoNavigateIn(int flags) } else // navigate inside the container { - wxWindow *parent = wxGetTopLevelParent(this); + wxWindow *parent = wxGetTopLevelParent((wxWindow *)this); wxCHECK_MSG( parent, false, _T("every window must have a TLW parent") ); GtkDirectionType dir; @@ -4104,6 +4107,14 @@ void wxWindowGTK::DoReleaseMouse() gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME ); } +void wxWindowGTK::GTKReleaseMouseAndNotify() +{ + DoReleaseMouse(); + wxMouseCaptureLostEvent evt(GetId()); + evt.SetEventObject( this ); + GetEventHandler()->ProcessEvent( evt ); +} + /* static */ wxWindow *wxWindowBase::GetCapture() { @@ -4178,11 +4189,13 @@ void wxWindowGTK::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) pos = 0; m_scrollPos[dir] = adj->value = pos; - // If a "value_changed" signal emission is not already in progress - if (!m_blockValueChanged[dir]) - { - gtk_adjustment_value_changed(adj); - } + g_signal_handlers_block_by_func(m_scrollBar[dir], + (gpointer)gtk_scrollbar_value_changed, this); + + gtk_adjustment_value_changed(adj); + + g_signal_handlers_unblock_by_func(m_scrollBar[dir], + (gpointer)gtk_scrollbar_value_changed, this); } } @@ -4272,7 +4285,7 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) // No scrolling requested. if ((dx == 0) && (dy == 0)) return; - + m_clipPaintRegion = true; if (GetLayoutDirection() == wxLayout_RightToLeft)