w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

commit c918d7902afe9431154abecb824ae03c2b84933f
parent d3e0d5a2e270fd2acdf113a183908de43a955a4b
Author: ukai <ukai>
Date:   Fri, 15 Nov 2002 15:36:48 +0000

[w3m-dev 03433] cygwin console on Win9X
* configure (config.h): SUPPORT_WIN9X_CONSOLE_MBCS
* linein.c (inputLineHistSearch): enable_win9x_console_input()
				disable_win9x_console_input()
* main.c (mouse): cygin_mouse_btn_swapped
* terms.c (is_xterm): static
	(isLocalConsole): added
	(cygwin_mouse_btn_swapped): added
	(check_win32_console): deleted
	(check_win9x): added
	(init_win32_console_handle): check ttyslot()
	(enable_win9x_console_input): added
	(disable_win9x_console_input): added
	(read_win32_console_input): delete ifdef MOUSE
	(cmp_tv): deleted
	(subtract_tv): deleted
	(GetConsoleHwnd): added
	(cygwin_version): added
	(select_or_poll_win32_console): deleted
	(check_cygwin_console): added
	(select_win32_console): deleted
	(set_tty): check_cygin_console()
	(term_title): SetConsoleTitle()
	(CYGWIN_ON): added
	(CYGIN_OFF): added
	(mouse_init): NEED_CYGWIN_ON
	(mouse_end): NEED_CYGWIN_OFF
* terms.h (cygwin_mouse_btn_swapped): added
	(enable_win9x_console_input): added
	(disable_win9x_console_input): added
	(NEED_CYGWIN_ON): added
	(NEED_CYGWIN_OFF): added
From: WATANABE Katsuyuki <katsuyuki_1.watanabe@toppan.co.jp>

