aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2008-11-03 00:49:34 +0100
committerHenrik Rydberg <rydberg@euromail.se>2008-11-03 00:49:34 +0100
commit70ba2dbf0f49a4f8d1caa2bbed97c8c2358c6fb6 (patch)
treee1697049bc32fd47b1e639969b4ff752689c92a8
downloadxorg-input-kobomultitouch-70ba2dbf0f49a4f8d1caa2bbed97c8c2358c6fb6.tar.gz
xorg-input-kobomultitouch-70ba2dbf0f49a4f8d1caa2bbed97c8c2358c6fb6.tar.bz2
xorg-input-kobomultitouch-70ba2dbf0f49a4f8d1caa2bbed97c8c2358c6fb6.zip
Initial version: adding some files
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r--Makefile57
-rw-r--r--debian/README.Debian9
-rw-r--r--debian/changelog5
-rw-r--r--debian/compat1
-rw-r--r--debian/control14
-rw-r--r--debian/copyright27
-rw-r--r--debian/dirs3
-rwxr-xr-xdebian/rules46
-rw-r--r--fdi/11-multitouch.fdi40
-rw-r--r--src/dbus-abi.h34
-rw-r--r--src/glib-abi.h19
-rw-r--r--src/hal-abi.h28
-rw-r--r--src/multitouch.c241
-rw-r--r--src/test.c7
14 files changed, 531 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c387266
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,57 @@
+LIBRARY = multitouch.so
+FDIS = 11-multitouch.fdi
+MODULES = src
+
+o_src = multitouch
+
+TARGETS = $(addsuffix /test,$(MODULES))
+
+OBJECTS = $(addsuffix .o,\
+ $(foreach mod,$(MODULES),\
+ $(addprefix $(mod)/,$(o_$(mod)))))
+
+TBIN = $(addprefix bin/,$(TARGETS))
+TLIB = $(addprefix obj/,$(LIBRARY))
+TOBJ = $(addprefix obj/,$(addsuffix .o,$(TARGETS)))
+TFDI = $(addprefix fdi/,$(FDIS))
+OBJS = $(addprefix obj/,$(OBJECTS))
+LIBS = #-lhal -ldbus-glib-1
+
+DLIB = usr/lib/xorg/modules/input
+DFDI = usr/share/hal/fdi/policy/20thirdparty
+
+INCLUDE = -I.
+OPTS = -O3
+
+.PHONY: all clean
+.PRECIOUS: obj/%.o
+
+all: $(OBJS) $(TLIB) $(TOBJ) $(TBIN)
+
+bin/%: obj/%.o
+ @mkdir -p $(@D)
+ gcc $(INCLUDE) $(OPTS) $< $(TLIB) $(LIBS) -o $@
+
+$(TLIB): $(OBJS)
+ @rm -f $(TLIB)
+ gcc -shared $(OBJS) -Wl,-soname -Wl,$(LIBRARY) -o $@
+
+obj/%.o: %.c
+ @mkdir -p $(@D)
+ gcc -c $< -o $@
+
+obj/%.o: %.cc
+ @mkdir -p $(@D)
+ gcc -c $< -o $@
+
+clean:
+ rm -rf bin obj
+
+distclean: clean
+ rm -rf debian/*.log debian/files
+
+install: $(TLIB) $(TFDI)
+ install -d "$(DESTDIR)/$(DLIB)"
+ install -d "$(DESTDIR)/$(DFDI)"
+ install -m 755 $(TBIN) "$(DESTDIR)/$(DLIB)"
+ install -m 644 $(TFDI) "$(DESTDIR)/$(DFDI)"
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..e1e27bf
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,9 @@
+multitouch Xorg driver
+
+* Install the debian package
+
+* Restart X
+
+Enjoy!
+
+Henrik Rydberg <rydberg@euromail.se>
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..b6ef16b
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+multitouch (0.1) unstable; urgency=low
+
+ * Add multitouch Xorg input driver
+
+ -- Henrik Rydberg <rydberg@euromail.se> Mon, 03 Nov 2008 00:47:37 +0100
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..c74798c
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,14 @@
+Source: multitouch
+Section: misc
+Priority: optional
+Maintainer: Henrik Rydberg <rydberg@euromail.se>
+Build-Depends: debhelper (>= 5)
+Standards-Version: 3.7.2
+Homepage: http://web.comhem.se/rydberg/Bits/
+
+Package: multitouch
+Architecture: any
+Depends: bash (>> 1.99)
+Description: Multitouch X input driver
+ This package is a multitouch Xorg input driver.
+
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..bf1dcd2
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,27 @@
+Source URL: http://web.comhem.se/rydberg/Bits/
+
+Upstream Author: Henrik Rydberg <rydberg@euromail.se>
+
+Copyright:
+ Copyright (C) 2008 Henrik Rydberg (rydberg@euromail.se)
+
+License:
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Packaging:
+ Copyright (C) 2008 by Henrik Rydberg <rydberg@euromail.se>
+ released under GPL 2
+
diff --git a/debian/dirs b/debian/dirs
new file mode 100644
index 0000000..6611862
--- /dev/null
+++ b/debian/dirs
@@ -0,0 +1,3 @@
+usr/share/hal/fdi/information/10freedesktop
+usr/lib/hal
+
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..90568c9
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,46 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+build-arch:
+ dh_testdir
+ $(MAKE)
+
+build-indep:
+
+build: build-arch build-indep
+
+install:
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+ $(MAKE) DESTDIR=$(CURDIR)/debian/hal-applesmc install
+
+binary-arch: build-arch install
+ dh_testdir
+ dh_testroot
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary-indep: build-indep
+
+binary: binary-arch binary-indep
+
+clean:
+ dh_testdir
+ dh_testroot
+ $(MAKE) clean
+ dh_clean
+
+.PHONY: build-arch build-indep build install binary-arch binary-indep binary clean
+
diff --git a/fdi/11-multitouch.fdi b/fdi/11-multitouch.fdi
new file mode 100644
index 0000000..1c82a22
--- /dev/null
+++ b/fdi/11-multitouch.fdi
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deviceinfo version="0.2">
+
+ <device>
+ <match key="platform.id" contains="applesmc">
+ <spawn udi="/org/freedesktop/Hal/devices/applesmc_keyboard_backlight"/>
+<!--
+ <spawn udi="/org/freedesktop/Hal/devices/applesmc_light_sensor"/>
+-->
+ </match>
+ </device>
+
+ <device>
+ <match key="info.udi" string="/org/freedesktop/Hal/devices/applesmc_keyboard_backlight">
+ <append key="info.capabilities" type="strlist">keyboard_backlight</append>
+ <merge key="info.product" type="string">Applesmc Keyboard Backlight</merge>
+ <merge key="keyboard_backlight.num_levels" type="int">256</merge>
+ <merge key="keyboard_backlight.access_method" type="string">custom</merge>
+ <merge key="linux.sysfs_path" type="string">/sys/class/leds/smc::kbd_backlight</merge>
+ <append key="info.addons" type="strlist">hald-addon-generic-kbd-backlight</append>
+ </match>
+ </device>
+
+<!--
+ <device>
+ <match key="info.udi" string="/org/freedesktop/Hal/devices/applesmc_light_sensor">
+ <append key="info.capabilities" type="strlist">light_sensor</append>
+ <merge key="info.product" type="string">Applesmc Light Sensor</merge>
+ <merge key="light_sensor.num_sensors" type="int">1</merge>
+ <merge key="light_sensor.num_levels" type="int">64</merge>
+ <append key="light_sensor.sensor_locations" type="strlist">left</append>
+ <merge key="light_sensor.access_method" type="string">custom</merge>
+ <merge key="linux.sysfs_path" type="string">/sys/devices/platform/applesmc.768/light</merge>
+ <append key="info.addons" type="strlist">hald-addon-generic-light-sensor</append>
+ </match>
+ </device>
+-->
+
+</deviceinfo>
diff --git a/src/dbus-abi.h b/src/dbus-abi.h
new file mode 100644
index 0000000..ed406f1
--- /dev/null
+++ b/src/dbus-abi.h
@@ -0,0 +1,34 @@
+/*
+ * DBUS ABI
+ *
+ * The following is all dbus information needed in order to compile
+ * a hald-addon.
+ */
+
+/* Structure declarations */
+struct DBusMessage;
+
+/* Allocate 32 bytes for the error structure. */
+struct DBusError {
+ char bytes[32];
+};
+
+/* Define DBus arguments types */
+const int DBUS_TYPE_INVALID;
+const int DBUS_TYPE_INT32 = 'i';
+const int DBUS_TYPE_ARRAY = 'a';
+
+/* Define DBus handler results */
+typedef enum {
+ DBUS_HANDLER_RESULT_HANDLED,
+ DBUS_HANDLER_RESULT_NOT_YET_HANDLED,
+ DBUS_HANDLER_RESULT_NEED_MEMORY
+} DBusHandlerResult;
+
+/* Function declarations */
+struct DBusMessage *
+dbus_message_new_error(struct DBusMessage *reply_to, const char *error_name,
+ const char *error_message);
+struct DBusMessage *
+dbus_message_new_method_return(struct DBusMessage *method_call);
+
diff --git a/src/glib-abi.h b/src/glib-abi.h
new file mode 100644
index 0000000..62b85d5
--- /dev/null
+++ b/src/glib-abi.h
@@ -0,0 +1,19 @@
+/*
+ * GLIB ABI
+ *
+ * The following is all glib information needed in order to compile
+ * a hald-addon.
+ */
+
+/* logical values */
+const int TRUE = 1;
+const int FALSE;
+
+/* Structure declarations */
+struct GMainContext;
+struct GMainLoop;
+
+/* Function declarations */
+struct GMainLoop *g_main_loop_new(struct GMainContext *context, int is_running);
+void g_main_loop_run(struct GMainLoop *loop);
+
diff --git a/src/hal-abi.h b/src/hal-abi.h
new file mode 100644
index 0000000..277580f
--- /dev/null
+++ b/src/hal-abi.h
@@ -0,0 +1,28 @@
+/*
+ * HAL ABI
+ *
+ * The following is all hal information needed in order to compile
+ * a hald-addon.
+ */
+
+/* Structure declarations */
+struct LibHalContext;
+struct DBusConnection;
+
+/* Simple error handling */
+#define setup_logger()
+#define eprintf(...) (fprintf(stderr, __VA_ARGS__), fprintf(stderr, "\n"))
+#define WARNING(...) eprintf("addon-warning: " __VA_ARGS__)
+#define DEBUG(...) eprintf("addon-debug: " __VA_ARGS__)
+#define ERROR(...) eprintf("addon-error: " __VA_ARGS__)
+#define HAL_WARNING(x) WARNING x
+#define HAL_DEBUG(x) DEBUG x
+#define HAL_ERROR(x) ERROR x
+
+/* Function declarations */
+struct LibHalContext *
+libhal_ctx_init_direct(struct DBusError *error);
+
+struct DBusConnection *
+libhal_ctx_get_dbus_connection(struct LibHalContext *ctx);
+
diff --git a/src/multitouch.c b/src/multitouch.c
new file mode 100644
index 0000000..537ab69
--- /dev/null
+++ b/src/multitouch.c
@@ -0,0 +1,241 @@
+/***************************************************************************
+ *
+ * addon-generic-kbd-backlight.c:
+ * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
+ *
+ * Based on addon-generic-backlight.c:
+ * Copyright (C) 2008 Danny Kukawka <danny.kukawka@web.de>
+ *
+ * Licensed under the Academic Free License version 2.1
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ **************************************************************************/
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "glib-abi.h"
+#include "dbus-abi.h"
+#include "hal-abi.h"
+
+#define HAL_PROPERTY "org.freedesktop.Hal.Device.KeyboardBacklight"
+
+static const char prop_name[] = HAL_PROPERTY;
+static const char prop_invalid[] = HAL_PROPERTY ".Invalid";
+static const char prop_set[] = "SetBrightness";
+static const char prop_get[] = "GetBrightness";
+
+static struct GMainLoop *main_loop;
+static struct LibHalContext *halctx;
+static struct DBusConnection *conn;
+
+static char sysfs_path[512];
+static int levels;
+
+/**
+ * Get keyboard backlight level
+ *
+ * Tries to read from the specified sysfs device, and if successful,
+ * updates the internal keyboard backlight state. Warns if the device
+ * cannot be opened or be read from. Always returns the last succesful
+ * read.
+ */
+static int get_kbd_backlight()
+{
+ static int level;
+ int fd;
+ char buf[64];
+
+ fd = open(sysfs_path, O_RDONLY);
+ if (fd < 0) {
+ HAL_WARNING(("Could not open '%s'", sysfs_path));
+ return level;
+ }
+
+ memset(buf, 0, sizeof(buf));
+ if (read(fd, buf, sizeof(buf)) < 0)
+ HAL_WARNING(("Could not read from '%s'", sysfs_path));
+ else
+ level = atoi(buf);
+
+ close(fd);
+ return level;
+}
+
+/**
+ * Set keyboard backlight level
+ *
+ * Warns if the device cannot be opened or be written to.
+ * Returns bytes written on success, negative value on failure.
+ */
+static int set_kbd_backlight(int level)
+{
+ int fd, ret;
+ char buf[64];
+
+ sprintf(buf, "%d", level);
+
+ fd = open(sysfs_path, O_WRONLY);
+ if (fd < 0) {
+ HAL_WARNING(("Could not open '%s'", sysfs_path));
+ return -1;
+ }
+
+ ret = write(fd, buf, strlen(buf));
+ if (ret < 0)
+ HAL_WARNING(("Could not write '%s' to '%s'", buf, sysfs_path));
+
+ close(fd);
+ return ret;
+}
+
+/* DBus set keyboard backlight level */
+static struct DBusMessage *dbus_get_kbd_backlight(struct DBusMessage *msg)
+{
+ struct DBusError err;
+ struct DBusMessage *reply;
+ int level;
+
+ dbus_error_init(&err);
+ if (!dbus_message_get_args(msg, &err, DBUS_TYPE_INVALID))
+ return dbus_message_new_error(msg, prop_invalid,
+ "Invalid message");
+
+ level = get_kbd_backlight();
+
+ reply = dbus_message_new_method_return(msg);
+ if (reply)
+ dbus_message_append_args(reply, DBUS_TYPE_INT32, &level,
+ DBUS_TYPE_INVALID);
+
+ return reply;
+}
+
+/* DBus set keyboard backlight level */
+static struct DBusMessage *dbus_set_kbd_backlight(struct DBusMessage *msg)
+{
+ struct DBusError err;
+ int level;
+
+ dbus_error_init(&err);
+ if (!dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &level,
+ DBUS_TYPE_INVALID))
+ return dbus_message_new_error(msg, prop_invalid,
+ "Brightness level argument missing");
+
+ if (level < 0 || level > levels - 1)
+ return dbus_message_new_error(msg, prop_invalid,
+ "Brightness level is invalid");
+
+ set_kbd_backlight(level);
+
+ return dbus_message_new_method_return(msg);
+}
+
+/* DBus filter function */
+static DBusHandlerResult filter_function(struct DBusConnection *connection,
+ struct DBusMessage *message,
+ void *userdata)
+{
+ struct DBusMessage *reply = NULL;
+
+ if (dbus_message_is_method_call(message, prop_name, prop_get))
+ reply = dbus_get_kbd_backlight(message);
+ else if (dbus_message_is_method_call(message, prop_name, prop_set))
+ reply = dbus_set_kbd_backlight(message);
+
+ if (reply) {
+ dbus_connection_send(connection, reply, NULL);
+ dbus_message_unref(reply);
+ }
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+int main(int argc, char *argv[])
+{
+ struct DBusError err;
+ struct stat fs;
+
+ char *udi = getenv("UDI");
+ char *path = getenv("HAL_PROP_LINUX_SYSFS_PATH");
+ char *level_str = getenv("HAL_PROP_KEYBOARD_BACKLIGHT_NUM_LEVELS");
+
+ setup_logger();
+
+ if (udi == NULL) {
+ HAL_ERROR(("No device specified"));
+ return -2;
+ }
+ if (path == NULL) {
+ HAL_ERROR(("No sysfs path specified"));
+ return -2;
+ }
+ if (level_str == NULL) {
+ HAL_ERROR(("No keyboard_backlight.num_levels defined"));
+ return -2;
+ }
+
+ levels = atoi(level_str);
+ snprintf(sysfs_path, sizeof(sysfs_path), "%s/brightness", path);
+
+ HAL_DEBUG(("udi='%s', path='%s', levels='%d'", udi, path, levels));
+
+ if (stat(sysfs_path, &fs)) {
+ HAL_ERROR(("The sysfs property path does not exist"));
+ return -2;
+ }
+
+ dbus_error_init(&err);
+ halctx = libhal_ctx_init_direct(&err);
+
+ if (halctx == NULL) {
+ HAL_ERROR(("Cannot connect to hald"));
+ return -3;
+ }
+
+ conn = libhal_ctx_get_dbus_connection(halctx);
+ dbus_connection_setup_with_g_main(conn, NULL);
+
+ dbus_connection_add_filter(conn, filter_function, NULL, NULL);
+
+ if (!libhal_device_claim_interface(halctx, udi, prop_name,
+ " <method name=\"GetBrightness\">\n"
+ " <arg name=\"brightness_value\" direction=\"out\" type=\"i\"/>\n"
+ " </method>\n"
+ " <method name=\"SetBrightness\">\n"
+ " <arg name=\"brightness_value\" direction=\"in\" type=\"i\"/>\n"
+ " </method>\n",
+ &err)) {
+ HAL_ERROR(("Cannot claim interface '" HAL_PROPERTY "'"));
+ return -4;
+ }
+
+ dbus_error_init(&err);
+ if (!libhal_device_addon_is_ready(halctx, udi, &err))
+ return -4;
+
+ main_loop = g_main_loop_new(NULL, FALSE);
+ g_main_loop_run(main_loop);
+
+ return 0;
+}
+
diff --git a/src/test.c b/src/test.c
new file mode 100644
index 0000000..20f35c6
--- /dev/null
+++ b/src/test.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include <time.h>
+
+int main(int argc,char* argv[])
+{
+ return 0;
+}