X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dd00f3f6fa06de66a8c5dedb0494eecc66633994..7e99520bd3fc092bbbcbc38bb699a0236618ea40:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index aa212c4d05..a85d6ab17b 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -12,6 +12,10 @@ #pragma implementation "window.h" #endif +#ifdef __VMS +#define XWarpPointer XWARPPOINTER +#endif + #include "wx/defs.h" #include "wx/window.h" #include "wx/dc.h" @@ -675,31 +679,43 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev } */ - win->GetUpdateRegion().Union( gdk_event->area.x, - gdk_event->area.y, - gdk_event->area.width, - gdk_event->area.height ); + GtkPizza *pizza = GTK_PIZZA (widget); - if (gdk_event->count == 0) - { - wxEraseEvent eevent( win->GetId() ); - eevent.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent(eevent); + if (win->GetThemeEnabled()) + { + wxWindow *parent = win->GetParent(); + while (parent && !parent->IsTopLevel()) + parent = parent->GetParent(); + if (!parent) + parent = win; - wxPaintEvent event( win->GetId() ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + gtk_paint_flat_box (parent->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, + GTK_SHADOW_NONE, &gdk_event->area, parent->m_widget, "base", 0, 0, -1, -1); + } + + win->GetUpdateRegion().Union( gdk_event->area.x, + gdk_event->area.y, + gdk_event->area.width, + gdk_event->area.height ); - win->GetUpdateRegion().Clear(); - } + if (gdk_event->count == 0) + { + wxEraseEvent eevent( win->GetId() ); + eevent.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent(eevent); + + wxPaintEvent event( win->GetId() ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); + + win->GetUpdateRegion().Clear(); + } /* The following code will result in all window-less widgets being redrawn if the wxWindows class is given a chance to paint *anything* because it will then be allowed to paint over the window-less widgets */ - GtkPizza *pizza = GTK_PIZZA (widget); - GList *children = pizza->children; while (children) { @@ -757,7 +773,11 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW if (g_isIdle) wxapp_install_idle_handler(); - + + // this is supposed to take care of extra (and unneeded) frame repaints + if (win->GetChildren().GetCount() == 0) + return; + /* if (win->GetName() == wxT("panel")) { @@ -772,17 +792,30 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW */ GtkPizza *pizza = GTK_PIZZA (widget); + + if (win->GetThemeEnabled()) + { + wxWindow *parent = win->GetParent(); + while (parent && !parent->IsTopLevel()) + parent = parent->GetParent(); + if (!parent) + parent = win; + + gtk_paint_flat_box (parent->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, + GTK_SHADOW_NONE, rect, parent->m_widget, "base", 0, 0, -1, -1); + } - if (!(GTK_WIDGET_APP_PAINTABLE (widget)) && - (pizza->clear_on_draw)) - { - gdk_window_clear_area( pizza->bin_window, + + if (!(GTK_WIDGET_APP_PAINTABLE (widget)) && + (pizza->clear_on_draw)) + { + gdk_window_clear_area( pizza->bin_window, rect->x, rect->y, rect->width, rect->height); - } + } - win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); + win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); - win->m_clipPaintRegion = TRUE; + win->m_clipPaintRegion = TRUE; wxEraseEvent eevent( win->GetId() ); eevent.SetEventObject( win ); @@ -3749,3 +3782,45 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) } */ } + +// Find the wxWindow at the current mouse position, also returning the mouse +// position. +wxWindow* wxFindWindowAtPointer(wxPoint& pt) +{ + pt = wxGetMousePosition(); + wxWindow* found = wxFindWindowAtPoint(pt); + return found; +} + +// Get the current mouse position. +wxPoint wxGetMousePosition() +{ + /* This crashes when used within wxHelpContext, + so we have to use the X-specific implementation below. + gint x, y; + GdkModifierType *mask; + (void) gdk_window_get_pointer(NULL, &x, &y, mask); + + return wxPoint(x, y); + */ + + int x, y; + GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); + if (!windowAtPtr) + return wxPoint(-999, -999); + + Display *display = GDK_WINDOW_XDISPLAY(windowAtPtr); + Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display)); + Window rootReturn, childReturn; + int rootX, rootY, winX, winY; + unsigned int maskReturn; + + XQueryPointer (display, + rootWindow, + &rootReturn, + &childReturn, + &rootX, &rootY, &winX, &winY, &maskReturn); + return wxPoint(rootX, rootY); + +} +