X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/35510e483f44f36e03c6bf80234931048e48188d..43b282bd095529e69f0bf7e7bd44888e4867257e:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 1df7e83264..845268de67 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -205,7 +205,7 @@ extern wxCursor g_globalCursor; // mouse capture state: the window which has it and if the mouse is currently // inside it -static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL; +static wxWindowGTK *g_captureWindow = NULL; static bool g_captureWindowHasMouse = false; // The window that currently has focus: @@ -220,7 +220,7 @@ static wxWindowGTK *gs_deferredFocusOut = NULL; // global variables because GTK+ DnD want to have the // mouse event that caused it -GdkEvent *g_lastMouseEvent = (GdkEvent*) NULL; +GdkEvent *g_lastMouseEvent = NULL; int g_lastButtonNumber = 0; //----------------------------------------------------------------------------- @@ -257,11 +257,11 @@ gdk_window_warp_pointer (GdkWindow *window, // "size_request" of m_widget //----------------------------------------------------------------------------- -// make it extern because wxStaticText needs to disconnect this one extern "C" { -void wxgtk_window_size_request_callback(GtkWidget * WXUNUSED(widget), - GtkRequisition *requisition, - wxWindow * win) +static void +wxgtk_window_size_request_callback(GtkWidget * WXUNUSED(widget), + GtkRequisition *requisition, + wxWindow * win) { int w, h; win->GetSize( &w, &h ); @@ -683,7 +683,6 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event, event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0; event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0; event.m_metaDown = (gdk_event->state & GDK_META_MASK) != 0; - event.m_scanCode = gdk_event->keyval; event.m_rawCode = (wxUint32) gdk_event->keyval; event.m_rawFlags = 0; #if wxUSE_UNICODE @@ -1075,15 +1074,15 @@ template void InitMouseEvent(wxWindowGTK *win, T *gdk_event) { event.SetTimestamp( gdk_event->time ); - event.m_shiftDown = gdk_event->state & GDK_SHIFT_MASK; - event.m_controlDown = gdk_event->state & GDK_CONTROL_MASK; - event.m_altDown = gdk_event->state & GDK_MOD1_MASK; - event.m_metaDown = gdk_event->state & GDK_META_MASK; - event.m_leftDown = gdk_event->state & GDK_BUTTON1_MASK; - event.m_middleDown = gdk_event->state & GDK_BUTTON2_MASK; - event.m_rightDown = gdk_event->state & GDK_BUTTON3_MASK; - event.m_aux1Down = gdk_event->state & GDK_BUTTON4_MASK; - event.m_aux2Down = gdk_event->state & GDK_BUTTON5_MASK; + event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK) != 0; + event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0; + event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0; + event.m_metaDown = (gdk_event->state & GDK_META_MASK) != 0; + event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK) != 0; + event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK) != 0; + event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK) != 0; + event.m_aux1Down = (gdk_event->state & GDK_BUTTON4_MASK) != 0; + event.m_aux2Down = (gdk_event->state & GDK_BUTTON5_MASK) != 0; wxPoint pt = win->GetClientAreaOrigin(); event.m_x = (wxCoord)gdk_event->x - pt.x; @@ -1156,7 +1155,7 @@ wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y) if (!child->IsShown()) continue; - if (child->IsTransparentForMouse()) + if (child->GTKIsTransparentForMouse()) { // wxStaticBox is transparent in the box itself int xx1 = child->m_x; @@ -1182,7 +1181,7 @@ wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y) } else { - if ((child->m_wxwindow == (GtkWidget*) NULL) && + if ((child->m_wxwindow == NULL) && (child->m_x <= xx) && (child->m_y <= yy) && (child->m_x+child->m_width >= xx) && @@ -1368,10 +1367,6 @@ gtk_window_button_press_callback( GtkWidget *widget, AdjustEventButtonState(event); - // wxListBox actually gets mouse events from the item, so we need to give it - // a chance to correct this - win->FixUpMouseEvent(widget, event.m_x, event.m_y); - // find the correct window to send the event to: it may be a different one // from the one which got it at GTK+ level because some controls don't have // their own X window and thus cannot get any events. @@ -1418,7 +1413,7 @@ gtk_window_button_press_callback( GtkWidget *widget, //----------------------------------------------------------------------------- static gboolean -gtk_window_button_release_callback( GtkWidget *widget, +gtk_window_button_release_callback( GtkWidget *WXUNUSED(widget), GdkEventButton *gdk_event, wxWindowGTK *win ) { @@ -1454,9 +1449,6 @@ gtk_window_button_release_callback( GtkWidget *widget, AdjustEventButtonState(event); - // same wxListBox hack as above - win->FixUpMouseEvent(widget, event.m_x, event.m_y); - if ( !g_captureWindow ) win = FindWindowForMouseEvent(win, event.m_x, event.m_y); @@ -1751,7 +1743,7 @@ gtk_window_leave_callback( GtkWidget *widget, static void gtk_scrollbar_value_changed(GtkRange* range, wxWindow* win) { - wxEventType eventType = win->GetScrollEventType(range); + wxEventType eventType = win->GTKGetScrollEventType(range); if (eventType != wxEVT_NULL) { // Convert scroll event type to scrollwin event type @@ -1836,7 +1828,7 @@ gtk_window_realized_callback(GtkWidget* widget, wxWindow* win) gtk_im_context_set_client_window( win->m_imData->context, widget->window); } - + // We cannot set colours and fonts before the widget // been realized, so we do this directly after realization // or otherwise in idle time @@ -2000,16 +1992,16 @@ wxMouseState wxGetMouseState() ms.SetX(x); ms.SetY(y); - ms.SetLeftDown(mask & GDK_BUTTON1_MASK); - ms.SetMiddleDown(mask & GDK_BUTTON2_MASK); - ms.SetRightDown(mask & GDK_BUTTON3_MASK); - ms.SetAux1Down(mask & GDK_BUTTON4_MASK); - ms.SetAux2Down(mask & GDK_BUTTON5_MASK); + ms.SetLeftDown((mask & GDK_BUTTON1_MASK) != 0); + ms.SetMiddleDown((mask & GDK_BUTTON2_MASK) != 0); + ms.SetRightDown((mask & GDK_BUTTON3_MASK) != 0); + ms.SetAux1Down((mask & GDK_BUTTON4_MASK) != 0); + ms.SetAux2Down((mask & GDK_BUTTON5_MASK) != 0); - ms.SetControlDown(mask & GDK_CONTROL_MASK); - ms.SetShiftDown(mask & GDK_SHIFT_MASK); - ms.SetAltDown(mask & GDK_MOD1_MASK); - ms.SetMetaDown(mask & GDK_META_MASK); + ms.SetControlDown((mask & GDK_CONTROL_MASK) != 0); + ms.SetShiftDown((mask & GDK_SHIFT_MASK) != 0); + ms.SetAltDown((mask & GDK_MOD1_MASK) != 0); + ms.SetMetaDown((mask & GDK_META_MASK) != 0); return ms; } @@ -2029,9 +2021,9 @@ wxMouseState wxGetMouseState() void wxWindowGTK::Init() { // GTK specific - m_widget = (GtkWidget *) NULL; - m_wxwindow = (GtkWidget *) NULL; - m_focusWidget = (GtkWidget *) NULL; + m_widget = NULL; + m_wxwindow = NULL; + m_focusWidget = NULL; // position/size m_x = 0; @@ -2040,9 +2032,8 @@ void wxWindowGTK::Init() m_height = 0; m_hasVMT = false; - m_isBeingDeleted = false; - m_showOnIdle= false; + m_showOnIdle = false; m_noExpose = false; m_nativeSizeEvent = false; @@ -2096,6 +2087,7 @@ bool wxWindowGTK::Create( wxWindow *parent, { // Get default border wxBorder border = GetBorder(style); + style &= ~wxBORDER_MASK; style |= border; @@ -2106,8 +2098,14 @@ bool wxWindowGTK::Create( wxWindow *parent, return false; } + // We should accept the native look +#if 0 + GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(m_widget) ); + scroll_class->scrollbar_spacing = 0; +#endif + - m_wxwindow = wxPizza::New(m_windowStyle); + m_wxwindow = wxPizza::New(m_windowStyle,this); #ifndef __WXUNIVERSAL__ if (HasFlag(wxPizza::BORDER_STYLES)) { @@ -2119,13 +2117,10 @@ bool wxWindowGTK::Create( wxWindow *parent, m_widget = m_wxwindow; else { - m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); + m_widget = gtk_scrolled_window_new( NULL, NULL ); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); - GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(m_widget) ); - scroll_class->scrollbar_spacing = 0; - // There is a conflict with default bindings at GTK+ // level between scrolled windows and notebooks both of which want to use // Ctrl-PageUp/Down: scrolled windows for scrolling in the horizontal @@ -2210,7 +2205,6 @@ wxWindowGTK::~wxWindowGTK() if ( gs_deferredFocusOut == this ) gs_deferredFocusOut = NULL; - m_isBeingDeleted = true; m_hasVMT = false; // destroy children before destroying this window itself @@ -2538,10 +2532,16 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags event.SetEventObject( this ); HandleWindowEvent( event ); } + } else + if (sizeFlags & wxSIZE_FORCE_EVENT) + { + wxSizeEvent event( wxSize(m_width,m_height), GetId() ); + event.SetEventObject( this ); + HandleWindowEvent( event ); } } -bool wxWindowGTK::GtkShowFromOnIdle() +bool wxWindowGTK::GTKShowFromOnIdle() { if (IsShown() && m_showOnIdle && !GTK_WIDGET_VISIBLE (m_widget)) { @@ -2568,7 +2568,7 @@ void wxWindowGTK::OnInternalIdle() GTKHandleDeferredFocusOut(); // Check if we have to show window now - if (GtkShowFromOnIdle()) return; + if (GTKShowFromOnIdle()) return; if ( m_dirtyTabOrder ) { @@ -2679,12 +2679,15 @@ void wxWindowGTK::DoGetClientSize( int *width, int *height ) const continue; } + GtkScrolledWindowClass *scroll_class = + GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(m_widget) ); + GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(range), &req); if (i == ScrollDir_Horz) - h -= req.height; + h -= req.height + scroll_class->scrollbar_spacing; else - w -= req.width; + w -= req.width + scroll_class->scrollbar_spacing; } } @@ -2718,7 +2721,7 @@ void wxWindowGTK::DoGetPosition( int *x, int *y ) const if (m_x == -1 && m_y == -1) { - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = m_wxwindow->window; else @@ -2748,7 +2751,7 @@ void wxWindowGTK::DoClientToScreen( int *x, int *y ) const if (!m_widget->window) return; - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = m_wxwindow->window; else @@ -2785,7 +2788,7 @@ void wxWindowGTK::DoScreenToClient( int *x, int *y ) const if (!m_widget->window) return; - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = m_wxwindow->window; else @@ -3470,7 +3473,7 @@ void wxWindowGTK::WarpPointer( int x, int y ) // We provide this function ourselves as it is // missing in GDK (top of this file). - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = m_wxwindow->window; else @@ -3526,63 +3529,58 @@ bool wxWindowGTK::ScrollPages(int pages) void wxWindowGTK::Refresh(bool WXUNUSED(eraseBackground), const wxRect *rect) { - if (!m_widget) - return; - if (!m_widget->window) + if ( !m_widget ) + { + // it is valid to call Refresh() for a window which hasn't been created + // yet, it simply doesn't do anything in this case return; + } - if (m_wxwindow) + if (!m_wxwindow) + { + if (rect) + gtk_widget_queue_draw_area( m_widget, rect->x, rect->y, rect->width, rect->height ); + else + gtk_widget_queue_draw( m_widget ); + } + else { - if (m_wxwindow->window == NULL) return; + // Just return if the widget or one of its ancestors isn't mapped + GtkWidget *w; + for (w = m_wxwindow; w != NULL; w = w->parent) + if (!GTK_WIDGET_MAPPED (w)) + return; - GdkRectangle gdk_rect, - *p; if (rect) { - gdk_rect.x = rect->x; - gdk_rect.y = rect->y; - gdk_rect.width = rect->width; - gdk_rect.height = rect->height; + int x = rect->x; if (GetLayoutDirection() == wxLayout_RightToLeft) - gdk_rect.x = GetClientSize().x - gdk_rect.x - gdk_rect.width; - - p = &gdk_rect; - } - else // invalidate everything - { - p = NULL; + x = GetClientSize().x - x - rect->width; + GdkRectangle r; + r.x = rect->x; + r.y = rect->y; + r.width = rect->width; + r.height = rect->height; + gdk_window_invalidate_rect( m_wxwindow->window, &r, TRUE ); } - - gdk_window_invalidate_rect(m_wxwindow->window, p, true); + else + gdk_window_invalidate_rect( m_wxwindow->window, NULL, TRUE ); } } void wxWindowGTK::Update() { - GtkUpdate(); - - // when we call Update() we really want to update the window immediately on - // screen, even if it means flushing the entire queue and hence slowing down - // everything -- but it should still be done, it's just that Update() should - // be called very rarely - gdk_flush(); -} - -void wxWindowGTK::GtkUpdate() -{ - if (m_wxwindow && m_wxwindow->window) - gdk_window_process_updates(m_wxwindow->window, false); - if (m_widget && m_widget->window && (m_wxwindow != m_widget)) - gdk_window_process_updates( m_widget->window, FALSE ); - - // for consistency with other platforms (and also because it's convenient - // to be able to update an entire TLW by calling Update() only once), we - // should also update all our children here - for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); - node; - node = node->GetNext() ) + if (m_widget && m_widget->window) { - node->GetData()->GtkUpdate(); + GdkDisplay* display = gtk_widget_get_display(m_widget); + // Flush everything out to the server, and wait for it to finish. + // This ensures nothing will overwrite the drawing we are about to do. + gdk_display_sync(display); + + gdk_window_process_updates(m_widget->window, TRUE); + + // Flush again, but no need to wait for it to finish + gdk_display_flush(display); } } @@ -3591,7 +3589,6 @@ bool wxWindowGTK::DoIsExposed( int x, int y ) const return m_updateRegion.Contains(x, y) != wxOutRegion; } - bool wxWindowGTK::DoIsExposed( int x, int y, int w, int h ) const { if (GetLayoutDirection() == wxLayout_RightToLeft) @@ -3725,10 +3722,10 @@ void wxWindowGTK::DoSetToolTip( wxToolTip *tip ) wxWindowBase::DoSetToolTip(tip); if (m_tooltip) - m_tooltip->Apply( (wxWindow *)this ); + m_tooltip->GTKApply( (wxWindow *)this ); } -void wxWindowGTK::ApplyToolTip( GtkTooltips *tips, const gchar *tip ) +void wxWindowGTK::GTKApplyToolTip( GtkTooltips *tips, const gchar *tip ) { gtk_tooltips_set_tip(tips, GetConnectWidget(), tip, NULL); } @@ -3750,7 +3747,7 @@ bool wxWindowGTK::SetBackgroundColour( const wxColour &colour ) // apply style change (forceStyle=true so that new style is applied // even if the bg colour changed from valid to wxNullColour) if (GetBackgroundStyle() != wxBG_STYLE_CUSTOM) - ApplyWidgetStyle(true); + GTKApplyWidgetStyle(true); return true; } @@ -3772,17 +3769,17 @@ bool wxWindowGTK::SetForegroundColour( const wxColour &colour ) // apply style change (forceStyle=true so that new style is applied // even if the bg colour changed from valid to wxNullColour): - ApplyWidgetStyle(true); + GTKApplyWidgetStyle(true); return true; } -PangoContext *wxWindowGTK::GtkGetPangoDefaultContext() +PangoContext *wxWindowGTK::GTKGetPangoDefaultContext() { return gtk_widget_get_pango_context( m_widget ); } -GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle) +GtkRcStyle *wxWindowGTK::GTKCreateWidgetStyle(bool forceStyle) { // do we need to apply any changes at all? if ( !forceStyle && @@ -3851,9 +3848,9 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle) return style; } -void wxWindowGTK::ApplyWidgetStyle(bool forceStyle) +void wxWindowGTK::GTKApplyWidgetStyle(bool forceStyle) { - GtkRcStyle *style = CreateWidgetStyle(forceStyle); + GtkRcStyle *style = GTKCreateWidgetStyle(forceStyle); if ( style ) { DoApplyWidgetStyle(style); @@ -3914,7 +3911,7 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style) { // apply style change (forceStyle=true so that new style is applied // even if the bg colour changed from valid to wxNullColour): - ApplyWidgetStyle(true); + GTKApplyWidgetStyle(true); } return true; } @@ -3964,11 +3961,6 @@ void wxPopupMenuPositionCallback( GtkMenu *menu, } } -void wxWindowGTK::DoPopupMenuUpdateUI(wxMenu* menu) -{ - menu->UpdateUI(); -} - bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) { wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") ); @@ -3977,7 +3969,7 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) SetInvokingWindow( menu, this ); - DoPopupMenuUpdateUI(menu); + menu->UpdateUI(); wxPoint pos; gpointer userdata; @@ -3998,8 +3990,8 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) menu->m_popupShown = true; gtk_menu_popup( GTK_MENU(menu->m_menu), - (GtkWidget *) NULL, // parent menu shell - (GtkWidget *) NULL, // parent menu item + NULL, // parent menu shell + NULL, // parent menu item posfunc, // function to position it userdata, // client data 0, // button used to activate it @@ -4024,12 +4016,12 @@ void wxWindowGTK::SetDropTarget( wxDropTarget *dropTarget ) GtkWidget *dnd_widget = GetConnectWidget(); - if (m_dropTarget) m_dropTarget->UnregisterWidget( dnd_widget ); + if (m_dropTarget) m_dropTarget->GtkUnregisterWidget( dnd_widget ); if (m_dropTarget) delete m_dropTarget; m_dropTarget = dropTarget; - if (m_dropTarget) m_dropTarget->RegisterWidget( dnd_widget ); + if (m_dropTarget) m_dropTarget->GtkRegisterWidget( dnd_widget ); } #endif // wxUSE_DRAG_AND_DROP @@ -4065,7 +4057,7 @@ bool wxWindowGTK::SetFont( const wxFont &font ) // apply style change (forceStyle=true so that new style is applied // even if the font changed from valid to wxNullFont): - ApplyWidgetStyle(true); + GTKApplyWidgetStyle(true); return true; } @@ -4074,7 +4066,7 @@ void wxWindowGTK::DoCaptureMouse() { wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = m_wxwindow->window; else @@ -4092,7 +4084,7 @@ void wxWindowGTK::DoCaptureMouse() GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK), - (GdkWindow *) NULL, + NULL, cursor->GetCursor(), (guint32)GDK_CURRENT_TIME ); g_captureWindow = this; @@ -4105,9 +4097,9 @@ void wxWindowGTK::DoReleaseMouse() wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") ); - g_captureWindow = (wxWindowGTK*) NULL; + g_captureWindow = NULL; - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = m_wxwindow->window; else @@ -4197,7 +4189,7 @@ int wxWindowGTK::GetScrollThumb(int orient) const GtkRange * const sb = m_scrollBar[ScrollDirFromOrient(orient)]; wxCHECK_MSG( sb, 0, _T("this window is not scrollable") ); - return int(sb->adjustment->page_size); + return wxRound(sb->adjustment->page_size); } int wxWindowGTK::GetScrollPos( int orient ) const @@ -4205,7 +4197,7 @@ int wxWindowGTK::GetScrollPos( int orient ) const GtkRange * const sb = m_scrollBar[ScrollDirFromOrient(orient)]; wxCHECK_MSG( sb, 0, _T("this window is not scrollable") ); - return int(sb->adjustment->value + 0.5); + return wxRound(sb->adjustment->value); } int wxWindowGTK::GetScrollRange( int orient ) const @@ -4213,7 +4205,7 @@ int wxWindowGTK::GetScrollRange( int orient ) const GtkRange * const sb = m_scrollBar[ScrollDirFromOrient(orient)]; wxCHECK_MSG( sb, 0, _T("this window is not scrollable") ); - return int(sb->adjustment->upper); + return wxRound(sb->adjustment->upper); } // Determine if increment is the same as +/-x, allowing for some small @@ -4225,21 +4217,21 @@ static inline bool IsScrollIncrement(double increment, double x) return fabs(increment - fabs(x)) < tolerance; } -wxEventType wxWindowGTK::GetScrollEventType(GtkRange* range) +wxEventType wxWindowGTK::GTKGetScrollEventType(GtkRange* range) { wxASSERT(range == m_scrollBar[0] || range == m_scrollBar[1]); const int barIndex = range == m_scrollBar[1]; GtkAdjustment* adj = range->adjustment; - const int value = int(adj->value + 0.5); + const int value = wxRound(adj->value); // save previous position const double oldPos = m_scrollPos[barIndex]; // update current position m_scrollPos[barIndex] = adj->value; // If event should be ignored, or integral position has not changed - if (!m_hasVMT || g_blockEventsOnDrag || value == int(oldPos + 0.5)) + if (!m_hasVMT || g_blockEventsOnDrag || value == wxRound(oldPos)) { return wxEVT_NULL; } @@ -4306,7 +4298,7 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) #endif // wxUSE_CARET } -void wxWindowGTK::GtkScrolledWindowSetBorder(GtkWidget* w, int wxstyle) +void wxWindowGTK::GTKScrolledWindowSetBorder(GtkWidget* w, int wxstyle) { //RN: Note that static controls usually have no border on gtk, so maybe //it makes sense to treat that as simply no border at the wx level