Browse Source

Re-implement tiling of image (-t)

master
Michael Stapelberg 15 years ago
parent
commit
3f168a54ce
  1. 25
      i3lock.c

25
i3lock.c

@ -32,7 +32,9 @@
static xcb_connection_t *conn; static xcb_connection_t *conn;
static xcb_key_symbols_t *symbols; static xcb_key_symbols_t *symbols;
static cairo_surface_t *img = NULL;
static cairo_t *ctx = NULL; static cairo_t *ctx = NULL;
static xcb_screen_t *scr;
static pam_handle_t *pam_handle; static pam_handle_t *pam_handle;
static int input_position = 0; static int input_position = 0;
/* holds the password you enter (in UTF-8) */ /* holds the password you enter (in UTF-8) */
@ -41,6 +43,7 @@ static bool modeswitch_active = false;
static int modeswitchmask; static int modeswitchmask;
static int numlockmask; static int numlockmask;
static bool beep = false; static bool beep = false;
static bool tile = false;
static void input_done() { static void input_done() {
if (input_position == 0) if (input_position == 0)
@ -67,7 +70,19 @@ static void handle_expose_event() {
if (!ctx) if (!ctx)
return; return;
cairo_paint(ctx); if (tile) {
/* create a pattern and fill a rectangle as big as the screen */
cairo_pattern_t *pattern;
pattern = cairo_pattern_create_for_surface(img);
cairo_set_source(ctx, pattern);
cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
cairo_rectangle(ctx, 0, 0, scr->width_in_pixels, scr->height_in_pixels);
cairo_fill(ctx);
} else {
/* otherwise, just paint the image */
cairo_paint(ctx);
}
xcb_flush(conn); xcb_flush(conn);
} }
@ -227,10 +242,8 @@ int main(int argc, char *argv[]) {
int ret; int ret;
struct pam_conv conv = {conv_callback, NULL}; struct pam_conv conv = {conv_callback, NULL};
int screen; int screen;
cairo_surface_t *img = NULL;
xcb_visualtype_t *vistype; xcb_visualtype_t *vistype;
xcb_generic_event_t *event; xcb_generic_event_t *event;
xcb_screen_t *scr;
xcb_window_t win; xcb_window_t win;
xcb_cursor_t cursor; xcb_cursor_t cursor;
int curs_choice = CURS_NONE; int curs_choice = CURS_NONE;
@ -280,7 +293,7 @@ int main(int argc, char *argv[]) {
break; break;
} }
case 't': case 't':
/* TODO: tile image */ tile = true;
break; break;
case 'p': case 'p':
if (!strcmp(optarg, "win")) { if (!strcmp(optarg, "win")) {
@ -345,9 +358,9 @@ int main(int argc, char *argv[]) {
cairo_surface_t *output; cairo_surface_t *output;
output = cairo_xcb_surface_create(conn, win, vistype, output = cairo_xcb_surface_create(conn, win, vistype,
scr->width_in_pixels, scr->height_in_pixels); scr->width_in_pixels, scr->height_in_pixels);
/* TODO: tiling of the image */
ctx = cairo_create(output); ctx = cairo_create(output);
cairo_set_source_surface(ctx, img, 0, 0); if (!tile)
cairo_set_source_surface(ctx, img, 0, 0);
handle_expose_event(); handle_expose_event();
} }

Loading…
Cancel
Save