findwindow를 구현하고 있는데요
글쓴이: kisungcho / 작성시간: 금, 2005/04/01 - 10:02오후
X상의 윈도우리스트를 뒤져서 그 창을 활성화 하려고 합니다.
꼭 그래야만 하는 이유가 있어서요.
그래서 window는 찾았는데 어떻게 그 창을 전면으로 내보내서 활성화 해야 할지 모르겠습니다.
조언 부탁드립니다. X에 떠있는 윈도우중 postmessage처럼 메시지를 보내던지 windowid를 어떻게 해서든지 원하는 것을 활성화 하고 싶습니다. XMapWindow단순하게 해서는 안되더라구요.
즐프되시고요
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xproto.h> typedef struct { int Screen; // Screen Number; int ScreenWidth; // Screen Width; int ScreenHeight; // Height; Window RootWindow; // Root Window i.e. Parent Window. unsigned long white_pixel; //ID's of the black and white colors of screen. unsigned long black_pixel; } DP; typedef struct { Window root_return; Window parent_return; Window *children_return; unsigned int nchildren_return; } TreeReturn; #define FALSE 0 #define TRUE 1 #define DEBUG FALSE #define EVENT_MASK SubstructureNotifyMask | PropertyChangeMask |KeyPressMask | KeyReleaseMask int DigWindow(Window, int); int BuildWindowListQ(int); int ErrorHandler(Display*, XErrorEvent*);
#include "findwindow.h" Display *display; //X display pointer. We have to open a display to //communication to the X server. TreeReturn QTR; //information from XQueryTree int main(int argc, char *argv[]) { char *DEnv = NULL; //target pointer for env variable. DP DisProp; //Display properties structure. int retCode = 0, i = 0, runType = 0, done = 0; char *syscall = NULL; struct timespec delay; delay.tv_sec = 1; delay.tv_nsec = 0; DEnv = getenv("DISPLAY"); // get display? runType = 0; if (DEnv == NULL) // did we get the var? return 1; else { display = XOpenDisplay(DEnv); //open the connection to the display. if (display == NULL) { printf("Cannot connect to X server %s\n", DEnv); return 1; } XSetErrorHandler(ErrorHandler); } DisProp.Screen = DefaultScreen(display); DisProp.ScreenWidth = DisplayWidth(display, DisProp.Screen); DisProp.ScreenHeight = DisplayHeight(display, DisProp.Screen); DisProp.RootWindow = RootWindow(display, DisProp.Screen); DisProp.white_pixel = WhitePixel(display, DisProp.Screen); DisProp.black_pixel = BlackPixel(display, DisProp.Screen); BuildWindowListQ(TRUE); //populates WinQ and QTR struct, MUST BE CALLED // FALSE - AllowDuplicate = NO. TRUE - YES. if (NULL != QTR.children_return) XFree(QTR.children_return); XCloseDisplay(display); //close the display. (previously opened) return 0; } int BuildWindowListQ(int dupWin) { int retCode = 0, i = 0; retCode = XQueryTree(display, DefaultRootWindow(display), &QTR.root_return, &QTR.parent_return, &QTR.children_return, &QTR.nchildren_return); XSelectInput(display, QTR.root_return, EVENT_MASK); if (retCode) { for (i = 0; i < QTR.nchildren_return; i++) { if (!DigWindow(QTR.children_return[i], dupWin)) printf("API 0L Error"); }//for } else return 0; } int DigWindow(Window target, int allowDupWin) { int retCode, parentRetCode, i; char *text_name; XWindowAttributes window_attributes_return; Window root_return; Window parent_return; Window *children_return; unsigned int nchildren_return; parentRetCode = 1; retCode = XQueryTree(display, target, &root_return, &parent_return, &children_return, &nchildren_return); if (!retCode) return 1; retCode=XGetWindowAttributes(display, target, &window_attributes_return); if (retCode != 0) { if ((window_attributes_return.map_state == IsViewable) && (window_attributes_return.class == InputOutput)) { retCode=XFetchName(display, target, &text_name); if (retCode != 0) { printf("###Founded Window Name:%s\n", text_name); XFree(text_name); } } } if (nchildren_return == 0) { return 1; } else { XSelectInput(display, target, EVENT_MASK); for (i = 0; i < nchildren_return; i++) { if (!DigWindow(children_return[i], allowDupWin)) parentRetCode = 0; } if (NULL != children_return) XFree(children_return); } return parentRetCode; } int ErrorHandler(Display *display, XErrorEvent *error) { if ((error->request_code == X_GetWindowAttributes) || (error->request_code == X_ChangeWindowAttributes) || (error->request_code == X_QueryTree) || (error->request_code == X_GetProperty) || (error->request_code == X_GetGeometry) && (error->error_code == BadWindow) || (error->error_code == BadDrawable)) { return 0; } else { char *report = NULL; char num[10]; report = malloc(100); memset(report, 0, 100); XGetErrorText(display, error->error_code, report, 100); printf("Xlib Error: <%s>\n", report); sprintf(num, "%i", error->request_code); XGetErrorDatabaseText(display, "XRequest", num, num, report, 100); printf("Request: %s <XID(%06x), Serial(%d/%d) Minor(%d)>\n\n", report, error->resourceid, error->serial, LastKnownRequestProcessed(display), error->minor_code); exit(1); } }
Forums:
댓글 달기