Re: How can I change the font of a text field using non-deprecated way?



 
Hi Radomir,

The function gtk_widget_override_font() is deprecated but as far as I know it still works fine in GTK3. 

With the Pango font description and the textview you should be able to set everything up without getting any 
deprecated warnings. It doesn't set the textview widget itself to a particular font but you do have the Pango 
font description that you can use elsewhere if needed.

Eric

    
//gcc -Wall font_chooser1.c -o font_chooser1 `pkg-config --cflags --libs gtk+-3.0`

#include <gtk/gtk.h>

static void show_font_chooser(GtkWidget *button, gpointer **user_data)
  {
    static gint i=1;
    GtkWidget *chooser=gtk_font_chooser_dialog_new("Font Chooser", GTK_WINDOW(user_data[0]));
    gint result=gtk_dialog_run(GTK_DIALOG(chooser));

    if(result==GTK_RESPONSE_OK)
      {       
        PangoFontDescription *desc=gtk_font_chooser_get_font_desc(GTK_FONT_CHOOSER(chooser));
        GtkTextBuffer *buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data[1]));
        gchar *tag_name=g_strdup_printf("font-tag%i", i);
        GtkTextTag *font_tag=gtk_text_buffer_create_tag(buffer, tag_name, "font-desc", desc, NULL);
        g_ptr_array_add((GPtrArray*)user_data[2], (gpointer)font_tag);
        i++;
        g_free(tag_name);
        pango_font_description_free(desc);
      }
    
    gtk_widget_destroy(chooser);
  }
static void insert_text(GtkTextBuffer *textbuffer, GtkTextIter *location, gchar *text, gint len, GPtrArray 
*tags)
  {
    GtkTextIter *start=gtk_text_iter_copy(location);
    gtk_text_iter_backward_chars(start, len);
    //Get the last tag added to the tag array.
    GtkTextTag *font_tag=GTK_TEXT_TAG(g_ptr_array_index(tags, ((tags->len)-1)));
    gtk_text_buffer_apply_tag(textbuffer, font_tag, start, location);
    gtk_text_iter_free(start);
  }
int main(int argc, char *argv[])
  {
    gtk_init(&argc, &argv);

    GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Font Chooser");
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 20);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    GtkWidget *textview=gtk_text_view_new();
    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
    gtk_widget_set_hexpand(textview, TRUE);
    gtk_widget_set_vexpand(textview, TRUE);

    PangoContext *context=gtk_widget_get_pango_context(textview);
    PangoFontDescription *desc=pango_context_get_font_description(context);

    //For saving the tag pointers.
    GPtrArray *tags=g_ptr_array_new();

    GtkTextBuffer *buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    GtkTextTag *font_tag=gtk_text_buffer_create_tag(buffer, "font-tag", "font-desc", desc, NULL);
    g_ptr_array_add(tags, (gpointer)font_tag);
    g_signal_connect_after(buffer, "insert-text", G_CALLBACK(insert_text), tags); 

    GtkWidget *button=gtk_button_new_with_label("FontChooser");
    gtk_widget_set_hexpand(button, TRUE);
    gpointer user_data[]={window, textview, tags};
    g_signal_connect(button, "clicked", G_CALLBACK(show_font_chooser), user_data);

    GtkWidget *grid=gtk_grid_new();
    gtk_grid_attach(GTK_GRID(grid), textview, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), button, 0, 1, 1, 1);

    gtk_container_add(GTK_CONTAINER(window), grid);

    gtk_widget_show_all(window);
    
    gtk_main();

    return 0;
  }

 


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