#include "config.h"
#include <gtk/gtk.h>
typedef struct {
GtkTextView parent;
} MyTextView;
typedef struct {
GtkTextViewClass parent_class;
} MyTextViewClass;
static GType my_text_view_get_type (void );
G_DEFINE_TYPE (MyTextView, my_text_view, GTK_TYPE_TEXT_VIEW);
static void snapshot_background (GtkWidget *widget, GtkSnapshot *snapshot);
static void
my_text_view_init (MyTextView *text_view)
{
}
static void my_text_view_snapshot_layer (GtkTextView *textview,
GtkTextViewLayer layer,
GtkSnapshot *snapshot)
{
if (layer == GTK_TEXT_VIEW_LAYER_BELOW_TEXT)
snapshot_background (GTK_WIDGET (textview), snapshot);
}
static void
my_text_view_class_init (MyTextViewClass *klass)
{
GTK_TEXT_VIEW_CLASS (klass)->snapshot_layer = my_text_view_snapshot_layer;
}
static void
create_tags (GtkTextBuffer *buffer)
{
gtk_text_buffer_create_tag (buffer, "italic" ,
"style" , PANGO_STYLE_ITALIC, NULL);
gtk_text_buffer_create_tag (buffer, "bold" ,
"weight" , PANGO_WEIGHT_BOLD, NULL);
gtk_text_buffer_create_tag (buffer, "x-large" ,
"scale" , PANGO_SCALE_X_LARGE, NULL);
gtk_text_buffer_create_tag (buffer, "semi_blue_foreground" ,
"foreground" , "rgba(0,0,255,0.7)" , NULL);
gtk_text_buffer_create_tag (buffer, "semi_red_background" ,
"background" , "rgba(255,0,0,0.5)" , NULL);
gtk_text_buffer_create_tag (buffer, "semi_orange_paragraph_background" ,
"paragraph-background" , "rgba(255,165,0,0.5)" , NULL);
gtk_text_buffer_create_tag (buffer, "word_wrap" ,
"wrap-mode" , GTK_WRAP_WORD, NULL);
}
static GtkTextChildAnchor *
insert_text (GtkTextBuffer *buffer)
{
GtkTextIter iter;
GtkTextIter start, end;
GtkTextMark *para_start;
GtkTextChildAnchor *anchor;
/* get start of buffer; each insertion will revalidate the
* iterator to point to just after the inserted text .
*/
gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0 );
gtk_text_buffer_insert (buffer, &iter,
"This test shows text view rendering some text with rgba colors.\n\n" , -1 );
gtk_text_buffer_insert (buffer, &iter, "For example, you can have " , -1 );
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
"italic translucent blue text" , -1 ,
"italic" ,
"semi_blue_foreground" ,
"x-large" ,
NULL);
gtk_text_buffer_insert (buffer, &iter, ", or " , -1 );
gtk_text_buffer_insert (buffer, &iter, ", " , -1 );
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
"bold text with translucent red background" , -1 ,
"bold" ,
"semi_red_background" ,
"x-large" ,
NULL);
gtk_text_buffer_insert (buffer, &iter, ".\n\n" , -1 );
anchor = gtk_text_buffer_create_child_anchor (buffer, &iter);
/* Store the beginning of the other paragraph */
para_start = gtk_text_buffer_create_mark (buffer, "para_start" , &iter, TRUE );
gtk_text_buffer_insert (buffer, &iter,
"Paragraph background colors can also be set with rgba color values .\n" , -1 );
gtk_text_buffer_insert (buffer, &iter, "For instance, you can have " , -1 );
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
"bold translucent blue text" , -1 ,
"bold" ,
"semi_blue_foreground" ,
"x-large" ,
NULL);
gtk_text_buffer_insert (buffer, &iter, ", or " , -1 );
gtk_text_buffer_insert (buffer, &iter, ", " , -1 );
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
"italic text with translucent red background" , -1 ,
"italic" ,
"semi_red_background" ,
"x-large" ,
NULL);
gtk_text_buffer_insert (buffer, &iter, " all rendered onto a translucent orange paragraph background.\n" , -1 );
gtk_text_buffer_get_bounds (buffer, &start, &end);
gtk_text_buffer_get_iter_at_mark (buffer, &iter, para_start);
gtk_text_buffer_apply_tag_by_name (buffer, "semi_orange_paragraph_background" , &iter, &end);
/* Apply word_wrap tag to whole buffer */
gtk_text_buffer_get_bounds (buffer, &start, &end);
gtk_text_buffer_apply_tag_by_name (buffer, "word_wrap" , &start, &end);
return anchor;
}
/* Size of checks and gray levels for alpha compositing checkerboard */
#define CHECK_SIZE 10
#define CHECK_DARK (1 .0 / 3 .0 )
#define CHECK_LIGHT (2 .0 / 3 .0 )
static void
snapshot_background (GtkWidget *widget,
GtkSnapshot *snapshot)
{
GdkRectangle visible_rect;
gtk_text_view_get_visible_rect (GTK_TEXT_VIEW (widget), &visible_rect);
gtk_snapshot_append_color (snapshot,
&(GdkRGBA) { CHECK_DARK, CHECK_DARK, CHECK_DARK, 1 .0 },
&GRAPHENE_RECT_INIT(visible_rect.x, visible_rect.y, visible_rect.width, visible_rect.height));
gtk_snapshot_push_repeat (snapshot,
&GRAPHENE_RECT_INIT(visible_rect.x, visible_rect.y, visible_rect.width, visible_rect.height),
&GRAPHENE_RECT_INIT(visible_rect.x, visible_rect.y, CHECK_SIZE * 2 , CHECK_SIZE * 2 ));
gtk_snapshot_append_color (snapshot,
&(GdkRGBA) { CHECK_LIGHT, CHECK_LIGHT, CHECK_LIGHT, 1 .0 },
&GRAPHENE_RECT_INIT(visible_rect.x, visible_rect.y, CHECK_SIZE, CHECK_SIZE));
gtk_snapshot_append_color (snapshot,
&(GdkRGBA) { CHECK_LIGHT, CHECK_LIGHT, CHECK_LIGHT, 1 .0 },
&GRAPHENE_RECT_INIT(visible_rect.x + CHECK_SIZE, visible_rect.y + CHECK_SIZE, CHECK_SIZE, CHECK_SIZE));
gtk_snapshot_pop (snapshot);
}
int
main (int argc, char **argv)
{
GtkWidget *window, *textview, *sw, *button, *button2;
GtkTextBuffer *buffer;
GtkTextChildAnchor *anchor;
gtk_init ();
window = gtk_window_new ();
sw = gtk_scrolled_window_new ();
textview = g_object_new (my_text_view_get_type (), NULL);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
button = gtk_button_new_with_label ("Fixed Child" );
button2 = gtk_button_new_with_label ("Flowed Child" );
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_window_set_default_size (GTK_WINDOW (window), 400 , 400 );
create_tags (buffer);
anchor = insert_text (buffer);
gtk_window_set_child (GTK_WINDOW (window), sw);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), textview);
gtk_text_view_add_overlay (GTK_TEXT_VIEW (textview),
button,
50 , 150 );
gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (textview),
button2, anchor);
gtk_window_present (GTK_WINDOW (window));
while (TRUE )
g_main_context_iteration (NULL, TRUE );
return 0 ;
}
Messung V0.5 in Prozent C=98 H=96 G=96
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-07-03)
¤
*© Formatika GbR, Deutschland