]> err.no Git - util-linux/commitdiff
setterm: add -blan [force|poke] options for TIOCL_{BLANKED,BLANK}SCREEN
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 27 Nov 2007 22:54:35 +0000 (22:54 +0000)
committerKarel Zak <kzak@redhat.com>
Fri, 8 Feb 2008 01:01:27 +0000 (02:01 +0100)
Linux has some interface to force an immediate blank
(TIOCL_BLANK/UNBLANKSCREEN) or get the blank status
(TIOCL_BLANKEDSCREEN), which is useful e.g. for blind people.

Co-Author: Karel Zak <kzak@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
configure.ac
misc-utils/setterm.1
misc-utils/setterm.c

index a148e28d802e4ab1a13609540f0407d44c59d4de..3bedf2ca76f8a5443cdd6390341790c196db9e11 100644 (file)
@@ -56,6 +56,7 @@ AC_CHECK_HEADERS(
        sys/io.h \
        pty.h \
        err.h \
+       linux/tiocl.h \
        linux/version.h])
 AC_CHECK_HEADERS([linux/raw.h],
                 [AM_CONDITIONAL([HAVE_RAW], [true])],
index 86c3635da2344604c0763198e8757047d8698d02..ec4b6a885e98a819b171ed605db9fc987f6734e7 100644 (file)
@@ -133,10 +133,18 @@ Clears tab stops from the given horizontal cursor positions, in the range
 Clears all tab stops, then sets a regular tab stop pattern, with one tab
 every specified number of positions.  Without an argument, defaults to 8.
 .TP
-.BR \-blank " [0-60] (virtual consoles only)"
+.BR \-blank " [0-60|force|poke] (virtual consoles only)"
 Sets the interval of inactivity, in minutes, after which the screen will be
 automatically blanked (using APM if available).  Without an argument,
 defaults to 0 (disable console blanking).
+
+The
+.B force
+option keeps screen blank even if a key is pressed.
+
+The
+.B poke
+option returns which vt was blanked.
 .TP
 .BR \-dump " [1-NR_CONS]"
 Writes a snapshot of the given virtual console (with attributes) to the file
index eda99a34c36c491cc46c137c93f17e84033b01f4..2646fc38e369e4634cc8b5d6eb6f893ca62ea9d0 100644 (file)
@@ -50,7 +50,7 @@
  *   [ -tabs [tab1 tab2 tab3 ... ] ]     (tabn = 1-160)
  *   [ -clrtabs [ tab1 tab2 tab3 ... ]   (tabn = 1-160)
  *   [ -regtabs [1-160] ]
- *   [ -blank [0-60] ]
+ *   [ -blank [0-60|force|poke|] ]
  *   [ -dump   [1-NR_CONS ] ]
  *   [ -append [1-NR_CONS ] ]
  *   [ -file dumpfilename ]
 #include <sys/param.h>         /* for MAXPATHLEN */
 #include <sys/ioctl.h>
 #include <sys/time.h>
+#ifdef HAVE_LINUX_TIOCL_H
+#include <linux/tiocl.h>
+#endif
 #include "nls.h"
 
 #if __GNU_LIBRARY__ < 5
@@ -151,6 +154,19 @@ extern int klogctl(int type, char *buf, int len);
 #define GREY   8
 #define DEFAULT 9
 
+/* Blank commands */
+#define BLANKSCREEN    -1
+#define UNBLANKSCREEN  -2
+#define BLANKEDSCREEN  -3
+
+/* <linux/tiocl.h> fallback */
+#ifndef TIOCL_BLANKSCREEN
+# define TIOCL_UNBLANKSCREEN   4       /* unblank screen */
+# define TIOCL_SETVESABLANK    10      /* set vesa blanking mode */
+# define TIOCL_BLANKSCREEN     14      /* keep screen blank even if a key is pressed */
+# define TIOCL_BLANKEDSCREEN   15      /* return which vt was blanked */
+#endif
+
 /* Control sequences. */
 #define ESC "\033"
 #define DCS "\033P"
@@ -391,11 +407,17 @@ parse_blank(int argc, char **argv, int *option, int *opt_all, int *bad_arg) {
                *bad_arg = TRUE;
        *option = TRUE;
        if (argc == 1) {
-               *opt_all = atoi(argv[0]);
-               if ((*opt_all > 60) || (*opt_all < 0))
-                       *bad_arg = TRUE;
+               if (!strcmp(argv[0], "force"))
+                       *opt_all = BLANKSCREEN;
+               else if (!strcmp(argv[0], "poke"))
+                       *opt_all = UNBLANKSCREEN;
+               else {
+                       *opt_all = atoi(argv[0]);
+                       if ((*opt_all > 60) || (*opt_all < 0))
+                               *bad_arg = TRUE;
+               }
        } else {
-               *opt_all = 0;
+               *opt_all = BLANKEDSCREEN;
        }
 }
 
@@ -779,7 +801,7 @@ usage(char *prog_name) {
        fprintf(stderr, _("  [ -tabs [ tab1 tab2 tab3 ... ] ]      (tabn = 1-160)\n"));
        fprintf(stderr, _("  [ -clrtabs [ tab1 tab2 tab3 ... ] ]   (tabn = 1-160)\n"));
        fprintf(stderr, _("  [ -regtabs [1-160] ]\n"));
-       fprintf(stderr, _("  [ -blank [0-60] ]\n"));
+       fprintf(stderr, _("  [ -blank [0-60|force|poke] ]\n"));
        fprintf(stderr, _("  [ -dump   [1-NR_CONSOLES] ]\n"));
        fprintf(stderr, _("  [ -append [1-NR_CONSOLES] ]\n"));
        fprintf(stderr, _("  [ -file dumpfilename ]\n"));
@@ -1034,13 +1056,32 @@ perform_sequence(int vcterm) {
        }
 
        /* -blank [0-60]. */
-       if (opt_blank && vcterm) 
-               printf("\033[9;%d]", opt_bl_min);
-    
+       if (opt_blank && vcterm) {
+               if (opt_bl_min >= 0)
+                       printf("\033[9;%d]", opt_bl_min);
+               else if (opt_bl_min == BLANKSCREEN) {
+                       char ioctlarg = TIOCL_BLANKSCREEN;
+                       if (ioctl(0,TIOCLINUX,&ioctlarg))
+                               fprintf(stderr,_("cannot force blank\n"));
+               } else if (opt_bl_min == UNBLANKSCREEN) {
+                       char ioctlarg = TIOCL_UNBLANKSCREEN;
+                       if (ioctl(0,TIOCLINUX,&ioctlarg))
+                               fprintf(stderr,_("cannot force unblank\n"));
+               } else if (opt_bl_min == BLANKEDSCREEN) {
+                       char ioctlarg = TIOCL_BLANKEDSCREEN;
+                       int ret;
+                       ret = ioctl(0,TIOCLINUX,&ioctlarg);
+                       if (ret < 0)
+                               fprintf(stderr,_("cannot get blank status\n"));
+                       else
+                               printf("%d\n",ret);
+               }
+       }
+
        /* -powersave [on|vsync|hsync|powerdown|off] (console) */
        if (opt_powersave) {
                char ioctlarg[2];
-               ioctlarg[0] = 10;       /* powersave */
+               ioctlarg[0] = TIOCL_SETVESABLANK;
                ioctlarg[1] = opt_ps_mode;
                if (ioctl(0,TIOCLINUX,ioctlarg))
                        fprintf(stderr,_("cannot (un)set powersave mode\n"));