3

ncurses を使用してユーザー インターフェイスをコーディングしています。端末の幅または高さが 222 文字/行を超えている場合に問題が発生し、マウス座標が -33 値を返すため、222 文字を超えてクリックすると mouse_x = -33 222 行を超えてクリックすると mouse_y = -33

222 文字/行を超えるマウス イベントを停止しないように ncurses に指示することは可能でしょうか? このバグは vim でも発生し、:vs 分離バーを 222 文字を超えて移動すると、x=0 に戻ります。

たぶん、このバグはすでに修正されていますか?

  1 #include <ncurses.h>
  2 
  3 void    treat_mouse(MEVENT* event);
  4 
  5 int     main(void)
  6 {
  7         bool    run;
  8         int     key;
  9         MEVENT  event;
 10 
 11         run = true;
 12         initscr();
 13         noecho();
 14         keypad(stdscr, TRUE);
 15         mousemask(BUTTON1_PRESSED, NULL);
 16         while (run == true)
 17         {
 18                 key = getch();
 19                 switch  (key)
 20                 {
 21                         case    'q':
 22                                 run = false;
 23                                 break;
 24                         case    KEY_MOUSE:
 25                                 treat_mouse(&event);
 26                                 break;
 27                         default:
 28                                 break;
 29                 }
 30         }
 31         endwin();
 32         return 0;
 33 }
 34 
 35 void    treat_mouse(MEVENT* event)
 36 {
 37         if (getmouse(event) == OK)
 38                 mvwprintw(stdscr, 0, 0, "click: x = %d, y = %d\n", event->x, event->y);
 39 } 

.

.

======================== 編集 =======================

.

.

わかりました。

ここで ncurses コード ソースをダウンロードしましたhttp://ftp.gnu.org/pub/gnu/ncurses/

そして、私はこのリンクを取りましたncurses-5.9.tar.gz 04-Apr-2011 19:12 2.7M

getch()を検索しました。

getch()はwgetch( )を呼び出します。

wgetch()は_nc_wgetch ()を呼び出します。

_nc_wgetch()は_mouse_inline ()を呼び出します。

_mouse_inline()は、空の関数である _nc_mouse_inline ()またはno_mouse_inline()を呼び出す構造体画面の関数ポインターです(マウスがない場合)。

ncurses-5.9/ncurses/base/lib_mouse.cで_nc_mouse_inline()関数を確認できます

彼女はunsigned charを使用してマウスの座標を計算し、この小さな例を確認します。

821 static bool
822 _nc_mouse_inline(SCREEN *sp)
823 /* mouse report received in the keyboard stream -- parse its info */
824 {
.
.
.
832         unsigned char kbuf[4];
.
.
.
970         eventp->x = (kbuf[1] - ' ') - 1;
971         eventp->y = (kbuf[2] - ' ') - 1;
.
.
.
984     return (result);
985 }

最後はなんでもします。

4

1 に答える 1

0

あなたの質問に対する答えを見つけたと思います。

unsigned char kbuf[4];
eventp->x = (kbuf[1] - ' ') - 1;
eventp->y = (kbuf[2] - ' ') - 1;

マウスの x と y は として受信されているunsigned charため、保持できる最大値は 255 です。' '(スペース) は ASCII 32 であるため、可能な最大値255 - 32 - 1は 222 です。

その後、値は 0 にラップされ、0 - 32 -1-33 に等しくなります。

于 2013-06-06T20:13:26.480 に答える