Home | History | Annotate | Line # | Download | only in wsconsctl
display.c revision 1.15.20.1
      1  1.15.20.1      yamt /*	$NetBSD: display.c,v 1.15.20.1 2012/04/17 00:05:43 yamt Exp $ */
      2        1.1   hannken 
      3        1.1   hannken /*-
      4        1.8      jmmv  * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
      5        1.1   hannken  * All rights reserved.
      6        1.1   hannken  *
      7        1.1   hannken  * This code is derived from software contributed to The NetBSD Foundation
      8        1.1   hannken  * by Juergen Hannken-Illjes.
      9        1.1   hannken  *
     10        1.1   hannken  * Redistribution and use in source and binary forms, with or without
     11        1.1   hannken  * modification, are permitted provided that the following conditions
     12        1.1   hannken  * are met:
     13        1.1   hannken  * 1. Redistributions of source code must retain the above copyright
     14        1.1   hannken  *    notice, this list of conditions and the following disclaimer.
     15        1.1   hannken  * 2. Redistributions in binary form must reproduce the above copyright
     16        1.1   hannken  *    notice, this list of conditions and the following disclaimer in the
     17        1.1   hannken  *    documentation and/or other materials provided with the distribution.
     18        1.1   hannken  *
     19        1.1   hannken  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20        1.1   hannken  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21        1.1   hannken  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22        1.1   hannken  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23        1.1   hannken  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24        1.1   hannken  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25        1.1   hannken  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26        1.1   hannken  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27        1.1   hannken  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28        1.1   hannken  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29        1.1   hannken  * POSSIBILITY OF SUCH DAMAGE.
     30        1.1   hannken  */
     31        1.1   hannken 
     32        1.1   hannken #include <sys/ioctl.h>
     33        1.4  christos #include <sys/time.h>
     34        1.4  christos 
     35       1.12      jmmv #include <dev/wscons/wsconsio.h>
     36       1.12      jmmv 
     37       1.12      jmmv #include <err.h>
     38       1.12      jmmv #include <errno.h>
     39        1.3  christos #include <stdio.h>
     40       1.12      jmmv #include <stdlib.h>
     41        1.4  christos #include <string.h>
     42        1.4  christos 
     43        1.1   hannken #include "wsconsctl.h"
     44        1.1   hannken 
     45        1.6      jmmv static int border;
     46        1.1   hannken static int dpytype;
     47        1.2   hannken static struct wsdisplay_usefontdata font;
     48       1.10       uwe static struct wsdisplay_param backlight;
     49       1.10       uwe static struct wsdisplay_param brightness;
     50       1.10       uwe static struct wsdisplay_param contrast;
     51        1.3  christos static struct wsdisplay_scroll_data scroll_l;
     52        1.5      jmmv static int msg_default_attrs, msg_default_bg, msg_default_fg;
     53        1.5      jmmv static int msg_kernel_attrs, msg_kernel_bg, msg_kernel_fg;
     54       1.13  jmcneill static int splash_enable, splash_progress;
     55        1.1   hannken 
     56        1.1   hannken struct field display_field_tab[] = {
     57       1.11      jmmv     { "border",			&border,	FMT_COLOR,	0 },
     58        1.1   hannken     { "type",			&dpytype,	FMT_DPYTYPE,	FLG_RDONLY },
     59        1.2   hannken     { "font",			&font.name,	FMT_STRING,	FLG_WRONLY },
     60       1.10       uwe     { "backlight",		&backlight.curval,  FMT_UINT,	0 },
     61       1.10       uwe     { "brightness",		&brightness.curval, FMT_UINT,	FLG_MODIFY },
     62       1.10       uwe     { "contrast",		&contrast.curval,   FMT_UINT,	FLG_MODIFY },
     63       1.12      jmmv     { "scroll.fastlines",	&scroll_l.fastlines, FMT_UINT,	FLG_MODIFY },
     64       1.12      jmmv     { "scroll.slowlines",	&scroll_l.slowlines, FMT_UINT,	FLG_MODIFY },
     65       1.11      jmmv     { "msg.default.attrs",	&msg_default_attrs, FMT_ATTRS,	0 },
     66       1.11      jmmv     { "msg.default.bg",		&msg_default_bg, FMT_COLOR,	0 },
     67       1.11      jmmv     { "msg.default.fg",		&msg_default_fg, FMT_COLOR,	0 },
     68       1.11      jmmv     { "msg.kernel.attrs",	&msg_kernel_attrs, FMT_ATTRS,	0 },
     69       1.11      jmmv     { "msg.kernel.bg",		&msg_kernel_bg, FMT_COLOR,	0 },
     70       1.11      jmmv     { "msg.kernel.fg",		&msg_kernel_fg, FMT_COLOR,	0 },
     71       1.14       uwe     { "splash.enable",		&splash_enable, FMT_UINT,	FLG_WRONLY },
     72       1.14       uwe     { "splash.progress",	&splash_progress, FMT_UINT,	FLG_WRONLY },
     73        1.1   hannken };
     74        1.1   hannken 
     75       1.12      jmmv int display_field_tab_len = sizeof(display_field_tab) /
     76       1.12      jmmv 	sizeof(display_field_tab[0]);
     77        1.1   hannken 
     78        1.1   hannken void
     79        1.9   xtraeme display_get_values(int fd)
     80        1.1   hannken {
     81       1.12      jmmv 
     82        1.1   hannken 	if (field_by_value(&dpytype)->flags & FLG_GET)
     83        1.1   hannken 		if (ioctl(fd, WSDISPLAYIO_GTYPE, &dpytype) < 0)
     84       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_GTYPE");
     85        1.3  christos 
     86        1.6      jmmv 	if (field_by_value(&border)->flags & FLG_GET)
     87        1.6      jmmv 		if (ioctl(fd, WSDISPLAYIO_GBORDER, &border) < 0)
     88        1.7      jmmv 			field_disable_by_value(&border);
     89        1.6      jmmv 
     90       1.10       uwe 	if (field_by_value(&backlight.curval)->flags & FLG_GET) {
     91       1.10       uwe 		backlight.param = WSDISPLAYIO_PARAM_BACKLIGHT;
     92       1.10       uwe 		if (ioctl(fd, WSDISPLAYIO_GETPARAM, &backlight) < 0)
     93       1.10       uwe 			field_disable_by_value(&backlight.curval);
     94       1.10       uwe 	}
     95       1.10       uwe 
     96       1.10       uwe 	if (field_by_value(&brightness.curval)->flags & FLG_GET) {
     97       1.10       uwe 		brightness.param = WSDISPLAYIO_PARAM_BRIGHTNESS;
     98       1.10       uwe 		if (ioctl(fd, WSDISPLAYIO_GETPARAM, &brightness))
     99       1.10       uwe 			field_disable_by_value(&brightness.curval);
    100       1.10       uwe 	}
    101       1.10       uwe 
    102       1.10       uwe 	if (field_by_value(&contrast.curval)->flags & FLG_GET) {
    103       1.10       uwe 		contrast.param = WSDISPLAYIO_PARAM_CONTRAST;
    104       1.10       uwe 		if (ioctl(fd, WSDISPLAYIO_GETPARAM, &contrast))
    105       1.10       uwe 			field_disable_by_value(&contrast.curval);
    106       1.10       uwe 	}
    107       1.10       uwe 
    108        1.5      jmmv 	if (field_by_value(&msg_default_attrs)->flags & FLG_GET ||
    109        1.5      jmmv 	    field_by_value(&msg_default_bg)->flags & FLG_GET ||
    110        1.5      jmmv 	    field_by_value(&msg_default_fg)->flags & FLG_GET ||
    111        1.5      jmmv 	    field_by_value(&msg_kernel_attrs)->flags & FLG_GET ||
    112        1.5      jmmv 	    field_by_value(&msg_kernel_bg)->flags & FLG_GET ||
    113        1.5      jmmv 	    field_by_value(&msg_kernel_fg)->flags & FLG_GET) {
    114        1.5      jmmv 		struct wsdisplay_msgattrs ma;
    115        1.5      jmmv 
    116        1.5      jmmv 		if (ioctl(fd, WSDISPLAYIO_GMSGATTRS, &ma) < 0) {
    117        1.7      jmmv 			field_disable_by_value(&msg_default_attrs);
    118        1.7      jmmv 			field_disable_by_value(&msg_default_bg);
    119        1.7      jmmv 			field_disable_by_value(&msg_default_fg);
    120        1.7      jmmv 			field_disable_by_value(&msg_kernel_attrs);
    121        1.7      jmmv 			field_disable_by_value(&msg_kernel_bg);
    122        1.7      jmmv 			field_disable_by_value(&msg_kernel_fg);
    123        1.7      jmmv 		} else {
    124        1.7      jmmv 			msg_default_attrs = ma.default_attrs;
    125        1.7      jmmv 			if (ma.default_attrs & WSATTR_WSCOLORS) {
    126        1.7      jmmv 				msg_default_bg = ma.default_bg;
    127        1.7      jmmv 				msg_default_fg = ma.default_fg;
    128        1.7      jmmv 			} else
    129        1.7      jmmv 				msg_default_bg = msg_default_fg = -1;
    130        1.7      jmmv 
    131        1.7      jmmv 			msg_kernel_attrs = ma.kernel_attrs;
    132        1.7      jmmv 			if (ma.kernel_attrs & WSATTR_WSCOLORS) {
    133        1.7      jmmv 				msg_kernel_bg = ma.kernel_bg;
    134        1.7      jmmv 				msg_kernel_fg = ma.kernel_fg;
    135        1.7      jmmv 			} else
    136        1.7      jmmv 				msg_kernel_bg = msg_kernel_fg = -1;
    137        1.5      jmmv 		}
    138        1.5      jmmv 	}
    139        1.5      jmmv 
    140        1.7      jmmv 	if (field_by_value(&scroll_l.fastlines)->flags & FLG_GET ||
    141        1.7      jmmv 	    field_by_value(&scroll_l.slowlines)->flags & FLG_GET) {
    142        1.7      jmmv 		if (ioctl(fd, WSDISPLAYIO_DGSCROLL, &scroll_l) < 0) {
    143        1.7      jmmv 			field_disable_by_value(&scroll_l.fastlines);
    144        1.7      jmmv 			field_disable_by_value(&scroll_l.slowlines);
    145        1.7      jmmv 		}
    146        1.4  christos 	}
    147        1.1   hannken }
    148        1.1   hannken 
    149        1.1   hannken void
    150  1.15.20.1      yamt display_put_values(int fd)
    151        1.1   hannken {
    152       1.12      jmmv 
    153        1.2   hannken 	if (field_by_value(&font.name)->flags & FLG_SET) {
    154        1.2   hannken 		if (ioctl(fd, WSDISPLAYIO_SFONT, &font) < 0)
    155       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_SFONT");
    156        1.2   hannken 		pr_field(field_by_value(&font.name), " -> ");
    157        1.2   hannken 	}
    158        1.5      jmmv 
    159        1.6      jmmv 	if (field_by_value(&border)->flags & FLG_SET) {
    160        1.6      jmmv 		if (ioctl(fd, WSDISPLAYIO_SBORDER, &border) < 0)
    161       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_SBORDER");
    162        1.6      jmmv 		pr_field(field_by_value(&border), " -> ");
    163        1.6      jmmv 	}
    164        1.6      jmmv 
    165       1.10       uwe 	if (field_by_value(&backlight.curval)->flags & FLG_SET) {
    166       1.10       uwe 		backlight.param = WSDISPLAYIO_PARAM_BACKLIGHT;
    167       1.10       uwe 		if (ioctl(fd, WSDISPLAYIO_SETPARAM, &backlight) < 0)
    168       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_PARAM_BACKLIGHT");
    169       1.10       uwe 		pr_field(field_by_value(&backlight.curval), " -> ");
    170       1.10       uwe 	}
    171       1.10       uwe 
    172       1.10       uwe 	if (field_by_value(&brightness.curval)->flags & FLG_SET) {
    173       1.10       uwe 		brightness.param = WSDISPLAYIO_PARAM_BRIGHTNESS;
    174       1.10       uwe 		if (ioctl(fd, WSDISPLAYIO_SETPARAM, &brightness) < 0)
    175       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_PARAM_BRIGHTNESS");
    176       1.10       uwe 		pr_field(field_by_value(&brightness.curval), " -> ");
    177       1.10       uwe 	}
    178       1.10       uwe 
    179       1.10       uwe 	if (field_by_value(&contrast.curval)->flags & FLG_SET) {
    180       1.10       uwe 		contrast.param = WSDISPLAYIO_PARAM_CONTRAST;
    181       1.10       uwe 		if (ioctl(fd, WSDISPLAYIO_SETPARAM, &contrast) < 0)
    182       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_PARAM_CONTRAST");
    183       1.10       uwe 		pr_field(field_by_value(&contrast.curval), " -> ");
    184       1.10       uwe 	}
    185       1.10       uwe 
    186       1.13  jmcneill 	if (field_by_value(&splash_enable)->flags & FLG_SET) {
    187       1.13  jmcneill 		if (ioctl(fd, WSDISPLAYIO_SSPLASH, &splash_enable) < 0)
    188       1.13  jmcneill 			err(EXIT_FAILURE, "WSDISPLAYIO_SSPLASH");
    189       1.13  jmcneill 		pr_field(field_by_value(&splash_enable), " -> ");
    190       1.13  jmcneill 	}
    191       1.13  jmcneill 
    192       1.13  jmcneill 	if (field_by_value(&splash_progress)->flags & FLG_SET) {
    193       1.13  jmcneill 		if (ioctl(fd, WSDISPLAYIO_SPROGRESS, &splash_progress) < 0)
    194       1.13  jmcneill 			err(EXIT_FAILURE, "WSDISPLAYIO_SPROGRESS");
    195       1.13  jmcneill 		pr_field(field_by_value(&splash_progress), " -> ");
    196       1.13  jmcneill 	}
    197       1.13  jmcneill 
    198        1.5      jmmv 	if (field_by_value(&msg_default_attrs)->flags & FLG_SET ||
    199        1.5      jmmv 	    field_by_value(&msg_default_bg)->flags & FLG_SET ||
    200        1.5      jmmv 	    field_by_value(&msg_default_fg)->flags & FLG_SET ||
    201        1.5      jmmv 	    field_by_value(&msg_kernel_attrs)->flags & FLG_SET ||
    202        1.5      jmmv 	    field_by_value(&msg_kernel_bg)->flags & FLG_SET ||
    203        1.5      jmmv 	    field_by_value(&msg_kernel_fg)->flags & FLG_SET) {
    204        1.5      jmmv 		struct wsdisplay_msgattrs ma;
    205        1.5      jmmv 
    206        1.5      jmmv 		if (ioctl(fd, WSDISPLAYIO_GMSGATTRS, &ma) < 0)
    207       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_GMSGATTRS");
    208        1.5      jmmv 
    209        1.5      jmmv 		if (field_by_value(&msg_default_attrs)->flags & FLG_SET) {
    210        1.5      jmmv 			ma.default_attrs = msg_default_attrs;
    211        1.5      jmmv 			pr_field(field_by_value(&msg_default_attrs), " -> ");
    212        1.5      jmmv 		}
    213        1.5      jmmv 		if (ma.default_attrs & WSATTR_WSCOLORS) {
    214        1.5      jmmv 			if (field_by_value(&msg_default_bg)->flags & FLG_SET) {
    215        1.5      jmmv 				ma.default_bg = msg_default_bg;
    216        1.5      jmmv 				pr_field(field_by_value(&msg_default_bg),
    217       1.12      jmmv 				    " -> ");
    218        1.5      jmmv 			}
    219        1.5      jmmv 			if (field_by_value(&msg_default_fg)->flags & FLG_SET) {
    220        1.5      jmmv 				ma.default_fg = msg_default_fg;
    221        1.5      jmmv 				pr_field(field_by_value(&msg_default_fg),
    222       1.12      jmmv 				    " -> ");
    223        1.5      jmmv 			}
    224        1.5      jmmv 		}
    225        1.5      jmmv 
    226        1.5      jmmv 		if (field_by_value(&msg_kernel_attrs)->flags & FLG_SET) {
    227        1.5      jmmv 			ma.kernel_attrs = msg_kernel_attrs;
    228        1.5      jmmv 			pr_field(field_by_value(&msg_kernel_attrs), " -> ");
    229        1.5      jmmv 		}
    230        1.5      jmmv 		if (ma.default_attrs & WSATTR_WSCOLORS) {
    231        1.5      jmmv 			if (field_by_value(&msg_kernel_bg)->flags & FLG_SET) {
    232        1.5      jmmv 				ma.kernel_bg = msg_kernel_bg;
    233        1.5      jmmv 				pr_field(field_by_value(&msg_kernel_bg),
    234       1.12      jmmv 				    " -> ");
    235        1.5      jmmv 			}
    236        1.5      jmmv 			if (field_by_value(&msg_kernel_fg)->flags & FLG_SET) {
    237        1.5      jmmv 				ma.kernel_fg = msg_kernel_fg;
    238        1.5      jmmv 				pr_field(field_by_value(&msg_kernel_fg),
    239       1.12      jmmv 				    " -> ");
    240        1.5      jmmv 			}
    241        1.5      jmmv 		}
    242        1.5      jmmv 
    243        1.5      jmmv 		if (ioctl(fd, WSDISPLAYIO_SMSGATTRS, &ma) < 0)
    244       1.12      jmmv 			err(EXIT_FAILURE, "WSDISPLAYIO_SMSGATTRS");
    245        1.5      jmmv 	}
    246        1.5      jmmv 
    247        1.7      jmmv 	scroll_l.which = 0;
    248        1.7      jmmv 	if (field_by_value(&scroll_l.fastlines)->flags & FLG_SET)
    249        1.7      jmmv 		scroll_l.which |= WSDISPLAY_SCROLL_DOFASTLINES;
    250        1.7      jmmv 	if (field_by_value(&scroll_l.slowlines)->flags & FLG_SET)
    251        1.7      jmmv 		scroll_l.which |= WSDISPLAY_SCROLL_DOSLOWLINES;
    252        1.7      jmmv 	if (scroll_l.which != 0 &&
    253        1.7      jmmv 	    ioctl(fd, WSDISPLAYIO_DSSCROLL, &scroll_l) < 0)
    254       1.12      jmmv 		err(EXIT_FAILURE, "WSDISPLAYIO_DSSCROLL");
    255        1.3  christos 	if (scroll_l.which & WSDISPLAY_SCROLL_DOFASTLINES)
    256        1.3  christos 		pr_field(field_by_value(&scroll_l.fastlines), " -> ");
    257        1.3  christos 	if (scroll_l.which & WSDISPLAY_SCROLL_DOSLOWLINES)
    258        1.3  christos 		pr_field(field_by_value(&scroll_l.slowlines), " -> ");
    259        1.1   hannken }
    260