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; }
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; }
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; }
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; }