连续跟踪鼠标坐标

时间:2013-10-15 14:49:03

标签: ruby curses

我希望在移动鼠标时不断跟踪鼠标,或者至少每0.5秒跟踪一次:

require "curses"
include Curses



init_screen
start_color
init_pair(COLOR_BLUE,COLOR_BLUE,COLOR_WHITE)
init_pair(COLOR_RED,COLOR_RED,COLOR_WHITE)
crmode
noecho
stdscr.keypad(true)

close = false

begin
  mousemask(BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED)

  count = 0

  while( count < 10 )

        sleep 0.5

          m = getmouse


          winx = Window.new(7,30,10,10)
          winx.keypad = true
          winx.box(?|, ?-, ?+)
          winx.setpos(2,3)
          winx.addstr "Loop Count: " + count.to_s
          winx.setpos(3,3)
          winx.addstr "Mouse Position: " + m.inspect



          winx.refresh


          count += 1
  end


refresh
ensure
    close_screen
end

我觉得我很接近,但出于某种原因,getmouse回来了吗?为什么是这样? getmouse只能在点击等事件后工作吗?如果是这样,是否不可能连续跟踪鼠标?

来自ruby documentation

  

getmouse()点击以切换来源

     

返回鼠标的坐标。

     

这将从队列中读取并弹出鼠标事件数据

     

查看BUTTON *,ALL_MOUSE_EVENTS和REPORT_MOUSE_POSITION常量

REPORT_MOUSE_POSITION似乎是关键,但我真的不知道如何使用这些常量。 getmouse(REPORT_MOUSE_POSITION)无法正常工作。如果那是非常重要的话,那就很好了,但那里没有太多的文档。

3 个答案:

答案 0 :(得分:1)

您需要将REPORT_MOUSE_POSITION添加到mousemask

mousemask(BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED|REPORT_MOUSE_POSITION)

或者只是

mousemask(ALL_MOUSE_EVENTS)

Curses会在与按键相同的流中处理鼠标点击。因此,您需要使用getch获取鼠标事件。

在您的情况下,我建议将getch设置为非阻止读取stdscr.timeout=0并添加案例陈述:

case getch
when KEY_MOUSE
  m = getmouse
  winx.addstr "Mouse Position: #{m.x} #{m.y} #{m.z}"
end

不幸的是,在我的系统中,这只会在我点击时报告鼠标移动,所以根据你的curses实现/终端,你可能会失去运气。

如果您不太害怕C,我建议您阅读ncurses C文档。 Ruby的curses库基本上是它的直接翻译。

答案 1 :(得分:0)

根据TLDP护士文档,您需要在鼠标掩码中使用REPORT_MOUSE_POSITION Asa常量。试试这个:

mousemask(REPORT_MOUSE_POSITION|BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED)

这告诉curses将鼠标位置报告为事件。

答案 2 :(得分:0)

请参阅Mouse movement events in NCurses的答案。

鼠标事件报告在很大程度上取决于终端模拟器(在iTerm2中的Mac上,我必须在首选项中“启用xterm鼠标报告”),以及如上所述的TERM设置(我必须像{{1一样启动ruby) }})

此外,在致电TERM=xterm-1003 ruby curses_mouse.rb之前,您必须致电getch并测试KEY_MOUSE。例如,如果您只对鼠标事件感兴趣:

getmouse

另外,将c = getch case c when KEY_MOUSE m = getmouse end 添加到|REPORT_MOUSE_POSITION来电。