Graeme Jensz
Graeme Jensz

Reputation: 277

GTK How to set font for a text_view

How can I set the font name and size for a text_view? Or do I have to set the font information at the buffer or at the window? Do I have to create some sort of style-sheet?

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

    GtkWidget *window;
    GtkWidget *view;
    GtkTextBuffer *buffer;

    gtk_init(&argc, &argv);

    view = gtk_text_view_new();

    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_default_size(GTK_WINDOW(window), 350, 300);

    gtk_container_add(GTK_CONTAINER(window), view);
    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

Upvotes: 6

Views: 9048

Answers (3)

TnxSO
TnxSO

Reputation: 13

Some comment to the previous answers suggested that "Pango syntax for the font is deprecated in Gtk+3". I'm not sure about what exactly that is was referring to, but Pango markup syntax is supported in GTK 3 and 4. Using Pango markup embedded in the string is the easiest way to set size and other font attributes. No need to do anything with CSS. For example, in Python you can do:

label = Gtk.Label()
label.set_markup("<span font='100'>A BIG title - and the Author's name</span>")

Pango Documentation

Upvotes: 0

michal
michal

Reputation: 115

I know it is 2 years old question but in case someone encounter any issues. Note, that Pango syntax for the font is deprecated in Gtk+3.

If you want to use GtkSourceView:

#include <gtksourceview/gtksource.h>

must be installed separately and compiled with

`pkg-config --cflags --libs gtksourceview-3.0`

or use regular GtkTextView

 GtkCssProvider *cssProvider;
 GtkSourceView *view;
 GError *error = NULL;
 GtkStyleContext *context;

 /* new css provider */
 cssProvider = gtk_css_provider_new(); 

 view = GTK_SOURCE_VIEW(gtk_source_view_new ());

 /* widget name for css syntax */
 gtk_widget_set_name (GTK_WIDGET(view), "cssView");   

 /* load css file */
 gtk_css_provider_load_from_path (cssProvider, "main.css", &error); 

 /* get GtkStyleContext from widget   */
 context = gtk_widget_get_style_context(GTK_WIDGET(view));  

 /* finally load style provider */
 gtk_style_context_add_provider(context,    
                             GTK_STYLE_PROVIDER(cssProvider), 
                             GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

and "main.css" file in the same directory

#cssView { 
      font: 15px "Monospace";
      color: #ff0000;          /*in case you need red color*/
}

Actually in Gtk+3 you can add and remove CSS classes in very easy way:

in one callback you need to call:

 gtk_style_context_add_class(context, "redFonts");

then in another one:

 gtk_style_context_remove_class(context, "redFonts");

your "main.css" should be like:

#tab1Content {
    font: 15px "Monospace";
}
.redFonts{
    color: #ff0000;
}

Upvotes: 4

Graeme Jensz
Graeme Jensz

Reputation: 277

The following code works.

my.c

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    GtkWidget *view;
    GtkTextBuffer *buffer;
    GtkWidget *window;

    GdkDisplay *display;
    GdkScreen *screen;
    GtkCssProvider *provider;

    GError *error;

    gtk_init(&argc, &argv);

    view = gtk_text_view_new();
    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));

    display = gdk_display_get_default ();
    screen = gdk_display_get_default_screen (display);
    provider = gtk_css_provider_new();
    gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

    error = NULL;
    gtk_css_provider_load_from_file (provider, g_file_new_for_path("my.css"), &error);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_default_size(GTK_WINDOW(window), 350, 300);

    gtk_container_add(GTK_CONTAINER(window), view);
    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

my.css

GtkTextView
{
    font:Monospace 10;
}. 

Upvotes: 4

Related Questions