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
button_req.height = 2;
(* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(gcombo->button) )->size_request )
(gcombo->button, &button_req );
-
+
requisition->width = w - button_req.width;
requisition->height = entry_req.height;
}
}
}
- // win is a control: tab can be propagated up
- if ( !ret &&
- ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) &&
-// VZ: testing for wxTE_PROCESS_TAB shouldn't be done here - the control may
-// have this style, yet choose not to process this particular TAB in which
-// case TAB must still work as a navigational character
-// JS: enabling again to make consistent with other platforms
-// (with wxTE_PROCESS_TAB you have to call Navigate to get default
-// navigation behaviour)
-#if wxUSE_TEXTCTRL
- (! (win->HasFlag(wxTE_PROCESS_TAB) && win->IsKindOf(CLASSINFO(wxTextCtrl)) )) &&
-#endif
- win->GetParent() && (win->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
- {
- wxNavigationKeyEvent new_event;
- new_event.SetEventObject( win->GetParent() );
- // GDK reports GDK_ISO_Left_Tab for SHIFT-TAB
- new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
- // CTRL-TAB changes the (parent) window, i.e. switch notebook page
- new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) );
- new_event.SetCurrentFocus( win );
- ret = win->GetParent()->GetEventHandler()->ProcessEvent( new_event );
- }
-
return ret;
}
}
window, window->m_imData->lastKeyEvent);
}
- const wxWxCharBuffer data(wxGTK_CONV_BACK(str));
+ const wxWxCharBuffer data(wxGTK_CONV_BACK_SYS(str));
if( !data )
return;
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
g_lastButtonNumber = gdk_event->button;
- if (win->m_wxwindow && (g_focusWindow != win) && win->AcceptsFocus())
+ if (win->m_wxwindow && (g_focusWindow != win) && win->CanAcceptFocus())
{
gtk_widget_grab_focus( win->m_wxwindow );
}
}
g_lastMouseEvent = (GdkEvent*) gdk_event;
-
+
wxMouseEvent event( event_type );
InitMouseEvent( win, event, gdk_event );
event.SetEventObject( win );
event.SetId( win->GetId() );
- if (win->GTKProcessEvent( event ))
- {
- g_lastMouseEvent = NULL;
- return TRUE;
- }
+ bool ret = win->GTKProcessEvent( event );
g_lastMouseEvent = NULL;
+ if ( ret )
+ return TRUE;
if (event_type == wxEVT_RIGHT_DOWN)
{
}
g_lastMouseEvent = (GdkEvent*) gdk_event;
-
+
wxMouseEvent event( event_type );
InitMouseEvent( win, event, gdk_event );
event.SetEventObject( win );
event.SetId( win->GetId() );
- return win->GTKProcessEvent(event);
+ bool ret = win->GTKProcessEvent(event);
+
+ g_lastMouseEvent = NULL;
+
+ return ret;
}
//-----------------------------------------------------------------------------
}
bool ret = win->GTKProcessEvent(event);
-
+
g_lastMouseEvent = NULL;
return ret;
return FALSE;
}
+static gboolean
+wx_window_focus_callback(GtkWidget *widget,
+ GtkDirectionType direction,
+ wxWindowGTK *win)
+{
+ // the default handler for focus signal in GtkPizza (or, rather, in
+ // GtkScrolledWindow from which GtkPizza inherits this behaviour) sets
+ // focus to the window itself even if it doesn't accept focus, i.e. has no
+ // GTK_CAN_FOCUS in its style -- work around this by forcibly preventing
+ // the signal from reaching gtk_scrolled_window_focus() if we don't have
+ // any children which might accept focus (we know we don't accept the focus
+ // ourselves as this signal is only connected in this case)
+ if ( win->GetChildren().empty() )
+ g_signal_stop_emission_by_name(widget, "focus");
+
+ // we didn't change the focus
+ return FALSE;
+}
+
//-----------------------------------------------------------------------------
// "enter_notify_event"
//-----------------------------------------------------------------------------
if ((client_width == win->m_oldClientWidth) && (client_height == win->m_oldClientHeight))
return;
-#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
-
+ if ( !client_width && !client_height )
+ {
+ // the window is currently unmapped, don't generate size events
+ return;
+ }
+
win->m_oldClientWidth = client_width;
win->m_oldClientHeight = client_height;
m_insertCallback = (wxInsertChildFunction) NULL;
- m_acceptsFocus = false;
m_hasFocus = false;
m_clipPaintRegion = false;
m_insertCallback = wxInsertChildInWindow;
m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
- GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
scrolledWindow->hscrollbar_visible = TRUE;
scrolledWindow->vscrollbar_visible = TRUE;
- }
+ }
else
{
gtk_scrolled_window_set_policy( scrolledWindow, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
- GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
- m_acceptsFocus = true;
-
// connect various scroll-related events
for ( int dir = 0; dir < ScrollDir_Max; dir++ )
{
}
}
+ if ( !AcceptsFocusFromKeyboard() )
+ {
+ GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
+ if ( m_wxwindow )
+ GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
+
+ g_signal_connect(m_widget, "focus",
+ G_CALLBACK(wx_window_focus_callback), this);
+ }
+
// connect to the various key and mouse handlers
GtkWidget *connect_widget = GetConnectWidget();
// FIXME: what should be done here ?
}
#endif
- else
+ else if ( !IsTopLevel() ) // top level windows use their own callback
{
// This is needed if we want to add our windows into native
// GTK controls, such as the toolbar. With this callback, the
{
// inform the parent to perform the move
gtk_pizza_set_size( GTK_PIZZA(m_parent->m_wxwindow), m_widget, x, y, width, height );
-
+
}
void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags )
{
if (GetLayoutDirection() == wxLayout_RightToLeft)
*x = (GetClientSize().x - *x) + org_x;
- else
+ else
*x += org_x;
}
-
+
if (y) *y += org_y;
}
{
if (GetLayoutDirection() == wxLayout_RightToLeft)
*x = (GetClientSize().x - *x) - org_x;
- else
+ else
*x -= org_x;
}
if (y) *y -= org_y;
return true;
}
-static void wxWindowNotifyEnable(wxWindowGTK* win, bool enable)
+void wxWindowGTK::DoEnable( bool enable )
{
- win->OnParentEnable(enable);
-
- // Recurse, so that children have the opportunity to Do The Right Thing
- // and reset colours that have been messed up by a parent's (really ancestor's)
- // Enable call
- for ( wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindow *child = node->GetData();
- if (!child->IsKindOf(CLASSINFO(wxDialog)) && !child->IsKindOf(CLASSINFO(wxFrame)))
- wxWindowNotifyEnable(child, enable);
- }
-}
-
-bool wxWindowGTK::Enable( bool enable )
-{
- wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
-
- if (!wxWindowBase::Enable(enable))
- {
- // nothing to do
- return false;
- }
+ wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
gtk_widget_set_sensitive( m_widget, enable );
if ( m_wxwindow )
gtk_widget_set_sensitive( m_wxwindow, enable );
-
- wxWindowNotifyEnable(this, enable);
-
- return true;
}
int wxWindowGTK::GetCharHeight() const
gtk_widget_grab_focus (m_widget);
return;
}
-
+
gtk_widget_child_focus( m_widget, GTK_DIR_TAB_FORWARD );
}
else
}
}
-bool wxWindowGTK::AcceptsFocus() const
-{
- return m_acceptsFocus && wxWindowBase::AcceptsFocus();
-}
-
bool wxWindowGTK::Reparent( wxWindowBase *newParentBase )
{
wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
return;
GTKSetLayout(m_widget, dir);
-
+
if (m_wxwindow)
GTKSetLayout(m_wxwindow, dir);
}
{
p = NULL;
}
-
+
gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, p, TRUE );
}
}
{
// 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)
{
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);
pango_font_description_copy( m_font.GetNativeFontInfo()->description );
}
+ int flagsNormal = 0,
+ flagsPrelight = 0,
+ flagsActive = 0,
+ flagsInsensitive = 0;
+
if ( m_foregroundColour.Ok() )
{
const GdkColor *fg = m_foregroundColour.GetColor();
- style->fg[GTK_STATE_NORMAL] = *fg;
- style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG;
+ style->fg[GTK_STATE_NORMAL] =
+ style->text[GTK_STATE_NORMAL] = *fg;
+ flagsNormal |= GTK_RC_FG | GTK_RC_TEXT;
- style->fg[GTK_STATE_PRELIGHT] = *fg;
- style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG;
+ style->fg[GTK_STATE_PRELIGHT] =
+ style->text[GTK_STATE_PRELIGHT] = *fg;
+ flagsPrelight |= GTK_RC_FG | GTK_RC_TEXT;
- style->fg[GTK_STATE_ACTIVE] = *fg;
- style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG;
+ style->fg[GTK_STATE_ACTIVE] =
+ style->text[GTK_STATE_ACTIVE] = *fg;
+ flagsActive |= GTK_RC_FG | GTK_RC_TEXT;
}
if ( m_backgroundColour.Ok() )
{
const GdkColor *bg = m_backgroundColour.GetColor();
- style->bg[GTK_STATE_NORMAL] = *bg;
+ style->bg[GTK_STATE_NORMAL] =
style->base[GTK_STATE_NORMAL] = *bg;
- style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags)
- (style->color_flags[GTK_STATE_NORMAL] | GTK_RC_BG | GTK_RC_BASE);
+ flagsNormal |= GTK_RC_BG | GTK_RC_BASE;
- style->bg[GTK_STATE_PRELIGHT] = *bg;
+ style->bg[GTK_STATE_PRELIGHT] =
style->base[GTK_STATE_PRELIGHT] = *bg;
- style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags)
- (style->color_flags[GTK_STATE_PRELIGHT] | GTK_RC_BG | GTK_RC_BASE);
+ flagsPrelight |= GTK_RC_BG | GTK_RC_BASE;
- style->bg[GTK_STATE_ACTIVE] = *bg;
+ style->bg[GTK_STATE_ACTIVE] =
style->base[GTK_STATE_ACTIVE] = *bg;
- style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags)
- (style->color_flags[GTK_STATE_ACTIVE] | GTK_RC_BG | GTK_RC_BASE);
+ flagsActive |= GTK_RC_BG | GTK_RC_BASE;
- style->bg[GTK_STATE_INSENSITIVE] = *bg;
+ style->bg[GTK_STATE_INSENSITIVE] =
style->base[GTK_STATE_INSENSITIVE] = *bg;
- style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags)
- (style->color_flags[GTK_STATE_INSENSITIVE] | GTK_RC_BG | GTK_RC_BASE);
+ flagsInsensitive |= GTK_RC_BG | GTK_RC_BASE;
}
+ style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags)flagsNormal;
+ style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags)flagsPrelight;
+ style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags)flagsActive;
+ style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags)flagsInsensitive;
+
return style;
}
if (pos < 0)
pos = 0;
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
if (dx > 0)
caretRect.width += dx;
else
- {
+ {
caretRect.x += dx; caretRect.width -= dx;
- }
+ }
if (dy > 0)
caretRect.height += dy;
else
- {
+ {
caretRect.y += dy; caretRect.height -= dy;
- }
-
+ }
+
RefreshRect(caretRect);
}
-#endif
+#endif // wxUSE_CARET
}
void wxWindowGTK::GtkScrolledWindowSetBorder(GtkWidget* w, int wxstyle)