Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 07 Nov 1996 17:28:00 +1100
From:      Julian Assange <proff@profane.iq.org>
To:        hackers@freebsd.org
Subject:   patches for nice text modes (170x48x16 etc) (syscons.c)
Message-ID:  <199611071319.AAA01322@profane.iq.org>

next in thread | raw e-mail | index | archive | help


--- sys/i386/isa/syscons.c.orig	Thu Oct 17 00:51:11 1996
+++ sys/i386/isa/syscons.c	Fri Oct 18 05:19:47 1996
@@ -195,6 +195,7 @@
 static void set_vgaregs(char *modetable);
 static void set_font_mode(void);
 static void set_normal_mode(void);
+static int change_mode (struct tty *tp, scr_stat *scp, int mode);
 static void set_destructive_cursor(scr_stat *scp);
 static void set_mouse_pos(scr_stat *scp);
 static void mouse_cut_start(scr_stat *scp);
@@ -840,62 +841,10 @@
     case SW_ENH_B40x25: case SW_ENH_C40x25:
     case SW_ENH_B80x25: case SW_ENH_C80x25:
     case SW_ENH_B80x43: case SW_ENH_C80x43:
-
+    case SW_USER:
 	if (!crtc_vga || video_mode_ptr == NULL)
 	    return ENXIO;
-	switch (cmd & 0xff) {
-	case M_VGA_C80x60: case M_VGA_M80x60:
-	    if (!(fonts_loaded & FONT_8))
-		return EINVAL;
-	    scp->xsize = 80;
-	    scp->ysize = 60;
-	    break;
-	case M_VGA_C80x50: case M_VGA_M80x50:
-	    if (!(fonts_loaded & FONT_8))
-		return EINVAL;
-	    scp->xsize = 80;
-	    scp->ysize = 50;
-	    break;
-	case M_ENH_B80x43: case M_ENH_C80x43:
-	    if (!(fonts_loaded & FONT_8))
-		return EINVAL;
-	    scp->xsize = 80;
-	    scp->ysize = 43;
-	    break;
-	case M_VGA_C80x30: case M_VGA_M80x30:
-	    scp->xsize = 80;
-	    scp->ysize = 30;
-	    break;
-	default:
-	    if ((cmd & 0xff) > M_VGA_CG320)
-		return EINVAL;
-	    else
-		scp->xsize = *(video_mode_ptr+((cmd&0xff)*64));
-		scp->ysize = *(video_mode_ptr+((cmd&0xff)*64)+1)+1;
-	    break;
-	}
-	scp->mode = cmd & 0xff;
-	free(scp->scr_buf, M_DEVBUF);
-	scp->scr_buf = (u_short *)
-	    malloc(scp->xsize*scp->ysize*sizeof(u_short), M_DEVBUF, M_WAITOK);
-    	scp->cursor_pos = scp->cursor_oldpos =
-	    scp->scr_buf + scp->xpos + scp->ypos * scp->xsize;
-    	scp->mouse_pos = scp->mouse_oldpos = 
-	    scp->scr_buf + ((scp->mouse_ypos/scp->font_size)*scp->xsize +
-	    scp->mouse_xpos/8);
-	free(cut_buffer, M_DEVBUF);
-    	cut_buffer = (char *)malloc(scp->xsize*scp->ysize, M_DEVBUF, M_NOWAIT);
-	cut_buffer[0] = 0x00;
-	if (scp == cur_console)
-	    set_mode(scp);
-	scp->status &= ~UNKNOWN_MODE;
-	clear_screen(scp);
-	if (tp->t_winsize.ws_col != scp->xsize
-	    || tp->t_winsize.ws_row != scp->ysize) {
-	    tp->t_winsize.ws_col = scp->xsize;
-	    tp->t_winsize.ws_row = scp->ysize;
-	    pgsignal(tp->t_pgrp, SIGWINCH, 1);
-	}
+	change_mode(tp, scp, cmd&0xff);
 	return 0;
 
     /* GRAPHICS MODES */
