Showing with 157 additions and 133 deletions.
  1. +9 −5 cairo_framework.py
  2. +9 −9 dialogbox.py
  3. +40 −35 tablet_capplet.py
  4. +6 −3 wacom_data.py
  5. +2 −1 wacom_identify.py
  6. +6 −1 wacom_interface.py
  7. +84 −79 wacom_utility.py
  8. +1 −0 wacom_xorg.py
14 changes: 9 additions & 5 deletions cairo_framework.py
@@ -1,14 +1,18 @@
from __future__ import division
from __future__ import print_function
# Some cairo magic, thanks goes to Michael Urman for tutorials

import gtk
from builtins import str
from past.utils import old_div
from gi.repository import Gtk
import cairo
import os


class DrawingArea(gtk.DrawingArea):
__gsignals__ = {"expose-event": "override"}
class DrawingArea(Gtk.DrawingArea):
__gsignals__ = {"draw": "override"}

def do_expose_event(self, event):
def do_draw(self, event):
cr = self.window.cairo_create()
cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
cr.clip()
Expand Down Expand Up @@ -50,7 +54,7 @@ def draw(self, cr, width, height):
for button in self.button_map:
cr.set_source_rgba(1,1,1,1)
choffset = len(str(button.Number)) * 6
cr.move_to(int((button.X1+button.X2)/2)-choffset,int((button.Y1+button.Y2)/2)+6)
cr.move_to(int(old_div((button.X1+button.X2),2))-choffset,int(old_div((button.Y1+button.Y2),2))+6)
cr.show_text (str(button.Number))
cr.set_source_rgba(1.0, 1.0, 1.0,0.4)
cr.rectangle(button.X1, button.Y1, button.X2-button.X1, button.Y2-button.Y1)
Expand Down
18 changes: 9 additions & 9 deletions dialogbox.py
@@ -1,15 +1,15 @@
# Dialog Box Class

# Dialog Box
import gtk
import gtk.glade
from builtins import object
from gi.repository import Gtk

class DialogBox:
class DialogBox(object):
def __init__(self,parent,wTree):
# Set the Glade file
self.wTree = wTree
# Load pointer for dialog box
self.window = self.wTree.get_widget("dialogbox")
self.window = self.wTree.get_object("dialogbox")
self.window.set_title("Wacom Control Panel")
self.window.set_transient_for(parent)
self.window.set_destroy_with_parent(True)
Expand All @@ -19,18 +19,18 @@ def __init__(self,parent,wTree):
self.window.set_skip_pager_hint(1)

#self.window.present()
self.label = self.wTree.get_widget("dialoglbl")
self.label = self.wTree.get_object("dialoglbl")
#self.label.set_text(message)
self.window.connect("destroy",self.callbackYes)
self.window.connect("key-press-event", self.keydown)
self.button2 = self.wTree.get_widget("dialogyes")
self.button2 = self.wTree.get_object("dialogyes")
self.button2.connect("button-press-event",self.callbackYes)
#gtk.main()
#Gtk.main()

def callbackYes(self,widget=None,event=None):
self.window.hide()
try:
gtk.main_quit()
Gtk.main_quit()
except:
pass

Expand All @@ -51,6 +51,6 @@ def NewMessage(self,message, title):
self.window.set_title(title)
self.label.set_markup(message)
self.window.present()
gtk.main()
Gtk.main()
return

75 changes: 40 additions & 35 deletions tablet_capplet.py
@@ -1,3 +1,5 @@
from __future__ import division
from __future__ import print_function
############################################################################
##
## Copyright (C) 2007 Alexander Macdonald. All rights reserved.
Expand All @@ -11,11 +13,14 @@
##
############################################################################

import pygtk
pygtk.require('2.0')
import gtk
import gtk.glade
import gobject
from builtins import str
from builtins import range
from builtins import object
from past.utils import old_div
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GObject
import cairo
import subprocess
import math
Expand Down Expand Up @@ -55,9 +60,9 @@ def SetMode(devicename, m):
output = subprocess.Popen(command)


