@oneeyeman1 which language are you using?
Here a fully working example in Python:
import sys
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import GLib, Gtk
class MyApp(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
self.connect('activate', self.on_activate)
def on_activate(self, app):
self.add_window(MyAppWindow())
class MyAppWindow(Gtk.ApplicationWindow):
def __init__(self):
Gtk.ApplicationWindow.__init__(self, default_width=300, default_height=200)
buffer = MyTextBuffer(20)
view = Gtk.TextView.new_with_buffer(buffer)
self.set_child(view)
self.present()
class MyTextBuffer(Gtk.TextBuffer):
def __init__(self, max_length):
Gtk.TextBuffer.__init__(self)
self.max_length = max_length
def do_insert_text(self, itr, txt, txtlen):
# Get buffer size, in characters
current_length = self.get_char_count()
# Trim inserted text, if needed
if current_length + len(txt) > self.max_length:
insert_length = 1 + self.max_length - current_length - len(txt)
txt = txt[:insert_length]
# Let parent's method do the actual insert
Gtk.TextBuffer.do_insert_text(self, itr, txt, -1)
if __name__ == '__main__':
sys.exit(MyApp().run(sys.argv))
If you use C, then have a look at the GtkSourceView code, they have a custom override of insert_text.
It should look like this (entirely untested!!!, feedback welcome):
#define MAX_CHARS 20
#define MY_TYPE_BUFFER (my_buffer_get_type())
G_DECLARE_DERIVABLE_TYPE (MyBuffer, my_buffer, MY, BUFFER, GtkTextBuffer)
G_DEFINE_TYPE (MyBuffer, my_buffer, GTK_TYPE_TEXT_BUFFER)
static void
my_buffer_class_init (MyBufferClass *klass)
{
GObjectClass *object_class;
GtkTextBufferClass *text_buffer_class;
object_class = G_OBJECT_CLASS (klass);
text_buffer_class = GTK_TEXT_BUFFER_CLASS (klass);
text_buffer_class->insert_text = my_buffer_real_insert_text;
}
static void
my_buffer_real_insert_text (GtkTextBuffer *buffer,
GtkTextIter *iter,
const gchar *text,
int len)
{
int current_char_count = gtk_text_buffer_get_char_count (buffer);
int insert_char_count = (int) g_utf8_strlen (text, len);
if (current_char_count + insert_char_count > MAX_CHARS)
{
int new_cnt = MAX_CHARS - current_char_count - insert_char_count;
gchar *new_txt = g_utf8_substring (txt, 0, new_cnt);
GTK_TEXT_BUFFER_CLASS (my_buffer_parent_class)->insert_text (buffer, iter, new_txt, -1);
g_free (new_txt);
}
else
{
GTK_TEXT_BUFFER_CLASS (my_buffer_parent_class)->insert_text (buffer, iter, text, len);
}
}