diff --git a/src/fe-gtk/chanview-tabs.c b/src/fe-gtk/chanview-tabs.c index 1e6f670b..d0062b74 100644 --- a/src/fe-gtk/chanview-tabs.c +++ b/src/fe-gtk/chanview-tabs.c @@ -346,13 +346,12 @@ cv_tabs_init (chanview *cv) viewport = gtk_scrolled_window_new (0, 0); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (viewport), GTK_SHADOW_NONE); - gtk_scrolled_window_set_overlay_scrolling (GTK_SCROLLED_WINDOW (viewport), FALSE); if (cv->vertical) gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (viewport), - GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); else gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (viewport), - GTK_POLICY_ALWAYS, GTK_POLICY_NEVER); + GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW (viewport), 1); gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (viewport), 1); gtk_widget_set_hexpand (viewport, TRUE); diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c index 1377b2d5..2ef4e12e 100644 --- a/src/fe-gtk/maingui.c +++ b/src/fe-gtk/maingui.c @@ -3413,8 +3413,13 @@ mg_create_textarea (session *sess, GtkWidget *box) inbox = mg_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 2); gtk_box_pack_start (GTK_BOX (vbox), inbox, TRUE, TRUE, 0); - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); + frame = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_hexpand (frame, TRUE); + gtk_widget_set_vexpand (frame, TRUE); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (frame), + GTK_SHADOW_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (frame), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (inbox), frame, TRUE, TRUE, 0); theme_get_xtext_colors_for_widget (frame, xtext_palette, XTEXT_COLS); @@ -3431,9 +3436,7 @@ mg_create_textarea (session *sess, GtkWidget *box) g_signal_connect (G_OBJECT (xtext), "word_click", G_CALLBACK (mg_word_clicked), NULL); - gui->vscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, - GTK_XTEXT (xtext)->adj); - gtk_box_pack_start (GTK_BOX (inbox), gui->vscrollbar, FALSE, TRUE, 0); + gui->vscrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (frame)); gtk_drag_dest_set (gui->vscrollbar, 5, dnd_dest_targets, 2, GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK); diff --git a/src/fe-gtk/userlistgui.c b/src/fe-gtk/userlistgui.c index 2f283237..58473e93 100644 --- a/src/fe-gtk/userlistgui.c +++ b/src/fe-gtk/userlistgui.c @@ -95,7 +95,11 @@ userlist_update_min_width (session *sess) { GtkRequisition minimum; GtkRequisition natural; + GtkRequisition scrollbar_minimum; + GtkRequisition scrollbar_natural; GtkWidget *scrolled_window; + GtkWidget *scrollbar; + int scrollbar_width; int width; if (!sess || !sess->gui || !sess->gui->user_box || !sess->gui->namelistinfo || !sess->gui->user_tree) @@ -106,10 +110,19 @@ userlist_update_min_width (session *sess) if (width < 1) width = 1; + scrollbar_width = 0; scrolled_window = gtk_widget_get_parent (sess->gui->user_tree); if (GTK_IS_SCROLLED_WINDOW (scrolled_window)) + { gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW (scrolled_window), width); - gtk_widget_set_size_request (sess->gui->user_box, width, -1); + scrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (scrolled_window)); + if (scrollbar) + { + gtk_widget_get_preferred_size (scrollbar, &scrollbar_minimum, &scrollbar_natural); + scrollbar_width = MAX (scrollbar_minimum.width, scrollbar_natural.width); + } + } + gtk_widget_set_size_request (sess->gui->user_box, width + scrollbar_width, -1); } GdkPixbuf * @@ -909,17 +922,19 @@ userlist_create (GtkWidget *box) }; sw = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_hexpand (sw, TRUE); + gtk_widget_set_vexpand (sw, TRUE); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), - GTK_SHADOW_ETCHED_IN); + GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - prefs.hex_gui_ulist_show_hosts ? - GTK_POLICY_AUTOMATIC : - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW (sw), 1); gtk_box_pack_start (GTK_BOX (box), sw, TRUE, TRUE, 0); gtk_widget_show (sw); treeview = gtk_tree_view_new (); + gtk_widget_set_hexpand (treeview, TRUE); + gtk_widget_set_vexpand (treeview, TRUE); gtk_widget_set_name (treeview, "zoitechat-userlist"); gtk_widget_set_can_focus (treeview, TRUE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); diff --git a/src/fe-gtk/xtext.c b/src/fe-gtk/xtext.c index 9a1159a7..01373725 100644 --- a/src/fe-gtk/xtext.c +++ b/src/fe-gtk/xtext.c @@ -110,6 +110,15 @@ enum TARGET_COMPOUND_TEXT }; +enum +{ + PROP_0, + PROP_HADJUSTMENT, + PROP_VADJUSTMENT, + PROP_HSCROLL_POLICY, + PROP_VSCROLL_POLICY +}; + /* Selection targets for PRIMARY selection / copy-paste. * @@ -158,7 +167,8 @@ gtk_xtext_install_selection_targets (GtkWidget *widget) static guint xtext_signals[LAST_SIGNAL]; -G_DEFINE_TYPE (GtkXText, gtk_xtext, GTK_TYPE_WIDGET) +G_DEFINE_TYPE_WITH_CODE (GtkXText, gtk_xtext, GTK_TYPE_WIDGET, + G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL)) char *nocasestrstr (const char *text, const char *tofind); /* util.c */ int xtext_get_stamp_str (time_t, char **); @@ -168,9 +178,13 @@ static gboolean gtk_xtext_is_selecting (GtkXText *xtext); static char *gtk_xtext_selection_get_text (GtkXText *xtext, int *len_ret); static textentry *gtk_xtext_nth (GtkXText *xtext, int line, int *subline); static void gtk_xtext_adjustment_changed (GtkAdjustment * adj, - GtkXText * xtext); + GtkXText * xtext); static void gtk_xtext_scroll_adjustments (GtkXText *xtext, GtkAdjustment *hadj, GtkAdjustment *vadj); +static void gtk_xtext_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec); +static void gtk_xtext_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec); static int gtk_xtext_render_ents (GtkXText * xtext, textentry *, textentry *); static void gtk_xtext_recalc_widths (xtext_buffer *buf, int); static void gtk_xtext_fix_indent (xtext_buffer *buf); @@ -794,6 +808,9 @@ gtk_xtext_init (GtkXText * xtext) xtext->recycle = FALSE; xtext->dont_render = FALSE; xtext->dont_render2 = FALSE; + xtext->hadj = NULL; + xtext->hscroll_policy = GTK_SCROLL_MINIMUM; + xtext->vscroll_policy = GTK_SCROLL_MINIMUM; gtk_xtext_scroll_adjustments (xtext, NULL, NULL); gtk_xtext_install_selection_targets (GTK_WIDGET (xtext)); @@ -886,6 +903,66 @@ gtk_xtext_adjustment_changed (GtkAdjustment * adj, GtkXText * xtext) xtext->buffer->old_value = xtext_adj_get_value (adj); } +static void +gtk_xtext_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GtkXText *xtext = GTK_XTEXT (object); + GtkAdjustment *adj; + + switch (prop_id) + { + case PROP_HADJUSTMENT: + adj = g_value_get_object (value); + if (xtext->hadj == adj) + break; + if (xtext->hadj) + g_object_unref (xtext->hadj); + xtext->hadj = adj ? g_object_ref (adj) : NULL; + g_object_notify (object, "hadjustment"); + break; + case PROP_VADJUSTMENT: + gtk_xtext_scroll_adjustments (xtext, NULL, g_value_get_object (value)); + g_object_notify (object, "vadjustment"); + break; + case PROP_HSCROLL_POLICY: + xtext->hscroll_policy = g_value_get_enum (value); + g_object_notify (object, "hscroll-policy"); + break; + case PROP_VSCROLL_POLICY: + xtext->vscroll_policy = g_value_get_enum (value); + g_object_notify (object, "vscroll-policy"); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gtk_xtext_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GtkXText *xtext = GTK_XTEXT (object); + + switch (prop_id) + { + case PROP_HADJUSTMENT: + g_value_set_object (value, xtext->hadj); + break; + case PROP_VADJUSTMENT: + g_value_set_object (value, xtext->adj); + break; + case PROP_HSCROLL_POLICY: + g_value_set_enum (value, xtext->hscroll_policy); + break; + case PROP_VSCROLL_POLICY: + g_value_set_enum (value, xtext->vscroll_policy); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + GtkWidget * gtk_xtext_new (const XTextColor *palette, int separator) { @@ -952,6 +1029,11 @@ gtk_xtext_cleanup (GtkXText *xtext) xtext->adj = NULL; } + if (xtext->hadj) + { + g_object_unref (G_OBJECT (xtext->hadj)); + xtext->hadj = NULL; + } if (xtext->hand_cursor) { @@ -2924,6 +3006,13 @@ gtk_xtext_class_init (GtkXTextClass * class) widget_class = (GtkWidgetClass *) class; xtext_class = (GtkXTextClass *) class; + object_class->set_property = gtk_xtext_set_property; + object_class->get_property = gtk_xtext_get_property; + g_object_class_override_property (object_class, PROP_HADJUSTMENT, "hadjustment"); + g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment"); + g_object_class_override_property (object_class, PROP_HSCROLL_POLICY, "hscroll-policy"); + g_object_class_override_property (object_class, PROP_VSCROLL_POLICY, "vscroll-policy"); + xtext_signals[WORD_CLICK] = g_signal_new ("word_click", G_TYPE_FROM_CLASS (object_class), diff --git a/src/fe-gtk/xtext.h b/src/fe-gtk/xtext.h index b31caf17..25fbb753 100644 --- a/src/fe-gtk/xtext.h +++ b/src/fe-gtk/xtext.h @@ -134,6 +134,9 @@ struct _GtkXText xtext_buffer *selection_buffer; GtkAdjustment *adj; + GtkAdjustment *hadj; + GtkScrollablePolicy hscroll_policy; + GtkScrollablePolicy vscroll_policy; cairo_surface_t *background_surface; /* 0 = use palette[19] */ cairo_surface_t *background_clip_surface; GdkWindow *draw_window; /* points to ->window */