class PressureCurveWidget(gtk.DrawingArea):
class PressureCurveWidget(Gtk.DrawingArea):
def __init__(self):
gtk.DrawingArea.__init__(self)
GObject.GObject.__init__(self)

self.Points = [0,100,100,0]
self.Pressure = 0.0
Expand All @@ -76,7 +81,7 @@ def __init__(self):
self.DraggingCP2 = False
self.DraggingCF = False

self.set_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_MOTION_MASK | gtk.gdk.BUTTON1_MOTION_MASK | gtk.gdk.BUTTON2_MOTION_MASK | gtk.gdk.BUTTON3_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK)
self.set_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.BUTTON_MOTION_MASK | Gdk.EventMask.BUTTON1_MOTION_MASK | Gdk.EventMask.BUTTON2_MOTION_MASK | Gdk.EventMask.BUTTON3_MOTION_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK)

self.connect("configure-event", self.ConfigureEvent)
self.connect("expose-event", self.ExposeEvent)
Expand All @@ -99,7 +104,7 @@ def SetDevice(self, name):
self.Points = [points[0], 100.0 - points[1], points[2], 100.0 - points[3]]

def Update(self):
if not isinstance(self.window, gtk.gdk.Window):
if not isinstance(self.window, Gdk.Window):
return
self.window.invalidate_region(self.window.get_clip_region(), True)

Expand All @@ -117,7 +122,7 @@ def ConfigureEvent(self, widget, event):

def MotionEvent(self, widget, event):
pos = event.get_coords()
pos = (pos[0] / self.Scale[0], pos[1] / self.Scale[1])
pos = (old_div(pos[0], self.Scale[0]), old_div(pos[1], self.Scale[1]))

if not self.Points:
return
Expand All @@ -131,7 +136,7 @@ def MotionEvent(self, widget, event):
self.Points[3] = self.ClampValue(pos[1])

elif self.DraggingCF:
self.ClickForce = int(self.ClampValue(pos[0]) / (100.0 / 19)) * (100.0 / 19)
self.ClickForce = int(old_div(self.ClampValue(pos[0]), (100.0 / 19))) * (100.0 / 19)

def ButtonPress(self, widget, event):
if not self.Points:
Expand All @@ -141,7 +146,7 @@ def ButtonPress(self, widget, event):
self.DragFinished()
else:
pos = event.get_coords()
pos = (pos[0] / self.Scale[0], pos[1] / self.Scale[1])
pos = (old_div(pos[0], self.Scale[0]), old_div(pos[1], self.Scale[1]))

if (self.Points[0] - self.ControlPointDiameter) < pos[0] < (self.Points[0] + self.ControlPointDiameter):
if (self.Points[1] - self.ControlPointDiameter) < pos[1] < (self.Points[1] + self.ControlPointDiameter):
Expand All @@ -168,11 +173,11 @@ def DragFinished(self):
elif self.DraggingCP2:
self.Points[0] = self.Points[3]
self.Points[1] = self.Points[2]
print (int(self.Points[0]), int(100.5 - self.Points[1]), int(self.Points[2]), int(100.5 - self.Points[3]))
print((int(self.Points[0]), int(100.5 - self.Points[1]), int(self.Points[2]), int(100.5 - self.Points[3])))

SetPressCurve(self.DeviceName, [int(self.Points[0]+.5), int(100.5 - self.Points[1]), int(self.Points[2]+.5), int(100.5 - self.Points[3])])
if self.ClickForce:
SetClickForce(self.DeviceName, int(self.ClickForce / (100.0 / 19.0)) + 1)
SetClickForce(self.DeviceName, int(old_div(self.ClickForce, (100.0 / 19.0))) + 1)
self.DraggingCP1 = self.DraggingCP2 = self.DraggingCF = False

def ExposeEvent(self, widget, event):
Expand Down Expand Up @@ -280,9 +285,9 @@ def ExposeEvent(self, widget, event):
cr.restore()


