Tag: xlib

xlib – 打印事件名称

所以我有一个用xlib创建的标准窗口来处理事件: while (keep_running){ XNextEvent (display, &event); printf(“event\n”); } 现在它似乎没有调用expose事件,所以我无法在窗口中绘制。 我可以通过print语句看到有些事件被解雇了,我想知道它们是什么事件。 所以基本上我的问题是,如何才能将事件名称打印出来? 我还在学习C,所以任何帮助都是适合的!

Xlib:窗口创建的位置错误

我有简单的xlib程序,它创建窗口。 我认为它必须在屏幕的左上角显示窗口,因为我将0,0传递给XCreateSimpleWindow函数,但它位于中上方。 为什么? #include #include #include int main(int argc, char* argv[]) { Display* display; int screen_num; Window win; unsigned int display_width,display_height; unsigned int width, height; char *display_name = getenv(“DISPLAY”); display = XOpenDisplay(display_name); screen_num = DefaultScreen(display); display_width = DisplayWidth(display, screen_num); display_height = DisplayHeight(display, screen_num); width = (display_width / 3); height = (display_height / 3); win = […]

如何检测在Linux中通过GUI登录的用户

我想在我的程序中捕获通过GUI登录的用户名。 我的程序作为root登录的守护进程运行。 如果非root用户通过GUI登录,则应通知我的程序。 我正在粘贴我当前的程序,该程序调用perl脚本,利用系统调用来检查当前用户是谁登录。我也粘贴了我的perl脚本以供参考。 #include #include #include #include #include int main() { char *user; char buf[1024]; int fd, ret; fd = open(“/tmp/log”, O_TRUNC|O_RDWR|O_CREAT); if (!fd) { printf(“Error opening file\n”); exit(1); } chmod(“/tmp/log”, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH); daemon(0, 0); while (1) { system(“perl […]

XPending周期使CPU 100%

美好的一天! 我有一些麻烦制作一个xlib项目。 这是我的项目的结构: [ Init ] [ Making some stuff ] [ Creating a timer thread (see code below) ] [ Main cycle (see code below) ] 当用户按下任何按钮时,我将线程中的标志设置为类似true的值,并且每隔n次开始将CustomMessage发送到窗口。 while (warehouse.destroyflag != SML_DEAD) { if (XPending(warehouse.display)) { XNextEvent(warehouse.display, &event); 但这里有一些问题。 随着当前主循环的实现,我有大约100%的CPU负载 。 但是当我从代码中删除XPending行时,负载大约为0%。 但在这种情况下,我没有从另一个线程到达正确的CustomMessage。 我找到了Xlib程序的示例代码并对其进行了编译。 它有同样的问题,CPU负载约为100%。 这是样本: http://paste.bradleygill.com/index.php?paste_id=4897 这是我的主题代码: http : //paste.bradleygill.com/index.php?paste_id = 4898 这是我的周期: http […]

在Xlib中,如何在事件发生之前设置动画?

我一直在尝试使用Xlib在C程序中制作动画,我想在事件发生时做点什么,否则我想保持动画效果。 这是我目前正在做的示例代码片段: while( 1 ) { // If an event occurs, stop and do whatever is needed. // If no event occurs, skip this if statement. if ( XEventsQueued( display, QueuedAlready ) > 0 ) { XNextEvent( display, &event ) switch ( event.type ) { // Don’t do anything case Expose: while ( event.xexpose.count != […]

XEventsQueued等效于xcb

我在XCB中读到了“ Need for XEventsQueued(display,QueuedAfterReading) ”,但答案指定了一个修改内部事件队列的函数( xcb_poll_for_queued_event )。 我需要一个与XEventsQueued(display, QueuedAfterReading) 完全相同的函数。 如果在使用XEventsQueued地方完成,修改事件队列会破坏我正在编写的代码。 什么是xcb中的等效函数或代码块?

在XCB中需要XEventsQueued(display,QueuedAfterReading)

我正在将一些CYBOI代码从Xlib迁移到XCB。 CYBOI使用几个线程用于不同的通信通道,如:serial_port,terminal,socket,x_window_system。 但是,它仅将这些线程用于信号/事件/数据检测; 实际的接收和发送是在主线程中完成的,以避免地址空间的任何multithreading冲突。 对于x_window_system通道,我先前检测到线程中的事件 : int n = XEventsQueued(display, QueuedAfterReading); 在检测到事件时,设置“中断标志”。 之后,主线程正在使用以下方式读取实际事件 : XNextEvent(display, &event); 当没有更多事件可用时,主线程停止接收事件,并且x_window_system通道线程再次开始侦听XEventsQueued。 现在,我正在将代码迁移到XC Binding(XCB)。 有一个阻塞函数“xcb_wait_for_event”,可以用于读取事件。 我想念的是一些function“偷看”,如果有事件待处理,没有实际返回/从队列中删除事件。 我现在正在网上阅读几个小时,但我找不到这样的function。 “xcb_poll_for_event”无济于事。 阻止对我来说很好,因为我的事件检测在它自己的线程中运行。 作为第三个输入函数的“xcb_request_check”似乎不是我想要的。 有人可以帮帮我吗? 谢谢,克里斯蒂安

我们如何用Xlib / C模拟鼠标点击?

我想找到C / Xorg代码来“输入”鼠标左键单击。 我期待一行代码,但我发现用C编写的唯一内容大约有二十几行而且它们无论如何都不起作用:(它似乎可以在Windows中完成,但我在Linux中。 问题的原因是我编写了一个实用程序,可以让我使用键盘在几个屏幕之间移动鼠标指针。 唯一的问题是,如果我移动到窗口abc曾经的位置但是另一个窗口xyz已经加载到同一位置的顶部,鼠标指针移动到xyz就好了,但是xyz没有焦点 – 直到我左键单击鼠标。 所以,我想在我的代码中构建’click’。 我尝试过的代码不起作用是基于XSendEvent()。

XLib窗口名称问题

从4天开始,我试着看看XLib是如何工作的,我终于明白了。 我尝试制作一个能找回开窗名称的短程序。 为此,我创建了2个函数: Window *list (Display *disp, unsigned long *len) { Atom prop = XInternAtom(disp,”_NET_CLIENT_LIST”,False), type; int form; unsigned long remain; unsigned char *list; if (XGetWindowProperty(disp,XDefaultRootWindow(disp),prop,0,1024,False,XA_WINDOW, &type,&form,len,&remain,&list) != Success) { return 0; } return (Window*)list; } 因此,第一个函数返回所有窗口的窗口对象。 然后,我创建了一个函数来从所有窗口中检索名称。 char *name (Display *disp, Window win) { Atom prop = XInternAtom(disp,”WM_NAME”,False), type; int form; unsigned long remain, […]

用Xlib捕获鼠标

我想编写一个简单的Xlib程序来改变鼠标的行为(举一个例子,反转垂直运动)。 我有捕获事件的问题。 我想要代码 捕获控制器位置的变化(我向上移动鼠标, MotionEvent ) 计算新光标位置( new_x -= difference_x ) 设置新的光标位置(向下移动指针, XWarpPointer ,在此处阻止事件生成) 下面的代码应该在每次移动鼠标时捕获一个运动事件,但只有当指针从一个窗口移动到另一个窗口时它才会生成事件…如何捕获所有运动事件? #include “X11/Xlib.h” #include “stdio.h” int main(int argc, char *argv[]) { Display *display; Window root_window; XEvent event; display = XOpenDisplay(0); root_window = XRootWindow(display, 0); XSelectInput(display, root_window, PointerMotionMask ); while(1) { XNextEvent( display, &event ); switch( event.type ) { case MotionNotify: printf(“x […]