EditableT

GtkEditable is an interface for text editing widgets.

Typical examples of editable widgets are [class@Gtk.Entry] and [class@Gtk.SpinButton]. It contains functions for generically manipulating an editable widget, a large number of action signals used for key bindings, and several signals that an application can connect to modify the behavior of a widget.

As an example of the latter usage, by connecting the following handler to [signal@Gtk.Editable::insert-text], an application can convert all entry into a widget into uppercase.

Forcing entry to uppercase.

#include <ctype.h>

void
insert_text_handler (GtkEditable *editable,
const char  *text,
int          length,
int         *position,
gpointer     data)
{
char *result = g_utf8_strup (text, length);

g_signal_handlers_block_by_func (editable,
(gpointer) insert_text_handler, data);
gtk_editable_insert_text (editable, result, length, position);
g_signal_handlers_unblock_by_func (editable,
(gpointer) insert_text_handler, data);

g_signal_stop_emission_by_name (editable, "insert_text");

g_free (result);
}

Implementing GtkEditable

The most likely scenario for implementing GtkEditable on your own widget is that you will embed a #GtkText inside a complex widget, and want to delegate the editable functionality to that text widget. GtkEditable provides some utility functions to make this easy.

In your class_init function, call [func@Gtk.Editable.install_properties], passing the first available property ID:

static void
my_class_init (MyClass *class)
{
...
g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
gtk_editable_install_properties (object_clas, NUM_PROPERTIES);
...
}

In your interface_init function for the GtkEditable interface, provide an implementation for the get_delegate vfunc that returns your text widget:

GtkEditable *
get_editable_delegate (GtkEditable *editable)
{
return GTK_EDITABLE (MY_WIDGET (editable)->text_widget);
}

static void
my_editable_init (GtkEditableInterface *iface)
{
iface->get_delegate = get_editable_delegate;
}

You don't need to provide any other vfuncs. The default implementations work by forwarding to the delegate that the GtkEditableInterface.get_delegate() vfunc returns.

In your instance_init function, create your text widget, and then call [method@Gtk.Editable.init_delegate]:

static void
my_widget_init (MyWidget *self)
{
...
self->text_widget = gtk_text_new ();
gtk_editable_init_delegate (GTK_EDITABLE (self));
...
}

In your dispose function, call [method@Gtk.Editable.finish_delegate] before destroying your text widget:

static void
my_widget_dispose (GObject *object)
{
...
gtk_editable_finish_delegate (GTK_EDITABLE (self));
g_clear_pointer (&self->text_widget, gtk_widget_unparent);
...
}

Finally, use [func@Gtk.Editable.delegate_set_property] in your set_property function (and similar for get_property), to set the editable properties:

...
if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
return;

switch (prop_id)
...

It is important to note that if you create a GtkEditable that uses a delegate, the low level [signal@Gtk.Editable::insert-text] and [signal@Gtk.Editable::delete-text] signals will be propagated from the "wrapper" editable to the delegate, but they will not be propagated from the delegate to the "wrapper" editable, as they would cause an infinite recursion. If you wish to connect to the [signal@Gtk.Editable::insert-text] and [signal@Gtk.Editable::delete-text] signals, you will need to connect to them on the delegate obtained via [method@Gtk.Editable.get_delegate].

Members

Functions

addOnChanged
gulong addOnChanged(void delegate(EditableIF) dlg, ConnectFlags connectFlags)

Emitted at the end of a single user-visible operation on the contents.

addOnDeleteText
gulong addOnDeleteText(void delegate(int, int, EditableIF) dlg, ConnectFlags connectFlags)

Emitted when text is deleted from the widget by the user.

addOnInsertText
gulong addOnInsertText(void delegate(string, int, void*, EditableIF) dlg, ConnectFlags connectFlags)

Emitted when text is inserted into the widget by the user.

deleteSelection
void deleteSelection()

Deletes the currently selected text of the editable.

deleteText
void deleteText(int startPos, int endPos)

Deletes a sequence of characters.

finishDelegate
void finishDelegate()

Undoes the setup done by [method@Gtk.Editable.init_delegate].

getAlignment
float getAlignment()

Gets the alignment of the editable.

getChars
string getChars(int startPos, int endPos)

Retrieves a sequence of characters.

getDelegate
EditableIF getDelegate()

Gets the GtkEditable that @editable is delegating its implementation to.

getEditable
bool getEditable()

Retrieves whether @editable is editable.

getEditableStruct
GtkEditable* getEditableStruct(bool transferOwnership)

Get the main Gtk struct

getEnableUndo
bool getEnableUndo()

Gets if undo/redo actions are enabled for @editable

getMaxWidthChars
int getMaxWidthChars()

Retrieves the desired maximum width of @editable, in characters.

getPosition
int getPosition()

Retrieves the current position of the cursor relative to the start of the content of the editable.

getSelectionBounds
bool getSelectionBounds(int startPos, int endPos)

Retrieves the selection bound of the editable.

getText
string getText()

Retrieves the contents of @editable.

getWidthChars
int getWidthChars()

Gets the number of characters of space reserved for the contents of the editable.

initDelegate
void initDelegate()

Sets up a delegate for GtkEditable.

insertText
void insertText(string text, int length, int position)

Inserts @length bytes of @text into the contents of the widget, at position @position.

selectRegion
void selectRegion(int startPos, int endPos)

Selects a region of text.

setAlignment
void setAlignment(float xalign)

Sets the alignment for the contents of the editable.

setEditable
void setEditable(bool isEditable)

Determines if the user can edit the text in the editable widget.

setEnableUndo
void setEnableUndo(bool enableUndo)

If enabled, changes to @editable will be saved for undo/redo actions.

setMaxWidthChars
void setMaxWidthChars(int nChars)

Sets the desired maximum width in characters of @editable.

setPosition
void setPosition(int position)

Sets the cursor position in the editable to the given value.

setText
void setText(string text)

Sets the text in the editable to the given value.

setWidthChars
void setWidthChars(int nChars)

Changes the size request of the editable to be about the right size for @n_chars characters.

Meta