2010-02-25 1 views
1

В настоящее время я реализую программу в X11 с использованием C. Я получил программу для обработки событий вправо и влево, однако при среднем щелчке возникает проблема. Кажется, мой оконный менеджер (Gnome on Ubuntu 9.10) думает, что лучше, если вместо одного щелчка одним щелчком мыши у меня должна быть серия других кликов. Я предполагаю, что это связано с тем, что средний клик используется для копирования-вставки. Я действительно не хочу этого, хотя, поскольку я делаю полноэкранное приложение с OpenGL, и такие вещи не подходят. Есть ли способ, чтобы средняя кнопка мыши работала как любая другая кнопка?Как отключить автоматические средние мыши события мыши в X (Xlib)?

Мой текущий код выглядит примерно так:

switch(currentXEvent.type) { 
    case ButtonPress: 
     switch(currentXEvent.xbutton.button) { 
      case 1: 
       leftMouseButton(currentXEvent.xbutton.x, currentXEvent.xbutton.y); 
       break; 
      case 2: 
       middleMouseButton(currentXEvent.xbutton.x, currentXEvent.xbutton.y); 
       break; 
     } 
} 

Моя трудность заключается в том, что он ведет себя как leftMouseButton() была нажата. Есть идеи?

ответ

1

Для этого вам необходимо захватить элементы управления с сервера. Затем оконный менеджер не входит в цепочку обработки. Самый удобный способ - использовать libSDL. Он создает подходящий контекст для полноэкранного приложения OpenGL и его легче обрабатывать, чем Xlib + GLX.

+1

Спасибо за ваш ответ. Я бы предпочел не добавлять другую библиотеку, учитывая, что большая часть кода для работы с X уже написана. Я хотел бы знать, как захватить элементы управления. Ранее я звонил: XGrabKeyboard (дисплей, окно, истина, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabPointer (отображение, окно, true, маски, GrabModeAsync, GrabModeAsync, окно, None, CurrentTime); Есть ли что-то еще, что мне нужно будет добавить? – Warpspace

+0

Выглядит хорошо. Я не вижу ничего другого, просто убедитесь, что ваш event_mask установлен правильно. В сомнениях, вы можете найти дальнейшие намеки, посмотрев код libSDL. Я не занимался схваткой, так что это вся помощь, которую я могу предоставить. p.s .: Если вам нравится мой ответ, вы должны дать ему надпись. Вы новичок в stackoverflow, поэтому я говорю вам, что голосование - это жизненно важная вещь, которая делает работу stackoverflow. – ypnos

+0

Это не позволит мне перейти (я слишком новый), но спасибо за ответ. Вы правы, это работает почти так, как у меня есть, и код libSDL будет иметь остальное, если мне это нужно. Благодарю. – Warpspace