Editable

interface Editable

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.

Skipped during bindings generation

  • parameter start_pos: start_pos: Out parameter is not supported

  • method insert_text: In/Out parameter is not supported

  • method cursor-position: Property has no getter nor setter

  • method selection-bound: Property has no getter nor setter

  • method xalign: Property has no getter nor setter

  • signal insert-text: Unsupported parameter position : position: InOut parameter is not supported

  • function install_properties: C function gtk_editable_install_properties is ignored

Inheritors

Types

Link copied to clipboard
object Companion

Properties

Link copied to clipboard
open var editable: Boolean

Whether the entry contents can be edited.

Link copied to clipboard

If undo/redo should be enabled for the editable.

Link copied to clipboard
abstract val gtkEditablePointer: <Error class: unknown class><<Error class: unknown class>>
Link copied to clipboard
open var maxWidthChars: Int

The desired maximum width of the entry, in characters.

Link copied to clipboard
open var text: String

The contents of the entry.

Link copied to clipboard
open var widthChars: Int

Number of characters to leave space for in the entry.

Functions

Link copied to clipboard
open fun connectChanged(connectFlags: <Error class: unknown class> = ConnectFlags(0u), handler: () -> Unit): <Error class: unknown class>

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

Link copied to clipboard
open fun connectDeleteText(connectFlags: <Error class: unknown class> = ConnectFlags(0u), handler: (startPos: Int, endPos: Int) -> Unit): <Error class: unknown class>

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

Link copied to clipboard
open fun deleteSelection()

Deletes the currently selected text of the editable.

Link copied to clipboard
open fun deleteText(startPos: Int, endPos: Int)

Deletes a sequence of characters.

Link copied to clipboard
open fun finishDelegate()

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

Link copied to clipboard
open fun getAlignment(): Float

Gets the alignment of the editable.

Link copied to clipboard
open fun getChars(startPos: Int, endPos: Int): String

Retrieves a sequence of characters.

Link copied to clipboard
open fun getDelegate(): Editable?

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

Link copied to clipboard
open fun getEditable(): Boolean

Retrieves whether @editable is editable.

Link copied to clipboard

Gets if undo/redo actions are enabled for @editable

Link copied to clipboard
open fun getMaxWidthChars(): Int

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

Link copied to clipboard
open fun getPosition(): Int

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

Link copied to clipboard
open fun getText(): String

Retrieves the contents of @editable.

Link copied to clipboard
open fun getWidthChars(): Int

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

Link copied to clipboard
open fun initDelegate()

Sets up a delegate for GtkEditable.

Link copied to clipboard
open fun selectRegion(startPos: Int, endPos: Int)

Selects a region of text.

Link copied to clipboard
open fun setAlignment(xalign: Float)

Sets the alignment for the contents of the editable.

Link copied to clipboard
open fun setEditable(isEditable: Boolean)

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

Link copied to clipboard
open fun setEnableUndo(enableUndo: Boolean)

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

Link copied to clipboard
open fun setMaxWidthChars(nChars: Int)

Sets the desired maximum width in characters of @editable.

Link copied to clipboard
open fun setPosition(position: Int)

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

Link copied to clipboard
open fun setText(text: String)

Sets the text in the editable to the given value.

Link copied to clipboard
open fun setWidthChars(nChars: Int)

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