// "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 );
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
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;
if (!child->IsShown())
continue;
- if (child->IsTransparentForMouse())
+ if (child->GTKIsTransparentForMouse())
{
// wxStaticBox is transparent in the box itself
int xx1 = child->m_x;
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.
//-----------------------------------------------------------------------------
static gboolean
-gtk_window_button_release_callback( GtkWidget *widget,
+gtk_window_button_release_callback( GtkWidget *WXUNUSED(widget),
GdkEventButton *gdk_event,
wxWindowGTK *win )
{
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);
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
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;
}
m_height = 0;
m_hasVMT = false;
- m_isBeingDeleted = false;
- m_showOnIdle= false;
+ m_showOnIdle = false;
m_noExpose = false;
m_nativeSizeEvent = false;
{
// Get default border
wxBorder border = GetBorder(style);
+
style &= ~wxBORDER_MASK;
style |= border;
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))
{
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
if ( gs_deferredFocusOut == this )
gs_deferredFocusOut = NULL;
- m_isBeingDeleted = true;
m_hasVMT = false;
// destroy children before destroying this window itself
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))
{
GTKHandleDeferredFocusOut();
// Check if we have to show window now
- if (GtkShowFromOnIdle()) return;
+ if (GTKShowFromOnIdle()) return;
if ( m_dirtyTabOrder )
{
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;
}
}
return DoScrollByUnits(ScrollDir_Vert, ScrollUnit_Page, pages);
}
+#include "wx/treectrl.h"
+
void wxWindowGTK::Refresh(bool WXUNUSED(eraseBackground),
const wxRect *rect)
{
- if (!m_widget)
+ GtkWidget* widget;
+ if (m_wxwindow)
+ widget = m_wxwindow;
+ else if (m_widget)
+ widget = m_widget;
+ else
return;
- if (!m_widget->window)
+
+ if (!widget->window)
return;
- if (m_wxwindow)
+ if (rect == NULL)
{
- if (m_wxwindow->window == NULL) 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;
- if (GetLayoutDirection() == wxLayout_RightToLeft)
- gdk_rect.x = GetClientSize().x - gdk_rect.x - gdk_rect.width;
-
- p = &gdk_rect;
- }
- else // invalidate everything
- {
- p = NULL;
- }
-
- gdk_window_invalidate_rect(m_wxwindow->window, p, true);
+ gdk_window_invalidate_rect( widget->window, NULL, TRUE );
+ }
+ else
+ {
+ int x = rect->x;
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ 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 );
}
}
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();
-}
+ if (m_widget && m_widget->window)
+ {
+ 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);
-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 );
+ gdk_window_process_updates(m_widget->window, true);
- // 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() )
- {
- node->GetData()->GtkUpdate();
+ // Flush again, but no need to wait for it to finish
+ gdk_display_flush(display);
}
}
return m_updateRegion.Contains(x, y) != wxOutRegion;
}
-
bool wxWindowGTK::DoIsExposed( int x, int y, int w, int h ) const
{
if (GetLayoutDirection() == wxLayout_RightToLeft)
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);
}
// 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;
}
// 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 &&
return style;
}
-void wxWindowGTK::ApplyWidgetStyle(bool forceStyle)
+void wxWindowGTK::GTKApplyWidgetStyle(bool forceStyle)
{
- GtkRcStyle *style = CreateWidgetStyle(forceStyle);
+ GtkRcStyle *style = GTKCreateWidgetStyle(forceStyle);
if ( style )
{
DoApplyWidgetStyle(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;
}
}
}
-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") );
SetInvokingWindow( menu, this );
- DoPopupMenuUpdateUI(menu);
+ menu->UpdateUI();
wxPoint pos;
gpointer userdata;
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
// 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;
}
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
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
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
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;
}
#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