mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-02 11:55:59 +01:00
Merge pull request #659 from agx/alpha
Make wlr_render_with_matrix use alpha
This commit is contained in:
commit
3296365ce5
19 changed files with 55 additions and 22 deletions
|
@ -647,7 +647,7 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
|
||||||
float matrix[16];
|
float matrix[16];
|
||||||
wlr_texture_get_matrix(plane->wlr_tex, &matrix, &plane->matrix, 0, 0);
|
wlr_texture_get_matrix(plane->wlr_tex, &matrix, &plane->matrix, 0, 0);
|
||||||
wlr_render_with_matrix(plane->surf.renderer->wlr_rend, plane->wlr_tex,
|
wlr_render_with_matrix(plane->surf.renderer->wlr_rend, plane->wlr_tex,
|
||||||
&matrix);
|
&matrix, 1.0f);
|
||||||
|
|
||||||
glFinish();
|
glFinish();
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, bo_stride);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, bo_stride);
|
||||||
|
|
|
@ -239,7 +239,7 @@ struct gbm_bo *wlr_drm_surface_mgpu_copy(struct wlr_drm_surface *dest,
|
||||||
glViewport(0, 0, dest->width, dest->height);
|
glViewport(0, 0, dest->width, dest->height);
|
||||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
wlr_render_with_matrix(dest->renderer->wlr_rend, tex, &matrix);
|
wlr_render_with_matrix(dest->renderer->wlr_rend, tex, &matrix, 1.0f);
|
||||||
|
|
||||||
return wlr_drm_surface_swap_buffers(dest, NULL);
|
return wlr_drm_surface_swap_buffers(dest, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,7 @@ static void handle_output_frame(struct output_state *output,
|
||||||
wlr_texture_get_matrix(sample->cat_texture, &matrix,
|
wlr_texture_get_matrix(sample->cat_texture, &matrix,
|
||||||
&wlr_output->transform_matrix, local_x, local_y);
|
&wlr_output->transform_matrix, local_x, local_y);
|
||||||
wlr_render_with_matrix(sample->renderer,
|
wlr_render_with_matrix(sample->renderer,
|
||||||
sample->cat_texture, &matrix);
|
sample->cat_texture, &matrix, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_renderer_end(sample->renderer);
|
wlr_renderer_end(sample->renderer);
|
||||||
|
|
|
@ -52,7 +52,7 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts
|
||||||
wlr_texture_get_matrix(sample->cat_texture, &matrix,
|
wlr_texture_get_matrix(sample->cat_texture, &matrix,
|
||||||
&wlr_output->transform_matrix, x, y);
|
&wlr_output->transform_matrix, x, y);
|
||||||
wlr_render_with_matrix(sample->renderer,
|
wlr_render_with_matrix(sample->renderer,
|
||||||
sample->cat_texture, &matrix);
|
sample->cat_texture, &matrix, 1.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts
|
||||||
(int)(p->x * width) - sample->cat_texture->width / 2,
|
(int)(p->x * width) - sample->cat_texture->width / 2,
|
||||||
(int)(p->y * height) - sample->cat_texture->height / 2);
|
(int)(p->y * height) - sample->cat_texture->height / 2);
|
||||||
wlr_render_with_matrix(sample->renderer,
|
wlr_render_with_matrix(sample->renderer,
|
||||||
sample->cat_texture, &matrix);
|
sample->cat_texture, &matrix, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_renderer_end(sample->renderer);
|
wlr_renderer_end(sample->renderer);
|
||||||
|
|
|
@ -83,6 +83,7 @@ struct roots_view {
|
||||||
double x, y;
|
double x, y;
|
||||||
uint32_t width, height;
|
uint32_t width, height;
|
||||||
float rotation;
|
float rotation;
|
||||||
|
float alpha;
|
||||||
|
|
||||||
bool decorated;
|
bool decorated;
|
||||||
int border_width;
|
int border_width;
|
||||||
|
@ -94,6 +95,7 @@ struct roots_view {
|
||||||
double x, y;
|
double x, y;
|
||||||
uint32_t width, height;
|
uint32_t width, height;
|
||||||
float rotation;
|
float rotation;
|
||||||
|
float alpha;
|
||||||
} saved;
|
} saved;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@ -180,6 +182,7 @@ struct roots_xdg_popup {
|
||||||
struct wl_listener new_popup;
|
struct wl_listener new_popup;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct roots_view *view_create();
|
||||||
void view_get_box(const struct roots_view *view, struct wlr_box *box);
|
void view_get_box(const struct roots_view *view, struct wlr_box *box);
|
||||||
void view_activate(struct roots_view *view, bool active);
|
void view_activate(struct roots_view *view, bool active);
|
||||||
void view_move(struct roots_view *view, double x, double y);
|
void view_move(struct roots_view *view, double x, double y);
|
||||||
|
@ -190,6 +193,7 @@ void view_maximize(struct roots_view *view, bool maximized);
|
||||||
void view_set_fullscreen(struct roots_view *view, bool fullscreen,
|
void view_set_fullscreen(struct roots_view *view, bool fullscreen,
|
||||||
struct wlr_output *output);
|
struct wlr_output *output);
|
||||||
void view_rotate(struct roots_view *view, float rotation);
|
void view_rotate(struct roots_view *view, float rotation);
|
||||||
|
void view_cycle_alpha(struct roots_view *view);
|
||||||
void view_close(struct roots_view *view);
|
void view_close(struct roots_view *view);
|
||||||
bool view_center(struct roots_view *view);
|
bool view_center(struct roots_view *view);
|
||||||
void view_setup(struct roots_view *view);
|
void view_setup(struct roots_view *view);
|
||||||
|
|
|
@ -33,12 +33,13 @@ struct wlr_texture *wlr_render_texture_create(struct wlr_renderer *r);
|
||||||
* float projection[16];
|
* float projection[16];
|
||||||
* float matrix[16];
|
* float matrix[16];
|
||||||
* wlr_texture_get_matrix(texture, &matrix, &projection, 123, 321);
|
* wlr_texture_get_matrix(texture, &matrix, &projection, 123, 321);
|
||||||
* wlr_render_with_matrix(renderer, texture, &matrix);
|
* wlr_render_with_matrix(renderer, texture, &matrix, 0.5f);
|
||||||
*
|
*
|
||||||
* This will render the texture at <123, 321>.
|
* This will render the texture at <123, 321> with an alpha channel of 0.5.
|
||||||
*/
|
*/
|
||||||
bool wlr_render_with_matrix(struct wlr_renderer *r,
|
bool wlr_render_with_matrix(struct wlr_renderer *r,
|
||||||
struct wlr_texture *texture, const float (*matrix)[16]);
|
struct wlr_texture *texture, const float (*matrix)[16], float alpha);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders a solid quad in the specified color.
|
* Renders a solid quad in the specified color.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct wlr_renderer_impl {
|
||||||
void (*scissor)(struct wlr_renderer *renderer, struct wlr_box *box);
|
void (*scissor)(struct wlr_renderer *renderer, struct wlr_box *box);
|
||||||
struct wlr_texture *(*texture_create)(struct wlr_renderer *renderer);
|
struct wlr_texture *(*texture_create)(struct wlr_renderer *renderer);
|
||||||
bool (*render_with_matrix)(struct wlr_renderer *renderer,
|
bool (*render_with_matrix)(struct wlr_renderer *renderer,
|
||||||
struct wlr_texture *texture, const float (*matrix)[16]);
|
struct wlr_texture *texture, const float (*matrix)[16], float alpha);
|
||||||
void (*render_quad)(struct wlr_renderer *renderer,
|
void (*render_quad)(struct wlr_renderer *renderer,
|
||||||
const float (*color)[4], const float (*matrix)[16]);
|
const float (*color)[4], const float (*matrix)[16]);
|
||||||
void (*render_ellipse)(struct wlr_renderer *renderer,
|
void (*render_ellipse)(struct wlr_renderer *renderer,
|
||||||
|
|
|
@ -171,7 +171,7 @@ static void draw_quad() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool wlr_gles2_render_texture(struct wlr_renderer *wlr_renderer,
|
static bool wlr_gles2_render_texture(struct wlr_renderer *wlr_renderer,
|
||||||
struct wlr_texture *texture, const float (*matrix)[16]) {
|
struct wlr_texture *texture, const float (*matrix)[16], float alpha) {
|
||||||
if (!texture || !texture->valid) {
|
if (!texture || !texture->valid) {
|
||||||
wlr_log(L_ERROR, "attempt to render invalid texture");
|
wlr_log(L_ERROR, "attempt to render invalid texture");
|
||||||
return false;
|
return false;
|
||||||
|
@ -179,12 +179,12 @@ static bool wlr_gles2_render_texture(struct wlr_renderer *wlr_renderer,
|
||||||
|
|
||||||
wlr_texture_bind(texture);
|
wlr_texture_bind(texture);
|
||||||
GL_CALL(glUniformMatrix4fv(0, 1, GL_FALSE, *matrix));
|
GL_CALL(glUniformMatrix4fv(0, 1, GL_FALSE, *matrix));
|
||||||
// TODO: source alpha from somewhere else I guess
|
GL_CALL(glUniform1f(2, alpha));
|
||||||
GL_CALL(glUniform1f(2, 1.0f));
|
|
||||||
draw_quad();
|
draw_quad();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void wlr_gles2_render_quad(struct wlr_renderer *wlr_renderer,
|
static void wlr_gles2_render_quad(struct wlr_renderer *wlr_renderer,
|
||||||
const float (*color)[4], const float (*matrix)[16]) {
|
const float (*color)[4], const float (*matrix)[16]) {
|
||||||
GL_CALL(glUseProgram(shaders.quad));
|
GL_CALL(glUseProgram(shaders.quad));
|
||||||
|
|
|
@ -36,8 +36,8 @@ struct wlr_texture *wlr_render_texture_create(struct wlr_renderer *r) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wlr_render_with_matrix(struct wlr_renderer *r,
|
bool wlr_render_with_matrix(struct wlr_renderer *r,
|
||||||
struct wlr_texture *texture, const float (*matrix)[16]) {
|
struct wlr_texture *texture, const float (*matrix)[16], float alpha) {
|
||||||
return r->impl->render_with_matrix(r, texture, matrix);
|
return r->impl->render_with_matrix(r, texture, matrix, alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_render_colored_quad(struct wlr_renderer *r,
|
void wlr_render_colored_quad(struct wlr_renderer *r,
|
||||||
|
|
|
@ -23,6 +23,16 @@
|
||||||
#include "rootston/view.h"
|
#include "rootston/view.h"
|
||||||
#include "rootston/xcursor.h"
|
#include "rootston/xcursor.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct roots_view *view_create() {
|
||||||
|
struct roots_view *view = calloc(1, sizeof(struct roots_view));
|
||||||
|
if (!view) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
view->alpha = 1.0f;
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
void view_get_box(const struct roots_view *view, struct wlr_box *box) {
|
void view_get_box(const struct roots_view *view, struct wlr_box *box) {
|
||||||
box->x = view->x;
|
box->x = view->x;
|
||||||
box->y = view->y;
|
box->y = view->y;
|
||||||
|
@ -269,6 +279,15 @@ void view_rotate(struct roots_view *view, float rotation) {
|
||||||
view_damage_whole(view);
|
view_damage_whole(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void view_cycle_alpha(struct roots_view *view) {
|
||||||
|
view->alpha -= 0.05;
|
||||||
|
/* Don't go completely transparent */
|
||||||
|
if (view->alpha < 0.1) {
|
||||||
|
view->alpha = 1.0;
|
||||||
|
}
|
||||||
|
view_damage_whole(view);
|
||||||
|
}
|
||||||
|
|
||||||
void view_close(struct roots_view *view) {
|
void view_close(struct roots_view *view) {
|
||||||
if (view->close) {
|
if (view->close) {
|
||||||
view->close(view);
|
view->close(view);
|
||||||
|
|
|
@ -106,6 +106,11 @@ static void keyboard_binding_execute(struct roots_keyboard *keyboard,
|
||||||
}
|
}
|
||||||
} else if (strcmp(command, "next_window") == 0) {
|
} else if (strcmp(command, "next_window") == 0) {
|
||||||
roots_seat_cycle_focus(seat);
|
roots_seat_cycle_focus(seat);
|
||||||
|
} else if (strcmp(command, "alpha") == 0) {
|
||||||
|
struct roots_view *focus = roots_seat_get_focus(seat);
|
||||||
|
if (focus != NULL) {
|
||||||
|
view_cycle_alpha(focus);
|
||||||
|
}
|
||||||
} else if (strncmp(exec_prefix, command, strlen(exec_prefix)) == 0) {
|
} else if (strncmp(exec_prefix, command, strlen(exec_prefix)) == 0) {
|
||||||
const char *shell_cmd = command + strlen(exec_prefix);
|
const char *shell_cmd = command + strlen(exec_prefix);
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
|
|
|
@ -202,6 +202,7 @@ struct render_data {
|
||||||
struct roots_output *output;
|
struct roots_output *output;
|
||||||
struct timespec *when;
|
struct timespec *when;
|
||||||
pixman_region32_t *damage;
|
pixman_region32_t *damage;
|
||||||
|
float alpha;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -296,7 +297,7 @@ static void render_surface(struct wlr_surface *surface, double lx, double ly,
|
||||||
pixman_box32_t *rects = pixman_region32_rectangles(&damage, &nrects);
|
pixman_box32_t *rects = pixman_region32_rectangles(&damage, &nrects);
|
||||||
for (int i = 0; i < nrects; ++i) {
|
for (int i = 0; i < nrects; ++i) {
|
||||||
scissor_output(output, &rects[i]);
|
scissor_output(output, &rects[i]);
|
||||||
wlr_render_with_matrix(renderer, surface->texture, &matrix);
|
wlr_render_with_matrix(renderer, surface->texture, &matrix, data->alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
damage_finish:
|
damage_finish:
|
||||||
|
@ -355,7 +356,7 @@ static void render_decorations(struct roots_view *view,
|
||||||
float matrix[16];
|
float matrix[16];
|
||||||
wlr_matrix_project_box(&matrix, &box, WL_OUTPUT_TRANSFORM_NORMAL,
|
wlr_matrix_project_box(&matrix, &box, WL_OUTPUT_TRANSFORM_NORMAL,
|
||||||
view->rotation, &output->wlr_output->transform_matrix);
|
view->rotation, &output->wlr_output->transform_matrix);
|
||||||
float color[] = { 0.2, 0.2, 0.2, 1 };
|
float color[] = { 0.2, 0.2, 0.2, view->alpha };
|
||||||
|
|
||||||
int nrects;
|
int nrects;
|
||||||
pixman_box32_t *rects =
|
pixman_box32_t *rects =
|
||||||
|
@ -376,6 +377,7 @@ static void render_view(struct roots_view *view, struct render_data *data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data->alpha = view->alpha;
|
||||||
render_decorations(view, data);
|
render_decorations(view, data);
|
||||||
view_for_each_surface(view, render_surface, data);
|
view_for_each_surface(view, render_surface, data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,10 @@ meta-key = Logo
|
||||||
# - "exec" to execute a shell command
|
# - "exec" to execute a shell command
|
||||||
# - "close" to close the current view
|
# - "close" to close the current view
|
||||||
# - "next_window" to cycle through windows
|
# - "next_window" to cycle through windows
|
||||||
|
# - "alpha" to cycle a window's alpha channel
|
||||||
[bindings]
|
[bindings]
|
||||||
Logo+Shift+e = exit
|
Logo+Shift+e = exit
|
||||||
Logo+q = close
|
Logo+q = close
|
||||||
Logo+m = maximize
|
Logo+m = maximize
|
||||||
Alt+Tab = next_window
|
Alt+Tab = next_window
|
||||||
|
Ctrl+Shift+a = alpha
|
||||||
|
|
|
@ -227,7 +227,7 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) {
|
||||||
roots_surface->surface_commit.notify = handle_surface_commit;
|
roots_surface->surface_commit.notify = handle_surface_commit;
|
||||||
wl_signal_add(&surface->surface->events.commit, &roots_surface->surface_commit);
|
wl_signal_add(&surface->surface->events.commit, &roots_surface->surface_commit);
|
||||||
|
|
||||||
struct roots_view *view = calloc(1, sizeof(struct roots_view));
|
struct roots_view *view = view_create();
|
||||||
if (!view) {
|
if (!view) {
|
||||||
free(roots_surface);
|
free(roots_surface);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -333,7 +333,7 @@ void handle_xdg_shell_surface(struct wl_listener *listener, void *data) {
|
||||||
roots_surface->new_popup.notify = handle_new_popup;
|
roots_surface->new_popup.notify = handle_new_popup;
|
||||||
wl_signal_add(&surface->events.new_popup, &roots_surface->new_popup);
|
wl_signal_add(&surface->events.new_popup, &roots_surface->new_popup);
|
||||||
|
|
||||||
struct roots_view *view = calloc(1, sizeof(struct roots_view));
|
struct roots_view *view = view_create();
|
||||||
if (!view) {
|
if (!view) {
|
||||||
free(roots_surface);
|
free(roots_surface);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -333,7 +333,7 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) {
|
||||||
roots_surface->new_popup.notify = handle_new_popup;
|
roots_surface->new_popup.notify = handle_new_popup;
|
||||||
wl_signal_add(&surface->events.new_popup, &roots_surface->new_popup);
|
wl_signal_add(&surface->events.new_popup, &roots_surface->new_popup);
|
||||||
|
|
||||||
struct roots_view *view = calloc(1, sizeof(struct roots_view));
|
struct roots_view *view = view_create();
|
||||||
if (!view) {
|
if (!view) {
|
||||||
free(roots_surface);
|
free(roots_surface);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -317,7 +317,7 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
|
||||||
wl_signal_add(&surface->surface->events.commit,
|
wl_signal_add(&surface->surface->events.commit,
|
||||||
&roots_surface->surface_commit);
|
&roots_surface->surface_commit);
|
||||||
|
|
||||||
struct roots_view *view = calloc(1, sizeof(struct roots_view));
|
struct roots_view *view = view_create();
|
||||||
if (view == NULL) {
|
if (view == NULL) {
|
||||||
free(roots_surface);
|
free(roots_surface);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -391,7 +391,7 @@ static void output_fullscreen_surface_render(struct wlr_output *output,
|
||||||
for (int i = 0; i < nrects; ++i) {
|
for (int i = 0; i < nrects; ++i) {
|
||||||
output_scissor(output, &rects[i]);
|
output_scissor(output, &rects[i]);
|
||||||
wlr_renderer_clear(renderer, &(float[]){0, 0, 0, 0});
|
wlr_renderer_clear(renderer, &(float[]){0, 0, 0, 0});
|
||||||
wlr_render_with_matrix(surface->renderer, surface->texture, &matrix);
|
wlr_render_with_matrix(surface->renderer, surface->texture, &matrix, 1.0f);
|
||||||
}
|
}
|
||||||
wlr_renderer_scissor(renderer, NULL);
|
wlr_renderer_scissor(renderer, NULL);
|
||||||
|
|
||||||
|
@ -448,7 +448,7 @@ static void output_cursor_render(struct wlr_output_cursor *cursor,
|
||||||
pixman_box32_t *rects = pixman_region32_rectangles(&surface_damage, &nrects);
|
pixman_box32_t *rects = pixman_region32_rectangles(&surface_damage, &nrects);
|
||||||
for (int i = 0; i < nrects; ++i) {
|
for (int i = 0; i < nrects; ++i) {
|
||||||
output_scissor(cursor->output, &rects[i]);
|
output_scissor(cursor->output, &rects[i]);
|
||||||
wlr_render_with_matrix(renderer, texture, &matrix);
|
wlr_render_with_matrix(renderer, texture, &matrix, 1.0f);
|
||||||
}
|
}
|
||||||
wlr_renderer_scissor(renderer, NULL);
|
wlr_renderer_scissor(renderer, NULL);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue