diff options
Diffstat (limited to 'x11-misc/slim/files/slim-1.3.1-vkbd.patch')
-rw-r--r-- | x11-misc/slim/files/slim-1.3.1-vkbd.patch | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/x11-misc/slim/files/slim-1.3.1-vkbd.patch b/x11-misc/slim/files/slim-1.3.1-vkbd.patch new file mode 100644 index 0000000..a21f007 --- /dev/null +++ b/x11-misc/slim/files/slim-1.3.1-vkbd.patch @@ -0,0 +1,165 @@ +--- app.h 2008-09-26 02:54:15.000000000 +0200 ++++ app.h.new 2009-07-03 21:11:52.000000000 +0200 +@@ -58,6 +58,10 @@ + void UpdatePid(); + + bool AuthenticateUser(bool focuspass); ++ ++ void InitVirtualKeyboard(); ++ void OpenVirtualKeyboard(); ++ void CloseVirtualKeyboard(); + + static std::string findValidRandomTheme(const std::string& set); + static void replaceVariables(std::string& input, +@@ -98,6 +102,11 @@ + // For testing themes + char* testtheme; + bool testing; ++ ++ // Virtual Keyboard stuff ++ pid_t KeyboardPID; ++ char** KeyboardCmd; ++ int KeyboardArgc; + + std::string themeName; + std::string mcookie; +--- app.cpp 2008-09-26 02:54:15.000000000 +0200 ++++ app.cpp.new 2009-07-03 22:00:07.000000000 +0200 +@@ -135,6 +135,8 @@ + #endif + int tmp; + ServerPID = -1; ++ KeyboardPID = -1; ++ KeyboardArgc = -1; + testing = false; + mcookie = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + daemonmode = false; +@@ -186,6 +188,107 @@ + + } + ++void App::InitVirtualKeyboard() { ++ static const int MAX_KEYBOARD_ARGS = 127; ++ static char* keyboard[MAX_KEYBOARD_ARGS+1] = { NULL }; ++ string command; ++ char *argptr; ++ char *args; ++ ++ cout << "Initialize virtual keyboard..." << endl; ++ ++ /* Disable virtual keyboard */ ++ KeyboardPID = -99; ++ KeyboardCmd = keyboard; ++ ++ /* Get the given command from the config file and check if it is empty. ++ If this is the case the keyboard should stay disabled. */ ++ command = cfg->getOption("keyboard_cmd"); ++ if (command == "") ++ return; ++ ++ args = new char[command.length()+1]; ++ strcpy(args, command.c_str()); ++ /* Make sure we find a \0 */ ++ args[command.length()] = '\0'; ++ ++ /* Parse the given string command into an array of strings */ ++ KeyboardArgc = 0; ++ argptr = args; ++ while (*argptr != '\0') { ++ /* Strip spaces and zero them */ ++ while (*argptr == ' ' || *argptr == '\t') { ++ *argptr = '\0'; ++ argptr++; ++ } ++ ++ /* We are at the end of the string */ ++ if (*argptr == '\0') ++ break; ++ ++ /* Ok we have a new string here, so set the next arg of the array. ++ If too many arguments are specified, remove them all to make ++ sure the keyboard starts. */ ++ keyboard[KeyboardArgc] = argptr; ++ KeyboardArgc++; ++ ++ if (KeyboardArgc >= MAX_KEYBOARD_ARGS) { ++ KeyboardArgc = 1; ++ break; ++ } ++ ++ /* Continue up to the next space */ ++ while (*argptr != ' ' && *argptr != '\t' && *argptr != '\0') { ++ argptr++; ++ } ++ } ++ ++ /* Enable virtual keyboard */ ++ if (KeyboardArgc > 0) { ++ cout << "Enabling virtual keyboard..." << endl; ++ KeyboardPID = -1; ++ } ++} ++ ++void App::OpenVirtualKeyboard() { ++ /* Initialize virtual keyboard command if requested */ ++ if (KeyboardArgc < 0) ++ InitVirtualKeyboard(); ++ ++ if(KeyboardPID == -1) { ++ cout << "Starting virtual keyboard..." << endl; ++ ++ KeyboardPID = fork (); ++ if(KeyboardPID == 0) { ++ /* This is the child process. Execute the shell command. */ ++ execvp(KeyboardCmd[0], KeyboardCmd); ++ cerr << APPNAME << "Executing the virtual keyboard failed!" << endl; ++ _exit (EXIT_FAILURE); ++ } else if (KeyboardPID < 0) { ++ cerr << APPNAME << "Spawning a new process for the virtual keyboard failed!" << endl; ++ } ++ cout << "DEBUG: Virtual keyboard is OK!" << endl; ++ } ++} ++ ++void App::CloseVirtualKeyboard() { ++ int status; ++ ++ if(KeyboardPID != -1) { ++ cout << "Terminating the virtual keyboard..." << endl; ++ status = kill(KeyboardPID, SIGTERM); ++ if(status != 0) { ++ cerr << APPNAME << "Terminating the virtual keyboard failed!" << endl; ++ return; ++ } ++ ++ /* This is the parent process. Wait for the child to complete. */ ++ if (waitpid (KeyboardPID, &status, 0) != KeyboardPID) { ++ cerr << APPNAME << "Waiting for virtual keyboard failed!" << endl; ++ } ++ } ++ KeyboardPID = -1; ++} + + void App::Run() { + DisplayName = DISPLAY; +@@ -349,6 +452,9 @@ + + // Show panel + LoginPanel->OpenPanel(); ++ ++ // Start virtual keyboard ++ OpenVirtualKeyboard(); + } + + LoginPanel->Reset(); +@@ -374,6 +480,10 @@ + if (testing) { + Action = Panel::Exit; + } ++ ++ // Close the virtual keyboard ++ CloseVirtualKeyboard(); ++ + panelclosed = 1; + LoginPanel->ClosePanel(); + |