diff --git a/driver-uinput/README b/driver-uinput/README new file mode 100644 index 0000000..826ce36 --- /dev/null +++ b/driver-uinput/README @@ -0,0 +1,49 @@ +GfxTablet network manager daemon. +Protocol version 1.0 -- quadcore-dev proposed commit. + +This code has been modified from it's original source on +GitHub -- https://github.com/edtrind/GfxTablet-master +Author: bitfire web engineering/GfxTablet -- Richard Hirner +http://rfc2822.github.io/GfxTablet/ + +Modified by quadcore-dev/loopyd - Robert Smith +lupinedreamexpress@gmail.com + +This version provides higher compatability for GIMP (by +converting the output values to larger ones so that the +pressure curve function becomes usable in "Input Settings" +-> "Network Tablet". + +It also contains some eyecandy, a visible pressure bar that +indicates how hard your last stroke was. It does not spam +your terminal window with the events, but will exit with +an error code if there is a problem. + +This code was tested on Ubuntu 14.04 LTS Studio and is +verified working on this platform. + +I am not responsible if my code causes your GfxTablet +daemon to stop functioning, your computer to catch fire, +or your pets to die from said fire, etc. + +--- + +Modified: + + networktablet.c - network tablet daemon + +Added: + + qccolor.h - eyecandy for your terminal + README - this file + +Deleted: + + None + +-- + +Have a wonderful life! + +~quadcore-dev/loopyd +"We write code because we like to." diff --git a/driver-uinput/networktablet.c b/driver-uinput/networktablet.c index e7cde9c..4260e6f 100644 --- a/driver-uinput/networktablet.c +++ b/driver-uinput/networktablet.c @@ -1,3 +1,34 @@ +// networktablet.c -- GfxTablet network manager daemon. +// +// This code has been modified from it's original source on +// GitHub -- https://github.com/edtrind/GfxTablet-master +// Author: bitfire web engineering/GfxTablet -- Richard Hirner +// http://rfc2822.github.io/GfxTablet/ +// +// Modified by quadcore-dev/loopyd - Robert Smith +// lupinedreamexpress@gmail.com +// +// This version provides higher compatability for GIMP (by +// converting the output values to larger ones so that the +// pressure curve function becomes usable in "Input Settings" +// -> "Network Tablet". +// +// It also contains some eyecandy, a visible pressure bar that +// indicates how hard your last stroke was. It does not spam +// your terminal window with the events, but will exit with +// an error code if there is a problem. +// +// This code was tested on Ubuntu 14.04 LTS Studio and is +// verified working on this platform. +// +// I am not responsible if my code causes your GfxTablet +// daemon to stop functioning, your computer to catch fire, +// and your pets to die, etc. +// +// Have a wonderful life! +// +// ~quadcore-dev/loopyd +// "We write code because we like to." #include #include @@ -11,16 +42,15 @@ #include #include #include "protocol.h" +#include "qccolor.h" #define die(str, args...) { \ perror(str); \ exit(EXIT_FAILURE); \ } - int udp_socket; - void init_device(int fd) { struct uinput_user_dev uidev; @@ -93,7 +123,6 @@ void quit(int signal) { close(udp_socket); } - int main(void) { int device; @@ -105,12 +134,24 @@ int main(void) init_device(device); udp_socket = prepare_socket(); - printf("GfxTablet driver (protocol version %u) is ready and listening on 0.0.0.0:%u (UDP)\n" - "Hint: Make sure that this port is not blocked by your firewall.\n", PROTOCOL_VERSION, GFXTABLET_PORT); + cls_screen(); + textcolor(RESET, WHITE, BLACK); + textcolor(BRIGHT, GREEN, BLACK); + printf("GfxTablet driver (protocol version %u) is ready and listening on:\n", PROTOCOL_VERSION); + printf("\t0.0.0.0:%u (UDP)\n\n", GFXTABLET_PORT); + textcolor(BRIGHT, RED, BLACK); + printf("Hint: Make sure that this port is not blocked by your firewall!\n"); + textcolor(BRIGHT, WHITE, BLACK); + printf("FIX applied by quadcore-dev/loopyd\nRobert Smith -- lupinedreamexpress@gmail.com.\n"); + textcolor(DIM, WHITE, BLACK); + printf("For GIMP Pressure curve + eyecandy pressure bar!\n\n"); signal(SIGINT, quit); signal(SIGTERM, quit); + long fixed_pressure = 0L; + short progj = 0L; + while (recv(udp_socket, &ev_pkt, sizeof(ev_pkt), 0) >= 9) { // every packet has at least 9 bytes printf("."); fflush(0); @@ -127,9 +168,20 @@ int main(void) ev_pkt.x = ntohs(ev_pkt.x); ev_pkt.y = ntohs(ev_pkt.y); - ev_pkt.pressure = ntohs(ev_pkt.pressure); - printf("x: %hi, y: %hi, pressure: %hi\n", ev_pkt.x, ev_pkt.y, ev_pkt.pressure); + + // FIX: More precise pressure value for GIMP + fixed_pressure = (long) ((float) (LONG_MAX / SHRT_MAX) * (float) ntohs(ev_pkt.pressure)); + ev_pkt.pressure = fixed_pressure; + // Calculate and draw our pressure bar. + progj = (short) (((float) fixed_pressure / (float) LONG_MAX) * 64.00f); + textcolor(RESET, WHITE, BLACK); + printf("A1 (X): %hi, A2 (Y): %hi, \t A3 (Pressure): ", ev_pkt.x, ev_pkt.y); + progbar(progj, 16); + textcolor(RESET, WHITE, BLACK); + printf(" \r"); + + // Send the events to the app. send_event(device, EV_ABS, ABS_X, ev_pkt.x); send_event(device, EV_ABS, ABS_Y, ev_pkt.y); send_event(device, EV_ABS, ABS_PRESSURE, ev_pkt.pressure); @@ -148,7 +200,8 @@ int main(void) } close(udp_socket); - printf("Removing network tablet from device list\n"); + textcolor(RESET, WHITE, BLACK); + printf("\nRemoving network tablet from device list\n"); ioctl(device, UI_DEV_DESTROY); close(device); diff --git a/driver-uinput/qccolor.h b/driver-uinput/qccolor.h new file mode 100644 index 0000000..ce5d5dc --- /dev/null +++ b/driver-uinput/qccolor.h @@ -0,0 +1,96 @@ +// qccolor.h -- Some color effects for your terminal! +// +// By quadcore-dev/loopyd -- Robert Smith +// lupinedreamexpress@gmail.com +// +// Replacement for conio.h. This module contains some +// eyecandy for your terminal. Including a color set +// subroutine and a neat little progress bar routine! +// +// By quadcore-dev on GitHub +// "We write code because we like to!" +// +#pragma once + +#define RESET 0 +#define BRIGHT 1 +#define DIM 2 +#define UNDERLINE 3 +#define BLINK 4 +#define REVERSE 7 +#define HIDDEN 8 +#define BLACK 0 +#define RED 1 +#define GREEN 2 +#define YELLOW 3 +#define BLUE 4 +#define MAGENTA 5 +#define CYAN 6 +#define WHITE 7 + +void textcolor(int attr, int fg, int bg); +void reset_screen(void); +void progbar(short ipVal, short ipMaxVal); + +// textcolor by QuadCore -- Sets text color at current cursor +// position. +// +// int attr - Color attribute +// int fg - Foreground color +// int bg - Background color +// +void textcolor(int attr, int fg, int bg) +{ + char command[13]; + sprintf(command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40); + printf("%s", command); +} + +// cls_screen by QuadCore -- Clears screen of all text +// +// Nothing. (void) +// +void cls_screen(void) +{ + system("reset"); + return; +} + +// progbar by QuadCore -- Draw a simple progress bar +// +// int ipVal = Current Value. +// int ipMaxVal = Max Value. +// +// Don't pass large values or you'll get a large progress +// bar! Convert them first using a ratio! Also don't +// pass 0 for ipMaxVal or you get divison by zero crash! +// +void progbar(short ipVal, short ipMaxVal) { + + short iProgC = ipVal; + + int ipColor = 0; + if ((float) ((float) ipVal / (float) ipMaxVal) <= 0.25f) { + ipColor = BLUE; + } + if ((float) ((float) ipVal / (float) ipMaxVal) > 0.25f) { + ipColor = GREEN; + } + if ((float) ((float) ipVal / (float) ipMaxVal) > 0.65f) { + ipColor = YELLOW; + } + if ((float) ((float) ipVal / (float) ipMaxVal) > 0.85f) { + ipColor = RED; + } + + iProgC = ipMaxVal - ipVal; + while (iProgC++ <= ipMaxVal && iProgC != 0) { + textcolor (DIM, ipColor, ipColor); + printf (" "); + } + iProgC = ipVal; + while (iProgC++ <= ipMaxVal) { + textcolor (DIM, WHITE, WHITE); + printf ("_"); + } +}