Diffstat:
MChangeLog | 35+++++++++++++++++++++++++++++++++++
Mconfigure | 3+++
Mlinein.c | 16+++++++---------
Mmain.c | 8++++++++
Mmenu.c | 8++++++++
Mterms.c | 256++++++++++++++++++++++++++++++++-----------------------------------------------
Mterms.h | 7+++++++
7 files changed, 170 insertions(+), 163 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,38 @@ +2002-11-16 WATANABE Katsuyuki <katsuyuki_1.watanabe@toppan.co.jp> + + * [w3m-dev 03433] cygwin console on Win9X + * configure (config.h): SUPPORT_WIN9X_CONSOLE_MBCS + * linein.c (inputLineHistSearch): enable_win9x_console_input() + disable_win9x_console_input() + * main.c (mouse): cygin_mouse_btn_swapped + * terms.c (is_xterm): static + (isLocalConsole): added + (cygwin_mouse_btn_swapped): added + (check_win32_console): deleted + (check_win9x): added + (init_win32_console_handle): check ttyslot() + (enable_win9x_console_input): added + (disable_win9x_console_input): added + (read_win32_console_input): delete ifdef MOUSE + (cmp_tv): deleted + (subtract_tv): deleted + (GetConsoleHwnd): added + (cygwin_version): added + (select_or_poll_win32_console): deleted + (check_cygwin_console): added + (select_win32_console): deleted + (set_tty): check_cygin_console() + (term_title): SetConsoleTitle() + (CYGWIN_ON): added + (CYGIN_OFF): added + (mouse_init): NEED_CYGWIN_ON + (mouse_end): NEED_CYGWIN_OFF + * terms.h (cygwin_mouse_btn_swapped): added + (enable_win9x_console_input): added + (disable_win9x_console_input): added + (NEED_CYGWIN_ON): added + (NEED_CYGWIN_OFF): added + 2002-11-16 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> * [w3m-dev 03432] Re: tab browser diff --git a/configure b/configure @@ -2502,6 +2502,9 @@ $def_ipv6_ss_family #if defined( __CYGWIN__ ) #define SUPPORT_NETBIOS_SHARE 1 +#if LANG == JA +#define SUPPORT_WIN9X_CONSOLE_MBCS 1 +#endif #endif #if defined(__DJGPP__) diff --git a/linein.c b/linein.c @@ -139,6 +139,9 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist, CLen = CPos = 0; } +#ifdef SUPPORT_WIN9X_CONSOLE_MBCS + enable_win9x_console_input(); +#endif i_cont = TRUE; i_broken = FALSE; i_quote = FALSE; @@ -287,6 +290,10 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist, if (need_redraw) displayBuffer(Currentbuf, B_FORCE_REDRAW); +#ifdef SUPPORT_WIN9X_CONSOLE_MBCS + disable_win9x_console_input(); +#endif + if (i_broken) return NULL; @@ -443,15 +450,6 @@ _esc(void) case 'D': _mvL(); break; -#if defined(__CYGWIN__) && defined(USE_MOUSE) - case 'M': - if ((is_xterm & (NEED_XTERM_ON | NEED_XTERM_OFF)) == NEED_XTERM_ON) { - getch(); - getch(); - getch(); - } - break; -#endif } break; case CTRL_I: diff --git a/main.c b/main.c @@ -4895,6 +4895,14 @@ mouse() int btn, x, y; btn = (unsigned char)getch() - 32; +#if defined(__CYGWIN__) + if (cygwin_mouse_btn_swapped) { + if (btn == MOUSE_BTN2_DOWN) + btn = MOUSE_BTN3_DOWN; + else if (btn == MOUSE_BTN3_DOWN) + btn = MOUSE_BTN2_DOWN; + } +#endif x = (unsigned char)getch() - 33; if (x < 0) x += 0x100; diff --git a/menu.c b/menu.c @@ -1142,6 +1142,14 @@ mMouse(char c) int btn, x, y; btn = (unsigned char)getch() - 32; +#if defined(__CYGWIN__) + if (cygwin_mouse_btn_swapped) { + if (btn == MOUSE_BTN2_DOWN) + btn = MOUSE_BTN3_DOWN; + else if (btn == MOUSE_BTN3_DOWN) + btn = MOUSE_BTN2_DOWN; + } +#endif x = (unsigned char)getch() - 33; if (x < 0) x += 0x100; diff --git a/terms.c b/terms.c @@ -33,10 +33,7 @@ static int cwidth = 8, cheight = 16; static int xpix, ypix, nbs, obs = 0; #endif /* use_SYSMOUSE */ -#ifndef __CYGWIN__ -static -#endif -int is_xterm = 0; +static int is_xterm = 0; void mouse_init(), mouse_end(); int mouseActive = 0; @@ -61,9 +58,14 @@ extern int CodePage; #if defined(__CYGWIN__) #include <windows.h> -static HANDLE hConIn; +#include <sys/cygwin.h> +static int isWinConsole = 0; +static int isLocalConsole = 0; +int cygwin_mouse_btn_swapped = 0; + +#if defined(SUPPORT_WIN9X_CONSOLE_MBCS) +static HANDLE hConIn = INVALID_HANDLE_VALUE; static int isWin95; -static int isWinConsole; static char *ConInV; static int iConIn, nConIn, nConInMax; #ifdef USE_MOUSE @@ -71,25 +73,10 @@ static MOUSE_EVENT_RECORD lastConMouse; #endif void -check_win32_console(void) -{ - char *tty; - - tty = ttyname(1); - if (!strncmp(tty, "/dev/con", 8)) { - isWinConsole = TRUE; - } - else { - isWinConsole = FALSE; - } -} - -void -init_win32_console_handle(void) +check_win9x(void) { OSVERSIONINFO winVersionInfo; - check_win32_console(); winVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx(&winVersionInfo) == 0) { fprintf(stderr, "can't get Windows version information.\n"); @@ -97,22 +84,38 @@ init_win32_console_handle(void) } if (winVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { isWin95 = 1; + if (ttyslot() != -1) { + isLocalConsole = 0; + } } - hConIn = INVALID_HANDLE_VALUE; - if (isWin95) { - if (isWinConsole) { - if (isatty(0)) { - hConIn = GetStdHandle(STD_INPUT_HANDLE); - } - else { - hConIn = CreateFile("CONIN$", GENERIC_READ, - FILE_SHARE_READ, - NULL, OPEN_EXISTING, 0, NULL); - } + else { + isWin95 = 0; + } +} + +void +enable_win9x_console_input(void) +{ + if (isWin95 && isWinConsole && isLocalConsole && + hConIn == INVALID_HANDLE_VALUE) { + hConIn = CreateFile("CONIN$", GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, 0, NULL); + if (hConIn != INVALID_HANDLE_VALUE) { + getch(); } } } +void +disable_win9x_console_input(void) +{ + if (hConIn != INVALID_HANDLE_VALUE) { + CloseHandle(hConIn); + hConIn = INVALID_HANDLE_VALUE; + } +} + static void expand_win32_console_input_buffer(int n) { @@ -143,44 +146,6 @@ read_win32_console_input(void) } break; -#ifdef USE_MOUSE - case MOUSE_EVENT: - if ((lastConMouse.dwButtonState ^ rec.Event.MouseEvent. - dwButtonState) & ~(~0 << 5)) { - int down; - MOUSE_EVENT_RECORD *mer; - INPUT_RECORD dummy; - - expand_win32_console_input_buffer(6); - mer = &rec.Event.MouseEvent; - ConInV[nConIn] = '\033'; - ConInV[nConIn + 1] = '['; - ConInV[nConIn + 2] = 'M'; - - if (~(mer->dwButtonState) & lastConMouse. - dwButtonState & ~(~0 << 5)) - ConInV[nConIn + 3] = MOUSE_BTN_UP + ' '; - else if (! - (down = - mer->dwButtonState & ~lastConMouse. - dwButtonState & ~(~0 << 5))) - break; - else - ConInV[nConIn + 3] = (down & (1 << 0) ? MOUSE_BTN1_DOWN : - down & (1 << 1) ? MOUSE_BTN3_DOWN : - down & (1 << 2) ? MOUSE_BTN2_DOWN : - down & (1 << 3) ? - MOUSE_BTN4_DOWN_XTERM : - MOUSE_BTN5_DOWN_XTERM) + ' '; - - ConInV[nConIn + 4] = mer->dwMousePosition.X + '!'; - ConInV[nConIn + 5] = mer->dwMousePosition.Y + '!'; - nConIn += 6; - lastConMouse = *mer; - ReadConsoleInput(hConIn, &rec, 1, &nevents); - return 6; - } -#endif default: break; } @@ -220,92 +185,64 @@ read_win32_console(char *s, int n) return n; } -static int -cmp_tv(const struct timeval *tv_a, const struct timeval *tv_b) -{ - return ((tv_a->tv_sec < tv_b->tv_sec) ? -1 : - (tv_a->tv_sec > tv_b->tv_sec) ? 1 : - (tv_a->tv_usec < tv_b->tv_usec) ? -1 : - (tv_a->tv_usec > tv_b->tv_usec) ? 1 : 0); -} +#endif /* SUPPORT_WIN9X_CONSOLE_MBCS */ -static int -subtract_tv(struct timeval *dst, const struct timeval *src) +HWND GetConsoleHwnd(void) { - if ((dst->tv_usec -= src->tv_usec) < 0) { - --(dst->tv_sec); - dst->tv_usec += 1000000; - } + #define MY_BUFSIZE 1024 + HWND hwndFound; + char pszNewWindowTitle[MY_BUFSIZE]; + char pszOldWindowTitle[MY_BUFSIZE]; - return ((dst->tv_sec -= src->tv_sec) < 0 ? -1 : - !dst->tv_sec ? (dst->tv_usec < - 0 ? -1 : !dst->tv_usec ? 0 : 1) : 1); + GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE); + wsprintf(pszNewWindowTitle,"%d/%d", + GetTickCount(), + GetCurrentProcessId()); + SetConsoleTitle(pszNewWindowTitle); + Sleep(40); + hwndFound = FindWindow(NULL, pszNewWindowTitle); + SetConsoleTitle(pszOldWindowTitle); + return(hwndFound); } - -int -select_or_poll_win32_console(int n, fd_set * rfds, fd_set * wfds, - fd_set * efds, struct timeval *tout) + +unsigned long +cygwin_version(void) { - int m; - DWORD nevents; - - if ((m = select(n, rfds, wfds, efds, tout)) < 0) - return m; + struct per_process *p; - if (iConIn < nConIn) { - FD_SET(tty, rfds); - ++m; + p = (struct per_process *)cygwin_internal(CW_USER_DATA); + if (p != NULL) { + return (p->dll_major * 1000) + p->dll_minor; } - else { - iConIn = nConIn = 0; - - while (GetNumberOfConsoleInputEvents(hConIn, &nevents) && nevents) - read_win32_console_input(); - - if (nConIn) { - FD_SET(tty, rfds); - ++m; - } - } - - return m; + return 0; } -int -select_win32_console(int n, fd_set * rfds, fd_set * wfds, fd_set * efds, - struct timeval *tout) +void +check_cygwin_console(void) { - static struct timeval polltv = { 0, 1000000 / CLOCKS_PER_SEC }; - int m; - struct timeval tv; - - if (hConIn == INVALID_HANDLE_VALUE || tty < 0 || tty >= n || !rfds - || !FD_ISSET(tty, rfds)) - return select(n, rfds, wfds, efds, tout); - - FD_CLR(tty, rfds); - - if (tout) { - while (cmp_tv(tout, &polltv) > 0) { - tv = polltv; - - if ((m = select_or_poll_win32_console(n, rfds, wfds, efds, &tv))) - return m; - - subtract_tv(tout, &polltv); - } + char *term = getenv("TERM"); + HANDLE hWnd; - return select_or_poll_win32_console(n, rfds, wfds, efds, tout); + if (strncmp(term, "cygwin", 6) == 0) { + isWinConsole = 1; } - else - for (;;) { - tv = polltv; - - if ((m = select_or_poll_win32_console(n, rfds, wfds, efds, &tv))) - return m; + if (isWinConsole) { + hWnd = GetConsoleHwnd(); + if (hWnd != INVALID_HANDLE_VALUE) { + if (IsWindowVisible(hWnd)) { + isLocalConsole = 1; + } } -} +#ifdef SUPPORT_WIN9X_CONSOLE_MBCS + check_win9x(); #endif + } + if (cygwin_version() <= 1003015) { + /* cygwin DLL 1.3.15 or earler */ + cygwin_mouse_btn_swapped = 1; + } +} +#endif /* __CYGWIN__ */ char *getenv(const char *); MySignalHandler reset_exit(SIGNAL_ARG), error_dump(SIGNAL_ARG); @@ -499,7 +436,7 @@ static struct w3m_term_info { {W3M_TERM_INFO("mlterm", XTERM_TITLE, (NEED_XTERM_ON|NEED_XTERM_OFF))}, {W3M_TERM_INFO("screen", SCREEN_TITLE, 0)}, #ifdef __CYGWIN__ - {W3M_TERM_INFO("cygwin", NULL, NEED_XTERM_ON)}, + {W3M_TERM_INFO("cygwin", XTERM_TITLE, (NEED_CYGWIN_ON|NEED_CYGWIN_OFF))}, #endif {W3M_TERM_INFO(NULL, NULL, 0)} }; @@ -522,7 +459,7 @@ set_tty(void) } ttyf = fdopen(tty, "w"); #ifdef __CYGWIN__ - init_win32_console_handle(); + check_cygwin_console(); #endif TerminalGet(tty, &d_ioval); if (displayTitleTerm != NULL) { @@ -1872,8 +1809,17 @@ term_title(char *s) { if (!fmInitialized) return; - if (title_str != NULL) + if (title_str != NULL) { +#ifdef __CYGWIN__ + if (isLocalConsole) { + char buff[1024]; + snprintf(buff, sizeof(buff), "w3m: %s", s); + SetConsoleTitle(buff); + } + else if (!isWinConsole) +#endif fprintf(ttyf, title_str, s); + } } char @@ -1882,7 +1828,7 @@ getch(void) char c; while ( -#ifdef __CYGWIN__ +#ifdef SUPPORT_WIN9X_CONSOLE_MBCS read_win32_console(&c, 1) #else read(tty, &c, 1) @@ -2020,13 +1966,7 @@ sleep_till_anykey(int sec, int purge) FD_ZERO(&rfd); FD_SET(tty, &rfd); - if ( -#ifdef __CYGWIN__ - select_win32_console(tty + 1, &rfd, 0, 0, &tim) -#else - select(tty + 1, &rfd, 0, 0, &tim) -#endif - > 0 && purge) { + if (select(tty + 1, &rfd, 0, 0, &tim) > 0 && purge) { c = getch(); if (c == ESC_CODE) skip_escseq(); @@ -2042,6 +1982,8 @@ sleep_till_anykey(int sec, int purge) #define XTERM_ON {fputs("\033[?1001s\033[?1000h",ttyf); flush_tty();} #define XTERM_OFF {fputs("\033[?1000l\033[?1001r",ttyf); flush_tty();} +#define CYGWIN_ON {fputs("\033[?1000h",ttyf); flush_tty();} +#define CYGWIN_OFF {fputs("\033[?1000l",ttyf); flush_tty();} #ifdef USE_GPM /* Linux console with GPM support */ @@ -2167,6 +2109,9 @@ mouse_init() if (is_xterm & NEED_XTERM_ON) { XTERM_ON; } + else if (is_xterm & NEED_CYGWIN_ON) { + CYGWIN_ON; + } mouseActive = 1; } @@ -2178,6 +2123,9 @@ mouse_end() if (is_xterm & NEED_XTERM_OFF) { XTERM_OFF; } + else if (is_xterm & NEED_CYGWIN_OFF) { + CYGWIN_OFF; + } mouseActive = 0; } diff --git a/terms.h b/terms.h @@ -40,6 +40,13 @@ extern int LINES, COLS; #ifdef __CYGWIN__ extern int is_xterm; +extern int cygwin_mouse_btn_swapped; +#ifdef SUPPORT_WIN9X_CONSOLE_MBCS +void enable_win9x_console_input(void); +void disable_win9x_console_input(void); +#endif +#define NEED_CYGWIN_ON (1<<2) +#define NEED_CYGWIN_OFF (1<<3) #endif #define NEED_XTERM_ON (1) #define NEED_XTERM_OFF (1<<1)