class DrawingTestWidget(gtk.DrawingArea):
class DrawingTestWidget(Gtk.DrawingArea):
def __init__(self):
gtk.DrawingArea.__init__(self)
GObject.GObject.__init__(self)

self.Device = 0
self.Radius = 5.0
Expand All @@ -291,7 +296,7 @@ def __init__(self):
self.Raster = None
self.RasterCr = None

self.set_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_MOTION_MASK | gtk.gdk.BUTTON1_MOTION_MASK | gtk.gdk.BUTTON2_MOTION_MASK | gtk.gdk.BUTTON3_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK)
self.set_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.BUTTON_MOTION_MASK | Gdk.EventMask.BUTTON1_MOTION_MASK | Gdk.EventMask.BUTTON2_MOTION_MASK | Gdk.EventMask.BUTTON3_MOTION_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK)

self.connect("configure-event", self.ConfigureEvent)
self.connect("expose-event", self.ExposeEvent)
Expand All @@ -309,9 +314,9 @@ def ConfigureEvent(self, widget, event):
self.RasterCr.fill()

def GetPressure(self):
dev = gtk.gdk.devices_list()[self.Device]
dev = Gdk.devices_list()[self.Device]
state = dev.get_state(self.window)
return dev.get_axis(state[0], gtk.gdk.AXIS_PRESSURE)
return dev.get_axis(state[0], Gdk.AXIS_PRESSURE)

def MotionEvent(self, widget, event):
if self.Drawing:
Expand All @@ -326,7 +331,7 @@ def MotionEvent(self, widget, event):
self.RasterCr.fill_preserve()
self.RasterCr.set_source_rgba(0.5, 0.2, p, 0.5)
self.RasterCr.stroke()
reg = gtk.gdk.Region()
reg = Gdk.Region()
reg.union_with_rect((int(pos[0] - r - 2), int(pos[1] - r - 2), int(2 * (r + 2)), int(2 * (r + 2))))
self.window.invalidate_region(reg, False)

Expand All @@ -346,7 +351,7 @@ def ExposeEvent(self, widget, event):
cr.stroke()


class GraphicsTabletApplet:
class GraphicsTabletApplet(object):
def __init__(self, window, wTree, Device):
self.Active = 0 # Control
self.InLoop = 0 # Flag
Expand All @@ -366,7 +371,7 @@ def __init__(self, window, wTree, Device):
self.DrawingArea.show()
self.DrawingTestFrame.add(self.DrawingArea)

devices = gtk.gdk.devices_list()
devices = Gdk.devices_list()

for i in range(0,len(devices)):
item = devices[i].name
Expand All @@ -376,37 +381,37 @@ def __init__(self, window, wTree, Device):
self.DeviceName = Device

self.DrawingArea.Device = self.Device
self.DeviceName = gtk.gdk.devices_list()[self.Device].name
self.DeviceName = Gdk.devices_list()[self.Device].name
self.Curve.SetDevice(self.DeviceName)
self.UpdateDeviceMode()

self.DeviceModeCombo.connect("changed", self.ModeChanged)

self.DrawingArea.set_extension_events(gtk.gdk.EXTENSION_EVENTS_ALL)
self.DrawingArea.set_extension_events(Gdk.EXTENSION_EVENTS_ALL)

def Run(self):
self.Active = 1
self.InLoop = 1
self.DeviceName = gtk.gdk.devices_list()[self.Device].name
self.DeviceName = Gdk.devices_list()[self.Device].name
self.UpdateDeviceMode()
gobject.timeout_add(20, self.Update)
GObject.timeout_add(20, self.Update)

def Stop(self):
self.Active = 0

def GetPressure(self):
dev = gtk.gdk.devices_list()[self.Device]
if not isinstance(self.DrawingArea.window, gtk.gdk.Window):
dev = Gdk.devices_list()[self.Device]
if not isinstance(self.DrawingArea.window, Gdk.Window):
return 0.0, 0.0
state = dev.get_state(self.DrawingArea.window)
return dev.get_axis(state[0], gtk.gdk.AXIS_PRESSURE)
return dev.get_axis(state[0], Gdk.AXIS_PRESSURE)

