// Name: src/gtk/textctrl.cpp
// Purpose:
// Author: Robert Roebling
-// Id: $Id$
// Copyright: (c) 1998 Robert Roebling, Vadim Zeitlin, 2005 Mart Raudsepp
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
extern "C" {
+
+// Normal version used for detecting IME input and generating appropriate
+// events for it.
+void
+wx_insert_text_callback(GtkTextBuffer* buffer,
+ GtkTextIter* WXUNUSED(end),
+ gchar *text,
+ gint WXUNUSED(len),
+ wxTextCtrl *win)
+{
+ if ( win->GTKOnInsertText(text) )
+ {
+ // If we already handled the new text insertion, don't do it again.
+ g_signal_stop_emission_by_name (buffer, "insert_text");
+ }
+}
+
+
+// And an "after" version used for detecting URLs in the text.
static void
au_insert_text_callback(GtkTextBuffer * WXUNUSED(buffer),
GtkTextIter *end,
gtk_text_buffer_get_end_iter(m_buffer, &end);
au_check_range(&start, &end);
}
+
+ // Also connect a normal (not "after") signal handler for checking for
+ // the IME-generated input.
+ g_signal_connect(m_buffer, "insert_text",
+ G_CALLBACK(wx_insert_text_callback), this);
}
else // single line
{
// do the right thing with Enter presses depending on whether we have
// wxTE_PROCESS_ENTER or not
GTKSetActivatesDefault();
+
+ GTKConnectInsertTextSignal(GTK_ENTRY(m_text));
}
return GTK_ENTRY(m_text);
}
+int wxTextCtrl::GTKIMFilterKeypress(GdkEventKey* event) const
+{
+#if GTK_CHECK_VERSION(2, 22, 0)
+ if ( gtk_check_version(2, 12, 0) == 0 )
+ {
+ if ( IsSingleLine() )
+ {
+ return wxTextEntry::GTKIMFilterKeypress(event);
+ }
+ else
+ {
+ return gtk_text_view_im_context_filter_keypress(
+ GTK_TEXT_VIEW(m_text),
+ event
+ );
+ }
+ }
+#else // GTK+ < 2.22
+ wxUnusedVar(event);
+#endif // GTK+ 2.22+
+
+ return FALSE;
+}
+
// ----------------------------------------------------------------------------
// flags handling
// ----------------------------------------------------------------------------
#endif
// First remove the selection if there is one
- // TODO: Is there an easier GTK specific way to do this?
- long from, to;
- GetSelection(&from, &to);
- if (from != to)
- Remove(from, to);
+ gtk_text_buffer_delete_selection(m_buffer, false, true);
// Insert the text
wxGtkTextInsert( m_text, m_buffer, m_defaultStyle, buffer );
return true;
}
-// wxGTK-specific: called recursively by Enable,
-// to give widgets an opportunity to correct their colours after they
-// have been changed by Enable
-void wxTextCtrl::OnEnabled(bool WXUNUSED(enable))
-{
- // If we have a custom background colour, we use this colour in both
- // disabled and enabled mode, or we end up with a different colour under the
- // text.
- wxColour oldColour = GetBackgroundColour();
- if (oldColour.IsOk())
- {
- // Need to set twice or it'll optimize the useful stuff out
- if (oldColour == * wxWHITE)
- SetBackgroundColour(*wxBLACK);
- else
- SetBackgroundColour(*wxWHITE);
- SetBackgroundColour(oldColour);
- }
-}
-
void wxTextCtrl::MarkDirty()
{
m_modified = true;
{
if ( HasFlag(wxTE_PROCESS_ENTER) )
{
- wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
+ wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId);
event.SetEventObject(this);
event.SetString(GetValue());
if ( HandleWindowEvent(event) )