Re: turn on italics in TextView



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, <cecashon aol com> 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 <gtk-app-devel-list gnome org>
To: dougm <dougm bravoecho net>
Cc: gtk-app-devel-list <gtk-app-devel-list gnome org>
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
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]