def GetTilt(self):
dev = gtk.gdk.devices_list()[self.Device]
dev = Gdk.devices_list()[self.Device]
state = dev.get_state(self.MainWindow.window)
try:
x = float(dev.get_axis(state[0], gtk.gdk.AXIS_XTILT))
y = float(dev.get_axis(state[0], gtk.gdk.AXIS_YTILT))
x = float(dev.get_axis(state[0], Gdk.AXIS_XTILT))
y = float(dev.get_axis(state[0], Gdk.AXIS_YTILT))
return x, y
except:
return 0.0, 0.0
Expand All @@ -428,7 +433,7 @@ def UpdateDeviceMode(self):
def DeviceSelected(self, widget):
self.Device = widget.get_active()
self.DrawingArea.Device = self.Device
self.DeviceName = gtk.gdk.devices_list()[self.Device].name
self.DeviceName = Gdk.devices_list()[self.Device].name
self.Curve.SetDevice(self.DeviceName)
self.UpdateDeviceMode()

Expand All @@ -443,8 +448,8 @@ def Update(self):

t = self.GetTilt()

self.XTilt.set_adjustment(gtk.Adjustment(t[0], -1.0, 1.0))
self.YTilt.set_adjustment(gtk.Adjustment(t[1], -1.0, 1.0))
self.XTilt.set_adjustment(Gtk.Adjustment(t[0], -1.0, 1.0))
self.YTilt.set_adjustment(Gtk.Adjustment(t[1], -1.0, 1.0))
if self.Active:
return True
else:
Expand Down
9 changes: 6 additions & 3 deletions wacom_data.py
@@ -1,8 +1,10 @@
from __future__ import print_function
# Loads settings on various models of tablets
from builtins import object
import xml.dom.minidom


class TabletIdentities:
class TabletIdentities(object):
def __init__(self):
self.Tablets = []
self.Tablets.append(Tablet("MODEL_PP_0405", "Wacom PenPartner", 0x00))
Expand Down Expand Up @@ -72,12 +74,13 @@ def __init__(self):
self.Tablets.append(Tablet("CTH-460K", "Wacom BambooPT 2FG 4x5", 0xD6))
self.Tablets.append(Tablet("CTL-471", "Wacom Bamboo One S", 0x300))
self.Tablets.append(Tablet("CTL-470", "Wacom Bamboo Connect Pen", 0xDD))
self.Tablets.append(Tablet("CTH-680", "Intuos PTM", 0x303))

# self.Tablets.append(
# tablet("PTK-540WL", "Wacom Intuos4 Wireless Bluetooth", 0x00)) # Stub, this needs special support


class Tablet:
class Tablet(object):
def __init__(self, Model, Name, ProductId):
self.Name = Name
self.Model = Model
Expand Down Expand Up @@ -109,7 +112,7 @@ def __init__(self, Model, Name, ProductId):
print("Error loading " + "images/pad/" + self.Model + ".xml")


class Button:
class Button(object):
def __init__(self, Name, Number, Callsign, X1, Y1, X2, Y2):
self.Name = Name
self.Number = Number
Expand Down
3 changes: 2 additions & 1 deletion wacom_identify.py
@@ -1,9 +1,10 @@
# Identifies wacom tablet model
from builtins import object
from wacom_data import TabletIdentities
import os


class TabletIdClass:
class TabletIdClass(object):
def __init__(self, cloak=""):
self.TabletIds = TabletIdentities()
self.tablets = []
Expand Down
7 changes: 6 additions & 1 deletion wacom_interface.py
@@ -1,10 +1,15 @@
from __future__ import print_function
# xsetwacom interface
from future import standard_library
standard_library.install_aliases()
from builtins import str
from builtins import object
import os
from copy import copy
from tablet_capplet import GetPressCurve, GetClickForce


class XSetWacom:
class XSetWacom(object):
def listInterfaces(self):
# List all input devices
devlist = os.popen("xsetwacom --list devices").readlines()
Expand Down