X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fx11.c;h=e933a64cc78bb63d8f3049b238b96099d5ee04a0;hb=fc1bd4cf0a46eb594789d5a5f72a7f9427e89431;hp=a860bee79f5f2ccfef2d21c285a3df556a20231d;hpb=f1b69e26a29bf8a5c3f91980dc4f15327d9e1b2a;p=monky diff --git a/src/x11.c b/src/x11.c index a860bee..e933a64 100644 --- a/src/x11.c +++ b/src/x11.c @@ -44,7 +44,7 @@ #ifdef XFT #include -int use_xft = 0; +int use_xft; #endif #ifdef HAVE_XDBE @@ -55,6 +55,7 @@ int use_xdbe; int use_argb_visual; int have_argb_visual; #endif /* USE_ARGB */ +int own_window_argb_value; /* some basic X11 stuff */ Display *display = NULL; @@ -176,11 +177,12 @@ static Window find_desktop_window(Window *p_root, Window *p_desktop) return win; } +static int colour_set = -1; /* if no argb visual is configured sets background to ParentRelative for the Window and all parents, else real transparency is used */ -void set_transparent_background(Window win) +void set_transparent_background(Window win, int alpha) { - static int colour_set = -1; + (void)alpha; /* disable warnings when unused */ #ifdef USE_ARGB if (have_argb_visual) { @@ -189,13 +191,13 @@ void set_transparent_background(Window win) XSetWindowBackground(display, win, 0x00); } else if (colour_set != background_colour) { XSetWindowBackground(display, win, - background_colour | (0xff << 24)); + background_colour | (alpha << 24)); colour_set = background_colour; } } else { #endif /* USE_ARGB */ // pseudo transparency - + if (set_transparent) { Window parent = win; unsigned int i; @@ -224,7 +226,7 @@ static int get_argb_visual(Visual** visual, int *depth) { XVisualInfo visual_template; XVisualInfo *visual_list; int nxvisuals = 0, i; - + visual_template.screen = screen; visual_list = XGetVisualInfo (display, VisualScreenMask, &visual_template, &nxvisuals); @@ -235,10 +237,14 @@ static int get_argb_visual(Visual** visual, int *depth) { visual_list[i].blue_mask == 0x0000ff)) { *visual = visual_list[i].visual; *depth = visual_list[i].depth; + DBGP("Found ARGB Visual"); + XFree(visual_list); return 1; } } // no argb visual available + DBGP("No ARGB Visual found"); + XFree(visual_list); return 0; } #endif /* USE_ARGB */ @@ -253,7 +259,14 @@ void destroy_window(void) if(window.gc) { XFreeGC(display, window.gc); } + if(window.gc_back) { + XFreeGC(display, window.gc_back); + } + if(window.back_buffer != None) { + XFreePixmap(display, window.back_buffer); + } memset(&window, 0, sizeof(struct conky_window)); + colour_set = -1; } void init_window(int own_window, int w, int h, int set_trans, int back_colour, @@ -270,11 +283,11 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, if (own_window) { int depth = 0, flags; Visual *visual = NULL; - + if (!find_desktop_window(&window.root, &window.desktop)) { return; } - + #ifdef USE_ARGB if (use_argb_visual && get_argb_visual(&visual, &depth)) { have_argb_visual = 1; @@ -329,7 +342,7 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, XClassHint classHint; XWMHints wmHint; Atom xa; - + #ifdef USE_ARGB if (have_argb_visual) { attrs.colormap = window.colourmap; @@ -345,6 +358,8 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, window.x = window.y = 0; } /* Parent is root window so WM can take control */ + + fprintf(stderr, PACKAGE_NAME": creating window of %d x %d x %d\n",w,h,depth); window.window = XCreateWindow(display, window.root, window.x, window.y, w, h, 0, depth, InputOutput, visual, flags, &attrs); @@ -496,13 +511,13 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, } /* Skip pager */ - if (TEST_HINT(window.hints, HINT_SKIP_PAGER)) { - /* fprintf(stderr, PACKAGE_NAME": hint - skip_pager\n"); - fflush(stderr); */ + if (TEST_HINT(window.hints, HINT_FULLSCREEN)) { + fprintf(stderr, PACKAGE_NAME": hint - fullscreen\n"); + fflush(stderr); xa = ATOM(_NET_WM_STATE); if (xa != None) { - Atom xa_prop = ATOM(_NET_WM_STATE_SKIP_PAGER); + Atom xa_prop = ATOM(_NET_WM_STATE_FULLSCREEN); XChangeProperty(display, window.window, xa, XA_ATOM, 32, PropModeAppend, (unsigned char *) &xa_prop, 1); @@ -519,18 +534,23 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, } else #endif /* OWN_WINDOW */ { - XWindowAttributes attrs; - if (!window.window) { window.window = find_desktop_window(&window.root, &window.desktop); } + window.visual = DefaultVisual(display, screen); + window.colourmap = DefaultColormap(display, screen); + + fprintf(stderr, PACKAGE_NAME": drawing to desktop window\n"); + } + { + fprintf(stderr, PACKAGE_NAME": getting window attrs\n"); + XWindowAttributes attrs; if (XGetWindowAttributes(display, window.window, &attrs)) { window.width = attrs.width; window.height = attrs.height; + window.depth = attrs.depth; } - - fprintf(stderr, PACKAGE_NAME": drawing to desktop window\n"); } /* Drawable is same as window. This may be changed by double buffering. */ @@ -538,16 +558,12 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, #ifdef HAVE_XDBE if (use_xdbe) { - int major, minor; - - if (!XdbeQueryExtension(display, &major, &minor)) { - use_xdbe = 0; - } else { - window.back_buffer = XdbeAllocateBackBufferName(display, - window.window, XdbeBackground); + { + window.back_buffer = XCreatePixmap(display, window.window, + window.width, window.height, window.depth); if (window.back_buffer != None) { window.drawable = window.back_buffer; - fprintf(stderr, PACKAGE_NAME": drawing to double buffer\n"); + fprintf(stderr, PACKAGE_NAME": created %d x %d x %d back buffer\n",window.width, window.height, window.depth); } else { use_xdbe = 0; } @@ -618,6 +634,8 @@ void create_gc(void) values.function = GXcopy; window.gc = XCreateGC(display, window.drawable, GCFunction | GCGraphicsExposures, &values); + window.gc_back = XCreateGC(display, window.drawable, + GCFunction | GCGraphicsExposures, &values); } //Get current desktop number @@ -766,13 +784,14 @@ void get_x11_desktop_info(Display *current_display, Atom atom) } } -void update_x11info(void) +int update_x11info(void) { struct information *current_info = &info; - if (!x_initialised == YES) - return; + if (x_initialised != YES) + return 0; current_info->x11.monitor.number = XScreenCount(display); current_info->x11.monitor.current = XDefaultScreen(display); + return 0; } #ifdef OWN_WINDOW @@ -846,11 +865,16 @@ void set_struts(int sidenum) void xdbe_swap_buffers(void) { if (use_xdbe) { - XdbeSwapInfo swap; - - swap.swap_window = window.window; - swap.swap_action = XdbeBackground; - XdbeSwapBuffers(display, &swap, 1); + //XWindowAttributes dest;//leaks + //XGetWindowAttributes(display, window.window, &dest); + //unsigned int src_height, src_width, src_depth = 0; + //XGetGeometry(display, window.back_buffer, NULL, NULL, NULL,src_width,src_height, NULL, src_depth); +// fprintf(stderr, PACKAGE_NAME": copy from %d x %d x %d to %d x %d x %d\n",src_width, src_height, src_depth, dest.width, dest.height, dest.depth); + XCopyArea(display, window.drawable, window.window, + window.gc_back, 0, 0, window.width, window.height, 0, 0); + /* FIXME should fill w/ window background */ +// XFillRectangle(display, window.back_buffer, window.gc, +// 0, 0, window.width, window.height); } } #endif /* HAVE_XDBE */