textview: Remove GDK windows

This commit is contained in:
Benjamin Otte 2017-11-11 05:37:37 +01:00
parent 26909ee913
commit af13d474e8

View File

@ -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));