Xlib
跳转到导航
跳转到搜索
获取 X Display 名
当前 Display 的名字,可用 DisplayString(dpy)
来获取,它是一个宏 ((_XPrivDisplay)dpy)->display_name
,其中参数 dpy
是 Display
类型的参数,使用 XOpenDisplay
打开, XCloseDisplay
关闭。
#include<stdio.h>
#include<X11/Xlib.h>
int main(int argc, char *argv[]){
Display *dpy = NULL;
if((dpy = XOpenDisplay((char *)NULL)) == NULL){
return 1;
}
printf("%s\n", DisplayString(dpy));
XCloseDisplay(dpy);
return 0;
}
使用 -lX11
参数编译。
获取鼠标位置
#include<stdio.h>
#include<X11/Xlib.h>
int main(int argc, const char **argv){
Display *dpy = XOpenDisplay(NULL);
if(dpy == NULL){
return 1;
}
XEvent event;
/* get info about current pointer position */
XQueryPointer(dpy, RootWindow(dpy, DefaultScreen(dpy)),
&event.xbutton.root, &event.xbutton.window,
&event.xbutton.x_root, &event.xbutton.y_root,
&event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
XCloseDisplay(dpy);
printf("The mouse is at (%d, %d).\n", event.xbutton.x, event.xbutton.y);
return 0;
}
Xtest
Awesome的 root.fake_input
也实现了此功能。
模拟鼠标点击
#include<X11/Xlib.h>
#include<X11/extensions/XTest.h>
int clickAt(int x, int y){
Display *dpy = XOpenDisplay(NULL);
if(dpy == NULL){
return 0;
}
XEvent event;
/* get info about current pointer position */
XQueryPointer(dpy, RootWindow(dpy, DefaultScreen(dpy)),
&event.xbutton.root, &event.xbutton.window,
&event.xbutton.x_root, &event.xbutton.y_root,
&event.xbutton.x, &event.xbutton.y,
&event.xbutton.state);
XTestFakeMotionEvent(dpy, -1, x, y, 0);
XTestFakeButtonEvent(dpy, 1, 1, 0);
XTestFakeButtonEvent(dpy, 1, 0, 0);
/* place the mouse where it was */
XTestFakeMotionEvent(dpy, -1, event.xbutton.x, event.xbutton.y, 0);
XCloseDisplay(dpy);
return 1;
}
编译参数: -lX11 -lXtst
XScreenSaver
获取用户 idle 时长(毫秒)[1]
#include<X11/Xlib.h>
#include<X11/extensions/scrnsaver.h>
unsigned long scrnsaver_idletime(){
Display *display;
XScreenSaverInfo *info;
if((display = XOpenDisplay(NULL)) == NULL){
perror("failed to open display");
}
info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(display, DefaultRootWindow(display), info);
return info->idle;
}
编译参数: -lXss