xlib로 윈도우 만들기 질문드립니다! (XCreateWindow)
글쓴이: lowid / 작성시간: 월, 2007/06/04 - 4:45오후
만들고 싶은 윈도우는..
1 툴바에 나타나지 않아야함
2 윈도우 선택이 되지않아야함
3 선택이 안되니 이동도 안되게..
4 투명
5 제일 아래에(layer가) 윈도우가 위치해야함(idesk의 아이콘처럼요!)
6 워크 스페이스와 상관없이 다 나나타야함
그래서 conky,idesk소스를 뒤져보았습니다
대충 이런 조건을 만족하는 프로그램이니까요
살펴보니까 conky는 rootwindow에 region을 써서 그냥 그리는거 같았고
idesk는 직접어떻게 윈도우를 잠시 만드는거 같더군요 투명윈도우를..
(아마도 배경화면과 같은걸로 일단 출력을 해야 깨끗하게 아이콘이 나오니..)
그런데 이렇게 만든거는 다른건 다 잘되는거 같은데 최상위 윈도우가 되어버리는게 문제네요;
그리고 xlib를 안쓰고 gdk,gtk로는 저런걸 구현 못하나요 ;;
(gtk위젯들도 같이 사용해야하거든요..........)
gdk가 xlib의 wrapper로 알고 있는데 될거도 같은데, gdk,gtk를 써서 위의 조건을
만족시키는 소스는 아직 보지 못해서........; (다 xlib로 만들어 놨던...)
소스는 다음과 같습니다..
일단 여기저기서 copy&paste로..
작성했습니다...
#include <X11/Xlib.h> #include <X11/Xatom.h> int main(void) { Display *d ; Window w, root ; XSetWindowAttributes attr; //long data[1]; attr.background_pixmap = ParentRelative; attr.backing_store = Always; attr.event_mask = ExposureMask; attr.override_redirect = True; d = XOpenDisplay(NULL) ; root = DefaultRootWindow (d); w = XCreateWindow( d, root, 650, 500, 200, 100, 0, /* 다 0라도 되네 이라인은.. */ CopyFromParent, CopyFromParent, CopyFromParent, //0, 0, 0, /* 바탕윈도 | 모르겠다.; | 타이틀 삭제; 내용유지?| 몰라;,없으면 seg-fault 대충 man페이지 보면 속성은 나오지만*/ CWBackPixmap|CWBackingStore|CWOverrideRedirect|CWEventMask,&attr ); //CWBackPixmap|CWOverrideRedirect,&attr ); /* (kldp에서 찾아서 )레이어 조절이 되나 해봤는데 이미저도 안되네여.. Atom layer=XInternAtom(d,"_WIN_LAYER", False); data[0]=10; XChangeProperty(d, w, layer, XA_CARDINAL , 32 , PropModeReplace,(unsigned char *) data,1); XSelectInput( d, root, SubstructureNotifyMask ); XMapWindow (d, w); XFlush (d); getchar(); XCloseDisplay (d); return 0; }
Forums:
진정한 투명은
진정한 투명은 composite extension을 사용해야 합니다.
또한 몇몇 window manager에서는 제대로 지원이 되지 않을 수도 있습니다.
metacity + xcompmgr,
compiz / beryl 의 조합 정도라면
제대로 composite extension으로 만족할만한 결과를 얻으실 수 있습니다.
코딩을 직접해본 것이 아니라서 자세한 내용은 저도 잘 모르지만
macslow 의 cairo-clock 소스를 보실 것을 추천합니다.
$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}
진정한 투명이
진정한 투명이 아니어도 됩니다. ㅜ
그냥 배경화면만 투명하게 하는 효과를 원했던거구요..
(진정한 투명을 만들필요도 아직없고 그렇게하면 알파값 어쩌구 해서 복잡해 질것도 같고 해서요)
위에 소스에서 윈도우 layer만 좀 줄이면 (desktop layer로 만들려고) 될거 같은데 그걸 못하겠더라고요..
cairo..clock도 실행을 시켜보았는데 그것과는 좀 만들려고 하는거랑 거리가 있는듯 싶은거 같아서요..
그냥 XCreateWindow로 만드는게 더 가까운거 같아서........
---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!
그러니까 질문은..
XCreateWindow를 사용했을때
윈도우의 계층(layer가) Top level로 만들어지는데 (이 내용이 man페이지에도 있더군요)
이걸 Desktop 수준정도로 layer를 낮출수 있는가 하는것이 되겠네요..
---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!
혼자서 연구해서
혼자서 연구해서 저부분 까지 한번 해봤는데요..
attr.override_redirect 가 문제인듯하네요..
override라 아마 최상위 윈도우에 존재하는거 같은데..
이속성을 다 가지고 최하위 윈도우를 만드려고
_WIN_LAYER(CARDINAL) = 0-로 만들어 봤지만 안되네요.
(xprop로 확인하면서 했습니다).
속성에 가려서 그런가요..
아니면 _NET_WM_ALLOWED_ACTIONS 에서 항목을 빼고
_WIN_WORKSPACE(CARDINAL) 같은걸 일일이 다 설정해야하는지......
조언을 구합니다.
다음은 고친 소스..
---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!
아 바버........;
XLowerWindow(Display *dpy,Window win)
함수를 쓰면 되는거 였군요... 하핫,,;;
이런 기능을 하는 함수도 따로 있었네요.. 이거 몰라서 줄창 찾아댕겼는데 ......
뭐 나중에 이내용가지고 해메실분이 계실수도 있으니깐..;;
이렇게 나마 적어 둡니다...
---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!
댓글 달기