thw wxWindow class has a member variable called m_widget which holds a
pointer to this widget. When the window class represents a GTK native widget,
this is (in most cases) the only GTK widget the class manages. E.g. the
- wxStatitText class handles only a GtkLabel widget a pointer to which you
+ wxStaticText class handles only a GtkLabel widget a pointer to which you
can find in m_widget (defined in wxWindow)
When the class has a client area for drawing into and for containing children
if (g_blockEventsOnDrag)
return FALSE;
+#ifdef __WXGTK20__
+ if (win->m_imContext)
+ {
+ // In GTK 2.0, we need to hand over the key event to an input method
+ // and the IM will emit a "commit" event containing the actual utf8
+ // character. In that case the EVT_CHAR events will be sent from
+ // there.
+ if ( gtk_im_context_filter_keypress(win->m_imContext, gdk_event) )
+ return TRUE;
+ }
+#endif
wxKeyEvent event( wxEVT_KEY_DOWN );
if ( !wxTranslateGTKKeyEventToWx(event, win, gdk_event) )
{
long key_code;
KeySym keysym = gdk_event->keyval;
-#ifdef __WXGTK20__
- // In GTK 2.0, we need to hand over the key event to an input method
- // and the IM will emit a "commit" event containing the actual utf8
- // character. In that case the EVT_CHAR events will be sent from
- // there. But only do it this way for non-KeySym keys.
- key_code = wxTranslateKeySymToWXKey(gdk_event->keyval, FALSE /* isChar */);
- if ( !key_code && win->m_imContext )
+ // Find key code for EVT_CHAR and EVT_CHAR_HOOK events
+ key_code = wxTranslateKeySymToWXKey(keysym, TRUE /* isChar */);
+ if ( !key_code )
{
- gtk_im_context_filter_keypress ( (GtkIMContext*) win->m_imContext, gdk_event );
- ret = TRUE;
- }
- else
-#endif
- {
- // Find key code for EVT_CHAR and EVT_CHAR_HOOK events
- key_code = wxTranslateKeySymToWXKey(keysym, TRUE /* isChar */);
- if ( !key_code )
+ if ( gdk_event->length == 1 )
{
- if ( gdk_event->length == 1 )
- {
- key_code = (unsigned char)gdk_event->string[0];
- }
- else if ( wxIsAsciiKeysym(keysym) )
- {
- // ASCII key
- key_code = (unsigned char)keysym;
- }
+ key_code = (unsigned char)gdk_event->string[0];
}
-
- if ( key_code )
+ else if ( wxIsAsciiKeysym(keysym) )
{
- wxLogTrace(TRACE_KEYS, _T("Char event: %ld"), key_code);
+ // ASCII key
+ key_code = (unsigned char)keysym;
+ }
+ }
- event.m_keyCode = key_code;
+ if ( key_code )
+ {
+ wxLogTrace(TRACE_KEYS, _T("Char event: %ld"), key_code);
- // Implement OnCharHook by checking ancesteror top level windows
- wxWindow *parent = win;
- while (parent && !parent->IsTopLevel())
- parent = parent->GetParent();
- if (parent)
- {
- event.SetEventType( wxEVT_CHAR_HOOK );
- ret = parent->GetEventHandler()->ProcessEvent( event );
- }
+ event.m_keyCode = key_code;
- if (!ret)
- {
- event.SetEventType(wxEVT_CHAR);
- ret = win->GetEventHandler()->ProcessEvent( event );
- }
+ // Implement OnCharHook by checking ancesteror top level windows
+ wxWindow *parent = win;
+ while (parent && !parent->IsTopLevel())
+ parent = parent->GetParent();
+ if (parent)
+ {
+ event.SetEventType( wxEVT_CHAR_HOOK );
+ ret = parent->GetEventHandler()->ProcessEvent( event );
+ }
+
+ if (!ret)
+ {
+ event.SetEventType(wxEVT_CHAR);
+ ret = win->GetEventHandler()->ProcessEvent( event );
}
}
}
if (event.m_uniChar < 256)
event.m_keyCode = event.m_uniChar;
#else
- gunichar uniChar = g_utf8_get_char( str );
- // We cannot handle Unicode in non-Unicode mode
- if (uniChar > 255) return;
-
- event.m_keyCode = uniChar;
+ wchar_t unistr[2];
+ unistr[0] = g_utf8_get_char(str);
+ unistr[1] = 0;
+ wxCharBuffer ansistr(wxConvLocal.cWC2MB(unistr));
+ // We cannot handle characters that cannot be represented in
+ // current locale's charset in non-Unicode mode:
+ if (ansistr.data() == NULL) return;
+
+ event.m_keyCode = ansistr[0u];
#endif
wxEventType event_type = wxEVT_NULL;
- // GdkDisplay is a GTK+ 2.1.0 thing
-#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2, 1, 0)
+ // GdkDisplay is a GTK+ 2.2.0 thing
+#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2, 2, 0)
if ( gdk_event->type == GDK_2BUTTON_PRESS &&
gdk_event->button >= 1 && gdk_event->button <= 3 )
{
if (g_isIdle)
wxapp_install_idle_handler();
+#ifdef __WXGTK20__
+ if (win->m_imContext)
+ gtk_im_context_focus_in(win->m_imContext);
+#endif
+
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
if (g_isIdle)
wxapp_install_idle_handler();
+#ifdef __WXGTK20__
+ if (win->m_imContext)
+ gtk_im_context_focus_out(win->m_imContext);
+#endif
+
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
if (win->m_imContext)
{
GtkPizza *pizza = GTK_PIZZA( m_widget );
- gtk_im_context_set_client_window( (GtkIMContext*) win->m_imContext, pizza->bin_window );
+ gtk_im_context_set_client_window( win->m_imContext, pizza->bin_window );
}
#endif
gtk_signal_connect( GTK_OBJECT(m_vAdjust), "value_changed",
(GtkSignalFunc) gtk_window_vscroll_callback, (gpointer) this );
-#ifdef __WXGTK20__
- // Create input method handler
- m_imContext = (GtkIMMulticontext*) gtk_im_multicontext_new ();
-
- // Cannot handle drawing preedited text yet
- gtk_im_context_set_use_preedit( (GtkIMContext*) m_imContext, FALSE );
-
- g_signal_connect (G_OBJECT (m_imContext), "commit",
- G_CALLBACK (gtk_wxwindow_commit_cb), this);
-#endif
-
gtk_widget_show( m_wxwindow );
if (m_parent)
#else
// gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), !HasFlag( wxFULL_REPAINT_ON_RESIZE ) );
#endif
+ }
#ifdef __WXGTK20__
// Create input method handler
- m_imContext = (GtkIMMulticontext*) gtk_im_multicontext_new ();
+ m_imContext = gtk_im_multicontext_new();
// Cannot handle drawing preedited text yet
- gtk_im_context_set_use_preedit( (GtkIMContext*) m_imContext, FALSE );
+ gtk_im_context_set_use_preedit( m_imContext, FALSE );
g_signal_connect (G_OBJECT (m_imContext), "commit",
- G_CALLBACK (gtk_wxwindow_commit_cb), this);
+ G_CALLBACK (gtk_wxwindow_commit_cb), this);
#endif
- }
// these are called when the "sunken" or "raised" borders are drawn
gtk_signal_connect( GTK_OBJECT(m_widget), "expose_event",
{
// do we need to apply any changes at all?
if ( !forceStyle &&
- !m_hasFont && !m_hasFgCol &&
- (!m_hasBgCol || !m_backgroundColour.Ok()) )
+ !m_font.Ok() &&
+ !m_foregroundColour.Ok() && !m_backgroundColour.Ok() )
{
return NULL;
}
GtkRcStyle *style = gtk_rc_style_new();
- if ( m_hasFont )
+ if ( m_font.Ok() )
{
#ifdef __WXGTK20__
style->font_desc =
#endif
}
- if ( m_hasFgCol )
+ if ( m_foregroundColour.Ok() )
{
GdkColor *fg = m_foregroundColour.GetColor();
style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG;
}
- if ( m_hasBgCol )
+ if ( m_backgroundColour.Ok() )
{
GdkColor *bg = m_backgroundColour.GetColor();
return style;
}
-void wxWindowGTK::ApplyWidgetStyle(bool WXUNUSED(forceStyle))
+void wxWindowGTK::ApplyWidgetStyle(bool forceStyle)
+{
+ GtkRcStyle *style = CreateWidgetStyle(forceStyle);
+ if ( style )
+ {
+ DoApplyWidgetStyle(style);
+ gtk_rc_style_unref(style);
+ }
+}
+
+void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style)
{
+ if (m_wxwindow)
+ // should we also do m_widget in this case?
+ gtk_widget_modify_style(m_wxwindow, style);
+ else
+ gtk_widget_modify_style(m_widget, style);
}
+
//-----------------------------------------------------------------------------
// Pop-up menu stuff
//-----------------------------------------------------------------------------