X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ddb6bc71266486f2e7222915740393eddea620f5..049426fc8013b222c71ce44ca491e7461499085f:/src/gtk1/window.cpp?ds=inline diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index d12fcf4e69..fc09ed7eb5 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -44,9 +44,7 @@ #include "gdk/gdkkeysyms.h" #include "wx/gtk/win_gtk.h" -#if (GTK_MINOR_VERSION == 0) #include "gdk/gdkx.h" -#endif //----------------------------------------------------------------------------- // documentation on internals @@ -133,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 @@ -179,6 +177,32 @@ void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar *window #endif // Debug +//----------------------------------------------------------------------------- +// missing gdk functions +//----------------------------------------------------------------------------- + +void +gdk_window_warp_pointer (GdkWindow *window, + gint x, + gint y) +{ + GdkWindowPrivate *priv; + + if (!window) + window = (GdkWindow*) &gdk_root_parent; + + priv = (GdkWindowPrivate*) window; + + if (!priv->destroyed) + { + XWarpPointer (priv->xdisplay, + None, /* not source window -> move from anywhere */ + priv->xwindow, /* dest window */ + 0, 0, 0, 0, /* not source window -> move from anywhere */ + x, y ); + } +} + //----------------------------------------------------------------------------- // idle system //----------------------------------------------------------------------------- @@ -626,6 +650,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e ret = (ret || win->GetEventHandler()->ProcessEvent( event2 )); } +#if wxUSE_ACCEL if (!ret) { wxWindow *ancestor = win; @@ -641,6 +666,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e ancestor = ancestor->GetParent(); } } +#endif // wxUSE_ACCEL /* win is a control: tab can be propagated up */ if ( (!ret) && @@ -682,8 +708,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e wxNode *node = menubar->GetMenus().First(); if (node) { - wxMenu *firstMenu = (wxMenu*) node->Data(); // doesn't work correctly + // wxMenu *firstMenu = (wxMenu*) node->Data(); // gtk_menu_item_select( GTK_MENU_ITEM(firstMenu->m_owner) ); // ret = TRUE; break; @@ -873,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) @@ -983,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) @@ -1094,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) @@ -1957,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; @@ -2037,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(); } @@ -2359,12 +2385,23 @@ bool wxWindow::AcceptsFocus() const bool wxWindow::Reparent( wxWindow *newParent ) { wxCHECK_MSG( (m_widget != NULL), (wxWindow*) NULL, _T("invalid window") ); - - gtk_widget_unparent( m_widget ); + + wxWindow *oldParent = m_parent; if ( !wxWindowBase::Reparent(newParent) ) return FALSE; + if (oldParent) + { + gtk_container_remove( GTK_CONTAINER(oldParent->m_wxwindow), m_widget ); + } + + if (newParent) + { + /* insert GTK representation */ + (*(newParent->m_insertCallback))(newParent, this); + } + return TRUE; } @@ -2430,9 +2467,17 @@ bool wxWindow::SetCursor( const wxCursor &cursor ) return TRUE; } -void wxWindow::WarpPointer( int WXUNUSED(x), int WXUNUSED(y) ) +void wxWindow::WarpPointer( int x, int y ) { - // TODO + wxCHECK_RET( (m_widget != NULL), _T("invalid window") ); + + GtkWidget *connect_widget = GetConnectWidget(); + if (connect_widget->window) + { + /* we provide this function ourselves as it is + missing in GDK */ + gdk_window_warp_pointer( connect_widget->window, x, y ); + } } void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) @@ -2500,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 @@ -2537,7 +2582,6 @@ bool wxWindow::SetBackgroundColour( const wxColour &colour ) } wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); - if (sysbg == m_backgroundColour) { m_backgroundColour = wxNullColour; @@ -2576,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(); @@ -2758,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 @@ -2949,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(); }