#include "gdk/gdkkeysyms.h"
#include "wx/gtk/win_gtk.h"
-#if (GTK_MINOR_VERSION == 0)
#include "gdk/gdkx.h"
-#endif
//-----------------------------------------------------------------------------
// documentation on internals
extern wxList wxPendingDelete;
extern bool g_blockEventsOnDrag;
extern bool g_blockEventsOnScroll;
-static bool g_capturing = FALSE;
+extern wxCursor g_globalCursor;
+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
#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
//-----------------------------------------------------------------------------
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;
ret = (ret || win->GetEventHandler()->ProcessEvent( event2 ));
}
+#if wxUSE_ACCEL
if (!ret)
{
wxWindow *ancestor = win;
ancestor = ancestor->GetParent();
}
}
+#endif // wxUSE_ACCEL
/* win is a control: tab can be propagated up */
if ( (!ret) &&
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;
// 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)
// 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)
// 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)
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 );
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 );
m_scrollGC = (GdkGC*) NULL;
m_widgetStyle = (GtkStyle*) NULL;
- m_insertCallback = wxInsertChildInWindow;
+ m_insertCallback = (wxInsertChildFunction) NULL;
m_isStaticBox = FALSE;
m_acceptsFocus = FALSE;
{
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 );
}
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;
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
m_x-border,
m_y-border,
m_width+2*border,
- m_height+2*border );
+ m_height+border+bottom_border );
}
m_sizeSet = TRUE;
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();
}
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") );
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 )
}
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
-
if (sysbg == m_backgroundColour)
{
m_backgroundColour = wxNullColour;
}
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
- if (sysbg == m_foregroundColour)
+ if ( sysbg == m_backgroundColour )
{
m_backgroundColour = wxNullColour;
ApplyWidgetStyle();
{
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
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();
}