@@ -906,7 +855,7 @@
 
 	if (!crtc_vga || video_mode_ptr == NULL)
 	    return ENXIO;
-	scp->mode = cmd & 0xFF;
+	scp->mode = cmd&0xff;
 	scp->xpixel = (*(video_mode_ptr + (scp->mode*64))) * 8;
 	scp->ypixel = (*(video_mode_ptr + (scp->mode*64) + 1) + 1) *
 		     (*(video_mode_ptr + (scp->mode*64) + 2));
@@ -1004,6 +953,21 @@
 	*data = get_scr_num()+1;
 	return 0;
 
+    case VT_RESIZE: /* proff */
+    {
+	int n;
+	vt_consize_t *v = (vt_consize_t*)data;
+	for (n=0; n<MAXCONS; n++)
+	{
+		if (console[n])
+		{
+			console[n]->ysize = v->v_rows;  /* number of rows */
+			console[n]->xsize = v->v_cols;  /* number of columns */
+			change_mode(VIRTUAL_TTY(n), console[n], M_USER);
+		}
+	}
+    }
+
     case KDENABIO:      	/* allow io operations */
 	error = suser(p->p_ucred, &p->p_acflag);
 	if (error != 0)
@@ -1021,7 +985,7 @@
 	switch (*data) {
 	case KD_TEXT:   	/* switch to TEXT (known) mode */
 	    /* restore fonts & palette ! */
-	    if (crtc_vga) {
+	    if (crtc_vga && scp->mode != M_USER) {
 		if (fonts_loaded & FONT_8)
 		    copy_font(LOAD, FONT_8, font_8);
 		if (fonts_loaded & FONT_14)
@@ -2569,6 +2533,10 @@
 	    history_to_screen(cur_console);
 	}
 	switch (scancode) {
+	case 0x53:  /* grey delete key */
+	    change_mode(VIRTUAL_TTY(get_scr_num()), cur_console, M_VGA_C80x25);
+	    goto next_code;
+
 	case 0x47:  /* home key */
 	    cur_console->history_pos = cur_console->history_head;
 	    history_to_screen(cur_console);
@@ -2951,6 +2919,9 @@
 
     /* setup video hardware for the given mode */
     switch (scp->mode) {
+    case M_USER:
+	return;
+
     case M_VGA_M80x60:
 	bcopyw(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64);
 	goto special_80x60;
@@ -3051,6 +3022,67 @@
     /* set border color for this (virtual) console */
     set_border(scp->border);
     return;
+}
+
+static int
+change_mode (struct tty *tp, scr_stat *scp, int mode)
+{
+	switch (mode) {
+	case M_VGA_C80x60: case M_VGA_M80x60:
+	    if (!(fonts_loaded & FONT_8))
+		return EINVAL;
+	    scp->xsize = 80;
+	    scp->ysize = 60;
+	    break;
+	case M_VGA_C80x50: case M_VGA_M80x50:
+	    if (!(fonts_loaded & FONT_8))
+		return EINVAL;
+	    scp->xsize = 80;
+	    scp->ysize = 50;
+	    break;
+	case M_ENH_B80x43: case M_ENH_C80x43:
+	    if (!(fonts_loaded & FONT_8))
+		return EINVAL;
+	    scp->xsize = 80;
+	    scp->ysize = 43;
+	    break;
+	case M_VGA_C80x30: case M_VGA_M80x30:
+	    scp->xsize = 80;
+	    scp->ysize = 30;
+	    break;
+        case M_USER:
+	    break;
+	default:
+	    if (mode > M_VGA_CG320)
+		return EINVAL;
+	    else
+		scp->xsize = *(video_mode_ptr+((mode)*64));
+		scp->ysize = *(video_mode_ptr+((mode)*64)+1)+1;
+	    break;
+	}
+	scp->mode = mode;
+	free(scp->scr_buf, M_DEVBUF);
+	scp->scr_buf = (u_short *)
+	    malloc(scp->xsize*scp->ysize*sizeof(u_short), M_DEVBUF, M_WAITOK);
+    	scp->cursor_pos = scp->cursor_oldpos =
+	    scp->scr_buf + scp->xpos + scp->ypos * scp->xsize;
+    	scp->mouse_pos = scp->mouse_oldpos = 
+	    scp->scr_buf + ((scp->mouse_ypos/scp->font_size)*scp->xsize +
+	    scp->mouse_xpos/8);
+	free(cut_buffer, M_DEVBUF);
+    	cut_buffer = (char *)malloc(scp->xsize*scp->ysize, M_DEVBUF, M_NOWAIT);
+	cut_buffer[0] = 0x00;
+	if (scp == cur_console)
+	    set_mode(scp);
+	scp->status &= ~UNKNOWN_MODE;
+	clear_screen(scp);
+	if (tp->t_winsize.ws_col != scp->xsize
+	    || tp->t_winsize.ws_row != scp->ysize) {
+	    tp->t_winsize.ws_col = scp->xsize;
+	    tp->t_winsize.ws_row = scp->ysize;
+	    pgsignal(tp->t_pgrp, SIGWINCH, 1);
+	}
+	return 0;
 }
 
 void
--- sys/i386/include/console.h.orig	Thu Oct 17 01:10:16 1996
+++ sys/i386/include/console.h	Thu Oct 17 02:55:17 1996
@@ -91,6 +91,7 @@
 #define VT_ACTIVATE	_IO('v', 5)
 #define VT_WAITACTIVE	_IO('v', 6)
 #define VT_GETACTIVE	_IOR('v', 7, int)
+#define VT_RESIZE	_IOW('v', 8, vt_consize_t) /* set kernel's idea of screensize */
 
 #define VT_FALSE	0
 #define VT_TRUE		1
@@ -219,6 +220,15 @@
 	u_char	mk_keylock;
 };
 
+struct vt_consize {
+	unsigned short v_rows;	/* number of rows */
+	unsigned short v_cols;	/* number of columns */
+	unsigned short v_vlin;	/* number of pixel rows on screen */
+	unsigned short v_clin;	/* number of pixel rows per character */
+	unsigned short v_vcol;	/* number of pixel columns on screen */
+	unsigned short v_ccol;	/* number of pixel columns per character */
+};
+
 #define MAXSSAVER	16
 
 struct ssaver	{
@@ -232,6 +242,7 @@
 typedef struct fkeyarg fkeyarg_t;
 typedef struct vid_info vid_info_t;
 typedef struct vt_mode vtmode_t;
+typedef struct vt_consize vt_consize_t;
 typedef struct mouse_info mouse_info_t;
 typedef struct {char scrmap[256];} scrmap_t;
 typedef struct {char fnt8x8[8*256];} fnt8_t;
@@ -335,6 +346,8 @@
 #define M_VGA_C80x60	34	/* vga 8x8 font on color */
 #define M_VGA_M80x60	35	/* vga 8x8 font on color */
 
+#define M_USER		36	/* user defined mode */
+
 #define M_ENH_B80x43	0x70	/* ega black & white 80x43 */
 #define M_ENH_C80x43	0x71	/* ega color 80x43 */
 #define M_HGC_P0	0xe0	/* hercules graphics - page 0 @ B0000 */
@@ -382,6 +395,7 @@
 #define SW_CG640x480	_IO('S', M_VGA12)
 #define SW_VGA13	_IO('S', M_VGA13)
 #define SW_VGA_CG320	_IO('S', M_VGA13)
+#define SW_USER		_IO('S', M_USER)
 #endif /* PC98 */
 
 #endif /* !_MACHINE_CONSOLE_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199611071319.AAA01322>