Bug #600533 zenity --text-info should have an auto scroll option

This is a request to add a auto-scroll option.
For now it's only works when text-info is getting the
text from stdin.
Example usage:
cat file.txt | zenity --text-info --auto-scroll
This commit is contained in:
Arx Cruz 2013-11-23 20:32:51 -02:00
parent b0fc720fe4
commit 4681d74c02
3 changed files with 28 additions and 5 deletions

View File

@ -106,6 +106,8 @@ static gboolean zenity_question_default_cancel;
static gboolean zenity_text_active; static gboolean zenity_text_active;
static gchar *zenity_text_font; static gchar *zenity_text_font;
static gchar *zenity_text_checkbox; static gchar *zenity_text_checkbox;
static gboolean zenity_text_auto_scroll;
#ifdef HAVE_WEBKITGTK #ifdef HAVE_WEBKITGTK
static gboolean zenity_text_enable_html; static gboolean zenity_text_enable_html;
static gchar *zenity_text_url; static gchar *zenity_text_url;
@ -878,6 +880,15 @@ static GOptionEntry text_options[] = {
N_("URL") N_("URL")
}, },
#endif #endif
{
"auto-scroll",
'\0',
G_OPTION_FLAG_NOALIAS,
G_OPTION_ARG_NONE,
&zenity_text_auto_scroll,
N_("Auto scroll the text to the end. Only when text is captured from stdin"),
NULL
},
{ {
NULL NULL
} }
@ -1531,6 +1542,7 @@ zenity_text_pre_callback (GOptionContext *context,
zenity_text_active = FALSE; zenity_text_active = FALSE;
zenity_text_font = NULL; zenity_text_font = NULL;
zenity_text_checkbox = NULL; zenity_text_checkbox = NULL;
zenity_text_auto_scroll = FALSE;
#ifdef HAVE_WEBKITGTK #ifdef HAVE_WEBKITGTK
zenity_text_enable_html = FALSE; zenity_text_enable_html = FALSE;
zenity_text_url = NULL; zenity_text_url = NULL;
@ -1944,6 +1956,7 @@ zenity_text_post_callback (GOptionContext *context,
results->text_data->no_wrap = zenity_general_dialog_no_wrap; results->text_data->no_wrap = zenity_general_dialog_no_wrap;
results->text_data->font = zenity_text_font; results->text_data->font = zenity_text_font;
results->text_data->checkbox = zenity_text_checkbox; results->text_data->checkbox = zenity_text_checkbox;
results->text_data->auto_scroll = zenity_text_auto_scroll;
#ifdef HAVE_WEBKITGTK #ifdef HAVE_WEBKITGTK
results->text_data->html = zenity_text_enable_html; results->text_data->html = zenity_text_enable_html;
results->text_data->url = zenity_text_url; results->text_data->url = zenity_text_url;

View File

@ -134,11 +134,13 @@ zenity_text_handle_stdin (GIOChannel *channel,
gpointer data) gpointer data)
{ {
static GtkTextBuffer *buffer; static GtkTextBuffer *buffer;
static GtkTextView *text_view;
gchar buf[1024]; gchar buf[1024];
gsize len; gsize len;
buffer = GTK_TEXT_BUFFER (data); text_view = GTK_TEXT_VIEW (data);
buffer = gtk_text_view_get_buffer (text_view);
if ((condition & G_IO_IN) || (condition & (G_IO_IN | G_IO_HUP))) { if ((condition & G_IO_IN) || (condition & (G_IO_IN | G_IO_HUP))) {
GError *error = NULL; GError *error = NULL;
@ -179,6 +181,12 @@ zenity_text_handle_stdin (GIOChannel *channel,
} else { } else {
gtk_text_buffer_insert (buffer, &end, buf, len); gtk_text_buffer_insert (buffer, &end, buf, len);
} }
if (zen_text_data->auto_scroll) {
GtkTextMark *mark = NULL;
mark = gtk_text_buffer_get_insert (buffer);
if (mark != NULL)
gtk_text_view_scroll_to_mark (text_view, mark, 0.0, FALSE, 0, 0);
}
} }
} }
@ -186,14 +194,14 @@ zenity_text_handle_stdin (GIOChannel *channel,
} }
static void static void
zenity_text_fill_entries_from_stdin (GtkTextBuffer *text_buffer) zenity_text_fill_entries_from_stdin (GtkTextView *text_view)
{ {
GIOChannel *channel; GIOChannel *channel;
channel = g_io_channel_unix_new (0); channel = g_io_channel_unix_new (0);
g_io_channel_set_encoding (channel, NULL, NULL); g_io_channel_set_encoding (channel, NULL, NULL);
g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL);
g_io_add_watch (channel, G_IO_IN | G_IO_HUP, zenity_text_handle_stdin, text_buffer); g_io_add_watch (channel, G_IO_IN | G_IO_HUP, zenity_text_handle_stdin, text_view);
} }
void void
@ -233,7 +241,7 @@ zenity_text (ZenityData *data, ZenityTextData *text_data)
g_signal_connect (G_OBJECT (dialog), "response", g_signal_connect (G_OBJECT (dialog), "response",
G_CALLBACK (zenity_text_dialog_response), data); G_CALLBACK (zenity_text_dialog_response), data);
if (data->dialog_title) if (data->dialog_title)
gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title); gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title);
@ -257,7 +265,7 @@ zenity_text (ZenityData *data, ZenityTextData *text_data)
if (text_data->uri) if (text_data->uri)
zenity_util_fill_file_buffer (text_buffer, text_data->uri); zenity_util_fill_file_buffer (text_buffer, text_data->uri);
else else
zenity_text_fill_entries_from_stdin (GTK_TEXT_BUFFER (text_buffer)); zenity_text_fill_entries_from_stdin (GTK_TEXT_VIEW(text_view));
if (text_data->editable) if (text_data->editable)
zen_text_data->buffer = text_buffer; zen_text_data->buffer = text_buffer;
@ -326,6 +334,7 @@ zenity_text (ZenityData *data, ZenityTextData *text_data)
gtk_widget_show (GTK_WIDGET (web_kit)); gtk_widget_show (GTK_WIDGET (web_kit));
} }
#endif #endif
zenity_util_show_dialog (dialog, data->attach); zenity_util_show_dialog (dialog, data->attach);
g_object_unref (builder); g_object_unref (builder);

View File

@ -110,6 +110,7 @@ typedef struct {
gchar *uri; gchar *uri;
gboolean editable; gboolean editable;
gboolean no_wrap; gboolean no_wrap;
gboolean auto_scroll;
gchar *font; gchar *font;
GtkTextBuffer *buffer; GtkTextBuffer *buffer;
gchar *checkbox; gchar *checkbox;