11/*
22 * L3afpad - GTK+ based simple text editor
33 * Copyright (C) 2004-2005 Tarot Osuji
4+ * Copyright (C) 2012 Yoo, Taik-Yon <jaagar AT gmail DOT com>
45 *
56 * This program is free software; you can redistribute it and/or modify
67 * it under the terms of the GNU General Public License as published by
@@ -106,6 +107,20 @@ get_lines (GtkTextView *text_view,
106107 * countp = count ;
107108}
108109
110+ static inline PangoAttribute *
111+ line_numbers_foreground_attr_new (GtkWidget * widget )
112+ {
113+ GtkStyleContext * context ;
114+ GdkRGBA rgb ;
115+
116+ context = gtk_widget_get_style_context (widget );
117+ gtk_style_context_get_color (context , GTK_STATE_FLAG_NORMAL , & rgb );
118+
119+ return pango_attr_foreground_new ((guint16 )(rgb .red * 65535 ),
120+ (guint16 )(rgb .green * 65535 ),
121+ (guint16 )(rgb .blue * 65535 ));
122+ }
123+
109124static gint
110125line_numbers_expose (GtkWidget * widget , cairo_t * event )
111126{
@@ -122,6 +137,8 @@ line_numbers_expose (GtkWidget *widget, cairo_t *event)
122137 gint i ;
123138 gchar str [8 ]; /* we don't expect more than ten million lines */
124139
140+ cairo_rectangle_list_t * clips ;
141+
125142 if (line_number_visible ) {
126143
127144 text_view = GTK_TEXT_VIEW (widget );
@@ -137,17 +154,28 @@ line_numbers_expose (GtkWidget *widget, cairo_t *event)
137154 y2 = y1 + event -> area .height ;
138155#endif
139156
157+ /* get origin of the clipping area. */
158+ clips = cairo_copy_clip_rectangle_list (event );
159+
160+ i = (gint )clips -> rectangles [0 ].x ;
161+ y1 = (gint )clips -> rectangles [0 ].y ;
162+
163+ cairo_rectangle_list_destroy (clips );
164+
165+ /* skip drawing if not in the line number area. */
166+ if (i >= gtk_text_view_get_border_window_size (text_view , GTK_TEXT_WINDOW_LEFT ))
167+ return FALSE;
168+
140169 gtk_text_view_window_to_buffer_coords (text_view ,
141170 GTK_TEXT_WINDOW_LEFT ,
142171 0 ,
143172 y1 ,
144173 NULL ,
145174 & y1 );
146-
147175 gtk_text_view_window_to_buffer_coords (text_view ,
148176 GTK_TEXT_WINDOW_LEFT ,
149177 0 ,
150- y2 ,
178+ gtk_widget_get_allocated_height ( widget ) ,
151179 NULL ,
152180 & y2 );
153181
@@ -199,7 +227,7 @@ DV({g_print("Painting line numbers %d - %d\n",
199227
200228 alist = pango_attr_list_new ();
201229/* TODO: should change line number color by conffile */
202- attr = pango_attr_foreground_new ( 0 , 0 , 0 );
230+ attr = line_numbers_foreground_attr_new ( widget );
203231 attr -> start_index = 0 ;
204232 attr -> end_index = G_MAXUINT ;
205233 pango_attr_list_insert (alist , attr );
@@ -208,8 +236,7 @@ DV({g_print("Painting line numbers %d - %d\n",
208236
209237 /* Draw fully internationalized numbers! */
210238
211- i = 0 ;
212- while (i < count ) {
239+ for (i = 0 ; i < count ; i ++ ) {
213240 gint pos ;
214241
215242 gtk_text_view_buffer_to_window_coords (text_view ,
@@ -228,7 +255,6 @@ DV({g_print("Painting line numbers %d - %d\n",
228255 layout_width + justify_width + margin / 2 + 1 ,
229256 pos ,
230257 layout );
231- ++ i ;
232258 }
233259
234260 g_array_free (pixels , TRUE);
0 commit comments