diff options
-rw-r--r-- | sys/arch/i386/isa/pcvt/pcvt_drv.c | 6 | ||||
-rw-r--r-- | sys/arch/i386/isa/pcvt/pcvt_ext.c | 45 | ||||
-rw-r--r-- | sys/arch/i386/isa/pcvt/pcvt_hdr.h | 20 | ||||
-rw-r--r-- | sys/arch/i386/isa/pcvt/pcvt_ioctl.h | 3 | ||||
-rw-r--r-- | sys/arch/i386/isa/pcvt/pcvt_kbd.c | 10 | ||||
-rw-r--r-- | sys/arch/i386/isa/pcvt/pcvt_mouse.c | 457 | ||||
-rw-r--r-- | sys/arch/i386/isa/pcvt/pcvt_mouse.h | 6 | ||||
-rw-r--r-- | usr.sbin/moused/moused.c | 68 |
8 files changed, 467 insertions, 148 deletions
diff --git a/sys/arch/i386/isa/pcvt/pcvt_drv.c b/sys/arch/i386/isa/pcvt/pcvt_drv.c index 12beb84f7c1..d5bf32eb623 100644 --- a/sys/arch/i386/isa/pcvt/pcvt_drv.c +++ b/sys/arch/i386/isa/pcvt/pcvt_drv.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pcvt_drv.c,v 1.34 2000/09/28 17:45:42 aaron Exp $ */ +/* $OpenBSD: pcvt_drv.c,v 1.35 2000/10/07 03:12:45 aaron Exp $ */ /* * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. * @@ -549,11 +549,9 @@ pcstart(register struct tty *tp) if (vs[minor(tp->t_dev)].scrolling) sgetc(31337); if (vsp == &vs[minor(tp->t_dev)]) { - if (IS_SEL_EXISTS(vsp)) { + if (IS_SEL_EXISTS(vsp)) /* hides a potential selection */ remove_selection(); - vsp->mouse_flags &= ~SEL_EXISTS; - } mouse_hide(); /* hides a potential mouse cursor */ } sput(&buf[0], 0, len, minor(tp->t_dev)); diff --git a/sys/arch/i386/isa/pcvt/pcvt_ext.c b/sys/arch/i386/isa/pcvt/pcvt_ext.c index d7e3ca381dd..babde2b9990 100644 --- a/sys/arch/i386/isa/pcvt/pcvt_ext.c +++ b/sys/arch/i386/isa/pcvt/pcvt_ext.c @@ -1,5 +1,4 @@ -/* $OpenBSD: pcvt_ext.c,v 1.27 2000/09/01 05:46:01 aaron Exp $ */ - +/* $OpenBSD: pcvt_ext.c,v 1.28 2000/10/07 03:12:45 aaron Exp $ */ /* * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. * @@ -2417,11 +2416,10 @@ vgapage(int new_screen) { int x; - if (IS_SEL_EXISTS(vsp)) { + if (IS_SEL_EXISTS(vsp)) /* hides a potential selection */ remove_selection(); - vsp->mouse_flags &= ~SEL_EXISTS; - } + mouse_hide(); /* hides a potential mouse cursor */ if(new_screen < 0 || new_screen >= totalscreens) @@ -2630,7 +2628,7 @@ usl_vt_ioctl(Dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) * if the new vt is also in process * mode, we have to wait until its * controlling process acknowledged - * the switch + * the switch */ vsp->vt_status |= VT_WAIT_ACK; @@ -2643,6 +2641,14 @@ usl_vt_ioctl(Dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) /* we are committed */ vt_switch_pending = 0; } + /* + * We send here a USR2 signal to the mouse + * daemon (moused(8)) + * to tell him he can reuse the mouse device. + */ + if (moused_proc) + psignal(moused_proc, SIGUSR2); + return 0; } break; @@ -2653,6 +2659,13 @@ usl_vt_ioctl(Dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) { vt_switch_pending = 0; vsp->vt_status &= ~VT_WAIT_ACK; + /* + * We send a USR1 signal to the mouse + * daemon (moused(8)) + * to ask him to free the mouse device. + */ + if (moused_proc) + psignal(moused_proc, SIGUSR1); return 0; } @@ -2769,8 +2782,17 @@ usl_vt_ioctl(Dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) case KD_TEXT: haschanged = (vsx->vt_status & VT_GRAFX) != 0; vsx->vt_status &= ~VT_GRAFX; - if(haschanged && vsx == vsp) + if (haschanged && vsx == vsp) switch_screen(current_video_screen, 1, 0); + + /* + * We send here a USR2 signal to the mouse + * daemon (moused(8)) + * to tell him he can reuse the mouse device. + */ + if (moused_proc) + psignal(moused_proc, SIGUSR2); + return 0; case KD_GRAPHICS: @@ -2781,6 +2803,15 @@ usl_vt_ioctl(Dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) vsx->vt_status |= VT_GRAFX; if(haschanged && vsx == vsp) switch_screen(current_video_screen, 0, 1); + + /* + * We send a USR1 signal to the mouse + * daemon (moused(8)) + * to ask him to free the mouse device. + */ + if (moused_proc) + psignal(moused_proc, SIGUSR1); + return 0; } diff --git a/sys/arch/i386/isa/pcvt/pcvt_hdr.h b/sys/arch/i386/isa/pcvt/pcvt_hdr.h index 4f1f16f5f66..2f5e710010f 100644 --- a/sys/arch/i386/isa/pcvt/pcvt_hdr.h +++ b/sys/arch/i386/isa/pcvt/pcvt_hdr.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pcvt_hdr.h,v 1.40 2000/09/28 17:45:42 aaron Exp $ */ +/* $OpenBSD: pcvt_hdr.h,v 1.41 2000/10/07 03:12:46 aaron Exp $ */ /* * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. @@ -705,21 +705,29 @@ typedef struct video_state { int kbd_state; /* keyboard raw or translated */ unsigned short mouse; /* mouse cursor position */ + unsigned short cursor; /* selection cursor position ( if + different from mouse cursor pos) */ unsigned short cpy_start; /* position of the copy start mark*/ unsigned short cpy_end; /* position of the copy end mark */ - unsigned short cpy_orig; /* original copy position */ + unsigned short orig_start; /* position of the original sel. start*/ + unsigned short orig_end; /* position of the original sel. end */ #define MOUSE_VISIBLE (1 << 0) /* flag, the mouse cursor is visible */ #define SEL_EXISTS (1 << 1) /* flag, a selection exists */ #define SEL_IN_PROGRESS (1 << 2) /* flag, a selection is in progress */ -#define BLANK_TO_EOL (1 << 3) /* flag, there are only blanks +#define SEL_EXT_AFTER (1 << 3) /* flag, selection is extended after */ +#define BLANK_TO_EOL (1 << 4) /* flag, there are only blanks characters to eol */ -#define IN_SELECTION (1 << 4) /* flag, the cursor is currently in - the selection */ +#define SEL_BY_CHAR (1 << 5) /* flag, select character by character*/ +#define SEL_BY_WORD (1 << 6) /* flag, select word by word */ +#define SEL_BY_LINE (1 << 7) /* flag, select line by line */ #define IS_MOUSE_VISIBLE(vsp) ((vsp)->mouse_flags & MOUSE_VISIBLE) #define IS_SEL_EXISTS(vsp) ((vsp)->mouse_flags & SEL_EXISTS) #define IS_SEL_IN_PROGRESS(vsp) ((vsp)->mouse_flags & SEL_IN_PROGRESS) +#define IS_SEL_EXT_AFTER(vsp) ((vsp)->mouse_flags & SEL_EXT_AFTER) #define IS_BLANK_TO_EOL(vsp) ((vsp)->mouse_flags & BLANK_TO_EOL) -#define IS_IN_SELECTION(vsp) ((vsp)->mouse_flags & IN_SELECTION) +#define IS_SEL_BY_CHAR(vsp) ((vsp)->mouse_flags & SEL_BY_CHAR) +#define IS_SEL_BY_WORD(vsp) ((vsp)->mouse_flags & SEL_BY_WORD) +#define IS_SEL_BY_LINE(vsp) ((vsp)->mouse_flags & SEL_BY_LINE) unsigned char mouse_flags; /* flags, status of the mouse */ } video_state; diff --git a/sys/arch/i386/isa/pcvt/pcvt_ioctl.h b/sys/arch/i386/isa/pcvt/pcvt_ioctl.h index 03b00f3e586..6ef47922372 100644 --- a/sys/arch/i386/isa/pcvt/pcvt_ioctl.h +++ b/sys/arch/i386/isa/pcvt/pcvt_ioctl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pcvt_ioctl.h,v 1.15 2000/09/01 05:46:02 aaron Exp $ */ +/* $OpenBSD: pcvt_ioctl.h,v 1.16 2000/10/07 03:12:46 aaron Exp $ */ /* * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. @@ -592,5 +592,6 @@ typedef struct keymap keymap_t; /* Ioctl for mouse console support */ #define PCVT_MOUSECTL _IOW('M',1,mouse_info_t) +#define PCVT_MOUSED _IOW('M',2,char) #endif /* ! _MACHINE_PCVT_IOCTL_H_ */ diff --git a/sys/arch/i386/isa/pcvt/pcvt_kbd.c b/sys/arch/i386/isa/pcvt/pcvt_kbd.c index 2c0ec4e3764..c38299f89dc 100644 --- a/sys/arch/i386/isa/pcvt/pcvt_kbd.c +++ b/sys/arch/i386/isa/pcvt/pcvt_kbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pcvt_kbd.c,v 1.36 2000/09/01 05:46:02 aaron Exp $ */ +/* $OpenBSD: pcvt_kbd.c,v 1.37 2000/10/07 03:12:46 aaron Exp $ */ /* * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch. @@ -1107,11 +1107,9 @@ regular: if ((key == 85) && shift_down && (kbd_lastkey != 85 || !kbd_status.breakseen)) { /* removing of visual regions for mouse console support */ - if (IS_SEL_EXISTS(vsp)) { + if (IS_SEL_EXISTS(vsp)) remove_selection(); /* remove current selection before leaving this screen */ - vsp->mouse_flags &= ~SEL_EXISTS; - } if (IS_MOUSE_VISIBLE(vsp)) { mouse_hide(); vsp->mouse_flags &= ~MOUSE_VISIBLE; @@ -1156,11 +1154,9 @@ regular: (kbd_lastkey != 86 || !kbd_status.breakseen)) { scroll_reset: /* removing of visual regions for mouse console support */ - if (IS_SEL_EXISTS(vsp)) { + if (IS_SEL_EXISTS(vsp)) remove_selection(); /* remove current selection before leaving this screen */ - vsp->mouse_flags &= ~SEL_EXISTS; - } if (IS_MOUSE_VISIBLE(vsp)) { mouse_hide(); vsp->mouse_flags &= ~MOUSE_VISIBLE; diff --git a/sys/arch/i386/isa/pcvt/pcvt_mouse.c b/sys/arch/i386/isa/pcvt/pcvt_mouse.c index ee4c45aa23a..0785e10b5a7 100644 --- a/sys/arch/i386/isa/pcvt/pcvt_mouse.c +++ b/sys/arch/i386/isa/pcvt/pcvt_mouse.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pcvt_mouse.c,v 1.4 2000/09/28 15:44:50 aaron Exp $ */ +/* $OpenBSD: pcvt_mouse.c,v 1.5 2000/10/07 03:12:47 aaron Exp $ */ /* * Copyright (c) 2000 Jean-Baptiste Marchand, Julien Montagne and Jerome Verdon @@ -47,14 +47,19 @@ void inverse_region(unsigned short start, unsigned short end); unsigned char skip_spc_right(char); unsigned char skip_spc_left(void); -unsigned char skip_char_right(void); -unsigned char skip_char_left(void); +unsigned char skip_char_right(unsigned short); +unsigned char skip_char_left(unsigned short); +unsigned char class_cmp(unsigned short, unsigned short); void mouse_copy_start(void); void mouse_copy_end(void); void mouse_copy_word(void); void mouse_copy_line(void); void mouse_copy_extend(void); +void mouse_copy_extend_char(void); +void mouse_copy_extend_word(void); +void mouse_copy_extend_line(void); +void mouse_copy_extend_after(void); void remove_selection(void); void mouse_copy_selection(void); void mouse_paste(void); @@ -120,6 +125,21 @@ mouse_ioctl(Dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) } return 0; } + if (device == PCVTCTL_MINOR && cmd == PCVT_MOUSED) { + char moused_flag = *(char *) data; + switch(moused_flag) { + case MOUSED_ON: + moused_proc = p; + break; + case MOUSED_OFF: + moused_proc = NULL; + break; + default: + return 0; + } + return 0; + } + return (-1); /* continue treatment in pcioctl */ } @@ -181,7 +201,7 @@ mouse_moverel(char dx, char dy) } /* - * function to video inverse a character of the display + * Function to video inverse a character of the display */ void @@ -208,13 +228,15 @@ void inverse_region(unsigned short start, unsigned short end) { unsigned short current_pos; - unsigned char c = 0; + unsigned short abs_end; + /* sanity check, useful because 'end' can be (0 - 1) = 65535 */ + abs_end = vsp->maxcol * vsp->screen_rows; + if (end > abs_end) + return ; current_pos = start; - while (current_pos <= end) { + while (current_pos <= end) inverse_char(current_pos++); - c++; - } } /* @@ -270,7 +292,7 @@ skip_spc_left(void) res--; return (res); } - + /* * Class of characters * Stolen from xterm sources of the Xfree project (see cvs tag below) @@ -342,20 +364,21 @@ static int charClass[256] = { 48, 48, 48, 48, 48, 48, 48, 248, /* o/ u` u' u^ u: y' P y: */ 48, 48, 48, 48, 48, 48, 48, 48}; + /* * Function which find the first blank beginning after the current cursor * position */ unsigned char -skip_char_right(void) +skip_char_right(unsigned short offset) { unsigned short *current; unsigned short *limit; unsigned char res = 0; unsigned char class; - current = vsp->Crtat + vsp->cpy_end; + current = vsp->Crtat + offset; class = charClass[(*current & 0x00ff)]; limit = current + (vsp->maxcol - (vsp->mouse % vsp->maxcol) - 1); while ((charClass[(*current & 0x00ff)] == class) && (current <= limit)){ @@ -372,14 +395,14 @@ skip_char_right(void) */ unsigned char -skip_char_left(void) +skip_char_left(unsigned short offset) { unsigned short *current; unsigned short *limit; unsigned char res = 0; unsigned char class; - current = vsp->Crtat + vsp->cpy_start; + current = vsp->Crtat + offset; class = charClass[(*current & 0x00ff)]; limit = current - (vsp->mouse % vsp->maxcol); while ((charClass[(*current & 0x00ff)] == class) && (current >= limit)){ @@ -391,6 +414,25 @@ skip_char_left(void) return (res); } +/* + * Function to compare character classes + */ + +unsigned char +class_cmp(unsigned short first, unsigned short second) +{ + unsigned char first_class; + unsigned char second_class; + + first_class = charClass[(*(vsp->Crtat + first) & 0x00ff)]; + second_class = charClass[(*(vsp->Crtat + second) & 0x00ff)]; + + if (first_class != second_class) + return (1); + else + return (0); +} + /* * Function to handle beginning of a copy operation */ @@ -414,20 +456,23 @@ mouse_copy_start(void) /* initial show of the cursor */ if (!IS_MOUSE_VISIBLE(vsp)) inverse_char(vsp->mouse); - - vsp->cpy_start = vsp->mouse; + + vsp->cpy_start = vsp->mouse; vsp->cpy_end = vsp->mouse; - vsp->cpy_orig = vsp->cpy_start; /* for correct action in - remove_selection() */ + vsp->orig_start = vsp->cpy_start; + vsp->orig_end = vsp->cpy_end; + vsp->cursor = vsp->cpy_end + 1; /* init value */ + right = skip_spc_right(BORDER); /* useful later, in mouse_copy_extend */ if (right) vsp->mouse_flags |= BLANK_TO_EOL; vsp->mouse_flags |= SEL_IN_PROGRESS; vsp->mouse_flags |= SEL_EXISTS; - - /* mouse cursor hidden in the selection */ - vsp->mouse_flags &= ~MOUSE_VISIBLE; + vsp->mouse_flags |= SEL_BY_CHAR; /* select by char */ + vsp->mouse_flags &= ~SEL_BY_WORD; + vsp->mouse_flags &= ~SEL_BY_LINE; + vsp->mouse_flags &= ~MOUSE_VISIBLE; /* cursor hidden in selection */ } /* @@ -449,8 +494,8 @@ mouse_copy_word() vsp->cpy_end = vsp->mouse; if (IS_ALPHANUM(vsp->mouse)) { - right = skip_char_right(); - left = skip_char_left(); + right = skip_char_right(vsp->cpy_end); + left = skip_char_left(vsp->cpy_start); } else { right = skip_spc_right(NO_BORDER); @@ -459,15 +504,16 @@ mouse_copy_word() vsp->cpy_start -= left; vsp->cpy_end += right; - vsp->cpy_orig = vsp->cpy_start; + vsp->orig_start = vsp->cpy_start; + vsp->orig_end = vsp->cpy_end; + vsp->cursor = vsp->cpy_end + 1; /* init value, never happen */ inverse_region(vsp->cpy_start, vsp->cpy_end); vsp->mouse_flags |= SEL_IN_PROGRESS; vsp->mouse_flags |= SEL_EXISTS; - - /* mouse cursor is in the selection. Moving the cursor inside the - selection won't modify (extend or reduce) it */ - vsp->mouse_flags |= IN_SELECTION; + vsp->mouse_flags &= ~SEL_BY_CHAR; + vsp->mouse_flags |= SEL_BY_WORD; + vsp->mouse_flags &= ~SEL_BY_LINE; /* mouse cursor hidden in the selection */ vsp->mouse_flags &= ~BLANK_TO_EOL; @@ -490,15 +536,16 @@ mouse_copy_line(void) vsp->cpy_start = row * vsp->maxcol; vsp->cpy_end = vsp->cpy_start + MAXCOL; - vsp->cpy_orig = vsp->cpy_start; + vsp->orig_start = vsp->cpy_start; + vsp->orig_end = vsp->cpy_end; + vsp->cursor = vsp->cpy_end + 1; inverse_region(vsp->cpy_start, vsp->cpy_end); vsp->mouse_flags |= SEL_IN_PROGRESS; vsp->mouse_flags |= SEL_EXISTS; - - /* mouse cursor is in the selection. Moving the cursor inside the - selection won't modify (extend or reduce) it */ - vsp->mouse_flags |= IN_SELECTION; + vsp->mouse_flags &= ~SEL_BY_CHAR; + vsp->mouse_flags &= ~SEL_BY_WORD; + vsp->mouse_flags |= SEL_BY_LINE; /* mouse cursor hidden in the selection */ vsp->mouse_flags &= ~BLANK_TO_EOL; @@ -513,18 +560,41 @@ void mouse_copy_end(void) { vsp->mouse_flags &= ~(SEL_IN_PROGRESS); + if (IS_SEL_BY_WORD(vsp) || IS_SEL_BY_LINE(vsp)) { + if (vsp->cursor != (vsp->cpy_end + 1)) + inverse_char(vsp->cursor); + vsp->cursor = vsp->cpy_end + 1; + } } +/* + * Generic selection extend function + */ + +void +mouse_copy_extend(void) +{ + if (IS_SEL_BY_CHAR(vsp)) + mouse_copy_extend_char(); + if (IS_SEL_BY_WORD(vsp)) + mouse_copy_extend_word(); + if (IS_SEL_BY_LINE(vsp)) + mouse_copy_extend_line(); +} + + + /* - * Function to extend a previously selected region + * Function to extend a selected region, character by character */ void -mouse_copy_extend() +mouse_copy_extend_char() { unsigned char right; + + if (!IS_SEL_EXT_AFTER(vsp)) { - if (IS_SEL_EXISTS(vsp)) { if (IS_BLANK_TO_EOL(vsp)) { /* * First extension of selection. We handle special @@ -532,93 +602,295 @@ mouse_copy_extend() */ right = skip_spc_right(BORDER); - if (vsp->mouse > vsp->cpy_orig) { + if (vsp->mouse > vsp->orig_start) { /* the selection goes to the lower part of the screen */ - + /* remove the previous cursor, start of selection is now next line */ inverse_char(vsp->cpy_start); vsp->cpy_start += (right + 1); vsp->cpy_end = vsp->cpy_start; - vsp->cpy_orig = vsp->cpy_start; + vsp->orig_start = vsp->cpy_start; /* simulate the initial mark */ inverse_char(vsp->cpy_start); } else { /* the selection goes to the upper part of the screen */ - /* remove the previous cursorm, start of + /* remove the previous cursor, start of selection is now at the eol */ inverse_char(vsp->cpy_start); - vsp->cpy_orig += (right + 1); - vsp->cpy_start = vsp->cpy_orig - 1; - vsp->cpy_end = vsp->cpy_orig - 1; + vsp->orig_start += (right + 1); + vsp->cpy_start = vsp->orig_start - 1; + vsp->cpy_end = vsp->orig_start - 1; /* simulate the initial mark */ inverse_char(vsp->cpy_start); } vsp->mouse_flags &= ~ BLANK_TO_EOL; } - - if (vsp->mouse < vsp->cpy_orig - && vsp->cpy_end >= vsp->cpy_orig) { + + if (vsp->mouse < vsp->orig_start + && vsp->cpy_end >= vsp->orig_start) { /* we go to the upper part of the screen */ - + /* reverse the old selection region */ remove_selection(); - vsp->cpy_end = vsp->cpy_orig - 1; - vsp->cpy_start = vsp->cpy_orig; + vsp->cpy_end = vsp->orig_start - 1; + vsp->cpy_start = vsp->orig_start; } - if (vsp->cpy_start < vsp->cpy_orig - && vsp->mouse >= vsp->cpy_orig) { - /* we go back to the lower part of the screen */ + if (vsp->cpy_start < vsp->orig_start + && vsp->mouse >= vsp->orig_start) { + /* we go to the lower part of the screen */ /* reverse the old selection region */ remove_selection(); + vsp->cpy_start = vsp->orig_start; + vsp->cpy_end = vsp->orig_start - 1; + } + /* restore flags cleared in remove_selection() */ + vsp->mouse_flags |= SEL_IN_PROGRESS; + vsp->mouse_flags |= SEL_EXISTS; + } + /* beginning of common part */ + + if (vsp->mouse >= vsp->orig_start) { + + /* lower part of the screen */ + if (vsp->mouse > vsp->cpy_end) + /* extending selection */ + inverse_region(vsp->cpy_end + 1, vsp->mouse); + else + /* reducing selection */ + inverse_region(vsp->mouse + 1, vsp->cpy_end); + vsp->cpy_end = vsp->mouse; + } + else { + /* upper part of the screen */ + if (vsp->mouse < vsp->cpy_start) + /* extending selection */ + inverse_region(vsp->mouse,vsp->cpy_start - 1); + else + /* reducing selection */ + inverse_region(vsp->cpy_start,vsp->mouse - 1); + vsp->cpy_start = vsp->mouse; + } + /* end of common part */ +} + +/* + * Function to extend a selected region, word by word + */ + +void +mouse_copy_extend_word(void) +{ + unsigned short old_cpy_end; + unsigned short old_cpy_start; + + if (!IS_SEL_EXT_AFTER(vsp)) { + + /* remove cursor in selection (black one) */ + + if (vsp->cursor != (vsp->cpy_end + 1)) + inverse_char(vsp->cursor); - vsp->cpy_start = vsp->cpy_orig; - vsp->cpy_end = vsp->cpy_orig - 1; + /* now, switch between lower and upper part of the screen */ + + if (vsp->mouse < vsp->orig_start + && vsp->cpy_end >= vsp->orig_start) { + /* going to the upper part of the screen */ + inverse_region(vsp->orig_end + 1, vsp->cpy_end); + vsp->cpy_end = vsp->orig_end; } - - if (vsp->mouse >= vsp->cpy_orig) { - /* lower part of the screen */ - if (vsp->mouse > vsp->cpy_end) { - /* extending selection */ - if (IS_IN_SELECTION(vsp)) - vsp->mouse_flags &= ~ IN_SELECTION; - inverse_region(vsp->cpy_end + 1,vsp->mouse); + if (vsp->mouse > vsp->orig_end + && vsp->cpy_start <= vsp->orig_start) { + /* going to the lower part of the screen */ + inverse_region(vsp->cpy_start, vsp->orig_start - 1); + vsp->cpy_start = vsp->orig_start; + } + } + + if (vsp->mouse >= vsp->orig_start) { + /* lower part of the screen */ + + if (vsp->mouse > vsp->cpy_end) { + /* extending selection */ + + old_cpy_end = vsp->cpy_end; + vsp->cpy_end = vsp->mouse + skip_char_right(vsp->mouse); + inverse_region(old_cpy_end + 1, vsp->cpy_end); + } + else { + if (class_cmp(vsp->mouse, vsp->mouse + 1)) { + /* reducing selection (remove last word) */ + old_cpy_end = vsp->cpy_end; + vsp->cpy_end = vsp->mouse; + inverse_region(vsp->cpy_end + 1, old_cpy_end); } else { - /* reducing selection, if the cursor is not - inside a word or line selection */ - if (!IS_IN_SELECTION(vsp)) - inverse_region(vsp->mouse + 1,vsp->cpy_end); + old_cpy_end = vsp->cpy_end; + vsp->cpy_end = vsp->mouse + + skip_char_right(vsp->mouse); + if (vsp->cpy_end != old_cpy_end) { + /* reducing selection, from the end of + * next word */ + inverse_region(vsp->cpy_end + 1, + old_cpy_end); + } } - if (!IS_IN_SELECTION(vsp)) - vsp->cpy_end = vsp->mouse; + } + } + else { + /* upper part of the screen */ + if (vsp->mouse < vsp->cpy_start) { + /* extending selection */ + old_cpy_start = vsp->cpy_start; + vsp->cpy_start = vsp->mouse -skip_char_left(vsp->mouse); + inverse_region(vsp->cpy_start, old_cpy_start - 1); } else { - /* upper part of the screen */ - if (vsp->mouse < vsp->cpy_start) { - /* extending selection */ - if (IS_IN_SELECTION(vsp)) - vsp->mouse_flags &= ~ IN_SELECTION; - inverse_region(vsp->mouse,vsp->cpy_start - 1); + if (class_cmp(vsp->mouse - 1, vsp->mouse)) { + /* reducing selection (remove last word) */ + old_cpy_start = vsp->cpy_start; + vsp->cpy_start = vsp->mouse; + inverse_region(old_cpy_start, + vsp->cpy_start - 1); } else { - /* reducing selection */ - inverse_region(vsp->cpy_start,vsp->mouse - 1); + old_cpy_start = vsp->cpy_start; + vsp->cpy_start = vsp->mouse - + skip_char_left(vsp->mouse); + if (vsp->cpy_start != old_cpy_start) + inverse_region(old_cpy_start, + vsp->cpy_start - 1); } - vsp->cpy_start = vsp->mouse; } } - else { + + if (!IS_SEL_EXT_AFTER(vsp)) { + /* display new cursor */ + vsp->cursor = vsp->mouse; + inverse_char(vsp->cursor); + } +} + +/* + * Function to extend a selected region, line by line + */ + +void +mouse_copy_extend_line(void) +{ + unsigned short old_row; + unsigned short new_row; + unsigned short old_cpy_start; + unsigned short old_cpy_end; + + if (!IS_SEL_EXT_AFTER(vsp)) { + /* remove cursor in selection (black one) */ + + if (vsp->cursor != (vsp->cpy_end + 1)) + inverse_char(vsp->cursor); + + /* now, switch between lower and upper part of the screen */ + + if (vsp->mouse < vsp->orig_start + && vsp->cpy_end >= vsp->orig_start) { + /* going to the upper part of the screen */ + inverse_region(vsp->orig_end + 1, vsp->cpy_end); + vsp->cpy_end = vsp->orig_end; + } + + if (vsp->mouse > vsp->orig_end + && vsp->cpy_start <= vsp->orig_start) { + /* going to the lower part of the screen */ + inverse_region(vsp->cpy_start, vsp->orig_start - 1); + vsp->cpy_start = vsp->orig_start; + } + } + + if (vsp->mouse >= vsp->orig_start) { + /* lower part of the screen */ + if (vsp->cursor == (vsp->cpy_end + 1)) + vsp->cursor = vsp->cpy_end; + old_row = vsp->cursor / vsp->maxcol; + new_row = vsp->mouse / vsp->maxcol; + old_cpy_end = vsp->cpy_end; + vsp->cpy_end = (new_row * vsp->maxcol) + MAXCOL; + if (new_row > old_row) + inverse_region(old_cpy_end + 1, vsp->cpy_end); + else if (new_row < old_row) + inverse_region(vsp->cpy_end + 1, old_cpy_end); + } + else { + /* upper part of the screen */ + old_row = vsp->cursor / vsp->maxcol; + new_row = vsp->mouse / vsp->maxcol; + old_cpy_start = vsp->cpy_start; + vsp->cpy_start = new_row * vsp->maxcol; + if (new_row < old_row) + inverse_region(vsp->cpy_start, old_cpy_start - 1); + else if (new_row > old_row) + inverse_region(old_cpy_start, vsp->cpy_start - 1); + } + + if (!IS_SEL_EXT_AFTER(vsp)) { + /* display new cursor */ + vsp->cursor = vsp->mouse; + inverse_char(vsp->cursor); + } +} + +/* + * Function to add an extension to a selected region, word by word + */ + +void +mouse_copy_extend_after(void) +{ + unsigned short start_dist; + unsigned short end_dist; + + if (IS_SEL_EXISTS(vsp)) { + vsp->mouse_flags |= SEL_EXT_AFTER; + mouse_hide(); /* hide current cursor */ + + if (vsp->cpy_start > vsp->mouse) + start_dist = vsp->cpy_start - vsp->mouse; + else + start_dist = vsp->mouse - vsp->cpy_start; + if (vsp->mouse > vsp->cpy_end) + end_dist = vsp->mouse - vsp->cpy_end; + else + end_dist = vsp->cpy_end - vsp->mouse; + if (start_dist < end_dist) { + /* upper part of the screen*/ + vsp->orig_start = vsp->mouse + 1; + /* only used in mouse_copy_extend_line() */ + vsp->cursor = vsp->cpy_start; + } + else { + /* lower part of the screen */ + vsp->orig_start = vsp->mouse; + /* only used in mouse_copy_extend_line() */ + vsp->cursor = vsp->cpy_end; + } + if (IS_SEL_BY_CHAR(vsp)) + mouse_copy_extend_char(); + if (IS_SEL_BY_WORD(vsp)) + mouse_copy_extend_word(); + if (IS_SEL_BY_LINE(vsp)) + mouse_copy_extend_line(); + mouse_copy_selection(); + } + else /* no selection yet! */ sysbeep(PCVT_SYSBEEPF / 1500, hz / 4); - } } + /* * Function to remove a previously selected region */ @@ -626,12 +898,12 @@ mouse_copy_extend() void remove_selection() { - if (vsp->cpy_start < vsp->cpy_orig) - /* backward selection */ - inverse_region(vsp->cpy_start, vsp->cpy_orig - 1); - else - /* forward selection */ - inverse_region(vsp->cpy_start, vsp->cpy_end); + if (IS_SEL_EXT_AFTER(vsp)) + /* reset the flag indicating an extension of selection */ + vsp->mouse_flags &= ~SEL_EXT_AFTER; + inverse_region(vsp->cpy_start, vsp->cpy_end); + vsp->mouse_flags &= ~SEL_IN_PROGRESS; + vsp->mouse_flags &= ~SEL_EXISTS; } /* @@ -680,16 +952,9 @@ mouse_copy_selection(void) unsigned short *sel_cur; unsigned short *sel_end; - if (vsp->cpy_start < vsp->cpy_orig) { - /* backward selection */ - sel_cur = vsp->Crtat + vsp->cpy_end; - sel_end = vsp->Crtat + vsp->cpy_orig - 1; - } - else { - /* forward selection */ - sel_cur = vsp->Crtat + vsp->cpy_start; - sel_end = vsp->Crtat + vsp->cpy_end; - } + sel_cur = vsp->Crtat + vsp->cpy_start; + sel_end = vsp->Crtat + vsp->cpy_end; + while (sel_cur <= sel_end && current < buf_end - 1) { Copybuffer[current] = ((*sel_cur) & 0x00ff); if (!IS_SPACE(Copybuffer[current])) @@ -708,6 +973,7 @@ mouse_copy_selection(void) Copybuffer[current] = '\0'; Copyowner = current_uid(); } + /* * Function to paste the current selection */ @@ -781,8 +1047,7 @@ mouse_button(int button, int clicks) case 0: /* button is up */ break; default: /* extend the selection */ - mouse_copy_extend(); - mouse_copy_selection(); + mouse_copy_extend_after(); break; } break; diff --git a/sys/arch/i386/isa/pcvt/pcvt_mouse.h b/sys/arch/i386/isa/pcvt/pcvt_mouse.h index 985f2f512e5..2828382a33f 100644 --- a/sys/arch/i386/isa/pcvt/pcvt_mouse.h +++ b/sys/arch/i386/isa/pcvt/pcvt_mouse.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pcvt_mouse.h,v 1.1 2000/09/01 05:46:02 aaron Exp $ */ +/* $OpenBSD: pcvt_mouse.h,v 1.2 2000/10/07 03:12:47 aaron Exp $ */ /* * Copyright (c) 2000 Jean-Baptiste Marchand, Julien Montagne and Jerome Verdon @@ -87,6 +87,8 @@ typedef struct mouse_info { #define MOUSE_HIDE (1 << 1) /* Hide the cursor */ #define MOUSE_MOTION_EVENT (1 << 2) /* Motion event */ #define MOUSE_BUTTON_EVENT (1 << 3) /* Button event */ +#define MOUSED_ON 1 +#define MOUSED_OFF 0 union { struct mouse_data data; @@ -94,3 +96,5 @@ typedef struct mouse_info { }u; } mouse_info_t; +struct proc *moused_proc; + diff --git a/usr.sbin/moused/moused.c b/usr.sbin/moused/moused.c index 3b65231f4c1..d04507e0a28 100644 --- a/usr.sbin/moused/moused.c +++ b/usr.sbin/moused/moused.c @@ -52,7 +52,7 @@ #include <sys/types.h> #include <sys/time.h> #include <sys/tty.h> -#include <machine/pcvt_ioctl.h> +#include <machine/pcvt_ioctl.h> #include <ctype.h> #include <err.h> @@ -399,8 +399,21 @@ mouse_fill_mousemode(void) } } + +static void +freedev(int sig) +{ + /* + * close the device, when a USR1 signal is received. + * Tipically used by an X server so it can open the device for it's + * own purpose. + */ + close(mouse.mfd); + sigpause(0); +} + static void -hup(int sig) +opendev(int sig) { longjmp(env, 1); } @@ -408,6 +421,9 @@ hup(int sig) static void cleanup(int sig) { + char moused_flag = MOUSED_OFF; + + ioctl(mouse.cfd, PCVT_MOUSED, &moused_flag); exit(0); } @@ -908,7 +924,7 @@ mouse_init(void) ** ** The following lines take care of the Logitech MouseMan protocols. ** - ** NOTE: There are different versions of both MouseMan and TrackMan! + ** NOTE: There are diffrent versions of both MouseMan and TrackMan! ** Hence I add another protocol P_LOGIMAN, which the user can ** specify as MouseMan in his XF86Config file. This entry was ** formerly handled as a special case of P_MS. However, people @@ -1054,10 +1070,10 @@ mouse_init(void) case P_PS2: - /* now sets the resolution and rate for PS/2 mice */ + /* now sets the resolution and rate for PS/2 mice */ /* always sets resolution, to a default value if no value is given */ - + c = PS2_SET_RES; write(mouse.mfd, &c, 1); c = mouse.mode.resolution; @@ -1101,25 +1117,20 @@ mouse_identify(void) if (mouse.proto != P_UNKNOWN) bcopy(proto[mouse.proto], cur_proto, sizeof(cur_proto)); - if ((mouse.mode.protocol == P_UNKNOWN) - || (mouse.mode.protocol >= sizeof(proto)/sizeof(proto[0]))) { - logwarn("unknown mouse protocol (%d)", mouse.mode.protocol); - return P_UNKNOWN; - } else { - /* INPORT and BUS are the same... */ - if (mouse.mode.protocol == P_INPORT) - mouse.mode.protocol = P_BM; - if (mouse.mode.protocol != mouse.proto) { - /* Hmm, the driver doesn't agree with the user... */ - if (mouse.proto != P_UNKNOWN) - logwarn("mouse type mismatch (%s != %s), %s is assumed", + /* INPORT and BUS are the same... */ + if (mouse.mode.protocol == P_INPORT) + mouse.mode.protocol = P_BM; + if (mouse.mode.protocol != mouse.proto) { + /* Hmm, the driver doesn't agree with the user... */ + if (mouse.proto != P_UNKNOWN) + logwarn("mouse type mismatch (%s != %s), %s is assumed", mouse_name(mouse.mode.protocol), mouse_name(mouse.proto), mouse_name(mouse.mode.protocol)); - mouse.proto = mouse.mode.protocol; - bcopy(proto[mouse.proto], cur_proto, sizeof(cur_proto)); - } + mouse.proto = mouse.mode.protocol; + bcopy(proto[mouse.proto], cur_proto, sizeof(cur_proto)); } + cur_proto[4] = mouse.mode.packetsize; cur_proto[0] = mouse.mode.syncmask[0]; /* header byte bit mask */ cur_proto[1] = mouse.mode.syncmask[1]; /* header bit pattern */ @@ -1738,6 +1749,7 @@ moused(void) fd_set fds; u_char b; FILE *fp; + char moused_flag; if ((mouse.cfd = open("/dev/pcvtctl", O_RDWR, 0)) == -1) logerr(1, "cannot open /dev/pcvtctl"); @@ -1746,7 +1758,7 @@ moused(void) if (daemon(0, 0)) { logerr(1, "failed to become a daemon"); } else { - background = TRUE; + background = TRUE; fp = fopen(pidfile, "w"); if (fp != NULL) { fprintf(fp, "%d\n", getpid()); @@ -1756,9 +1768,11 @@ moused(void) } /* display initial cursor */ - mouse_infos.operation = MOUSE_INIT; - ioctl(mouse.cfd,PCVT_MOUSECTL,&mouse_infos); + + moused_flag = MOUSED_ON; + ioctl(mouse.cfd, PCVT_MOUSED, &moused_flag); + ioctl(mouse.cfd, PCVT_MOUSECTL, &mouse_infos); /* clear mouse data */ bzero(&action, sizeof(action)); @@ -1779,8 +1793,8 @@ moused(void) read(mouse.mfd, &b, 1); if (mouse_protocol(b, &action)) { /* handler detected action */ mouse_map(&action, &action2); -#if 0 - printf("activity : buttons 0x%08x dx %d dy %d dz %d\n", +#if 0 + fprintf("activity : buttons 0x%08x dx %d dy %d dz %d\n", action2.button, action2.dx, action2.dy, action2.dz); #endif mouse_click(&action2); @@ -2025,10 +2039,12 @@ main(int argc, char **argv) for (;;) { if (setjmp(env) == 0) { - signal(SIGHUP, hup); + signal(SIGUSR1, freedev); + signal(SIGUSR2, opendev); signal(SIGINT , cleanup); signal(SIGQUIT, cleanup); signal(SIGTERM, cleanup); + signal(SIGKILL, cleanup); if ((mouse.mfd = open(mouse.portname, O_RDWR | O_NONBLOCK, 0)) == -1) logerr(1, "unable to open %s", mouse.portname); |