2013-10-15 5 views
2

Я хочу постоянно отслеживать мышь, как она движется, или, по крайней мере, каждые 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() нажмите для переключения Source

Возвращает координаты мыши.

Это будет читать и поп данные события мыши из очереди

См КНОПКА *, ALL_MOUSE_EVENTS и REPORT_MOUSE_POSITION константы

REPORT_MOUSE_POSITION кажется, ключ здесь, но я действительно не знаю, как использовать эти константы. getmouse(REPORT_MOUSE_POSITION) не работает. Извините, если это главное nooby, но документации там мало.

ответ

1

Вам нужно добавить REPORT_MOUSE_POSITION к вашему mousemask:

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

или возможно только

mousemask(ALL_MOUSE_EVENTS) 

Проклятия обрабатывает щелчки мыши в том же потоке, как нажатие клавиш. Поэтому вам нужно получить события мыши с помощью 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 в основном является прямым переводом.

+0

Ах, это настоящий позор только по одному клику. Любые идеи о любой работе вообще? Это не важно, просто хотелось немного приправить мое приложение с эффектами зависания :) – Starkers

+0

Я не могу придумать никакого способа обойти это. Возможно, вы сможете прочитать, на каких терминалах поддерживается движение мыши, и только таргетировать их. – Max

+0

Да, ладно :). Использование кода в моем примере и тестирование для nil было бы хорошим тестом, чтобы узнать, поддерживает ли терминал движение мыши. – Starkers

0

Согласно документации медсестер TLDP, вам необходимо использовать REPORT_MOUSE_POSITION Asa constant в маске мыши. Попробуйте следующее:

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

Это говорит проклятиям сообщать о позиции мыши в качестве события.

0

См. Ответ Mouse movement events in NCurses.

Отчет о событиях с мышью в значительной степени зависит от эмулятора терминала (на Mac в iTerm2, мне нужно было «Включить передачу сообщений xterm mouse» в настройках) и в настройках TERM, как описано выше (мне пришлось запустить рубин, например TERM=xterm-1003 ruby curses_mouse.rb)

Кроме того, необходимо позвонить по телефону getch и провести тест на KEY_MOUSE, прежде чем звонить getmouse.Например, если вы заинтересованы только в событиях мыши:

c = getch 
case c 
when KEY_MOUSE 
    m = getmouse 
end 

Кроме того, добавьте |REPORT_MOUSE_POSITION к mousemask вызова.

Смежные вопросы