I looked at the wineconsole code and it does not seem that there is a configure option or any other mean to have wineconsole act as before (ie to use the slow but working USER driver). that's a feature (see previous discussion on wineconsole implementation) we could add an option for that, but it's better to fix actually the curses implementation *first*
does this attached patch solves some issues ? (it won't solve all of the issues for ida) A+ -- Eric Pouech Index: curses.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/programs/wineconsole/curses.c,v retrieving revision 1.1 diff -u -r1.1 curses.c --- curses.c 13 Dec 2002 23:37:06 -0000 1.1 +++ curses.c 19 Dec 2002 18:29:25 -0000 @@ -136,22 +136,28 @@ { int x, y; CHAR_INFO* cell; - WORD color; + DWORD attr; for (y = tp; y <= bm; y++) { cell = &data->cells[y * data->curcfg.sb_width]; for (x = 0; x < data->curcfg.sb_width; x++) { - color = 0; - if (cell[x].Attributes & FOREGROUND_RED) color |= COLOR_RED; - if (cell[x].Attributes & FOREGROUND_BLUE) color |= COLOR_BLUE; - if (cell[x].Attributes & FOREGROUND_GREEN) color |= COLOR_GREEN; - if (cell[x].Attributes & BACKGROUND_RED) color |= COLOR_RED << 3; - if (cell[x].Attributes & BACKGROUND_BLUE) color |= COLOR_BLUE << 3; - if (cell[x].Attributes & BACKGROUND_GREEN) color |= COLOR_GREEN << 3; + if (cell[x].Char.UnicodeChar >= 0x20 && cell[x].Char.UnicodeChar <= 0xFF) + attr = LOBYTE(cell[x].Char.UnicodeChar); + else + attr = ' '; + + if (cell[x].Attributes & FOREGROUND_RED) attr |= COLOR_PAIR(COLOR_RED); + if (cell[x].Attributes & FOREGROUND_BLUE) attr |= COLOR_PAIR(COLOR_BLUE); + if (cell[x].Attributes & FOREGROUND_GREEN) attr |= COLOR_PAIR(COLOR_GREEN); + if (cell[x].Attributes & BACKGROUND_RED) attr |= COLOR_PAIR(COLOR_RED << 3); + if (cell[x].Attributes & BACKGROUND_BLUE) attr |= COLOR_PAIR(COLOR_BLUE << 3); + if (cell[x].Attributes & BACKGROUND_GREEN) attr |= COLOR_PAIR(COLOR_GREEN << 3); - PRIVATE(data)->line[x] = (unsigned char)cell[x].Char.UnicodeChar | COLOR_PAIR(color); + if (cell[x].Attributes & FOREGROUND_INTENSITY) attr |= A_BOLD; + + PRIVATE(data)->line[x] = attr; } mvwaddchnstr(PRIVATE(data)->pad, y, 0, PRIVATE(data)->line, data->curcfg.sb_width); } @@ -282,10 +288,9 @@ static COORD pos /* = {0, 0} */; MEVENT mevt; - BOOL ret = 0; if (getmouse(&mevt) == ERR) - return FALSE; + return FALSE; WINE_TRACE("[%u]: (%d, %d) %08lx\n", mevt.id, mevt.x, mevt.y, (unsigned long)mevt.bstate); @@ -296,7 +301,6 @@ #define BTN3_BIT FROM_LEFT_2ND_BUTTON_PRESSED #define BTN4_BIT 0 /* not done yet */ - /* FIXME: to be checked */ if (mevt.bstate & BUTTON1_PRESSED) bstate |= BTN1_BIT; if (mevt.bstate & BUTTON1_RELEASED) bstate &= ~BTN1_BIT; if (mevt.bstate & BUTTON2_PRESSED) bstate |= BTN2_BIT; @@ -304,28 +308,12 @@ if (mevt.bstate & BUTTON3_PRESSED) bstate |= BTN3_BIT; if (mevt.bstate & BUTTON3_RELEASED) bstate &= ~BTN3_BIT; - /* for the clicked & double click events, since we'll generate automatically - * the release event, we don't have to store the state - */ - if ((mevt.bstate & (BUTTON1_CLICKED|BUTTON1_DOUBLE_CLICKED)) && !(bstate & BTN1_BIT)) - { - ret = BTN1_BIT; - } - if ((mevt.bstate & (BUTTON2_CLICKED|BUTTON2_DOUBLE_CLICKED)) && !(bstate & BTN2_BIT)) - { - ret = BTN2_BIT; - } - if ((mevt.bstate & (BUTTON3_CLICKED|BUTTON3_DOUBLE_CLICKED)) && !(bstate & BTN3_BIT)) - { - ret = BTN3_BIT; - } - ir->EventType = MOUSE_EVENT; ir->Event.MouseEvent.dwMousePosition.X = mevt.x; ir->Event.MouseEvent.dwMousePosition.Y = mevt.y; - ir->Event.MouseEvent.dwButtonState = (bstate | ret); - + ir->Event.MouseEvent.dwButtonState = bstate; + /* partial conversion */ ir->Event.MouseEvent.dwControlKeyState = 0; if (mevt.bstate & BUTTON_SHIFT) ir->Event.MouseEvent.dwControlKeyState |= SHIFT_PRESSED; @@ -338,19 +326,23 @@ */ ir->Event.MouseEvent.dwEventFlags = 0; +#if 0 + /* won't work, we need to still generate the first click event */ if ((mevt.bstate & BUTTON1_DOUBLE_CLICKED) && ((bstate|ret) & BTN1_BIT)) ir->Event.MouseEvent.dwEventFlags |= DOUBLE_CLICK; if ((mevt.bstate & BUTTON2_DOUBLE_CLICKED) && ((bstate|ret) & BTN2_BIT)) ir->Event.MouseEvent.dwEventFlags |= DOUBLE_CLICK; if ((mevt.bstate & BUTTON3_DOUBLE_CLICKED) && ((bstate|ret) & BTN3_BIT)) ir->Event.MouseEvent.dwEventFlags |= DOUBLE_CLICK; - if (mevt.x != pos.X || mevt.y != pos.Y) +#endif + if (!(mevt.bstate & (BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED)) && + (mevt.x != pos.X || mevt.y != pos.Y)) { ir->Event.MouseEvent.dwEventFlags |= MOUSE_MOVED; } pos.X = mevt.x; pos.Y = mevt.y; - - return ret; + + return FALSE; } /****************************************************************** @@ -659,7 +651,8 @@ nodelay(stdscr, TRUE); keypad(stdscr, TRUE); mousemask(0xffffffff, &PRIVATE(data)->initial_mouse_mask); - + /* no click generation... (--hmmm man page says -1 to disable) */ + mouseinterval(0); return TRUE; }