Как получить события от мыши?

Здравствуйте.
Интересует вопрос, как в Лазарусе получать события от мыши, если мышь находится вне моего окна? Например, нажатие/отпускание кнопки мыши и получение позиции курсора. По аналогии с WM_MOUSEMOVE, WM_LBUTTONDOWN и т.д.
Это нужно для того, чтобы написать программу фиксации щелчка, так как мне нужна такая функция, а найти такую программу под линукс я не могу.

0
MacLeod - 8 Октябрь, 2014 - 15:18
Изображение пользователя MacLeod.

fpGUI пробовали? На крайняк, наверное, можно и с самими иксами работать (X11, Xlib), думаю, модули есть.
З.Ы. Я не спец по Lazarus или Free Pascal, более детально не скажу.

0
Kubuntovich - 8 Октябрь, 2014 - 15:47

В windows я умею это делать, а в линуксе вообще не знаю никаких API. Знаю, что каждая оболочка держится на иксах, но как с ними взаимодействовать не знаю - вот и спрашиваю. Предполагаю, что у иксов тоже есть какие-то API-функции а-ля WinAPI. Но не могу про это ничего найти.

+2
MacLeod - 8 Октябрь, 2014 - 16:44
Изображение пользователя MacLeod.

В линухе для разработчика вообще все проще, чем в винде =)
Ибо опен сурс. А, значит, для использования любой опенсурсной либы достаточно подключить заголовок. Если рассматривать на уровне дистрибутива, просто достаточно заглянуть в /usr/includes, содержащий заголовки.
Например, такой сишный код:
#include <X11/Xlib-xcb.h>
будет означать подключение заголовочного файла /usr/includes/X11/Xlib-xcb.h, а при динамической линковке использовать /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 либу.
В дистрибутивах *ubuntu, как правило, заголовки лежат в других пакетах со сходим названием и суффиксом "-dev". Поэтому для использования либы в своей программе, либо при сборке чего-то, нужно доустановить нужные dev-пакеты.
Пример:

и
в котором лежат заголовочные файлы .h и файлы для статической линковки .a.
Для других языков нужно использовать биндинги, вропперы, пакеты, компоненты...
Навскидку, у Lazarus есть что-то подобное http://wiki.lazarus.freepascal.org/X11
0
Kubuntovich - 9 Октябрь, 2014 - 10:28

С языком С я плохо знаком. В винде я начинал его изучать и на нем писать, но мне он показался каким-то не логичным и я остался на Delphi. По-этому, вариант для Lazarus был бы для меня идеальным решением.
Итак, я посмотрел код по последней ссылке. Этот код создает пустое окно, которое закрывается при нажатии любой клавиши. Из кода я понял, что в цикле while true do окно принимает какие-то события. Это некий аналог оконной процедуры винды (уж извиняйте, что сравниваю). Переменная е это событие, которое пришло в данный момент. If e._type=KeyPress then это аналог WM_KEYDOWN. Но как узнать код нажатой клавиши и саму клавишу по коду? У винды есть wparam, содержащий код клавиши. Потом, продав душу сатане, юзаем API и узнаём раскладку клавиатуры и по ней имя клавиши. А здесь это как происходит? Где брать код клавиши? У меня проблема, в основном, именно с этим. Какие существуют события и за что они отвечают. У винды есть MSDN, где всё написано. А у иксов есть что-то подобное? Expose, как я понял, это событие перерисовки окна. А например, какое событие приходит, когда водишь мышь над окном или жмешь на ее кнопки. Где это гуглить?
И по теме - что надо сделать, чтобы окно принимало события мыши, когда мышь находится вне окна? В инете нагуглил, что есть функции типа XGrabPointer, XGrabButton. Но как их применять - не понятно.

0
MacLeod - 9 Октябрь, 2014 - 14:02
Изображение пользователя MacLeod.

Выше я пытался немного прояснить, как тут все работает. Основа системы - это сишные либы, которые уже используются биндингами/компонентами других языков.
Поэтому и сказал, что перечень функций либы можно увидеть в заголовочных файлах.
А справочник по функциям для другого языка следует искать в документации на компоненты или найти книжку вроде этой:
Программирование в X Window средствами Free Pascal
В частности, про клаву и мышь - http://rus-linux.net/MyLDP/BOOKS/ProgrX/xwin-1-3.shtml#1

0
Гость - 9 Октябрь, 2014 - 16:06

Про либы я понял. Мне нужен был справочник, какие функции что делают. Предпоследняя ссылка как-раз то, что нужно. Почитал про XSelectInput() и про мышь - понял, как ловить события мыши на своем окне. Но про XGrabButton возник вопрос.
Если я правильно понял, если я вызову XGrabButton(), то в мое окно будут приходить события мыши из окна, указанного в четвертом аргументе при действии кнопки, указанной во втором аргументе XGrabButton(...,button,...,window,...blabla)? Если так, то как задать аргументы, чтобы события кнопки приходили из всех окон?

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры