Пример #1
0
static int module_init(Display *dpy) {

    int i;

    data.display = dpy;
    data.windows = (Window *)malloc(sizeof(Window) * ScreenCount(dpy));

    for (i = 0; i < ScreenCount(dpy); i++) {

        Screen *screen = ScreenOfDisplay(dpy, i);
        Colormap colormap = DefaultColormapOfScreen(screen);
        XSetWindowAttributes xswa;
        XColor color;

        alock_alloc_color(dpy, colormap, data.colorname, "black", &color);

        xswa.override_redirect = True;
        xswa.colormap = colormap;
        xswa.background_pixel = color.pixel;

        data.windows[i] = XCreateWindow(dpy, RootWindowOfScreen(screen),
                0, 0, WidthOfScreen(screen), HeightOfScreen(screen), 0,
                CopyFromParent, InputOutput, CopyFromParent,
                CWOverrideRedirect | CWColormap | CWBackPixel,
                &xswa);

    }

    return 0;
}
Пример #2
0
static int module_init(struct aDisplayInfo *dinfo) {

    if (!dinfo)
        return -1;

    Display *dpy = dinfo->display;
    Colormap colormap = dinfo->screens[0].colormap;
    XColor color_bg;
    XColor color_fg;

    data.dinfo = dinfo;
    alock_alloc_color(dpy, colormap, data.colorname_bg, "black", &color_bg);
    alock_alloc_color(dpy, colormap, data.colorname_fg, "white", &color_fg);

    /* create cursor from X11/cursorfont.h */
    if (!(data.cursor = XCreateFontCursor(dpy, data.shape))) {
        fprintf(stderr, "[glyph]: unable to create fontcursor\n");
        return -1;
    }

    XRecolorCursor(dpy, data.cursor, &color_fg, &color_bg);
    return 0;
}
Пример #3
0
static int alock_cursor_glyph_init(const char* args, struct aXInfo* xinfo) {

    char* color_bg_name = strdup("steelblue3");
    char* color_fg_name = strdup("grey25");
    unsigned int shape = 0; /* XC_X_cursor */

    if (!xinfo || !args)
        return 0;

    if (strstr(args, "glyph:") == args && strlen(&args[6]) > 0) {
        char* arguments = strdup(&args[6]);
        char* tmp;
        char* arg = NULL;
        for (tmp = arguments; tmp; ) {
            arg = strsep(&tmp, ",");
            if (arg) {
                const struct CursorFontName* cursor_glyph_name;

                if (!strcmp(arg, "list")) {
                    for (cursor_glyph_name = cursor_names; cursor_glyph_name->name; ++cursor_glyph_name) {
                        printf("%s\n", cursor_glyph_name->name);
                    }
                    free(color_fg_name);
                    free(color_bg_name);
                    free(arguments);
                    exit(0);
                } else if (strstr(arg, "fg=") == arg && strlen(arg) > 4) {
                    free(color_fg_name);
                    color_fg_name = strdup(&arg[3]);
                } else if (strstr(arg, "bg=") == arg && strlen(arg) > 4) {
                    free(color_bg_name);
                    color_bg_name = strdup(&arg[3]);
                } else if (strstr(arg, "name=") == arg && strlen(arg) > 6) {
                    for (cursor_glyph_name = cursor_names; cursor_glyph_name->name; ++cursor_glyph_name) {
                        if(!strcmp(cursor_glyph_name->name, &arg[5])) {
                            shape = cursor_glyph_name->shape;
                            break;
                        }
                    }
                    if (!cursor_glyph_name->name) {
                        printf("alock: error, couldnt find [%s]\n", &arg[5]);
                        free(color_bg_name);
                        free(color_fg_name);
                        free(arguments);
                        return 0;
                    }
                }
            }
        }
        free(arguments);
    }

    {
        cursor = (Cursor*)calloc(xinfo->nr_screens, sizeof(Cursor));
        color_fg = (XColor*)calloc(xinfo->nr_screens, sizeof(XColor));
        color_bg = (XColor*)calloc(xinfo->nr_screens, sizeof(XColor));
    }

    {
        int scr;
        for (scr = 0; scr < xinfo->nr_screens; scr++) {

            alock_alloc_color(xinfo, scr, color_bg_name, "black", &color_bg[scr]);
            alock_alloc_color(xinfo, scr, color_fg_name, "white", &color_fg[scr]);

            /* create cursor from X11/cursorfont.h */
            if ((cursor[scr] = XCreateFontCursor(xinfo->display, shape))) {
                XRecolorCursor(xinfo->display, cursor[scr], &color_fg[scr], &color_bg[scr]);
                xinfo->cursor[scr] = cursor[scr];
            } else {
                printf("alock: error, couldnt create fontcursor [%d].\n", shape);
                return 0;
            }
        }

        free(color_fg_name);
        free(color_bg_name);
    }

    return 1;
}
Пример #4
0
static int alock_bg_shade_init(const char* args, struct aXInfo* xinfo) {

    char* color_name = strdup("black");
    unsigned int shade = 80;

    Pixmap src_pm = None;
    Pixmap dst_pm = None;

    int width = 0;
    int height = 0;

    if (!xinfo || !args)
        return 0;

    if (strstr(args, "shade:") == args && strlen(&args[6]) > 0) {
        char* arguments = strdup(&args[6]);
        char* tmp;
        char* arg = NULL;
        for (tmp = arguments; tmp; ) {
            arg = strsep(&tmp, ",");
            if (arg) {
                if (strstr(arg, "color=") == arg && strlen(arg) > 6 && strlen(&arg[6])) {
                    free(color_name);
                    color_name = strdup(&arg[6]);
                }
                else if (strstr(arg, "shade=") == arg && strlen(arg) > 6 && strlen(&arg[6])) {
                    long int tmp_shade;
                    char* tmp_char;
                    tmp_shade = strtol(&arg[6], &tmp_char, 0);
                    if ((!tmp_shade || tmp_char != &arg[6]) && tmp_shade > 0 && tmp_shade < 100)
                        shade = tmp_shade;
                    else {
                        printf("%s", "alock: error, given value invalid or out of range for [shade].\n");
                        free(arguments);
                        free(color_name);
                        return 0;
                    }
                }
            }
        }
        free(arguments);
    }

    if (!alock_check_xrender(xinfo)) {
        free(color_name);
        return 0;
    }

    {
        window = (Window*)calloc(xinfo->nr_screens, sizeof(Window));
        color = (XColor*)calloc(xinfo->nr_screens, sizeof(XColor));
    }

    {
        int scr;
        for (scr = 0; scr < xinfo->nr_screens; scr++) {

            /* get a color from color_name */
            alock_alloc_color(xinfo, scr, color_name, "black", &color[scr]);

            width = xinfo->width_of_root[scr];
            height = xinfo->height_of_root[scr];

            { /* xrender stuff */
                Display* dpy = xinfo->display;
                Window root = xinfo->root[scr];
                int depth = DefaultDepth(dpy, scr);
                GC gc = DefaultGC(dpy, scr);

                { /* grab whats on the screen */
                    XImage* image = XGetImage(dpy, root, 0, 0, width, height, AllPlanes, ZPixmap);
                    src_pm = XCreatePixmap(dpy, root, width, height, depth);
                    XPutImage(dpy, src_pm, gc, image, 0, 0, 0, 0, width, height);
                    XDestroyImage(image);
                }

                dst_pm = XCreatePixmap(dpy, root, width, height, depth);

                { /* tint the dst*/
                    GC tintgc;
                    XGCValues tintval;

                    tintval.foreground = color[scr].pixel;
                    tintgc = XCreateGC(dpy, dst_pm, GCForeground, &tintval);
                    XFillRectangle(dpy, dst_pm, tintgc, 0, 0, width, height);
                    XFreeGC(dpy, tintgc);
                }

                alock_shade_pixmap(xinfo, scr, src_pm, dst_pm, shade, 0, 0, 0, 0, width, height);
            }

            { /* create final window */
                XSetWindowAttributes xswa;
                long xsmask = 0;

                xswa.override_redirect = True;
                xswa.colormap = xinfo->colormap[scr];
                xswa.background_pixmap = dst_pm;

                xsmask |= CWOverrideRedirect;
                xsmask |= CWBackPixmap;
                xsmask |= CWColormap;

                window[scr] = XCreateWindow(xinfo->display, xinfo->root[scr],
                                  0, 0, width, height,
                                  0, /* borderwidth */
                                  CopyFromParent, /* depth */
                                  InputOutput, /* class */
                                  CopyFromParent, /* visual */
                                  xsmask, &xswa);
                XFreePixmap(xinfo->display, src_pm);
                XFreePixmap(xinfo->display, dst_pm);
            }

            if (window[scr])
                xinfo->window[scr] = window[scr];
        }
        free(color_name);
    }

    return 1;
}