]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktextdisplay.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtktextdisplay.c
index 6c2eddf9a7e12fc384d0633d44fc4a6f8656955b..24cc0ec6b4850970c08c3b46f341184232b7b328 100644 (file)
@@ -21,8 +21,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.Free
  *
  * Original Tk license:
  *
@@ -122,6 +121,8 @@ struct _GtkTextRendererClass
   PangoRendererClass parent_class;
 };
 
+GType _gtk_text_renderer_get_type (void);
+
 G_DEFINE_TYPE (GtkTextRenderer, _gtk_text_renderer, PANGO_TYPE_RENDERER)
 
 static void
@@ -584,10 +585,9 @@ render_para (GtkTextRenderer    *text_renderer,
   screen_width = line_display->total_width;
 
   context = gtk_widget_get_style_context (text_renderer->widget);
+  state = gtk_widget_get_state_flags (text_renderer->widget);
 
-  state = GTK_STATE_FLAG_SELECTED;
-  if (gtk_widget_has_focus (text_renderer->widget))
-    state |= GTK_STATE_FLAG_FOCUSED;
+  state |= GTK_STATE_FLAG_SELECTED;
 
   gtk_style_context_get_background_color (context, state, &selection);
 
@@ -821,11 +821,11 @@ gtk_text_layout_draw (GtkTextLayout *layout,
                       cairo_t *cr,
                       GList **widgets)
 {
+  GtkStyleContext *context;
   gint offset_y;
-  GSList *cursor_list;
   GtkTextRenderer *text_renderer;
   GtkTextIter selection_start, selection_end;
-  gboolean have_selection = FALSE;
+  gboolean have_selection;
   GSList *line_list;
   GSList *tmp_list;
   GList *tmp_widgets;
@@ -839,6 +839,8 @@ gtk_text_layout_draw (GtkTextLayout *layout,
   if (!gdk_cairo_get_clip_rectangle (cr, &clip))
     return;
 
+  context = gtk_widget_get_style_context (widget);
+
   line_list = gtk_text_layout_get_lines (layout, clip.y, clip.y + clip.height, &offset_y);
 
   if (line_list == NULL)
@@ -852,10 +854,9 @@ gtk_text_layout_draw (GtkTextLayout *layout,
 
   gtk_text_layout_wrap_loop_start (layout);
 
-  if (gtk_text_buffer_get_selection_bounds (layout->buffer,
-                                            &selection_start,
-                                            &selection_end))
-    have_selection = TRUE;
+  have_selection = gtk_text_buffer_get_selection_bounds (layout->buffer,
+                                                         &selection_start,
+                                                         &selection_end);
 
   tmp_list = line_list;
   while (tmp_list != NULL)
@@ -863,8 +864,6 @@ gtk_text_layout_draw (GtkTextLayout *layout,
       GtkTextLineDisplay *line_display;
       gint selection_start_index = -1;
       gint selection_end_index = -1;
-      gboolean have_strong;
-      gboolean have_weak;
 
       GtkTextLine *line = tmp_list->data;
 
@@ -906,50 +905,26 @@ gtk_text_layout_draw (GtkTextLayout *layout,
                        selection_start_index, selection_end_index);
 
           /* We paint the cursors last, because they overlap another chunk
-         and need to appear on top. */
-
-         have_strong = FALSE;
-         have_weak = FALSE;
-         
-         cursor_list = line_display->cursors;
-         while (cursor_list)
-           {
-             GtkTextCursorDisplay *cursor = cursor_list->data;
-             if (cursor->is_strong)
-               have_strong = TRUE;
-             else
-               have_weak = TRUE;
-             
-             cursor_list = cursor_list->next;
-           }
-         
-          cursor_list = line_display->cursors;
-          while (cursor_list)
+           * and need to appear on top.
+           */
+          if (line_display->cursors != NULL)
             {
-              GtkTextCursorDisplay *cursor = cursor_list->data;
-             GtkTextDirection dir;
-             GdkRectangle cursor_location;
-
-              dir = line_display->direction;
-             if (have_strong && have_weak)
-               {
-                 if (!cursor->is_strong)
-                   dir = (dir == GTK_TEXT_DIR_RTL) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL;
-               }
-             cursor_location.x = line_display->x_offset + cursor->x;
-             cursor_location.y = line_display->top_margin + cursor->y;
-             cursor_location.width = 0;
-             cursor_location.height = cursor->height;
+              int i;
 
-             gtk_draw_insertion_cursor (widget, cr, &cursor_location,
-                                         cursor->is_strong,
-                                         dir, have_strong && have_weak);
-
-              cursor_list = cursor_list->next;
+              for (i = 0; i < line_display->cursors->len; i++)
+                {
+                  int index;
+                  PangoDirection dir;
+
+                  index = g_array_index(line_display->cursors, int, i);
+                  dir = (line_display->direction == GTK_TEXT_DIR_RTL) ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR;
+                  gtk_render_insertion_cursor (context, cr,
+                                               line_display->x_offset, line_display->top_margin,
+                                               line_display->layout, index, dir);
+                }
             }
         } /* line_display->height > 0 */
-          
+
       cairo_translate (cr, 0, line_display->height);
       gtk_text_layout_free_line_display (layout, line_display);
       
@@ -962,10 +937,7 @@ gtk_text_layout_draw (GtkTextLayout *layout,
   if (widgets)
     *widgets = tmp_widgets;
   else
-    {
-      g_list_foreach (tmp_widgets, (GFunc)g_object_unref, NULL);
-      g_list_free (tmp_widgets);
-    }
+    g_list_free_full (tmp_widgets, g_object_unref);
 
   g_slist_free (line_list);
 }