Initial swaylock port

master
Drew DeVault 7 years ago
parent a28730edee
commit b32bf595ae

@ -4,6 +4,24 @@
#include "background-image.h" #include "background-image.h"
#include "cairo.h" #include "cairo.h"
enum background_mode parse_background_mode(const char *mode) {
if (strcmp(mode, "stretch") == 0) {
return BACKGROUND_MODE_STRETCH;
} else if (strcmp(mode, "fill") == 0) {
return BACKGROUND_MODE_FILL;
} else if (strcmp(mode, "fit") == 0) {
return BACKGROUND_MODE_FIT;
} else if (strcmp(mode, "center") == 0) {
return BACKGROUND_MODE_CENTER;
} else if (strcmp(mode, "tile") == 0) {
return BACKGROUND_MODE_TILE;
} else if (strcmp(mode, "solid_color") == 0) {
return BACKGROUND_MODE_SOLID_COLOR;
}
wlr_log(L_ERROR, "Unsupported background mode: %s", mode);
return BACKGROUND_MODE_INVALID;
}
cairo_surface_t *load_background_image(const char *path) { cairo_surface_t *load_background_image(const char *path) {
cairo_surface_t *image; cairo_surface_t *image;
#ifdef HAVE_GDK_PIXBUF #ifdef HAVE_GDK_PIXBUF
@ -35,8 +53,7 @@ cairo_surface_t *load_background_image(const char *path) {
} }
void render_background_image(cairo_t *cairo, cairo_surface_t *image, void render_background_image(cairo_t *cairo, cairo_surface_t *image,
enum background_mode mode, int buffer_width, int buffer_height, enum background_mode mode, int buffer_width, int buffer_height) {
int buffer_scale) {
double width = cairo_image_surface_get_width(image); double width = cairo_image_surface_get_width(image);
double height = cairo_image_surface_get_height(image); double height = cairo_image_surface_get_height(image);
@ -93,6 +110,7 @@ void render_background_image(cairo_t *cairo, cairo_surface_t *image,
break; break;
} }
case BACKGROUND_MODE_SOLID_COLOR: case BACKGROUND_MODE_SOLID_COLOR:
case BACKGROUND_MODE_INVALID:
assert(0); assert(0);
break; break;
} }

@ -9,11 +9,12 @@ enum background_mode {
BACKGROUND_MODE_CENTER, BACKGROUND_MODE_CENTER,
BACKGROUND_MODE_TILE, BACKGROUND_MODE_TILE,
BACKGROUND_MODE_SOLID_COLOR, BACKGROUND_MODE_SOLID_COLOR,
BACKGROUND_MODE_INVALID,
}; };
enum background_mode parse_background_mode(const char *mode);
cairo_surface_t *load_background_image(const char *path); cairo_surface_t *load_background_image(const char *path);
void render_background_image(cairo_t *cairo, cairo_surface_t *image, void render_background_image(cairo_t *cairo, cairo_surface_t *image,
enum background_mode mode, int buffer_width, int buffer_height, enum background_mode mode, int buffer_width, int buffer_height);
int buffer_scale);
#endif #endif

@ -35,6 +35,7 @@ gdk_pixbuf = dependency('gdk-pixbuf-2.0', required: false)
pixman = dependency('pixman-1') pixman = dependency('pixman-1')
libcap = dependency('libcap') libcap = dependency('libcap')
libinput = dependency('libinput') libinput = dependency('libinput')
libpam = cc.find_library('libpam')
math = cc.find_library('m') math = cc.find_library('m')
rt = cc.find_library('rt') rt = cc.find_library('rt')
git = find_program('git', required: false) git = find_program('git', required: false)
@ -105,6 +106,7 @@ subdir('swaymsg')
subdir('client') subdir('client')
subdir('swaybg') subdir('swaybg')
subdir('swaybar') subdir('swaybar')
subdir('swaylock')
config = configuration_data() config = configuration_data()
config.set('sysconfdir', join_paths(prefix, sysconfdir)) config.set('sysconfdir', join_paths(prefix, sysconfdir))

