static void on_size_allocate(GtkWidget *widget, GtkAllocation *allocation, PussVConsole* self) { gint h; GtkTextIter iter; GdkRectangle loc; GtkTextView* view = GTK_TEXT_VIEW( self->view ); GtkTextBuffer* buf = gtk_text_view_get_buffer(view); gtk_text_buffer_get_start_iter(buf, &iter); gtk_text_view_get_iter_location(view, &iter, &loc); h = loc.height; h += gtk_text_view_get_pixels_below_lines(view); h += gtk_text_view_get_pixels_above_lines(view); // Gtk+ need non-rich-text-editor // fix BUG // if( h > self->line_height ) { self->line_height = h; } else { h = self->line_height; } // g_print("size allocate : %d\n", (int)(allocation->height/h)); self->api->resize(self->vcon, 80, allocation->height/h); }
static void entry_changed_cb(GtkTextBuffer *buffer, void *data) { char *xmlstr, *str; GtkTextIter iter; int wrapped_lines; int lines; GdkRectangle oneline; int height; int pad_top, pad_inside, pad_bottom; GtkTextIter start, end; xmlnode *node; wrapped_lines = 1; gtk_text_buffer_get_start_iter(buffer, &iter); gtk_text_view_get_iter_location(GTK_TEXT_VIEW(console->entry), &iter, &oneline); while (gtk_text_view_forward_display_line(GTK_TEXT_VIEW(console->entry), &iter)) wrapped_lines++; lines = gtk_text_buffer_get_line_count(buffer); /* Show a maximum of 64 lines */ lines = MIN(lines, 6); wrapped_lines = MIN(wrapped_lines, 6); pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(console->entry)); pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(console->entry)); pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(console->entry)); height = (oneline.height + pad_top + pad_bottom) * lines; height += (oneline.height + pad_inside) * (wrapped_lines - lines); gtk_widget_set_size_request(console->sw, -1, height + 6); gtk_text_buffer_get_start_iter(buffer, &start); gtk_text_buffer_get_end_iter(buffer, &end); str = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); if (!str) return; xmlstr = g_strdup_printf("<xml>%s</xml>", str); node = xmlnode_from_str(xmlstr, -1); if (node) { gtk_imhtml_clear_formatting(GTK_IMHTML(console->entry)); } else { gtk_imhtml_toggle_background(GTK_IMHTML(console->entry), "#ffcece"); } g_free(str); g_free(xmlstr); if (node) xmlnode_free(node); }
static int imhtml_expose_cb(GtkWidget *widget, GdkEventExpose *event, PidginConversation *gtkconv) { int y, last_y, offset; GdkRectangle visible_rect; GtkTextIter iter; GdkRectangle buf; int pad; PurpleConversation *conv = gtkconv->active_conv; PurpleConversationType type = purple_conversation_get_type(conv); if ((type == PURPLE_CONV_TYPE_CHAT && !purple_prefs_get_bool(PREF_CHATS)) || (type == PURPLE_CONV_TYPE_IM && !purple_prefs_get_bool(PREF_IMS))) return FALSE; gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(widget), &visible_rect); offset = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "markerline")); if (offset) { gtk_text_buffer_get_iter_at_offset(gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)), &iter, offset); gtk_text_view_get_iter_location(GTK_TEXT_VIEW(widget), &iter, &buf); last_y = buf.y + buf.height; pad = (gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(widget)) + gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(widget))) / 2; last_y += pad; } else last_y = 0; gtk_text_view_buffer_to_window_coords(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_TEXT, 0, last_y, 0, &y); if (y >= event->area.y) { GdkColor red = {0, 0xffff, 0, 0}; GdkGC *gc = gdk_gc_new(GDK_DRAWABLE(event->window)); gdk_gc_set_rgb_fg_color(gc, &red); gdk_draw_line(event->window, gc, 0, y, visible_rect.width, y); g_object_unref(G_OBJECT(gc)); } return FALSE; }