xlib로 윈도우 만들기 질문드립니다! (XCreateWindow)

lowid의 이미지

만들고 싶은 윈도우는..
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;
 }
jg의 이미지

진정한 투명은 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}

lowid의 이미지

진정한 투명이 아니어도 됩니다. ㅜ
그냥 배경화면만 투명하게 하는 효과를 원했던거구요..
(진정한 투명을 만들필요도 아직없고 그렇게하면 알파값 어쩌구 해서 복잡해 질것도 같고 해서요)
위에 소스에서 윈도우 layer만 좀 줄이면 (desktop layer로 만들려고) 될거 같은데 그걸 못하겠더라고요..
cairo..clock도 실행을 시켜보았는데 그것과는 좀 만들려고 하는거랑 거리가 있는듯 싶은거 같아서요..
그냥 XCreateWindow로 만드는게 더 가까운거 같아서........

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

lowid의 이미지

XCreateWindow를 사용했을때
윈도우의 계층(layer가) Top level로 만들어지는데 (이 내용이 man페이지에도 있더군요)
이걸 Desktop 수준정도로 layer를 낮출수 있는가 하는것이 되겠네요..

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

lowid의 이미지

혼자서 연구해서 저부분 까지 한번 해봤는데요..
attr.override_redirect 가 문제인듯하네요..
override라 아마 최상위 윈도우에 존재하는거 같은데..
이속성을 다 가지고 최하위 윈도우를 만드려고
_WIN_LAYER(CARDINAL) = 0-로 만들어 봤지만 안되네요.
(xprop로 확인하면서 했습니다).
속성에 가려서 그런가요..

아니면 _NET_WM_ALLOWED_ACTIONS 에서 항목을 빼고
_WIN_WORKSPACE(CARDINAL) 같은걸 일일이 다 설정해야하는지......
조언을 구합니다.

다음은 고친 소스..

#include <X11/Xlib.h>
#include <X11/Xatom.h>
 
int main(void)
{
	Window win;
	Display *dpy;
	XSetWindowAttributes attr;
	long layer_data[1];
	long state_data[1];
	long wm_desktop_data[1];
	long frame_extents_data[4];
	long wm_state_data[2];
 
	Atom layer;
	Atom state;
	Atom frame_extents;
	Atom wm_desktop;
	Atom wm_state;
 
	/* ParentRelative가 None이면 바로 아래 윈도우로 투명하게 
	 * 하고 ParentRelative면 RootWindow를써서 투명하게 한다 */
	attr.background_pixmap 	= ParentRelative;
	/*
	attr.backing_store 		= Always;
	attr.event_mask 		= ExposureMask;*/
	/* 윈도위 메니져의 영향을 받냐 안받냐?  */
	attr.override_redirect 	= True;
 
	dpy = XOpenDisplay(NULL);
	/*
	win = XCreateWindow( dpy, DefaultRootWindow(dpy), 650, 500, 200, 100, 0,
			 CopyFromParent, CopyFromParent, CopyFromParent, 
			CWBackPixmap|CWBackingStore|CWOverrideRedirect|CWEventMask,&attr );
	*/
	win = XCreateWindow(dpy, DefaultRootWindow(dpy),0,0,500,600,0, 0, 0, 0,
						//0,0);
						CWBackPixmap|CWOverrideRedirect,&attr);
 
	/* XSetWindowAttributes 중 override_redirect == True 이므로
	 * 따로 따로 값들을 설정해 준다 */
	wm_state = XInternAtom(dpy, "WM_STATE", False);
	layer = XInternAtom(dpy ,"_WIN_LAYER", False);
	state = XInternAtom(dpy ,"_WIN_STATE", False);
	frame_extents = XInternAtom(dpy ,"_NET_FRAME_EXTENTS", False);
	wm_desktop = XInternAtom(dpy ,"_NET_WM_DESKTOP", False);
 
	/* 초기화 할 값들을 저장시킨다 */
	layer_data[0] = 0;
	state_data[0] = 0;
	wm_desktop_data[0] = 0;
 
	frame_extents_data[0] = 0;
	frame_extents_data[1] = 0;
	frame_extents_data[2] = 20;
	frame_extents_data[3] = 4;
 
	wm_state_data[0] = 1;
	wm_state_data[1] = 0;
 
	/* 설정된 값들로 윈도우 속성을 변경한다
	 * xprop로 값들을 확인해 보기로 하자 */
	XChangeProperty(dpy, win, wm_desktop, XA_CARDINAL , 32 , PropModeReplace,(unsigned char *) wm_desktop_data,1);
	XChangeProperty(dpy, win, frame_extents, XA_CARDINAL , 32 , PropModeReplace,(unsigned char *) frame_extents_data,4);
	XChangeProperty(dpy, win, state, XA_CARDINAL , 32 , PropModeReplace,(unsigned char *) state_data,1);
	XChangeProperty(dpy, win, layer, XA_CARDINAL , 32 , PropModeReplace,(unsigned char *) layer_data,1);
	XChangeProperty(dpy, win, wm_state, wm_state, 32 , PropModeReplace,(unsigned char *) wm_state_data,2);
 
	XMapWindow(dpy, win);
 
	XFlush(dpy);
 
	getchar();
	XCloseDisplay(dpy);
 
	return 0;
}

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

lowid의 이미지

XLowerWindow(Display *dpy,Window win)
함수를 쓰면 되는거 였군요... 하핫,,;;
이런 기능을 하는 함수도 따로 있었네요.. 이거 몰라서 줄창 찾아댕겼는데 ......
뭐 나중에 이내용가지고 해메실분이 계실수도 있으니깐..;;
이렇게 나마 적어 둡니다...

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.