diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index b091a8a5ed..f03428fbe1 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -388,7 +388,6 @@ static void gtk_text_view_size_allocate (GtkWidget *widget, static void gtk_text_view_realize (GtkWidget *widget); static void gtk_text_view_unrealize (GtkWidget *widget); static void gtk_text_view_map (GtkWidget *widget); -static void gtk_text_view_unmap (GtkWidget *widget); static void gtk_text_view_style_updated (GtkWidget *widget); static void gtk_text_view_direction_changed (GtkWidget *widget, GtkTextDirection previous_direction); @@ -649,15 +648,11 @@ static GtkTextViewChild* text_view_child_new_window (GtkWidget * gint x, gint y); static void text_view_child_free (GtkTextViewChild *child); -static void text_view_child_set_parent_window (GtkTextView *text_view, - GtkTextViewChild *child); struct _GtkTextWindow { GtkTextWindowType type; GtkWidget *widget; - GdkWindow *window; - GdkWindow *bin_window; GtkCssNode *css_node; GdkRectangle allocation; }; @@ -665,16 +660,8 @@ struct _GtkTextWindow static GtkTextWindow *text_window_new (GtkTextWindowType type, GtkWidget *widget); static void text_window_free (GtkTextWindow *win); -static void text_window_realize (GtkTextWindow *win, - GtkWidget *widget); -static void text_window_unrealize (GtkTextWindow *win); -static void text_window_map (GtkTextWindow *win); -static void text_window_unmap (GtkTextWindow *win); static void text_window_size_allocate (GtkTextWindow *win, GdkRectangle *rect); -static void text_window_scroll (GtkTextWindow *win, - gint dx, - gint dy); static void text_window_invalidate_rect (GtkTextWindow *win, GdkRectangle *rect); static void text_window_invalidate_cursors (GtkTextWindow *win); @@ -730,7 +717,6 @@ gtk_text_view_class_init (GtkTextViewClass *klass) widget_class->realize = gtk_text_view_realize; widget_class->unrealize = gtk_text_view_unrealize; widget_class->map = gtk_text_view_map; - widget_class->unmap = gtk_text_view_unmap; widget_class->style_updated = gtk_text_view_style_updated; widget_class->direction_changed = gtk_text_view_direction_changed; widget_class->state_flags_changed = gtk_text_view_state_flags_changed; @@ -4551,26 +4537,17 @@ gtk_text_view_realize (GtkWidget *widget) { GtkTextView *text_view; GtkTextViewPrivate *priv; - GSList *tmp_list; text_view = GTK_TEXT_VIEW (widget); priv = text_view->priv; GTK_WIDGET_CLASS (gtk_text_view_parent_class)->realize (widget); - text_window_realize (priv->text_window, widget); - - if (priv->left_window) - text_window_realize (priv->left_window, widget); - - if (priv->top_window) - text_window_realize (priv->top_window, widget); - - if (priv->right_window) - text_window_realize (priv->right_window, widget); - - if (priv->bottom_window) - text_window_realize (priv->bottom_window, widget); + if (gtk_widget_is_sensitive (widget)) + { + gtk_im_context_set_client_widget (GTK_TEXT_VIEW (widget)->priv->im_context, + widget); + } gtk_text_view_ensure_layout (text_view); gtk_text_view_invalidate (text_view); @@ -4582,16 +4559,6 @@ gtk_text_view_realize (GtkWidget *widget) gtk_text_buffer_add_selection_clipboard (priv->buffer, clipboard); } - tmp_list = priv->children; - while (tmp_list != NULL) - { - GtkTextViewChild *vc = tmp_list->data; - - text_view_child_set_parent_window (text_view, vc); - - tmp_list = tmp_list->next; - } - /* Ensure updating the spot location. */ gtk_text_view_update_im_spot_location (text_view); } @@ -4620,19 +4587,7 @@ gtk_text_view_unrealize (GtkWidget *widget) priv->popup_menu = NULL; } - text_window_unrealize (priv->text_window); - - if (priv->left_window) - text_window_unrealize (priv->left_window); - - if (priv->top_window) - text_window_unrealize (priv->top_window); - - if (priv->right_window) - text_window_unrealize (priv->right_window); - - if (priv->bottom_window) - text_window_unrealize (priv->bottom_window); + gtk_im_context_set_client_widget (priv->im_context, NULL); GTK_WIDGET_CLASS (gtk_text_view_parent_class)->unrealize (widget); } @@ -4640,57 +4595,11 @@ gtk_text_view_unrealize (GtkWidget *widget) static void gtk_text_view_map (GtkWidget *widget) { - GtkTextView *text_view; - GtkTextViewPrivate *priv; - - text_view = GTK_TEXT_VIEW (widget); - priv = text_view->priv; - - text_window_map (priv->text_window); - - if (priv->left_window) - text_window_map (priv->left_window); - - if (priv->top_window) - text_window_map (priv->top_window); - - if (priv->right_window) - text_window_map (priv->right_window); - - if (priv->bottom_window) - text_window_map (priv->bottom_window); - gtk_widget_set_cursor_from_name (widget, "text"); GTK_WIDGET_CLASS (gtk_text_view_parent_class)->map (widget); } -static void -gtk_text_view_unmap (GtkWidget *widget) -{ - GtkTextView *text_view; - GtkTextViewPrivate *priv; - - text_view = GTK_TEXT_VIEW (widget); - priv = text_view->priv; - - GTK_WIDGET_CLASS (gtk_text_view_parent_class)->unmap (widget); - - text_window_unmap (priv->text_window); - - if (priv->left_window) - text_window_unmap (priv->left_window); - - if (priv->top_window) - text_window_unmap (priv->top_window); - - if (priv->right_window) - text_window_unmap (priv->right_window); - - if (priv->bottom_window) - text_window_unmap (priv->bottom_window); -} - static void text_window_set_padding (GtkTextView *text_view, GtkStyleContext *context) @@ -8455,23 +8364,6 @@ gtk_text_view_set_vadjustment_values (GtkTextView *text_view) gtk_adjustment_set_value (priv->vadjustment, new_value); } -static void -adjust_allocation (GtkWidget *widget, - int dx, - int dy) -{ - GtkAllocation allocation; - GtkAllocation clip; - - if (!gtk_widget_is_drawable (widget)) - return; - - gtk_widget_get_allocation (widget, &allocation); - allocation.x += dx; - allocation.y += dy; - gtk_widget_size_allocate (widget, &allocation, -1, &clip); -} - static void gtk_text_view_value_changed (GtkAdjustment *adjustment, GtkTextView *text_view) @@ -8516,67 +8408,10 @@ gtk_text_view_value_changed (GtkAdjustment *adjustment, if (dx != 0 || dy != 0) { - GSList *tmp_list; - if (gtk_widget_get_realized (GTK_WIDGET (text_view))) { if (priv->selection_bubble) gtk_widget_hide (priv->selection_bubble); - - if (dy != 0) - { - if (priv->left_window) - text_window_scroll (priv->left_window, 0, dy); - if (priv->right_window) - text_window_scroll (priv->right_window, 0, dy); - } - - if (dx != 0) - { - if (priv->top_window) - text_window_scroll (priv->top_window, dx, 0); - if (priv->bottom_window) - text_window_scroll (priv->bottom_window, dx, 0); - } - - /* It looks nicer to scroll the main area last, because - * it takes a while, and making the side areas update - * afterward emphasizes the slowness of scrolling the - * main area. - */ - text_window_scroll (priv->text_window, dx, dy); - } - - /* Children are now "moved" in the text window, poke - * into widget->allocation for each child - */ - tmp_list = priv->children; - while (tmp_list != NULL) - { - GtkTextViewChild *child = tmp_list->data; - gint child_dx = 0, child_dy = 0; - - if (child->anchor) - { - child_dx = dx; - child_dy = dy; - } - else - { - if (child->type == GTK_TEXT_WINDOW_TEXT || - child->type == GTK_TEXT_WINDOW_LEFT || - child->type == GTK_TEXT_WINDOW_RIGHT) - child_dy = dy; - if (child->type == GTK_TEXT_WINDOW_TEXT || - child->type == GTK_TEXT_WINDOW_TOP || - child->type == GTK_TEXT_WINDOW_BOTTOM) - child_dx = dx; - } - - if (child_dx != 0 || child_dy != 0) - adjust_allocation (child->widget, child_dx, child_dy); - - tmp_list = tmp_list->next; } } @@ -8629,7 +8464,10 @@ gtk_text_view_value_changed (GtkAdjustment *adjustment, gtk_text_view_update_handles (text_view, _gtk_text_handle_get_mode (priv->text_handle)); - gtk_widget_queue_draw (GTK_WIDGET (text_view)); + if (priv->children) + gtk_widget_queue_allocate (GTK_WIDGET (text_view)); + else + gtk_widget_queue_draw (GTK_WIDGET (text_view)); DV(g_print(">End scroll offset changed handler ("G_STRLOC")\n")); } @@ -9446,8 +9284,6 @@ text_window_new (GtkTextWindowType type, win->type = type; win->widget = widget; - win->window = NULL; - win->bin_window = NULL; win->allocation.width = 0; win->allocation.height = 0; win->allocation.x = 0; @@ -9495,9 +9331,6 @@ text_window_new (GtkTextWindowType type, static void text_window_free (GtkTextWindow *win) { - if (win->window) - text_window_unrealize (win); - gtk_css_node_set_parent (win->css_node, NULL); g_slice_free (GtkTextWindow, win); @@ -9516,101 +9349,11 @@ gtk_text_view_get_rendered_rect (GtkTextView *text_view, rect->width = text_window_get_width (priv->text_window); } -static void -text_window_realize (GtkTextWindow *win, - GtkWidget *widget) -{ - GdkWindow *window; - - window = gtk_widget_get_window (widget); - - win->window = gdk_window_new_child (window, - 0, - &win->allocation); - - gtk_widget_register_window (win->widget, win->window); - gdk_window_lower (win->window); - - win->bin_window = gdk_window_new_child (win->window, - GDK_ALL_EVENTS_MASK, - &(GdkRectangle) { - 0, 0, - win->allocation.width, win->allocation.height}); - - gtk_widget_register_window (win->widget, win->bin_window); - - gdk_window_show (win->bin_window); - - if (win->type == GTK_TEXT_WINDOW_TEXT && - gtk_widget_is_sensitive (widget)) - { - - gtk_im_context_set_client_widget (GTK_TEXT_VIEW (widget)->priv->im_context, - widget); - } - - g_object_set_qdata (G_OBJECT (win->window), - g_quark_from_static_string ("gtk-text-view-text-window"), - win); - - g_object_set_qdata (G_OBJECT (win->bin_window), - g_quark_from_static_string ("gtk-text-view-text-window"), - win); -} - -static void -text_window_unrealize (GtkTextWindow *win) -{ - if (win->type == GTK_TEXT_WINDOW_TEXT) - { - gtk_im_context_set_client_widget (GTK_TEXT_VIEW (win->widget)->priv->im_context, - NULL); - } - - gtk_widget_unregister_window (win->widget, win->window); - gtk_widget_unregister_window (win->widget, win->bin_window); - gdk_window_destroy (win->bin_window); - gdk_window_destroy (win->window); - win->window = NULL; - win->bin_window = NULL; -} - -static void -text_window_map (GtkTextWindow *win) -{ - gdk_window_show (win->window); -} - -static void -text_window_unmap (GtkTextWindow *win) -{ - gdk_window_hide (win->window); -} - static void text_window_size_allocate (GtkTextWindow *win, GdkRectangle *rect) { win->allocation = *rect; - - if (win->window) - { - gdk_window_move_resize (win->window, - rect->x, rect->y, - rect->width, rect->height); - - gdk_window_resize (win->bin_window, - rect->width, rect->height); - } -} - -static void -text_window_scroll (GtkTextWindow *win, - gint dx, - gint dy) -{ - if (dx != 0 || dy != 0) - gdk_window_scroll (win->bin_window, dx, dy); } static void @@ -9624,9 +9367,6 @@ text_window_invalidate_rect (GtkTextWindow *win, gtk_widget_queue_draw (GTK_WIDGET (win->widget)); return; - if (!win->bin_window) - return; - gtk_text_view_buffer_to_window_coords (GTK_TEXT_VIEW (win->widget), win->type, rect->x, @@ -9969,10 +9709,6 @@ set_window_size (GtkTextView *text_view, { *winp = text_window_new (type, GTK_WIDGET (text_view)); /* if the widget is already realized we need to realize the child manually */ - if (gtk_widget_get_realized (GTK_WIDGET (text_view))) - text_window_realize (*winp, GTK_WIDGET (text_view)); - if (gtk_widget_get_mapped (GTK_WIDGET (text_view))) - text_window_map (*winp); update_node_ordering (GTK_WIDGET (text_view)); } } @@ -10154,24 +9890,6 @@ text_view_child_free (GtkTextViewChild *child) g_slice_free (GtkTextViewChild, child); } -static void -text_view_child_set_parent_window (GtkTextView *text_view, - GtkTextViewChild *vc) -{ - if (vc->anchor) - gtk_widget_set_parent_window (vc->widget, - text_view->priv->text_window->bin_window); - else - { -#if 0 - GdkWindow *window; - window = gtk_text_view_get_window (text_view, - vc->type); - gtk_widget_set_parent_window (vc->widget, window); -#endif - } -} - static void add_child (GtkTextView *text_view, GtkTextViewChild *vc) @@ -10180,9 +9898,6 @@ add_child (GtkTextView *text_view, text_view->priv->children = g_slist_prepend (text_view->priv->children, vc); - if (gtk_widget_get_realized (GTK_WIDGET (text_view))) - text_view_child_set_parent_window (text_view, vc); - parent = gtk_text_view_get_css_node (text_view, vc->type); if (parent == NULL) parent = gtk_widget_get_css_node (GTK_WIDGET (text_view));