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