Я программирую приложение C с библиотекой X. Я хочу отключить клавиатуру, и когда пользователь введет секретный пароль, клавиатура будет включена. Вкратце хочу переключиться между отключением и включением клавиатуры через секретный пароль.
Например, когда программа работает, пользователь может нажимать клавиши, но это не имеет никакого эффекта, когда пользователь вводит слово «пароль», программа снимает клавиатуру и позволяет пользователю нажимать клавиши, но когда пользователь снова вводит слово «пароль» клавиатура снова будет отключена.
У меня есть первая часть, отключить клавиатуру и включить ее, когда пользователь вводит пароль, но я не могу сделать обратный путь.
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>bool isBlock = false;
Display *display;
Screen *screen;
Window window;
char password[6];
void order_password(){
for (int i = 0; i < 6; i++){
password[i] = password[i+1];
}
password[6]=0;
}
void handle_event(XEvent event){
KeySym keysym = XKeycodeToKeysym(display, event.xkey.keycode,0);
char str[1];
if (event.type == KeyReleaseMask){
int len = strlen(password);
if (len == 6){
order_password();
}
len = strlen(password);
XLookupString(&event.xkey,str,1,NULL,NULL);
password[len] = str[0];
if (strcmp(password, "hello") == 0){
if (isBlock == false){
memset(&password, 0, sizeof(password));
block();
}else{
memset(&password, 0, sizeof(password));
unblock();
}
}
}
}
void block(){
isBlock = true;
XGrabKeyboard(display, window,true, GrabModeAsync, GrabModeAsync, CurrentTime);
XEvent event;
while (1){
XNextEvent(display, &event);
std::cout << "You can't type anything" << std::endl;
XAllowEvents(display, AsyncKeyboard, CurrentTime);
XAllowEvents(display, AsyncPointer, CurrentTime);
handle_event(event);
}
}
void unblock(){
isBlock = false;
XUngrabKeyboard(display, CurrentTime);
XEvent event;
while (1){
XNextEvent(display, &event);
XSendEvent(display,window,true, 0, &event);
std::cout << "Now, you can type" << std::endl;
XAllowEvents(display, AsyncKeyboard, CurrentTime);
XAllowEvents(display, AsyncPointer, CurrentTime);
handle_event(event);
}
}
int main(int argc,char **argv){
display = XOpenDisplay(NULL);
screen = ScreenOfDisplay(display, 0);
window = DefaultRootWindow(display);
isBlock = false;
if (isBlock == false){
block();
}
}
Итак, с этим кодом я начинаю с отключенной клавиатуры, и когда пользователь вводит слово «привет», клавиатура снова включается. Теперь я хочу отключить его снова, если пользователь вводит слово «привет».
Примечание. Пароль хранится в виде кругового списка фиксированного размера (6 в данном примере). Когда пользовательский тип «h», «h» хранится в переменной пароля [0], когда пользовательский тип «e», «e» сохраняется в переменной пароля [1]. Когда размер равен 6 (например, «Hello w»), когда в следующий раз пользователь нажимает клавишу, первая буква «H» исчезнет, если пользователь нажмет «o», содержимое переменной пароля будет «ello wo»
Задача ещё не решена.
Других решений пока нет …