X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1d591651949a903e8dead16680a9cec11dbaa797..8fd7108e7cfd6d3564a71ab5f49c391613e27798:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 38223d79fb..fed52353e4 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -25,7 +25,6 @@ #include "wx/settings.h" #include "wx/msgdlg.h" #include "wx/textctrl.h" - #include "wx/radiobut.h" #include "wx/toolbar.h" #include "wx/combobox.h" #include "wx/layout.h" @@ -991,6 +990,11 @@ gtk_window_key_press_callback( GtkWidget *widget, if (g_blockEventsOnDrag) return FALSE; + // GTK+ sends keypress events to the focus widget and then + // to all its parent and grandparent widget. We only want + // the key events from the focus widget. + if (!GTK_WIDGET_HAS_FOCUS(widget)) + return FALSE; wxKeyEvent event( wxEVT_KEY_DOWN ); bool ret = false; @@ -1008,18 +1012,7 @@ gtk_window_key_press_callback( GtkWidget *widget, return_after_IM = true; } - // 2005.01.26 modified by Hong Jen Yee (hzysoft@sina.com.tw): - // When we get a key_press event here, it could be originate - // from the current widget or its child widgets. However, only the widget - // with the INPUT FOCUS can generate the INITIAL key_press event. That is, - // if the CURRENT widget doesn't have the FOCUS at all, this event definitely - // originated from its child widgets and shouldn't be passed to IM context. - // In fact, what a GTK+ IM should do is filtering keyEvents and convert them - // into text input ONLY WHEN THE WIDGET HAS INPUT FOCUS. Besides, when current - // widgets has both IM context and input focus, the event should be filtered - // by gtk_im_context_filter_keypress(). - // Then, we should, according to GTK+ 2.0 API doc, return whatever it returns. - if ((!ret) && (win->m_imData != NULL) && ( wxWindow::FindFocus() == win )) + if ((!ret) && (win->m_imData != NULL)) { // We should let GTK+ IM filter key event first. According to GTK+ 2.0 API // docs, if IM filter returns true, no further processing should be done. @@ -1570,7 +1563,7 @@ gtk_window_button_press_callback( GtkWidget *widget, if ( ret ) return TRUE; - if ((event_type == wxEVT_LEFT_DOWN) && !win->IsOfStandardClass() && + if ((event_type == wxEVT_LEFT_DOWN) && !win->IsOfStandardClass() && (g_focusWindow != win) /* && win->IsFocusable() */) { win->SetFocus(); @@ -1865,9 +1858,7 @@ 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 @@ -2105,26 +2096,26 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget), } //----------------------------------------------------------------------------- -// "grab_broken" +// "grab_broken" //----------------------------------------------------------------------------- -#ifdef __WXGTK210__ -static void -gtk_window_grab_broken( GtkWidget *m_widget, +#if GTK_CHECK_VERSION(2, 8, 0) +static gboolean +gtk_window_grab_broken( GtkWidget*, GdkEventGrabBroken *event, wxWindow *win ) { // Mouse capture has been lost involuntarily, notify the application - if( !event->keyboard && win && wxWindow::GetCapture() == win ) + if(!event->keyboard && wxWindow::GetCapture() == win) { wxMouseCaptureLostEvent evt( win->GetId() ); evt.SetEventObject( win ); win->GetEventHandler()->ProcessEvent( evt ); } + return false; } #endif - } // extern "C" // ---------------------------------------------------------------------------- @@ -2538,7 +2529,7 @@ 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) if (!gtk_check_version(2,8,0)) { // Make sure we can notify the app when mouse capture is lost @@ -2550,7 +2541,7 @@ void wxWindowGTK::PostCreation() if ( connect_widget != m_wxwindow ) { -#ifdef __WXGTK210__ +#if GTK_CHECK_VERSION(2, 8, 0) if (!gtk_check_version(2,8,0)) { // Make sure we can notify app code when mouse capture is lost @@ -3058,9 +3049,7 @@ int wxWindowGTK::GetCharHeight() const wxFont font = GetFont(); wxCHECK_MSG( font.Ok(), 12, wxT("invalid font") ); - PangoContext *context = NULL; - if (m_widget) - context = gtk_widget_get_pango_context( m_widget ); + PangoContext* context = gtk_widget_get_pango_context(m_widget); if (!context) return 0; @@ -3086,9 +3075,7 @@ int wxWindowGTK::GetCharWidth() const wxFont font = GetFont(); wxCHECK_MSG( font.Ok(), 8, wxT("invalid font") ); - PangoContext *context = NULL; - if (m_widget) - context = gtk_widget_get_pango_context( m_widget ); + PangoContext* context = gtk_widget_get_pango_context(m_widget); if (!context) return 0; @@ -3189,22 +3176,30 @@ void wxWindowGTK::SetFocus() if (m_wxwindow) { + // wxWindow::SetFocus() should really set the focus to + // this control, whatever the flags are + if (!GTK_WIDGET_CAN_FOCUS(m_wxwindow)) + GTK_WIDGET_SET_FLAGS(m_wxwindow, GTK_CAN_FOCUS); + if (!GTK_WIDGET_HAS_FOCUS (m_wxwindow)) { gtk_widget_grab_focus (m_wxwindow); } } - else if (m_widget) + else { + // wxWindow::SetFocus() should really set the focus to + // this control, whatever the flags are + if (!GTK_WIDGET_CAN_FOCUS(m_widget)) + GTK_WIDGET_SET_FLAGS(m_widget, GTK_CAN_FOCUS); + if (GTK_IS_CONTAINER(m_widget)) { -#if wxUSE_RADIOBTN - if (IsKindOf(CLASSINFO(wxRadioButton))) + if (GTK_IS_RADIO_BUTTON(m_widget)) { gtk_widget_grab_focus (m_widget); return; } -#endif // wxUSE_RADIOBTN gtk_widget_child_focus( m_widget, GTK_DIR_TAB_FORWARD ); } @@ -4131,7 +4126,8 @@ void wxWindowGTK::SetScrollbar(int orient, int range, bool WXUNUSED(update)) { - GtkRange * const sb = m_scrollBar[ScrollDirFromOrient(orient)]; + const int dir = ScrollDirFromOrient(orient); + GtkRange* const sb = m_scrollBar[dir]; wxCHECK_RET( sb, _T("this window is not scrollable") ); if (range > 0) @@ -4145,17 +4141,20 @@ void wxWindowGTK::SetScrollbar(int orient, thumbVisible = 1; } - if (pos > range - thumbVisible) - pos = range - thumbVisible; - if (pos < 0) - pos = 0; GtkAdjustment * const adj = sb->adjustment; adj->step_increment = 1; adj->page_increment = adj->page_size = thumbVisible; - adj->upper = range; - SetScrollPos(orient, pos); - gtk_adjustment_changed(adj); + adj->value = pos; + + g_signal_handlers_block_by_func( + sb, (void*)gtk_scrollbar_value_changed, this); + + gtk_range_set_range(sb, 0, range); + m_scrollPos[dir] = sb->adjustment->value; + + g_signal_handlers_unblock_by_func( + sb, (void*)gtk_scrollbar_value_changed, this); } void wxWindowGTK::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) @@ -4168,21 +4167,14 @@ void wxWindowGTK::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) // will not move smoothly while tracking when using wxScrollHelper. if (GetScrollPos(orient) != pos) { - GtkAdjustment* adj = sb->adjustment; - const int max = int(adj->upper - adj->page_size); - if (pos > max) - pos = max; - if (pos < 0) - pos = 0; - m_scrollPos[dir] = adj->value = pos; - - g_signal_handlers_block_by_func(m_scrollBar[dir], - (gpointer)gtk_scrollbar_value_changed, this); + g_signal_handlers_block_by_func( + sb, (void*)gtk_scrollbar_value_changed, this); - gtk_adjustment_value_changed(adj); + gtk_range_set_value(sb, pos); + m_scrollPos[dir] = sb->adjustment->value; - g_signal_handlers_unblock_by_func(m_scrollBar[dir], - (gpointer)gtk_scrollbar_value_changed, this); + g_signal_handlers_unblock_by_func( + sb, (void*)gtk_scrollbar_value_changed, this); } } @@ -4272,7 +4264,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) @@ -4318,8 +4310,11 @@ void wxWindowGTK::GtkScrolledWindowSetBorder(GtkWidget* w, int wxstyle) gtkstyle = GTK_SHADOW_OUT; else if (wxstyle & wxBORDER_SUNKEN) gtkstyle = GTK_SHADOW_IN; +#if 0 + // Now obsolete else if (wxstyle & wxBORDER_DOUBLE) gtkstyle = GTK_SHADOW_ETCHED_IN; +#endif else //default gtkstyle = GTK_SHADOW_IN;