GTK-3 Touchscreen events



tut14-touchscreen-events.png

Figure 1: File downloader

The example below demonstrates filtering events for a specific device, in this case a touch screen we then capture touch begin update and end events.

To my knowledge gestures are not supports so you will need to count the begins to determine the number of fingers and handle the updates to determine whats happening.

#!/usr/bin/env python
import sys
from gi.repository import Gtk, GdkX11, Gdk


class gui():

    def __init__(self):
	self.touch_count = 0
	self.window = Gtk.Window()
	self.window.realize()
	self.window.resize(300, 300)
	self.window.set_resizable(True)
	self.window.set_reallocate_redraws(True)
	self.window.set_title("GTK3 touch events")
	self.window.connect('delete_event', Gtk.main_quit)
	self.window.connect('destroy', lambda quit: Gtk.main_quit())

	self.drawing_area = Gtk.DrawingArea()
	#add the type of events we are interested in retrieving, skip this step and your events will never fire
	self.drawing_area.add_events(Gdk.EventMask.TOUCH_MASK)
	self.drawing_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
	self.drawing_area.connect('button_press_event', self.touched)
	self.drawing_area.connect('touch-event', self.touched)
	self.drawing_area.set_double_buffered(False)

	self.window.add(self.drawing_area)
	self.window.show_all()

    def touched(self, widget, ev):
	# detect the type of device we can filter events using this
	# if we dont a touch event and mouse event can be triggered from one touch for example
	if ev.get_source_device().get_source() == Gdk.InputSource.TOUCHPAD:
	    print('touchpad device')
	if ev.get_source_device().get_source() == Gdk.InputSource.MOUSE:
	    print('mouse device')
	if ev.get_source_device().get_source() == Gdk.InputSource.TOUCHSCREEN:
	    print('touchscreen device')

	    #from what i can tell there is no support for gestures so you would need another library
	    #or to handle this yourself
	    if ev.touch.type == Gdk.EventType.TOUCH_BEGIN:
		self.touch_count += 1
		print('start %d %s %s' % (self.touch_count, ev.touch.x,ev.touch.y))
	    if ev.touch.type == Gdk.EventType.TOUCH_UPDATE:
		print('UPDATE %d %s %s' % (self.touch_count, ev.touch.x,ev.touch.y))
	    if ev.touch.type == Gdk.EventType.TOUCH_END:
		self.touch_count -= 1
		print('end %d %s %s' % (self.touch_count, ev.touch.x,ev.touch.y))
	    if ev.touch.type == Gdk.EventType.TOUCH_CANCEL:
		self.touch_count -= 1
		print('cancelled')

def main():
    g = gui()
    Gtk.main()

if __name__ == '__main__':
    main()

Comments