如何在X11

时间:2017-03-27 16:11:27

标签: c++ x11 xorg

我正在使用X库编写C应用程序。我想禁用键盘,当用户输入密码时,键盘将被启用。简单地说,我想通过密码在禁用和启用键盘之间切换。

例如,当程序运行时,用户可以按键但不起作用,当用户键入“密码”字时,程序取消键盘并让用户按键,但当用户再次键入时“密码“word键盘将再次被禁用。

我有第一部分,禁用键盘并在用户输入密码时启用它,但我不能以相反的方式执行。

#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();
  }
}

所以,使用这段代码我开始禁用键盘,当用户输入“hello”字样时,键盘再次启用。现在我想再次禁用它,如果用户输入“你好”字。

注意:密码存储为固定大小的循环列表(本例中为6)。当用户输入“h”时,“h”存储在密码[0]变量中,当用户输入“e”时,“e”存储在密码[1]变量中。当用户下次按键时,当大小为6(例如“Hello w”)时,第一个“H”消失,如果用户现在按“o”密码变量的内容将是“ello wo”

0 个答案:

没有答案