Implement and document text entry hiding
authorJoachim Breitner <mail@joachim-breitner.de>
Tue, 12 Aug 2008 04:27:18 +0000 (04:27 +0000)
committerJoachim Breitner <mail@joachim-breitner.de>
Tue, 12 Aug 2008 04:27:18 +0000 (04:27 +0000)
sm.6
sm.c

diff --git a/sm.6 b/sm.6
index 667467f..03d1983 100644 (file)
--- a/sm.6
+++ b/sm.6
@@ -27,6 +27,10 @@ will display a given multi-line message as large as
 possible, fullscreen and black on white. You can specify the text either
 when launching sm, or edit it while the program is running.
 .PP
+After a short timeout, the text entry and the quit button will disappear, leaving
+nothing on the screen but the entered text. To continue entering text, just start
+typing or (left-)click anywhere on the screen.
+.PP
 To clear the displayed text, press Escape.
 .PP
 To quit the program, press Ctrl-Q or press the button.
diff --git a/sm.c b/sm.c
index 81316ad..e85cf8b 100644 (file)
--- a/sm.c
+++ b/sm.c
 
 #define min(x,y) ((x) < (y) ? (x) : (y))
 
+#define AUTOHIDE_TIMEOUT 5
+
 static gboolean quality = TRUE;
 static gboolean need_resize = TRUE;
 
+static int timeout_id=0;
+
 static GtkWidget* window;
-static GdkScreen *screen;
 static GdkCursor *cursor;
 static GtkWidget* quit;
 static GtkWidget* tv;
+static GtkWidget* entry_widget;
 static GtkSettings* settings;
 static GtkTextBuffer* tb;
 static PangoFontDescription *font;
@@ -50,15 +54,33 @@ static char *background = NULL;
 static char *fontdesc = NULL;
 static rotation = 0; // 0 = normal, 1 = left, 2 = inverted, 3 = right
 
+gboolean hide_entry(gpointer *user_data) {
+       gtk_widget_hide(entry_widget);
+       gtk_widget_grab_focus(tv);
+       return FALSE;
+}
+
+static void show_entry() {
+       if (timeout_id) {
+               g_source_remove(timeout_id);
+               timeout_id = 0;
+       }
+       gtk_widget_show(entry_widget);
+
+       timeout_id = g_timeout_add_seconds (AUTOHIDE_TIMEOUT, (GSourceFunc)hide_entry, NULL);
+}
+
 static void realize(GtkWindow *window, GdkScreen *screen, gpointer data) {
        gdk_window_set_cursor(GTK_WIDGET(window)->window, cursor);
 }
 
 static void clear_text(GtkAccelGroup *accel, GObject *window, guint keyval,  GdkModifierType modifier) {
-       if( gtk_text_buffer_get_char_count(tb) )
+       if( gtk_text_buffer_get_char_count(tb) ) {
                gtk_text_buffer_set_text(tb,"",-1);
-       else
+               show_entry();
+       } else {
                gtk_main_quit();
+       }
 }
 
 static char *get_text() {
@@ -126,7 +148,7 @@ static void redraw() {
 }
 
 static gboolean text_clicked(GtkWidget *widget, GdkEventButton *event, gpointer *user_data) {
-       printf("Hi\n");
+       show_entry();
        if (event->type == GDK_BUTTON_PRESS && event->button == 2) {
                GtkClipboard *cb = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
 
@@ -141,6 +163,7 @@ static gboolean text_clicked(GtkWidget *widget, GdkEventButton *event, gpointer
 }
 
 static void newtext(char *text) {
+       show_entry();
        pango_layout_set_text(layout, get_text(), -1);
        hq(FALSE, TRUE);
 }
@@ -210,7 +233,7 @@ int main(int argc, char **argv) {
        gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
        gtk_window_set_icon_name (GTK_WINDOW (window), "sm");
 
-       screen = gtk_window_get_screen(GTK_WINDOW(window));
+       GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(window));
        gtk_widget_set_size_request(window, gdk_screen_get_width(screen),
                                            gdk_screen_get_height(screen));
        gtk_window_fullscreen(GTK_WINDOW(window));
@@ -288,6 +311,7 @@ int main(int argc, char **argv) {
        gtk_box_pack_end(GTK_BOX(vbox_button), quit, FALSE, FALSE, 0);
 
        GtkWidget *hbox = gtk_hbox_new(FALSE,0);
+       entry_widget = hbox;
        gtk_box_pack_start(GTK_BOX(hbox), tv,   TRUE,  TRUE,  0);
        gtk_box_pack_start(GTK_BOX(hbox), vbox_button, FALSE, FALSE, 0);
 
@@ -321,6 +345,8 @@ int main(int argc, char **argv) {
        g_signal_connect_after(G_OBJECT(window), "expose-event", G_CALLBACK(redraw), NULL);
        g_signal_connect(G_OBJECT(tb), "changed", G_CALLBACK(newtext), NULL);
 
+       show_entry();
+
        gtk_main();
 
        return 0;