Eric, thanks again.
I ended up using g_signal_connect() on "key-press-event" (instead of
"insert-text"). This makes it easier IMO to handle specific cases, since
the callback fn can return TRUE if it did anything or FALSE to get GTK
default behavior, unlike void insert-text fn. Plus if you paste 20000
chars, the insert-text callback will process every one of them, whereas
key-press-event will get none of them.
I think I tried to do my own version of the move-cursor and change
italic/bold state buttons, but abandoned it, don't remember why. But I
took the advice to "store" the italic/bold states in the toolbar button
states. It's a little quirky since the text cursor can move away from an
italic/bold region and still the i/b tutton, if already pressed, stays that
way and so typing at the new cursor location is i/b.
Anyway, with Italic button pressed, for example, I get the char via
key-press-event. (If style tool button not pressed, then return FALSE).
The characters are just keycodes at this point, so need to kick back most
of them to default:
switch (event->keyval) {
case GDK_KEY_Return:
case GDK_KEY_Delete:
case GDK_KEY_Shift_L:
case GDK_KEY_Shift_R:
case GDK_KEY_Alt_L:
case GDK_KEY_Alt_R:
case GDK_KEY_Control_L:
case GDK_KEY_Up:
case GDK_KEY_Down:
case GDK_KEY_Left:
case GDK_KEY_Right:
case GDK_KEY_End:
case GDK_KEY_Home:
// case GDK_KEY_BackSpace:
return FALSE;
}
or you get the first letter after "GDK_KEY_". Still haven't fixed up the
backspace case. Then call
text = gdk_keyval_name(event->keyval);
If strlen(text) > 1, then go through this exercise:
switch (event->keyval) {
case GDK_KEY_exclam: text = "!"; break;
case GDK_KEY_quotedbl: text = "\""; break;
case GDK_KEY_numbersign: text = "#"; break;
case GDK_KEY_dollar: text = "$"; break;
case GDK_KEY_percent: text = "%"; break;
case GDK_KEY_ampersand: text = "&"; break;
case GDK_KEY_apostrophe: text = "'"; break;
case GDK_KEY_parenleft: text = "("; break;
case GDK_KEY_parenright: text = ")"; break;
case GDK_KEY_asterisk: text = "*"; break;
case GDK_KEY_plus: text = "+"; break;
case GDK_KEY_colon: text = ":"; break;
case GDK_KEY_less: text = "<"; break;
case GDK_KEY_greater: text = ">"; break;
case GDK_KEY_question: text = "?"; break;
case GDK_KEY_at: text = "@"; break;
case GDK_KEY_underscore: text = "_"; break;
case GDK_KEY_braceleft: text = "{"; break;
case GDK_KEY_bar: text = "|"; break;
case GDK_KEY_braceright: text = "}"; break;
case GDK_KEY_asciitilde: text = "~"; break;
}
Then after all that malarkey, simply insert the char, get the iters around
it, and apply the style to it. Then return TRUE.
So this works pretty good (good enough :-) ).
Even though I didn't use your suggested code
GSList *tlist=NULL;
GSList *next=NULL;
tlist=gtk_text_iter_get_tags(&start);
if(tlist!=NULL)
{
do
{
next=tlist->next;
gchar *string=NULL;
g_object_get(G_OBJECT(tlist->data), "name", &string, NULL);
g_print("%s\n", string);
g_free(string);
tlist=g_slist_next(tlist);
}while(next!=NULL);
}
else g_print("No Tags\n");
if(tlist!=NULL) g_slist_free(tlist);
after cursor motion, I did deploy that elsewhere to find format tags (for
example in exporting to HTML, for which I have a crude version). Once
again thanks for that do-while tlist loop -- I *never* would've figured out
how to write that!
--Doug
On Tue, Jun 20, 2017 at 10:47 PM, <[email protected]> wrote:
>
> On that last post, I think that I have some bad pointer arithmetic. Moving
> a pointer past the end and freeing a moved pointer. Not so good.
>
> Eric
>
> ...
> GSList *tlist=NULL;
> GSList *p=NULL;
> GSList *next=NULL;
> tlist=gtk_text_iter_get_tags(&start);
> p=tlist;
> if(tlist!=NULL)
> {
> do
> {
> next=p->next;
> gchar *string=NULL;
> g_object_get(G_OBJECT(p->data), "name", &string, NULL);
> g_print("%s\n", string);
> g_free(string);
> if(next!=NULL)p=g_slist_next(p);
> }while(next!=NULL);
> }
> else g_print("No Tag\n");
>
> if(tlist!=NULL) g_slist_free(tlist);
> ...
>
>
> -----Original Message-----
> From: Eric Cashon via gtk-app-devel-list <[email protected]>
> To: dougm <[email protected]>
> Cc: gtk-app-devel-list <[email protected]>
> Sent: Tue, Jun 20, 2017 4:48 pm
> Subject: Re: turn on italics in TextView
>
>
>
> Another option is to look at the properties of the tags to get the
> information that you need. This might work better than saving globals and
> matching pointers.
>
> Eric
>
> ...
> GSList *tlist=NULL;
> GSList *next=NULL;
> tlist=gtk_text_iter_get_tags(&start);
> if(tlist!=NULL)
> {
> do
> {
> next=tlist->next;
> gchar *string=NULL;
> g_object_get(G_OBJECT(tlist->data), "name", &string, NULL);
> g_print("%s\n", string);
> g_free(string);
> tlist=g_slist_next(tlist);
> }while(next!=NULL);
> }
> else g_print("No Tags\n");
>
> if(tlist!=NULL) g_slist_free(tlist);
> ...
>
>
>
>
>
> _______________________________________________
> gtk-app-devel-list mailing list
> [email protected]
> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
_______________________________________________
gtk-app-devel-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list