Mercurial > pidgin
changeset 12597:842b3b897cde
[gaim-migrate @ 14927]
SF Patch #1357805 from Sadrul
"Statusbox: resize
This patch resizes the statusbox-entry after the entry.
It shows a max. of 4 lines, otherwise resizes the
height so that there's no empty place. Try it now!!"
This one has lots of changes from me. It works over here.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 21 Dec 2005 12:08:51 +0000 |
parents | 037a673ba862 |
children | 1c122dbc8e9e |
files | src/gtkstatusbox.c |
diffstat | 1 files changed, 51 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gtkstatusbox.c Wed Dec 21 10:56:07 2005 +0000 +++ b/src/gtkstatusbox.c Wed Dec 21 12:08:51 2005 +0000 @@ -43,6 +43,7 @@ static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data); static void imhtml_format_changed_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, void *data); static void remove_typing_cb(GtkGaimStatusBox *box); +static void update_size (GtkGaimStatusBox *box); static void gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box); static void gtk_gaim_status_box_refresh(GtkGaimStatusBox *status_box); @@ -328,6 +329,7 @@ gtk_tree_path_free(path); g_free(text); + update_size(status_box); } /** @@ -1030,6 +1032,55 @@ g_free(message); } +static void update_size(GtkGaimStatusBox *status_box) +{ + GtkTextBuffer *buffer; + GtkTextIter iter; + int wrapped_lines; + int lines; + GdkRectangle oneline; + int height; + int pad_top, pad_inside, pad_bottom; + + if (!status_box->imhtml_visible) + { + gtk_widget_set_size_request(status_box->vbox, -1, -1); + return; + } + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); + + wrapped_lines = 1; + gtk_text_buffer_get_start_iter(buffer, &iter); + while (gtk_text_view_forward_display_line(GTK_TEXT_VIEW(status_box->imhtml), &iter)) + wrapped_lines++; + + lines = gtk_text_buffer_get_line_count(buffer); + + /* Show a maximum of 4 lines */ + lines = MIN(lines, 4); + wrapped_lines = MIN(wrapped_lines, 4); + + gtk_text_buffer_get_start_iter(buffer, &iter); + gtk_text_view_get_iter_location(GTK_TEXT_VIEW(status_box->imhtml), &iter, &oneline); + + pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(status_box->imhtml)); + pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(status_box->imhtml)); + pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(status_box->imhtml)); + + height = (oneline.height + pad_top + pad_bottom) * lines; + height += (oneline.height + pad_inside) * (wrapped_lines - lines); + + if (status_box->typing) { + GtkRequisition requisition; + + gtk_widget_size_request(status_box->toolbar, &requisition); + height += requisition.height; + } + + gtk_widget_set_size_request(GTK_WIDGET(status_box->vbox), -1, height); +} + static void remove_typing_cb(GtkGaimStatusBox *status_box) { activate_currently_selected_status(status_box);