From 70ba2dbf0f49a4f8d1caa2bbed97c8c2358c6fb6 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Mon, 3 Nov 2008 00:49:34 +0100 Subject: Initial version: adding some files Signed-off-by: Henrik Rydberg --- Makefile | 57 ++++++++++++ debian/README.Debian | 9 ++ debian/changelog | 5 ++ debian/compat | 1 + debian/control | 14 +++ debian/copyright | 27 ++++++ debian/dirs | 3 + debian/rules | 46 ++++++++++ fdi/11-multitouch.fdi | 40 +++++++++ src/dbus-abi.h | 34 +++++++ src/glib-abi.h | 19 ++++ src/hal-abi.h | 28 ++++++ src/multitouch.c | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/test.c | 7 ++ 14 files changed, 531 insertions(+) create mode 100644 Makefile create mode 100644 debian/README.Debian create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/dirs create mode 100755 debian/rules create mode 100644 fdi/11-multitouch.fdi create mode 100644 src/dbus-abi.h create mode 100644 src/glib-abi.h create mode 100644 src/hal-abi.h create mode 100644 src/multitouch.c create mode 100644 src/test.c 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 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 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 +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 + +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 + 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 @@ + + + + + + + + + + + + + + keyboard_backlight + Applesmc Keyboard Backlight + 256 + custom + /sys/class/leds/smc::kbd_backlight + hald-addon-generic-kbd-backlight + + + + + + 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 + * + * Based on addon-generic-backlight.c: + * Copyright (C) 2008 Danny Kukawka + * + * 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 +#include +#include +#include +#include +#include +#include + +#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, + " \n" + " \n" + " \n" + " \n" + " \n" + " \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 +#include + +int main(int argc,char* argv[]) +{ + return 0; +} -- cgit v1.2.3