c语言 窗口置顶,xlib 快捷键 切换 置顶 窗口

#include

#include

#include

#include

#define shortkey XK_F10

#define funckey ControlMask

#define winname1 "1 Kate"

#define winname2 "2 Kate"

static char *window_id_format = "0x%lx";

Window win1,win2;

int winflag;

struct _global_handles{

Display *display;

unsigned int screen;

Window root_win;

};

typedef struct _global_handles Ghandles;

void remap(Ghandles *g,Window win)

{

XUnmapWindow(g->display,win);

XMapRaised(g->display,win);

XFlush(g->display);

}

void unmap(Ghandles *g,Window win)

{

XUnmapWindow(g->display,win);

}

void findwindow(Ghandles *g, Window rootWindow)

{

Window

parent;

Window

*children;

Window

*child;

unsigned int

nNumChildren;

XTextProperty wmName;

XTextProperty wmCommand;

XWindowAttributes attr;

int

status = XGetWMName(g->display, rootWindow,

&wmName);

XGetWindowAttributes(g->display,rootWindow,

&attr);

//if (attr.map_state == IsViewable)

{

if (status

&& wmName.value

&& wmName.nitems)

{

int i;

char

**list;

status =

XmbTextPropertyToTextList(g->display,

&wmName, &list,

&i);

if (status

>= Success && i

&& *list)

{

printf("Found

window with name: %s \n",(char*) *list);

if(winflag==0)

{

if((!strcmp((char*)

*list,winname1)) | (!strcmp((char*) *list,winname2)))

{

printf("Found

window with name: %s ------------\n",(char*) *list);

win1=rootWindow;

winflag=1;

}

}

else

if(winflag==1)

{

if(!strcmp((char*)

*list,winname2)|(!strcmp((char*) *list,winname1)))

{

printf("Found

window with name: %s -------------\n",(char*) *list);

win2=rootWindow;

}

}

}

status =

XGetCommand(g->display, rootWindow,

&list, &i);

if (status

>= Success && i

&& *list)

{

//printf("---and

Command: %s \n", (char*) *list);

}

Window

tf;

status =

XGetTransientForHint(g->display, rootWindow,

&tf);

if (status

>= Success &&

tf)

{

//printf("TF

set! \n");

}

XWMHints

*pHints = XGetWMHints(g->display, rootWindow);

if

(pHints)

{

//printf("Flags:

%d " , pHints->flags);

//printf(

"Window group:%lx \n" , pHints->window_group);

}

}

}

status =

XQueryTree(g->display, rootWindow,

&rootWindow, &parent,

&children, &nNumChildren);

if (status

== 0)

{

// Could not query window tree further, aborting

return;

}

if

(nNumChildren == 0)

{

// No more children found. Aborting

return;

}

int

i=0;

for (i =

0; i < nNumChildren; i++)

{

findwindow(g, children[i]);

}

XFree((char*) children);

}

void changefocus(Ghandles *g)

{

if(winflag==0)

{

findwindow(g,g->root_win);

}

if(winflag==1)

{

unmap(g,win2);

remap(g,win1);

winflag=2;

}

else if(winflag==2)

{

unmap(g,win1);

remap(g,win2);

winflag=1;

}

}

int checkkeys(Ghandles *g,XKeyEvent * keyev)

{

if (keyev->type == KeyPress)

{

if

(keyev->keycode ==

XKeysymToKeycode(g->display, shortkey))

{

if

((keyev->state & (funckey))

== (funckey))

{

fprintf(stderr,

"you pressed F10\n");

changefocus(g);

}

}

}

return 0;

}

int getevent(Ghandles *g)

{

XEvent event_buffer;

XNextEvent(g->display,

&event_buffer);

switch (event_buffer.type)

{

case KeyPress:

case KeyRelease:

checkkeys(g,(XKeyEvent *)

& event_buffer);

break;

}

return 1;

}

void makehandles(Ghandles *g)

{

g->display=XOpenDisplay(NULL);

g->screen=DefaultScreen(g->display);

g->root_win=RootWindow(g->display,g->screen);

}

int main()

{

Ghandles g;

makehandles(&g);

winflag=0;//

XUngrabKey(g.display,

XKeysymToKeycode(g.display,shortkey), AnyModifier,

g.root_win);

XGrabKey(g.display ,

XKeysymToKeycode(g.display,shortkey), AnyModifier , g.root_win ,

TRUE , GrabModeAsync,GrabModeAsync);

for (;;) {

if(XPending(g.display))

{

getevent(&g);

}

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值