summaryrefslogtreecommitdiffstats
path: root/redhat/kdebase
diff options
context:
space:
mode:
authorFrancois Andriot <francois.andriot@free.fr>2012-02-12 18:04:26 +0100
committerFrancois Andriot <francois.andriot@free.fr>2012-02-12 18:04:26 +0100
commite52e723d608adb3227f17cc07ca39e0a84002f89 (patch)
treea79969fc00451ac3b1f8efd3825e429301bf71f3 /redhat/kdebase
parent8b9d093ac76fd18674c4593b203f11d75aa12887 (diff)
downloadtde-packaging-e52e723d608adb3227f17cc07ca39e0a84002f89.tar.gz
tde-packaging-e52e723d608adb3227f17cc07ca39e0a84002f89.zip
[RHEL/Fedora] some fixes to kdelibs, kdebase, kdemultimedia
Diffstat (limited to 'redhat/kdebase')
-rw-r--r--redhat/kdebase/kdebase-3.5.13-fix_kdm_cpu_usage.patch47
-rw-r--r--redhat/kdebase/kdebase-3.5.13-replicate_led_status_on_virtual_keyboard.patch95
-rw-r--r--redhat/kdebase/kdebase-3.5.13-tsak_keyboard_hotplug.patch641
-rw-r--r--redhat/kdebase/trinity-kdebase-3.5.13.spec26
4 files changed, 804 insertions, 5 deletions
diff --git a/redhat/kdebase/kdebase-3.5.13-fix_kdm_cpu_usage.patch b/redhat/kdebase/kdebase-3.5.13-fix_kdm_cpu_usage.patch
new file mode 100644
index 000000000..1a80c00f1
--- /dev/null
+++ b/redhat/kdebase/kdebase-3.5.13-fix_kdm_cpu_usage.patch
@@ -0,0 +1,47 @@
+commit 1e2983ad0107fb1d26e3e9931528701f30632c6d
+Author: Timothy Pearson <kb9vqf@pearsoncomputing.net>
+Date: 1326856834 -0600
+
+ Fix kdm_greet high CPU usage
+ Clean up a few build warnings
+
+diff --git a/kdm/kfrontend/kgreeter.cpp b/kdm/kfrontend/kgreeter.cpp
+index 9b974cc..5877cb6 100644
+--- a/kdm/kfrontend/kgreeter.cpp
++++ b/kdm/kfrontend/kgreeter.cpp
+@@ -273,6 +273,9 @@ void KGreeter::handleInputPipe(void) {
+ readbuf[numread] = 0;
+ readbuf[2047] = 0;
+ inputcommand += readbuf;
++ if (!tqApp->hasPendingEvents()) {
++ usleep(500);
++ }
+ tqApp->processEvents();
+ }
+ if (closingDown) {
+@@ -508,11 +511,11 @@ KGreeter::insertUsers(int limit_users)
+ int count = 0;
+ for (setpwent(); (ps = getpwent()) != 0;) {
+ if (*ps->pw_dir && *ps->pw_shell &&
+- (ps->pw_uid >= (unsigned)_lowUserId ||
+- !ps->pw_uid && _showRoot) &&
+- ps->pw_uid <= (unsigned)_highUserId &&
+- !noUsers.hasUser( ps->pw_name ) &&
+- !noUsers.hasGroup( ps->pw_gid ))
++ ((ps->pw_uid >= (unsigned)_lowUserId) ||
++ ((!ps->pw_uid) && _showRoot)) &&
++ (ps->pw_uid <= (unsigned)_highUserId) &&
++ (!noUsers.hasUser( ps->pw_name )) &&
++ (!noUsers.hasGroup( ps->pw_gid )))
+ {
+ TQString username( TQFile::decodeName( ps->pw_name ) );
+ if (!dupes.find( username )) {
+@@ -574,7 +577,7 @@ KGreeter::insertUsers(int limit_users)
+ for (setpwent(); (ps = getpwent()) != 0;) {
+ if (*ps->pw_dir && *ps->pw_shell &&
+ (ps->pw_uid >= (unsigned)_lowUserId ||
+- !ps->pw_uid && _showRoot) &&
++ ((!ps->pw_uid) && _showRoot)) &&
+ ps->pw_uid <= (unsigned)_highUserId &&
+ (users.hasUser( ps->pw_name ) ||
+ users.hasGroup( ps->pw_gid )))
diff --git a/redhat/kdebase/kdebase-3.5.13-replicate_led_status_on_virtual_keyboard.patch b/redhat/kdebase/kdebase-3.5.13-replicate_led_status_on_virtual_keyboard.patch
new file mode 100644
index 000000000..1d3f73ceb
--- /dev/null
+++ b/redhat/kdebase/kdebase-3.5.13-replicate_led_status_on_virtual_keyboard.patch
@@ -0,0 +1,95 @@
+commit 8468d9bd5c66fe402acbc06f728b12ea996848de
+Author: Timothy Pearson <kb9vqf@pearsoncomputing.net>
+Date: 1327049889 -0600
+
+ Replicate LED status from virtual keyboards to physical keyboards
+ Fix keyboard attribute cloning
+ This commit closes Bug 561
+
+diff --git a/tsak/main.cpp b/tsak/main.cpp
+index df485a0..26aad00 100644
+--- a/tsak/main.cpp
++++ b/tsak/main.cpp
+@@ -126,22 +126,23 @@ static void copy_features(int devin, int devout)
+ for(i=0;i<EV_MAX;++i) {
+ if (bit_set(i, evtypes)) {
+ switch(i) {
+- case EV_KEY: op = UI_SET_KEYBIT; break;
+- case EV_REL: op = UI_SET_RELBIT; break;
+- case EV_ABS: op = UI_SET_ABSBIT; break;
+- case EV_MSC: op = UI_SET_MSCBIT; break;
+- case EV_LED: op = UI_SET_LEDBIT; break;
+- case EV_SND: op = UI_SET_SNDBIT; break;
+- case EV_SW: op = UI_SET_SWBIT; break;
+- default: op = -1;
++ case EV_KEY: op = UI_SET_KEYBIT; break;
++ case EV_REL: op = UI_SET_RELBIT; break;
++ case EV_ABS: op = UI_SET_ABSBIT; break;
++ case EV_MSC: op = UI_SET_MSCBIT; break;
++ case EV_LED: op = UI_SET_LEDBIT; break;
++ case EV_SND: op = UI_SET_SNDBIT; break;
++ case EV_SW: op = UI_SET_SWBIT; break;
++ default: op = -1;
++ }
+ }
+- }
+- if (op == -1) continue;
+- ioctl(devout, UI_SET_EVBIT, i);
+- memset(codes,0,sizeof(codes));
+- if (ioctl(devin, EVIOCGBIT(i, sizeof(codes)), codes) < 0) return;
+- for(code=0;code<KEY_MAX;code++) {
+- if (bit_set(code, codes)) ioctl(devout, op, code);
++ if (op == -1) continue;
++ ioctl(devout, UI_SET_EVBIT, i);
++ memset(codes,0,sizeof(codes));
++ if (ioctl(devin, EVIOCGBIT(i, sizeof(codes)), codes) >= 0) {
++ for(code=0;code<KEY_MAX;code++) {
++ if (bit_set(code, codes)) ioctl(devout, op, code);
++ }
+ }
+ }
+ }
+@@ -342,6 +343,7 @@ int main (int argc, char *argv[])
+ {
+ struct input_event ev[64];
+ struct input_event event;
++ struct input_event revev;
+ struct uinput_user_dev devinfo={0};
+ int devout[MAX_KEYBOARDS], rd, i, value, size = sizeof (struct input_event);
+ char name[256] = "Unknown";
+@@ -416,9 +418,9 @@ int main (int argc, char *argv[])
+ fprintf(stderr, "Reading from keyboard: (%s)\n", name);
+
+ // Create filtered virtual output device
+- devout[current_keyboard]=open("/dev/misc/uinput",O_WRONLY|O_NONBLOCK);
++ devout[current_keyboard]=open("/dev/misc/uinput",O_RDWR|O_NONBLOCK);
+ if (devout[current_keyboard]<0) {
+- devout[current_keyboard]=open("/dev/uinput",O_WRONLY|O_NONBLOCK);
++ devout[current_keyboard]=open("/dev/uinput",O_RDWR|O_NONBLOCK);
+ if (devout[current_keyboard]<0) {
+ perror("open(\"/dev/misc/uinput\")");
+ }
+@@ -483,6 +485,14 @@ int main (int argc, char *argv[])
+ fprintf(stderr, "Read failed.\n");
+ break;
+ }
++
++ // Replicate LED events from the virtual keyboard to the physical keyboard
++ int rrd = read(devout[current_keyboard], &revev, size);
++ if (rrd >= size) {
++ if (revev.type == EV_LED) {
++ write(keyboard_fds[current_keyboard], &revev, sizeof(revev));
++ }
++ }
+
+ value = ev[0].value;
+
+@@ -506,7 +516,7 @@ int main (int argc, char *argv[])
+ }
+ }
+
+- if (hide_event == false) {
++ if ((hide_event == false) && (ev[0].type != EV_LED) && (ev[1].type != EV_LED)) {
+ // Pass the event on...
+ event = ev[0];
+ write(devout[current_keyboard], &event, sizeof event);
diff --git a/redhat/kdebase/kdebase-3.5.13-tsak_keyboard_hotplug.patch b/redhat/kdebase/kdebase-3.5.13-tsak_keyboard_hotplug.patch
new file mode 100644
index 000000000..8c8ab415f
--- /dev/null
+++ b/redhat/kdebase/kdebase-3.5.13-tsak_keyboard_hotplug.patch
@@ -0,0 +1,641 @@
+commit 5f413b26ebaab8a6478427e4125bda628058ff85
+Author: Timothy Pearson <kb9vqf@pearsoncomputing.net>
+Date: 1327015159 -0600
+
+ Add keyboard hotplug (add/remove) support to tsak
+ This closes Bug 587
+ Fix warning in kompmgr
+
+diff --git a/tsak/CMakeLists.txt b/tsak/CMakeLists.txt
+index 6aa5b49..4490636 100644
+--- a/tsak/CMakeLists.txt
++++ b/tsak/CMakeLists.txt
+@@ -23,5 +23,6 @@ link_directories(
+
+ tde_add_executable( tsak
+ SOURCES main.cpp
++ LINK udev
+ DESTINATION ${BIN_INSTALL_DIR}
+ )
+diff --git a/tsak/main.cpp b/tsak/main.cpp
+index 050d6c0..df485a0 100644
+--- a/tsak/main.cpp
++++ b/tsak/main.cpp
+@@ -1,8 +1,8 @@
+ /*
+ Copyright 2010 Adam Marchetti
+-Copyright 2011 Timothy Pearson <kb9vqf@pearsoncomputing.net>
++Copyright 2011-2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
+
+-This file is part of tsak.
++This file is part of tsak, the TDE Secure Attention Key daemon
+
+ tsak is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+@@ -35,9 +35,15 @@ License along with tsak. If not, see http://www.gnu.org/licenses/.
+ #include <sys/time.h>
+ #include <termios.h>
+ #include <signal.h>
++#include <libudev.h>
++#include <libgen.h>
+
+ #define FIFO_DIR "/tmp/ksocket-global"
+ #define FIFO_FILE_OUT "/tmp/ksocket-global/tsak"
++#define FIFO_LOCKFILE_OUT "/tmp/ksocket-global/tsak.lock"
++
++#define MAX_KEYBOARDS 64
++#define MAX_INPUT_NODE 128
+
+ #define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))
+
+@@ -46,9 +52,18 @@ typedef unsigned char byte;
+ bool mPipeOpen_out = false;
+ int mPipe_fd_out = -1;
+
++int mPipe_lockfd_out = -1;
++
++char filename[32];
++char key_bitmask[(KEY_MAX + 7) / 8];
++
+ struct sigaction usr_action;
+ sigset_t block_mask;
+
++int keyboard_fd_num;
++int keyboard_fds[MAX_KEYBOARDS];
++int child_pids[MAX_KEYBOARDS];
++
+ const char *keycode[256] =
+ {
+ "", "<esc>", "1", "2", "3", "4", "5", "6", "7", "8",
+@@ -79,6 +94,26 @@ int bit_set(size_t i, const byte* a)
+ return a[i/CHAR_BIT] & (1 << i%CHAR_BIT);
+ }
+
++// --------------------------------------------------------------------------------------
++// Useful function from Stack Overflow
++// http://stackoverflow.com/questions/874134/find-if-string-endswith-another-string-in-c
++// --------------------------------------------------------------------------------------
++/* returns 1 iff str ends with suffix */
++int str_ends_with(const char * str, const char * suffix) {
++
++ if( str == NULL || suffix == NULL )
++ return 0;
++
++ size_t str_len = strlen(str);
++ size_t suffix_len = strlen(suffix);
++
++ if(suffix_len > str_len)
++ return 0;
++
++ return 0 == strncmp( str + str_len - suffix_len, suffix, suffix_len );
++}
++// --------------------------------------------------------------------------------------
++
+ /* Assign features (supported axes and keys) of the physical input device (devin)
+ * to the virtual input device (devout) */
+ static void copy_features(int devin, int devout)
+@@ -111,26 +146,40 @@ static void copy_features(int devin, int devout)
+ }
+ }
+
+-int find_keyboard() {
++int find_keyboards() {
+ int i, j;
+ int fd;
+- char filename[32];
+- char key_bitmask[(KEY_MAX + 7) / 8];
++ char name[256] = "Unknown";
++
++ keyboard_fd_num = 0;
++ for (i=0; i<MAX_KEYBOARDS; i++) {
++ keyboard_fds[i] = 0;
++ }
+
+- for (i=0; i<32; i++) {
++ for (i=0; i<MAX_INPUT_NODE; i++) {
+ snprintf(filename,sizeof(filename), "/dev/input/event%d", i);
+-
++
+ fd = open(filename, O_RDWR|O_SYNC);
+ ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask);
+-
+- /* We assume that anything that has an alphabetic key in the
+- QWERTYUIOP range in it is the main keyboard. */
+- for (j = KEY_Q; j <= KEY_P; j++) {
+- if (TestBit(j, key_bitmask))
+- return fd;
++
++ // Ensure that we do not detect our own tsak faked keyboards
++ ioctl (fd, EVIOCGNAME (sizeof (name)), name);
++ if (str_ends_with(name, "+tsak") == 0) {
++ /* We assume that anything that has an alphabetic key in the
++ QWERTYUIOP range in it is the main keyboard. */
++ for (j = KEY_Q; j <= KEY_P; j++) {
++ if (TestBit(j, key_bitmask)) {
++ keyboard_fds[keyboard_fd_num] = fd;
++ }
++ }
++ }
++
++ if (keyboard_fds[keyboard_fd_num] == 0) {
++ close (fd);
++ }
++ else {
++ keyboard_fd_num++;
+ }
+-
+- close (fd);
+ }
+ return 0;
+ }
+@@ -144,6 +193,12 @@ void tearDownPipe()
+ }
+ }
+
++void tearDownLockingPipe()
++{
++ close(mPipe_lockfd_out);
++ unlink(FIFO_LOCKFILE_OUT);
++}
++
+ bool setFileLock(int fd, bool close_on_failure)
+ {
+ struct flock fl;
+@@ -154,8 +209,8 @@ bool setFileLock(int fd, bool close_on_failure)
+ fl.l_len = 1;
+
+ // Set the exclusive file lock
+- if (fcntl(mPipe_fd_out, F_SETLK, &fl) == -1) {
+- close(mPipe_fd_out);
++ if (fcntl(fd, F_SETLK, &fl) == -1) {
++ close(fd);
+ return false;
+ }
+
+@@ -171,7 +226,7 @@ bool checkFileLock()
+ fl.l_whence = SEEK_SET;
+ fl.l_len = 0;
+
+- int fd = open(FIFO_FILE_OUT, O_RDWR | O_NONBLOCK);
++ int fd = open(FIFO_LOCKFILE_OUT, O_RDWR | O_NONBLOCK);
+ fcntl(fd, F_GETLK, &fl); /* Overwrites lock structure with preventors. */
+
+ if (fd > -1) {
+@@ -202,6 +257,71 @@ bool setupPipe()
+ return setFileLock(mPipe_fd_out, true);
+ }
+
++bool setupLockingPipe()
++{
++ /* Create the FIFOs if they do not exist */
++ umask(0);
++ mkdir(FIFO_DIR,0644);
++
++ mknod(FIFO_LOCKFILE_OUT, S_IFIFO|0600, 0);
++ chmod(FIFO_LOCKFILE_OUT, 0600);
++
++ mPipe_lockfd_out = open(FIFO_LOCKFILE_OUT, O_RDWR | O_NONBLOCK);
++ if (mPipe_lockfd_out > -1) {
++ // Set the exclusive file lock
++ return setFileLock(mPipe_lockfd_out, true);
++ }
++
++ return false;
++}
++
++void broadcast_sak()
++{
++ // Let anyone listening to our interface know that an SAK keypress was received
++ // I highly doubt there are more than 255 VTs active at once...
++ int i;
++ for (i=0;i<255;i++) {
++ write(mPipe_fd_out, "SAK\n\r", 6);
++ }
++}
++
++void restart_tsak()
++{
++ int i;
++
++ fprintf(stderr, "Forcibly terminating...\n");
++
++ // Close down all child processes
++ for (i=0; i<MAX_KEYBOARDS; i++) {
++ if (child_pids[i] != 0) {
++ kill(child_pids[i], SIGKILL);
++ }
++ }
++
++ // Wait for process termination
++ sleep(1);
++
++ // Release all exclusive keyboard locks
++ for (int current_keyboard=0;current_keyboard<keyboard_fd_num;current_keyboard++) {
++ if(ioctl(keyboard_fds[current_keyboard], EVIOCGRAB, 0) < 0) {
++ fprintf(stderr, "Failed to release exclusive input device lock");
++ }
++ close(keyboard_fds[current_keyboard]);
++ }
++
++#if 1
++ // Restart now
++ // Note that the execl function never returns
++ char me[2048];
++ int chars = readlink("/proc/self/exe", me, sizeof(me));
++ me[chars] = 0;
++ me[2047] = 0;
++ execl(me, basename(me), (char*)NULL);
++#else
++ _exit(0);
++#endif
++}
++
+ class PipeHandler
+ {
+ public:
+@@ -215,7 +335,7 @@ PipeHandler::PipeHandler()
+
+ PipeHandler::~PipeHandler()
+ {
+- tearDownPipe();
++ tearDownLockingPipe();
+ }
+
+ int main (int argc, char *argv[])
+@@ -223,13 +343,19 @@ int main (int argc, char *argv[])
+ struct input_event ev[64];
+ struct input_event event;
+ struct uinput_user_dev devinfo={0};
+- int fd, devout, rd, value, size = sizeof (struct input_event);
++ int devout[MAX_KEYBOARDS], rd, i, value, size = sizeof (struct input_event);
+ char name[256] = "Unknown";
+ bool ctrl_down = false;
+ bool alt_down = false;
+ bool hide_event = false;
+ bool established = false;
+ bool testrun = false;
++ int current_keyboard;
++ bool can_proceed;
++
++ for (i=0; i<MAX_KEYBOARDS; i++) {
++ child_pids[i] = 0;
++ }
+
+ if (argc == 2) {
+ if (strcmp(argv[1], "checkactive") == 0) {
+@@ -239,7 +365,11 @@ int main (int argc, char *argv[])
+
+ // Check for existing file locks
+ if (!checkFileLock()) {
+- fprintf(stderr, "Another instance of this program is already running\n");
++ fprintf(stderr, "Another instance of this program is already running [1]\n");
++ return 8;
++ }
++ if (!setupLockingPipe()) {
++ fprintf(stderr, "Another instance of this program is already running [2]\n");
+ return 8;
+ }
+
+@@ -256,125 +386,227 @@ int main (int argc, char *argv[])
+ return 5;
+ }
+
+- // Open Device
+- fd = find_keyboard();
+- if (fd == -1) {
+- printf ("Could not find your keyboard!\n");
++ // Find keyboards
++ find_keyboards();
++ if (keyboard_fd_num == 0) {
++ printf ("Could not find any usable keyboard(s)!\n");
++ // Make sure everyone knows we physically can't detect a SAK
++ // Before we do this we broadcast one so that active dialogs are updated appropriately
++ // Also, we keep watching for a keyboard to be added via a forked child process...
++ broadcast_sak();
+ if (established)
+ sleep(1);
+- else
+- return 4;
++ else {
++ int i=fork();
++ if (i<0) return 12; // fork failed
++ if (i>0) {
++ return 4;
++ }
++ sleep(1);
++ restart_tsak();
++ }
+ }
+ else {
+- // Print Device Name
+- ioctl (fd, EVIOCGNAME (sizeof (name)), name);
+- fprintf(stderr, "Reading From : (%s)\n", name);
+-
+- // Create filtered virtual output device
+- devout=open("/dev/misc/uinput",O_WRONLY|O_NONBLOCK);
+- if (devout<0) {
+- perror("open(\"/dev/misc/uinput\")");
+- devout=open("/dev/uinput",O_WRONLY|O_NONBLOCK);
+- }
+- if (devout<0) {
+- fprintf(stderr,"Unable to open /dev/uinput or /dev/misc/uinput (char device 10:223).\nPossible causes:\n 1) Device node does not exist\n 2) Kernel not compiled with evdev [INPUT_EVDEV] and uinput [INPUT_UINPUT] user level driver support\n 3) Permission denied.\n");
+- perror("open(\"/dev/uinput\")");
+- if (established)
+- sleep(1);
+- else
+- return 3;
+- }
+- else {
+- if(ioctl(fd, EVIOCGRAB, 2) < 0) {
+- close(fd);
+- fprintf(stderr, "Failed to grab exclusive input device lock");
++ fprintf(stderr, "Found %d keyboard(s)\n", keyboard_fd_num);
++
++ can_proceed = true;
++ for (current_keyboard=0;current_keyboard<keyboard_fd_num;current_keyboard++) {
++ // Print Device Name
++ ioctl (keyboard_fds[current_keyboard], EVIOCGNAME (sizeof (name)), name);
++ fprintf(stderr, "Reading from keyboard: (%s)\n", name);
++
++ // Create filtered virtual output device
++ devout[current_keyboard]=open("/dev/misc/uinput",O_WRONLY|O_NONBLOCK);
++ if (devout[current_keyboard]<0) {
++ devout[current_keyboard]=open("/dev/uinput",O_WRONLY|O_NONBLOCK);
++ if (devout[current_keyboard]<0) {
++ perror("open(\"/dev/misc/uinput\")");
++ }
++ }
++ if (devout[current_keyboard]<0) {
++ can_proceed = false;
++ fprintf(stderr, "Unable to open /dev/uinput or /dev/misc/uinput (char device 10:223).\nPossible causes:\n 1) Device node does not exist\n 2) Kernel not compiled with evdev [INPUT_EVDEV] and uinput [INPUT_UINPUT] user level driver support\n 3) Permission denied.\n");
++ perror("open(\"/dev/uinput\")");
+ if (established)
+ sleep(1);
+ else
+- return 1;
++ return 3;
+ }
+- else {
+- ioctl(fd, EVIOCGNAME(UINPUT_MAX_NAME_SIZE), devinfo.name);
+- strncat(devinfo.name, "+tsak", UINPUT_MAX_NAME_SIZE-1);
+- fprintf(stderr, "%s\n", devinfo.name);
+- ioctl(fd, EVIOCGID, &devinfo.id);
+-
+- copy_features(fd, devout);
+- write(devout,&devinfo,sizeof(devinfo));
+- if (ioctl(devout,UI_DEV_CREATE)<0) {
+- fprintf(stderr,"Unable to create input device with UI_DEV_CREATE\n");
++ }
++
++ if (can_proceed == true) {
++ for (current_keyboard=0;current_keyboard<keyboard_fd_num;current_keyboard++) {
++ if(ioctl(keyboard_fds[current_keyboard], EVIOCGRAB, 2) < 0) {
++ close(keyboard_fds[current_keyboard]);
++ fprintf(stderr, "Failed to grab exclusive input device lock");
+ if (established)
+ sleep(1);
+ else
+- return 2;
++ return 1;
+ }
+ else {
+- fprintf(stderr,"Device created.\n");
+-
+- if (established == false) {
+- tearDownPipe();
+- int i=fork();
+- if (i<0) return 9; // fork failed
+- if (i>0) {
+- // close parent process
+- close(mPipe_fd_out);
+- return 0;
+- }
+- setupPipe();
++ ioctl(keyboard_fds[current_keyboard], EVIOCGNAME(UINPUT_MAX_NAME_SIZE), devinfo.name);
++ strncat(devinfo.name, "+tsak", UINPUT_MAX_NAME_SIZE-1);
++ fprintf(stderr, "%s\n", devinfo.name);
++ ioctl(keyboard_fds[current_keyboard], EVIOCGID, &devinfo.id);
++
++ copy_features(keyboard_fds[current_keyboard], devout[current_keyboard]);
++ write(devout[current_keyboard],&devinfo,sizeof(devinfo));
++ if (ioctl(devout[current_keyboard],UI_DEV_CREATE)<0) {
++ fprintf(stderr, "Unable to create input device with UI_DEV_CREATE\n");
++ if (established)
++ sleep(1);
++ else
++ return 2;
+ }
+-
+- established = true;
+-
+- if (testrun == true) {
+- return 0;
+- }
+-
+- while (1) {
+- if ((rd = read (fd, ev, size * 2)) < size) {
+- fprintf(stderr,"Read failed.\n");
+- break;
+- }
+-
+- value = ev[0].value;
+-
+- if (value != ' ' && ev[1].value == 0 && ev[1].type == 1){ // Read the key release event
+- if (keycode[(ev[1].code)]) {
+- if (strcmp(keycode[(ev[1].code)], "<control>") == 0) ctrl_down = false;
+- if (strcmp(keycode[(ev[1].code)], "<alt>") == 0) alt_down = false;
++ else {
++ fprintf(stderr, "Device created.\n");
++
++ if (established == false) {
++ int i=fork();
++ if (i<0) return 9; // fork failed
++ if (i>0) {
++ child_pids[current_keyboard] = i;
++ continue;
+ }
++ setupLockingPipe();
+ }
+- if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Read the key press event
+- if (keycode[(ev[1].code)]) {
+- if (strcmp(keycode[(ev[1].code)], "<control>") == 0) ctrl_down = true;
+- if (strcmp(keycode[(ev[1].code)], "<alt>") == 0) alt_down = true;
+- }
++
++ established = true;
++
++ if (testrun == true) {
++ return 0;
+ }
+
+- hide_event = false;
+- if (keycode[(ev[1].code)]) {
+- if (alt_down && ctrl_down && (strcmp(keycode[(ev[1].code)], "<del>") == 0)) {
+- hide_event = true;
++ while (1) {
++ if ((rd = read (keyboard_fds[current_keyboard], ev, size * 2)) < size) {
++ fprintf(stderr, "Read failed.\n");
++ break;
++ }
++
++ value = ev[0].value;
++
++ if (value != ' ' && ev[1].value == 0 && ev[1].type == 1){ // Read the key release event
++ if (keycode[(ev[1].code)]) {
++ if (strcmp(keycode[(ev[1].code)], "<control>") == 0) ctrl_down = false;
++ if (strcmp(keycode[(ev[1].code)], "<alt>") == 0) alt_down = false;
++ }
++ }
++ if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Read the key press event
++ if (keycode[(ev[1].code)]) {
++ if (strcmp(keycode[(ev[1].code)], "<control>") == 0) ctrl_down = true;
++ if (strcmp(keycode[(ev[1].code)], "<alt>") == 0) alt_down = true;
++ }
++ }
++
++ hide_event = false;
++ if (keycode[(ev[1].code)]) {
++ if (alt_down && ctrl_down && (strcmp(keycode[(ev[1].code)], "<del>") == 0)) {
++ hide_event = true;
++ }
++ }
++
++ if (hide_event == false) {
++ // Pass the event on...
++ event = ev[0];
++ write(devout[current_keyboard], &event, sizeof event);
++ event = ev[1];
++ write(devout[current_keyboard], &event, sizeof event);
++ }
++ if (hide_event == true) {
++ // Let anyone listening to our interface know that an SAK keypress was received
++ broadcast_sak();
+ }
+ }
++ }
++ }
++ }
++
++ // fork udev monitor process
++ int i=fork();
++ if (i<0) return 10; // fork failed
++ if (i>0) {
++ // Terminate parent
++ return 0;
++ }
++
++ // Prevent multiple process instances from starting
++ setupLockingPipe();
++
++ // Wait a little bit so that udev hotplug can stabilize before we start monitoring
++ sleep(1);
++
++ fprintf(stderr, "Hotplug monitoring process started\n");
++
++ // Monitor for hotplugged keyboards
++ int j;
++ int hotplug_fd;
++ bool is_new_keyboard;
++ struct udev *udev;
++ struct udev_device *dev;
++ struct udev_monitor *mon;
++
++ // Create the udev object
++ udev = udev_new();
++ if (!udev) {
++ fprintf(stderr, "Cannot connect to udev interface\n");
++ return 11;
++ }
++
++ // Set up a udev monitor to monitor input devices
++ mon = udev_monitor_new_from_netlink(udev, "udev");
++ udev_monitor_filter_add_match_subsystem_devtype(mon, "input", NULL);
++ udev_monitor_enable_receiving(mon);
++
++ while (1) {
++ // Watch for input from the monitoring process
++ dev = udev_monitor_receive_device(mon);
++ if (dev) {
++ // If a keyboard was removed we need to restart...
++ if (strcmp(udev_device_get_action(dev), "remove") == 0) {
++ udev_device_unref(dev);
++ udev_unref(udev);
++ restart_tsak();
++ }
++
++ is_new_keyboard = false;
++ snprintf(filename,sizeof(filename), "%s", udev_device_get_devnode(dev));
++ udev_device_unref(dev);
++
++ // Print name of keyboard
++ hotplug_fd = open(filename, O_RDWR|O_SYNC);
++ ioctl(hotplug_fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask);
+
+- if (hide_event == false) {
+- // Pass the event on...
+- event = ev[0];
+- write(devout, &event, sizeof event);
+- event = ev[1];
+- write(devout, &event, sizeof event);
+- }
+- if (hide_event == true) {
+- // Let anyone listening to our interface know that an SAK keypress was received
+- // I highly doubt there are more than 255 VTs active at once...
+- int i;
+- for (i=0;i<255;i++) {
+- write(mPipe_fd_out, "SAK\n\r", 6);
+- }
++ /* We assume that anything that has an alphabetic key in the
++ QWERTYUIOP range in it is the main keyboard. */
++ for (j = KEY_Q; j <= KEY_P; j++) {
++ if (TestBit(j, key_bitmask)) {
++ is_new_keyboard = true;
+ }
+ }
++ ioctl (hotplug_fd, EVIOCGNAME (sizeof (name)), name);
++ close(hotplug_fd);
++
++ // Ensure that we do not detect our own tsak faked keyboards
++ if (str_ends_with(name, "+tsak") == 1) {
++ is_new_keyboard = false;
++ }
++
++ // If a keyboard was added we need to restart...
++ if (is_new_keyboard == true) {
++ fprintf(stderr, "Hotplugged new keyboard: (%s)\n", name);
++ udev_unref(udev);
++ restart_tsak();
++ }
++ }
++ else {
++ fprintf(stderr, "No Device from receive_device(). An error occured.\n");
+ }
+ }
++
++ udev_unref(udev);
++
++ fprintf(stderr, "Hotplug monitoring process terminated\n");
+ }
+ }
+ }
+diff --git a/twin/kompmgr/kompmgr.c b/twin/kompmgr/kompmgr.c
+index 5daf8c2..8216676 100644
+--- a/kwin/kompmgr/kompmgr.c
++++ b/kwin/kompmgr/kompmgr.c
+@@ -60,6 +60,7 @@ check baghira.sf.net for more infos
+ #include <signal.h>
+ #include <time.h>
+ #include <unistd.h>
++#include <libgen.h>
+ #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
+ #include <X11/Xatom.h>
+@@ -397,7 +398,7 @@ void delete_pid_file()
+ int chars = readlink("/proc/self/exe", me, sizeof(me));
+ me[chars] = 0;
+ me[2047] = 0;
+- execl(me, NULL);
++ execl(me, basename(me), (char*)NULL);
+ }
+ #endif
+ }
diff --git a/redhat/kdebase/trinity-kdebase-3.5.13.spec b/redhat/kdebase/trinity-kdebase-3.5.13.spec
index bc99f494d..7496f1ec9 100644
--- a/redhat/kdebase/trinity-kdebase-3.5.13.spec
+++ b/redhat/kdebase/trinity-kdebase-3.5.13.spec
@@ -2,7 +2,7 @@
%if "%{?version}" == ""
%define version 3.5.13
%endif
-%define release 15
+%define release 16
# If TDE is built in a specific prefix (e.g. /opt/trinity), the release will be suffixed with ".opt".
%if "%{?_prefix}" != "/usr"
@@ -99,6 +99,12 @@ Patch29: kdebase-3.5.13-fix_multihead_desktop_lock.patch
Patch30: kdebase-3.5.12-kdm_hide_menu_button.patch
## [kdebase/kxkb] Enables xtest support
Patch31: kdebase-3.5.13-enable_xtest_support.patch
+## [kdebase/kdm/kfrontend] fix KDM high CPU usage when inactive [Bug #690]
+Patch32: kdebase-3.5.13-fix_kdm_cpu_usage.patch
+## [kdebase/tsak] Add keyboard hotplug (add/remove) support to tsak [Bug #587]
+Patch33: kdebase-3.5.13-tsak_keyboard_hotplug.patch
+## [kdebase/tsak] Replicate LED status from virtual keyboards to physical keyboards [Bug #561]
+Patch34: kdebase-3.5.13-replicate_led_status_on_virtual_keyboard.patch
# Fedora 15 Theme: "Lovelock"
%if 0%{?fedora} == 15
@@ -169,11 +175,11 @@ BuildRequires: libXcomposite-devel
BuildRequires: libXtst-devel
BuildRequires: libXdamage-devel
BuildRequires: xorg-x11-font-utils
-
-# These dependancies are not met in RHEL
-%if 0%{?fedora}
BuildRequires: jack-audio-connection-kit-devel
BuildRequires: nas-devel
+
+%if 0%{?rhel} >= 6 || 0%{?fedora} >= 15
+BuildRequires: libudev-devel
%endif
Requires: tqtinterface
@@ -306,6 +312,11 @@ Protocol handlers (KIOslaves) for personal information management, including:
%patch29 -p0
%patch30 -p1
%patch31 -p1
+%patch32 -p1
+%if 0%{?fedora} >= 15
+%patch33 -p1
+%patch34 -p1
+%endif
# Applies an optional distro-specific graphical theme
%if "%{?tde_bg}" != ""
@@ -354,7 +365,7 @@ cd build
-DWITH_XCOMPOSITE=ON \
-DWITH_XCURSOR=ON \
-DWITH_XFIXES=ON \
-%if 0%{?fedora} || 0%{?rhel} > 5
+%if 0%{?fedora} || 0%{?rhel} >= 6
-DWITH_XRANDR=ON \
%else
-DWITH_XRANDR=OFF \
@@ -692,6 +703,11 @@ update-desktop-database %{_datadir}/applications > /dev/null 2>&1 || :
%{_datadir}/cmake/*.cmake
%changelog
+* Sat Jan 21 2012 Francois Andriot <francois.andriot@free.fr> - 3.5.13-16
+- Fix KDM high CPU usage when inactive [Bug #690]
+- Add keyboard hotplug (add/remove) support to tsak [Bug #587]
+- Replicate LED status from virtual keyboards to physical keyboards [Bug #561]
+
* Thu Jan 05 2012 Francois Andriot <francois.andriot@free.fr> - 3.5.13-15
- Add a KDM option to hide 'Menu' button on login prompt
- Fix corrupted PNG tiles [Bug #298]