}
}
+#ifndef __WXUNIVERSAL__
//-----------------------------------------------------------------------------
-// "expose_event" from m_widget, for drawing border
+// "expose_event" from m_wxwindow->parent, for drawing border
//-----------------------------------------------------------------------------
-#ifndef __WXUNIVERSAL__
-
extern "C" {
static gboolean
expose_event_border(GtkWidget* widget, GdkEventExpose* gdk_event, wxWindow* win)
{
- // if this event is not for the GdkWindow the border is drawn on
- if (win->m_wxwindow == win->m_widget && gdk_event->window == widget->window)
+ if (gdk_event->window != widget->window)
+ return false;
+
+ const GtkAllocation& alloc = win->m_wxwindow->allocation;
+ const int x = alloc.x;
+ const int y = alloc.y;
+ const int w = alloc.width;
+ const int h = alloc.height;
+
+ if (w <= 0 || h <= 0)
return false;
- int x = 0;
- int y = 0;
- // GtkScrolledWindow is GTK_NO_WINDOW
- if (GTK_WIDGET_NO_WINDOW(widget))
- {
- x = widget->allocation.x;
- y = widget->allocation.y;
- }
- int w = win->m_wxwindow->allocation.width;
- int h = win->m_wxwindow->allocation.height;
if (win->HasFlag(wxBORDER_SIMPLE))
{
- GdkGC* gc = gdk_gc_new(gdk_event->window);
- gdk_gc_set_foreground(gc, &widget->style->black);
- gdk_draw_rectangle(gdk_event->window, gc, false, x, y, w - 1, h - 1);
- g_object_unref(gc);
+ gdk_draw_rectangle(gdk_event->window,
+ widget->style->black_gc, false, x, y, w - 1, h - 1);
}
else
{
// Style detail to use
const char* detail;
- if (widget == win->m_wxwindow)
+ if (win->m_widget == win->m_wxwindow)
// for non-scrollable wxWindows
detail = "entry";
else
// for scrollable ones
detail = "viewport";
- GtkWidget* styleWidget = wxGTKPrivate::GetEntryWidget();
gtk_paint_shadow(
- styleWidget->style, gdk_event->window, GTK_STATE_NORMAL,
- shadow, NULL, styleWidget, detail, x, y, w, h);
+ win->m_wxwindow->style, gdk_event->window, GTK_STATE_NORMAL,
+ shadow, NULL, wxGTKPrivate::GetEntryWidget(), detail, x, y, w, h);
}
+ return false;
+}
+}
- // no further painting is needed for border-only GdkWindow
- return win->m_wxwindow == win->m_widget;
+//-----------------------------------------------------------------------------
+// "parent_set" from m_wxwindow
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static void
+parent_set(GtkWidget* widget, GtkObject* old_parent, wxWindow* win)
+{
+ if (old_parent)
+ {
+ g_signal_handlers_disconnect_by_func(
+ old_parent, (void*)expose_event_border, win);
+ }
+ if (widget->parent)
+ {
+ g_signal_connect_after(widget->parent, "expose_event",
+ G_CALLBACK(expose_event_border), win);
+ }
}
}
#endif // !__WXUNIVERSAL__
{
wxWindowGTK *focus = gs_pendingFocus ? gs_pendingFocus : gs_currentFocus;
// the cast is necessary when we compile in wxUniversal mode
- return wx_static_cast(wxWindow*, focus);
+ return static_cast<wxWindow*>(focus);
}
void wxWindowGTK::AddChildGTK(wxWindowGTK* child)
m_wxwindow = wxPizza::New(m_windowStyle);
+#ifndef __WXUNIVERSAL__
+ if (HasFlag(wxPizza::BORDER_STYLES))
+ {
+ g_signal_connect(m_wxwindow, "parent_set",
+ G_CALLBACK(parent_set), this);
+ }
+#endif
if (!HasFlag(wxHSCROLL) && !HasFlag(wxVSCROLL))
m_widget = m_wxwindow;
else
g_signal_connect (m_imData->context, "commit",
G_CALLBACK (gtk_wxwindow_commit_cb), this);
-
- // border drawing
-#ifndef __WXUNIVERSAL__
- if (HasFlag(wxPizza::BORDER_STYLES))
- {
- g_signal_connect(m_widget, "expose_event",
- G_CALLBACK(expose_event_border), this);
- }
-#endif
}
// focus handling
if (m_parent)
m_parent->ScreenToClient(&org_x, &org_y);
- wx_const_cast(wxWindowGTK*, this)->m_x = org_x;
- wx_const_cast(wxWindowGTK*, this)->m_y = org_y;
+ const_cast<wxWindowGTK*>(this)->m_x = org_x;
+ const_cast<wxWindowGTK*>(this)->m_y = org_y;
}
}
g_object_unref (layout);
}
+void wxWindowGTK::GTKDisableFocusOutEvent()
+{
+ g_signal_handlers_block_by_func( m_focusWidget,
+ (gpointer) gtk_window_focus_out_callback, this);
+}
+
+void wxWindowGTK::GTKEnableFocusOutEvent()
+{
+ g_signal_handlers_unblock_by_func( m_focusWidget,
+ (gpointer) gtk_window_focus_out_callback, this);
+}
bool wxWindowGTK::GTKHandleFocusIn()
{