X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c679789bdbc8b42b7b71828b0f02f97614ee574..28d2a709de9d2e85f70d78affadaf1a5930b23d4:/src/gtk/window.cpp?ds=sidebyside diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index cc9855afae..01bf2f6a9b 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/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 @@ -132,6 +130,7 @@ extern wxList wxPendingDelete; extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; +extern wxCursor g_globalCursor; static bool g_capturing = FALSE; static wxWindow *g_focusWindow = (wxWindow*) NULL; @@ -178,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 //----------------------------------------------------------------------------- @@ -215,6 +240,12 @@ static long map_to_unmodified_wx_keysym( KeySym keysym ) case GDK_Shift_R: key_code = WXK_SHIFT; break; case GDK_Control_L: case GDK_Control_R: key_code = WXK_CONTROL; break; + case GDK_Meta_L: + case GDK_Meta_R: + case GDK_Alt_L: + case GDK_Alt_R: + case GDK_Super_L: + case GDK_Super_R: key_code = WXK_ALT; break; case GDK_Menu: key_code = WXK_MENU; break; case GDK_Help: key_code = WXK_HELP; break; case GDK_BackSpace: key_code = WXK_BACK; break; @@ -635,7 +666,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e } } - // win is a control: tab can be propagated up + /* win is a control: tab can be propagated up */ if ( (!ret) && ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) && (win->HasFlag(wxTE_PROCESS_TAB) == 0)) @@ -1250,9 +1281,6 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_ if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE; - if (widget->window && win->GetCursor().Ok() ) - gdk_window_set_cursor( widget->window, win->GetCursor().GetCursor() ); - wxMouseEvent event( wxEVT_ENTER_WINDOW ); #if (GTK_MINOR_VERSION > 0) event.SetTimestamp( gdk_event->time ); @@ -1299,9 +1327,6 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_ if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE; - if (widget->window && win->GetCursor().Ok() ) - gdk_window_set_cursor( widget->window, wxSTANDARD_CURSOR->GetCursor() ); - wxMouseEvent event( wxEVT_LEAVE_WINDOW ); #if (GTK_MINOR_VERSION > 0) event.SetTimestamp( gdk_event->time ); @@ -1624,7 +1649,7 @@ void wxWindow::Init() m_scrollGC = (GdkGC*) NULL; m_widgetStyle = (GtkStyle*) NULL; - m_insertCallback = wxInsertChildInWindow; + m_insertCallback = (wxInsertChildFunction) NULL; m_isStaticBox = FALSE; m_acceptsFocus = FALSE; @@ -1650,6 +1675,8 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, { PreCreation( parent, id, pos, size, style, name ); + m_insertCallback = wxInsertChildInWindow; + m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); @@ -1985,11 +2012,13 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; int border = 0; + int bottom_border = 0; if (GTK_WIDGET_CAN_DEFAULT(m_widget)) { /* the default button has a border around it */ - border = 5; + border = 6; + bottom_border = 5; } /* this is the result of hours of debugging: the following code @@ -2018,7 +2047,7 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags ) m_x-border, m_y-border, m_width+2*border, - m_height+2*border ); + m_height+border+bottom_border ); } m_sizeSet = TRUE; @@ -2032,6 +2061,19 @@ 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; + + if (m_currentGdkCursor != cursor) + { + gdk_window_set_cursor( window, cursor.GetCursor() ); + m_currentGdkCursor = cursor; + } + } + UpdateWindowUI(); } @@ -2341,15 +2383,41 @@ 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; } +void wxWindow::DoAddChild(wxWindow *child) +{ + wxASSERT_MSG( (m_widget != NULL), _T("invalid window") ); + + wxASSERT_MSG( (child != NULL), _T("invalid child window") ); + + wxASSERT_MSG( (m_insertCallback != NULL), _T("invalid child insertion function") ); + + /* add to list */ + AddChild( child ); + + /* insert GTK representation */ + (*m_insertCallback)(this, child); +} + void wxWindow::Raise() { wxCHECK_RET( (m_widget != NULL), _T("invalid window") ); @@ -2391,19 +2459,23 @@ bool wxWindow::SetCursor( const wxCursor &cursor ) return TRUE; } - if ((m_widget) && (m_widget->window)) - gdk_window_set_cursor( m_widget->window, GetCursor().GetCursor() ); - - if ((m_wxwindow) && (m_wxwindow->window)) - gdk_window_set_cursor( m_wxwindow->window, GetCursor().GetCursor() ); +// gdk_window_set_cursor( connect_widget->window, GetCursor().GetCursor() ); // cursor was set 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 )