X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88ac883a0d005437c97a60d8195bd5e4719b1154..f377a3b58c509ceba8c9335dbe45d100cca615ad:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 0200936cf0..2f86fc9602 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -131,7 +131,7 @@ extern wxList wxPendingDelete; extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; extern wxCursor g_globalCursor; -static bool g_capturing = FALSE; +static wxWindow *g_captureWindow = (wxWindow*) NULL; static wxWindow *g_focusWindow = (wxWindow*) NULL; /* hack: we need something to pass to gtk_menu_popup, so we store the time of @@ -631,25 +631,6 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e key_code = map_to_wx_keysym( gdk_event->keyval ); - /* wxMSW doesn't send char events with Alt pressed */ - if ((key_code != 0) && - ((gdk_event->state & GDK_MOD1_MASK) == 0) && - ((gdk_event->state & GDK_MOD1_MASK) == 0)) - { - wxKeyEvent event2( wxEVT_CHAR ); - event2.SetTimestamp( gdk_event->time ); - event2.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); - event2.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); -// event2.m_altDown = (gdk_event->state & GDK_MOD1_MASK); -// event2.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); - event2.m_keyCode = key_code; - event2.m_scanCode = gdk_event->keyval; - event2.m_x = x; - event2.m_y = y; - event2.SetEventObject( win ); - ret = (ret || win->GetEventHandler()->ProcessEvent( event2 )); - } - #if wxUSE_ACCEL if (!ret) { @@ -667,6 +648,25 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e } } #endif // wxUSE_ACCEL + /* wxMSW doesn't send char events with Alt pressed */ + /* Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x + will only be sent if it is not a menu accelerator. */ + if ((key_code != 0) && ! ret ) + { + wxKeyEvent event2( wxEVT_CHAR ); + event2.SetTimestamp( gdk_event->time ); + event2.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); + event2.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); + event2.m_altDown = (gdk_event->state & GDK_MOD1_MASK); + event2.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); + event2.m_keyCode = key_code; + event2.m_scanCode = gdk_event->keyval; + event2.m_x = x; + event2.m_y = y; + event2.SetEventObject( win ); + ret = (ret || win->GetEventHandler()->ProcessEvent( event2 )); + } + /* win is a control: tab can be propagated up */ if ( (!ret) && @@ -899,7 +899,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton // Some control don't have their own X window and thus cannot get // any events. - if (!g_capturing) + if (!g_captureWindow) { wxNode *node = win->GetChildren().First(); while (node) @@ -1009,7 +1009,7 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto // Some control don't have their own X window and thus cannot get // any events. - if (!g_capturing) + if (!g_captureWindow) { wxNode *node = win->GetChildren().First(); while (node) @@ -1120,7 +1120,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion // Some control don't have their own X window and thus cannot get // any events. - if (!g_capturing) + if (!g_captureWindow) { wxNode *node = win->GetChildren().First(); while (node) @@ -1983,7 +1983,7 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags ) } else { - if ((sizeFlags & wxSIZE_USE_EXISTING) == wxSIZE_USE_EXISTING) + if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0) { if (x != -1) m_x = x; if (y != -1) m_y = y; @@ -2063,18 +2063,18 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags ) void wxWindow::OnInternalIdle() { - GdkWindow *window = GetConnectWidget()->window; - if (window) - { - wxCursor cursor = m_cursor; - if (g_globalCursor.Ok()) cursor = g_globalCursor; + GdkWindow *window = GetConnectWidget()->window; + if (window) + { + wxCursor cursor = m_cursor; + if (g_globalCursor.Ok()) cursor = g_globalCursor; - if (m_currentGdkCursor != cursor) - { - gdk_window_set_cursor( window, cursor.GetCursor() ); - m_currentGdkCursor = cursor; + if (cursor.Ok() && m_currentGdkCursor != cursor) + { + gdk_window_set_cursor( window, cursor.GetCursor() ); + m_currentGdkCursor = cursor; + } } - } UpdateWindowUI(); } @@ -2545,7 +2545,7 @@ void wxWindow::DoSetToolTip( wxToolTip *tip ) void wxWindow::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) { - gtk_tooltips_set_tip( tips, GetConnectWidget(), wxConv_current->cWX2MB(tip), (gchar*) NULL ); + gtk_tooltips_set_tip( tips, GetConnectWidget(), wxConvCurrent->cWX2MB(tip), (gchar*) NULL ); } #endif // wxUSE_TOOLTIPS @@ -2582,7 +2582,6 @@ bool wxWindow::SetBackgroundColour( const wxColour &colour ) } wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); - if (sysbg == m_backgroundColour) { m_backgroundColour = wxNullColour; @@ -2621,7 +2620,7 @@ bool wxWindow::SetForegroundColour( const wxColour &colour ) } wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); - if (sysbg == m_foregroundColour) + if ( sysbg == m_backgroundColour ) { m_backgroundColour = wxNullColour; ApplyWidgetStyle(); @@ -2803,35 +2802,33 @@ void wxWindow::CaptureMouse() { wxCHECK_RET( m_widget != NULL, _T("invalid window") ); - wxCHECK_RET( g_capturing == FALSE, _T("CaptureMouse called twice") ); + wxCHECK_RET( g_captureWindow == NULL, _T("CaptureMouse called twice") ); GtkWidget *connect_widget = GetConnectWidget(); if (!connect_widget->window) return; - gtk_grab_add( connect_widget ); gdk_pointer_grab( connect_widget->window, FALSE, (GdkEventMask) (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK), (GdkWindow *) NULL, - (GdkCursor *) NULL, + m_cursor.GetCursor(), GDK_CURRENT_TIME ); - g_capturing = TRUE; + g_captureWindow = this; } void wxWindow::ReleaseMouse() { wxCHECK_RET( m_widget != NULL, _T("invalid window") ); - wxCHECK_RET( g_capturing == TRUE, _T("ReleaseMouse called twice") ); + wxCHECK_RET( g_captureWindow, _T("ReleaseMouse called twice") ); GtkWidget *connect_widget = GetConnectWidget(); if (!connect_widget->window) return; - gtk_grab_remove( connect_widget ); gdk_pointer_ungrab ( GDK_CURRENT_TIME ); - g_capturing = FALSE; + g_captureWindow = (wxWindow*) NULL; } bool wxWindow::IsRetained() const @@ -2994,7 +2991,10 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) while (node) { wxWindow *child = (wxWindow*) node->Data(); - child->Move( child->m_x + dx, child->m_y + dy ); + int sx = 0; + int sy = 0; + child->GetSize( &sx, &sy ); + child->SetSize( child->m_x + dx, child->m_y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE ); node = node->Next(); }