#undef HAVE_XIM
#endif
-extern GtkContainerClass *pizza_parent_class;
-
//-----------------------------------------------------------------------------
// documentation on internals
//-----------------------------------------------------------------------------
if (!win->m_hasVMT)
return;
- int dw = 0;
- int dh = 0;
-
- if (win->m_hasScrolling)
- {
- GetScrollbarWidth(widget, dw, dh);
- }
-
int dx = 0;
int dy = 0;
if (GTK_WIDGET_NO_WINDOW (widget))
dy += widget->allocation.y;
}
+ int x = dx;
+ int y = dy;
+
+ int dw = 0;
+ int dh = 0;
+ if (win->m_hasScrolling)
+ {
+ GetScrollbarWidth(widget, dw, dh);
+
+ if (win->GetLayoutDirection() == wxLayout_RightToLeft)
+ {
+ // This is actually wrong for old GTK+ version
+ // which do not display the scrollbar on the
+ // left side in RTL
+ x += dw;
+ }
+ }
+
+ int w = widget->allocation.width-dw;
+ int h = widget->allocation.height-dh;
+
if (win->HasFlag(wxRAISED_BORDER))
{
gtk_paint_shadow (widget->style,
GTK_STATE_NORMAL,
GTK_SHADOW_OUT,
NULL, NULL, NULL, // FIXME: No clipping?
- dx, dy,
- widget->allocation.width-dw, widget->allocation.height-dh );
+ x, y, w, h );
return;
}
GTK_STATE_NORMAL,
GTK_SHADOW_IN,
NULL, NULL, NULL, // FIXME: No clipping?
- dx, dy,
- widget->allocation.width-dw, widget->allocation.height-dh );
+ x, y, w, h );
return;
}
GdkGC *gc;
gc = gdk_gc_new( widget->window );
gdk_gc_set_foreground( gc, &widget->style->black );
- gdk_draw_rectangle( widget->window, gc, FALSE,
- dx, dy,
- widget->allocation.width-dw-1, widget->allocation.height-dh-1 );
+ gdk_draw_rectangle( widget->window, gc, FALSE, x, y, w-1, h-1 );
g_object_unref (gc);
return;
}
GdkEventExpose *gdk_event,
wxWindowGTK *win )
{
- if (gdk_event->count > 0) return FALSE;
-
- draw_frame( widget, win );
-
- (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
-
- return TRUE;
+ if (gdk_event->count == 0)
+ draw_frame(widget, win);
+ return false;
}
}
GtkPizza *pizza = GTK_PIZZA( widget );
if (gdk_event->window != pizza->bin_window) return FALSE;
+
#if 0
if (win->GetName())
{
win->GtkSendPaintEvents();
-
// Let parent window draw window-less widgets
- (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
-
return FALSE;
}
}
wxPoint pt = win->GetClientAreaOrigin();
event.m_x = (wxCoord)gdk_event->x - pt.x;
event.m_y = (wxCoord)gdk_event->y - pt.y;
+
+ if ((win->m_wxwindow) && (win->GetLayoutDirection() == wxLayout_RightToLeft))
+ {
+ // origin in the upper right corner
+ int window_width = gtk_pizza_get_rtl_offset( GTK_PIZZA(win->m_wxwindow) );
+ event.m_x = window_width - event.m_x;
+ }
event.SetEventObject( win );
event.SetId( win->GetId() );
if ((client_width == win->m_oldClientWidth) && (client_height == win->m_oldClientHeight))
return;
- GTK_PIZZA(win->m_wxwindow)->m_width = alloc->width;
+#if 0
+ wxPrintf( wxT("size_allocate ") );
+ if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
+ wxPrintf( win->GetClassInfo()->GetClassName() );
+ wxPrintf( wxT(" %d %d %d %d\n"),
+ alloc->x,
+ alloc->y,
+ alloc->width,
+ alloc->height );
+#endif
+
+ GTK_PIZZA(win->m_wxwindow)->m_width = win->GetClientSize().x;
win->m_oldClientWidth = client_width;
win->m_oldClientHeight = client_height;
m_scrollBar[ScrollDir_Horz] = GTK_RANGE(scrolledWindow->hscrollbar);
m_scrollBar[ScrollDir_Vert] = GTK_RANGE(scrolledWindow->vscrollbar);
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ gtk_range_set_inverted( m_scrollBar[ScrollDir_Horz], TRUE );
m_wxwindow = gtk_pizza_new();
#ifndef __WXUNIVERSAL__
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
-
+
if (HasFlag(wxRAISED_BORDER))
{
gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_OUT );
{
// these get reported to wxWidgets -> wxPaintEvent
- gtk_pizza_set_external( GTK_PIZZA(m_wxwindow), TRUE );
-
g_signal_connect (m_wxwindow, "expose_event",
G_CALLBACK (gtk_window_expose_callback), this);
- gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), HasFlag( wxFULL_REPAINT_ON_RESIZE ) );
+ if (GetLayoutDirection() == wxLayout_LeftToRight)
+ gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), HasFlag( wxFULL_REPAINT_ON_RESIZE ) );
}
// Create input method handler
wxASSERT_MSG( (m_widget != NULL), wxT("invalid window") );
wxASSERT_MSG( (m_parent != NULL), wxT("wxWindowGTK::SetSize requires parent.\n") );
-/*
- printf( "DoSetSize: name %s, x,y,w,h: %d,%d,%d,%d \n", GetName().c_str(), x,y,width,height );
-*/
-
if (m_resizing) return; /* I don't like recursions */
m_resizing = true;
int dh = 0;
if (m_hasScrolling)
- {
GetScrollbarWidth(m_widget, dw, dh);
- }
#ifndef __WXUNIVERSAL__
if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER))
dy = gtk_pizza_get_yoffset( pizza );
}
+ if (m_x == -1 && m_y == -1)
+ {
+ GdkWindow *source = (GdkWindow *) NULL;
+ if (m_wxwindow)
+ source = GTK_PIZZA(m_wxwindow)->bin_window;
+ else
+ source = m_widget->window;
+
+ if (source)
+ {
+ int org_x = 0;
+ int org_y = 0;
+ gdk_window_get_origin( source, &org_x, &org_y );
+
+ if (GetParent())
+ GetParent()->ScreenToClient(&org_x, &org_y);
+
+ ((wxWindowGTK*) this)->m_x = org_x;
+ ((wxWindowGTK*) this)->m_y = org_y;
+ }
+ }
+
if (x) (*x) = m_x - dx;
if (y) (*y) = m_y - dy;
}
}
}
- if (x) *x += org_x;
+
+ if (x)
+ {
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ *x = (GetClientSize().x - *x) + org_x;
+ else
+ *x += org_x;
+ }
+
if (y) *y += org_y;
}
}
}
- if (x) *x -= org_x;
+ if (x)
+ {
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ *x = (GetClientSize().x - *x) - org_x;
+ else
+ *x -= org_x;
+ }
if (y) *y -= org_y;
}
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( GTK_PIZZA(m_wxwindow)->bin_window, p, TRUE );
}
}
}
}
+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 0
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ return m_updateRegion.Contains(x-w, y, w, h) != wxOutRegion;
+ else
+#endif
+ return m_updateRegion.Contains(x, y, w, h) != wxOutRegion;
+}
+
void wxWindowGTK::GtkSendPaintEvents()
{
if (!m_wxwindow)
// Clip to paint region in wxClientDC
m_clipPaintRegion = true;
+ m_nativeUpdateRegion = m_updateRegion;
+
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ {
+ // Transform m_updateRegion under RTL
+ m_updateRegion.Clear();
+
+ gint width;
+ gdk_window_get_geometry( GTK_PIZZA(m_wxwindow)->bin_window,
+ NULL, NULL, &width, NULL, NULL );
+
+ wxRegionIterator upd( m_nativeUpdateRegion );
+ while (upd)
+ {
+ wxRect rect;
+ rect.x = upd.GetX();
+ rect.y = upd.GetY();
+ rect.width = upd.GetWidth();
+ rect.height = upd.GetHeight();
+
+ rect.x = width - rect.x - rect.width;
+ m_updateRegion.Union( rect );
+
+ ++upd;
+ }
+ }
+
// widget to draw on
GtkPizza *pizza = GTK_PIZZA (m_wxwindow);
if (GTK_WIDGET_MAPPED(parent->m_widget))
{
- wxRegionIterator upd( m_updateRegion );
+ wxRegionIterator upd( m_nativeUpdateRegion );
while (upd)
{
GdkRectangle rect;
}
}
else
-
{
wxWindowDC dc( (wxWindow*)this );
dc.SetClippingRegion( m_updateRegion );
m_clipPaintRegion = false;
m_updateRegion.Clear();
+ m_nativeUpdateRegion.Clear();
}
void wxWindowGTK::SetDoubleBuffered( bool on )
pos = max;
if (pos < 0)
pos = 0;
- m_scrollPos[dir] =
- adj->value = pos;
+ m_scrollPos[dir] = adj->value = pos;
+
// If a "value_changed" signal emission is not already in progress
if (!m_blockValueChanged[dir])
{
const int barIndex = range == m_scrollBar[1];
GtkAdjustment* adj = range->adjustment;
+
const int value = int(adj->value + 0.5);
+
// save previous position
const double oldPos = m_scrollPos[barIndex];
// update current position
m_clipPaintRegion = true;
- gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), dx, -dy );
+ else
+ gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
m_clipPaintRegion = false;
}