@ -64,15 +64,17 @@ bool is_valid_color(const char *color) {
} }
static void render_frame(struct swaybg_state *state) { static void render_frame(struct swaybg_state *state) {
state->current_buffer = get_next_buffer(state->shm, state->buffers, int buffer_width = state->width * state->scale,
state->width * state->scale, state->height * state->scale); buffer_height = state->height * state->scale;
state->current_buffer = get_next_buffer(state->shm,
state->buffers, buffer_width, buffer_height);
cairo_t *cairo = state->current_buffer->cairo; cairo_t *cairo = state->current_buffer->cairo;
if (state->args->mode == BACKGROUND_MODE_SOLID_COLOR) { if (state->args->mode == BACKGROUND_MODE_SOLID_COLOR) {
cairo_set_source_u32(cairo, state->context.color); cairo_set_source_u32(cairo, state->context.color);
cairo_paint(cairo); cairo_paint(cairo);
} else { } else {
render_background_image(cairo, state->context.image, render_background_image(cairo, state->context.image,
state->args->mode, state->width, state->height, state->scale); state->args->mode, buffer_width, buffer_height);
} }
wl_surface_set_buffer_scale(state->surface, state->scale); wl_surface_set_buffer_scale(state->surface, state->scale);
@ -193,24 +195,10 @@ int main(int argc, const char **argv) {
args.output_idx = atoi(argv[1]); args.output_idx = atoi(argv[1]);
args.path = argv[2]; args.path = argv[2];
args.mode = BACKGROUND_MODE_STRETCH; args.mode = parse_background_mode(argv[3]);
if (strcmp(argv[3], "stretch") == 0) { if (args.mode == BACKGROUND_MODE_INVALID) {
args.mode = BACKGROUND_MODE_STRETCH;
} else if (strcmp(argv[3], "fill") == 0) {
args.mode = BACKGROUND_MODE_FILL;
} else if (strcmp(argv[3], "fit") == 0) {
args.mode = BACKGROUND_MODE_FIT;
} else if (strcmp(argv[3], "center") == 0) {
args.mode = BACKGROUND_MODE_CENTER;
} else if (strcmp(argv[3], "tile") == 0) {
args.mode = BACKGROUND_MODE_TILE;
} else if (strcmp(argv[3], "solid_color") == 0) {
args.mode = BACKGROUND_MODE_SOLID_COLOR;
} else {
wlr_log(L_ERROR, "Unsupported background mode: %s", argv[3]);
return 1; return 1;
} }
if (!prepare_context(&state)) { if (!prepare_context(&state)) {
return 1; return 1;
} }
@ -244,10 +232,10 @@ int main(int argc, const char **argv) {
zwlr_layer_surface_v1_set_exclusive_zone(state.layer_surface, -1); zwlr_layer_surface_v1_set_exclusive_zone(state.layer_surface, -1);
zwlr_layer_surface_v1_add_listener(state.layer_surface, zwlr_layer_surface_v1_add_listener(state.layer_surface,
&layer_surface_listener, &state); &layer_surface_listener, &state);
state.run_display = true;
wl_surface_commit(state.surface); wl_surface_commit(state.surface);
wl_display_roundtrip(state.display); wl_display_roundtrip(state.display);
state.run_display = true;
while (wl_display_dispatch(state.display) != -1 && state.run_display) { while (wl_display_dispatch(state.display) != -1 && state.run_display) {
// This space intentionally left blank // This space intentionally left blank
} }

File diff suppressed because it is too large Load Diff

@ -0,0 +1,18 @@
executable(
'swaylock',
'main.c',
include_directories: [sway_inc],
dependencies: [
cairo,
client_protos,
gdk_pixbuf,
libpam,
math,
pango,
pangocairo,
wayland_client,
wlroots,
],
link_with: [lib_sway_common, lib_sway_client],
install: true
)
Loading…
Cancel
Save