Do not show input field when data comes from stdin
authorJoachim Breitner <mail@joachim-breitner.de>
Sat, 24 Nov 2012 13:23:31 +0000 (13:23 +0000)
committerJoachim Breitner <mail@joachim-breitner.de>
Sat, 24 Nov 2012 13:23:31 +0000 (13:23 +0000)
sm.6
sm.c

diff --git a/sm.6 b/sm.6
index 03d1983..bf46bb0 100644 (file)
--- a/sm.6
+++ b/sm.6
@@ -40,7 +40,7 @@ To quit the program, press Ctrl-Q or press the button.
 .TP
 .RI [ text ]
 Text to display at start up. Defaults to ":-)". If "\-" is passed to sm,
-it will read the text to display from stdin.
+it will read the text to display from the standard input, see REMOTE CONTROLLING SM.
 .TP
 .BI \-f,\ \-\-foreground= colordesc
 Define a different color to use for the foreground of the text to
@@ -74,6 +74,14 @@ recognized options and quits.
 This prints the project name together with its version number
 quits.
 
+.SH REMOTE CONTROLLING SM
+If sm is called with \- as a command line argument, it will read the text to be
+shown from the standard input. It will read the input until it reaches the end
+of the file, or the line feed character \\f, and show the input read so far at
+once. Newline characters at the beginning or the end are ignored.
+.PP
+This can be used to create automatic displays of changing data or similar tricks. For example, the following command will create a simple digital watch:
+
 .SH AUTHOR
 This manual page was written by Joachim Breitner
 <mail@joachim-breitner.de> and updated by Gerfried Fuchs <rhonda@deb.at>
diff --git a/sm.c b/sm.c
index e3376fe..2e9546a 100644 (file)
--- a/sm.c
+++ b/sm.c
@@ -60,6 +60,7 @@ static char *background = NULL;
 static char *fontdesc = NULL;
 static int rotation = 0; // 0 = normal, 1 = left, 2 = inverted, 3 = right
 static GString *partial_input;
+static gulong text_change_handler;
 
 gboolean hide_entry(gpointer *user_data) {
        gtk_widget_hide(entry_widget);
@@ -232,7 +233,10 @@ static gboolean read_chan(GIOChannel *chan, GIOCondition condition, gpointer dat
                g_string_truncate(input, input->len - 1);
        }
 
+       g_signal_handler_block (tb, text_change_handler);
        gtk_text_buffer_set_text (tb, input->str, input->len);
+       g_signal_handler_unblock (tb, text_change_handler);
+
        g_string_free(input, TRUE);
 
        if (stat == G_IO_STATUS_AGAIN)
@@ -242,11 +246,14 @@ static gboolean read_chan(GIOChannel *chan, GIOCondition condition, gpointer dat
 }
 
 static void newtext() {
-       show_entry();
        pango_layout_set_text(layout, get_text(), -1);
        hq(FALSE, TRUE);
 }
 
+static void newtext_show_input() {
+       show_entry();
+}
+
 static void move_cursor(GtkTextView* tv, GtkMovementStep step, gint count, gboolean extend_selection, gpointer user_data) {
        show_entry();
 }
@@ -447,6 +454,7 @@ int main(int argc, char **argv) {
        gtk_widget_show_all(window);
 
        g_signal_connect_after(G_OBJECT(draw), "expose-event", G_CALLBACK(redraw), NULL);
+       text_change_handler = g_signal_connect(G_OBJECT(tb), "changed", G_CALLBACK(newtext_show_input), NULL);
        g_signal_connect(G_OBJECT(tb), "changed", G_CALLBACK(newtext), NULL);
        g_signal_connect(G_OBJECT(tv), "move-cursor", G_CALLBACK(move_cursor), NULL);