Skip to content
This repository has been archived by the owner on Nov 1, 2021. It is now read-only.

HiDPI #329

Merged
merged 16 commits into from
Nov 10, 2017
Merged

HiDPI #329

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions backend/libinput/tablet_tool.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ void handle_tablet_tool_axis(struct libinput_event *event,
wlr_event.updated_axes |= WLR_TABLET_TOOL_AXIS_WHEEL;
wlr_event.wheel_delta = libinput_event_tablet_tool_get_wheel_delta(tevent);
}
wlr_log(L_DEBUG, "Tablet tool axis event %d @ %f,%f",
wlr_event.updated_axes, wlr_event.x_mm, wlr_event.y_mm);
wl_signal_emit(&wlr_dev->tablet_tool->events.axis, &wlr_event);
}

Expand Down
2 changes: 1 addition & 1 deletion backend/wayland/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {
wlr_output_init(&output->wlr_output, &backend->backend, &output_impl);
struct wlr_output *wlr_output = &output->wlr_output;

wlr_output_update_size(wlr_output, 640, 480);
wlr_output_update_size(wlr_output, 1280, 720);
strncpy(wlr_output->make, "wayland", sizeof(wlr_output->make));
strncpy(wlr_output->model, "wayland", sizeof(wlr_output->model));
snprintf(wlr_output->name, sizeof(wlr_output->name), "WL-%d",
Expand Down
1 change: 1 addition & 0 deletions include/rootston/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ struct output_config {
char *name;
enum wl_output_transform transform;
int x, y;
int scale;
struct wl_list link;
struct {
int width, height;
Expand Down
4 changes: 2 additions & 2 deletions include/rootston/view.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ struct roots_view {
// configure event from the xdg_shell
// If not then this should follow the typical type/impl pattern we use
// elsewhere
void (*get_size)(struct roots_view *view, struct wlr_box *box);
void (*get_size)(const struct roots_view *view, struct wlr_box *box);
void (*activate)(struct roots_view *view, bool active);
void (*move)(struct roots_view *view, double x, double y);
void (*resize)(struct roots_view *view, uint32_t width, uint32_t height);
Expand All @@ -80,7 +80,7 @@ struct roots_view {
void (*close)(struct roots_view *view);
};

void view_get_size(struct roots_view *view, struct wlr_box *box);
void view_get_size(const struct roots_view *view, struct wlr_box *box);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe rename this to get_box now that this also returns the position?

void view_activate(struct roots_view *view, bool active);
void view_move(struct roots_view *view, double x, double y);
void view_resize(struct roots_view *view, uint32_t width, uint32_t height);
Expand Down
5 changes: 3 additions & 2 deletions include/wlr/types/wlr_output.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ struct wlr_output_mode {

struct wlr_output_cursor {
struct wlr_output *output;
int32_t x, y;
double x, y;
bool enabled;
uint32_t width, height;
int32_t hotspot_x, hotspot_y;
Expand Down Expand Up @@ -95,7 +95,8 @@ bool wlr_output_cursor_set_image(struct wlr_output_cursor *cursor,
int32_t hotspot_x, int32_t hotspot_y);
void wlr_output_cursor_set_surface(struct wlr_output_cursor *cursor,
struct wlr_surface *surface, int32_t hotspot_x, int32_t hotspot_y);
bool wlr_output_cursor_move(struct wlr_output_cursor *cursor, int x, int y);
bool wlr_output_cursor_move(struct wlr_output_cursor *cursor,
double x, double y);
void wlr_output_cursor_destroy(struct wlr_output_cursor *cursor);

#endif
9 changes: 8 additions & 1 deletion include/wlr/types/wlr_surface.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#ifndef WLR_TYPES_WLR_SURFACE_H
#define WLR_TYPES_WLR_SURFACE_H

#include <wayland-server.h>
#include <pixman.h>
#include <stdint.h>
#include <stdbool.h>
#include <wlr/types/wlr_output.h>

struct wlr_frame_callback {
struct wl_resource *resource;
Expand Down Expand Up @@ -135,4 +135,11 @@ struct wlr_surface *wlr_surface_get_main_surface(struct wlr_surface *surface);
*/
struct wlr_subsurface *wlr_surface_subsurface_at(struct wlr_surface *surface,
double sx, double sy, double *sub_x, double *sub_y);

void wlr_surface_send_enter(struct wlr_surface *surface,
struct wlr_output *output);
Copy link
Member

@emersion emersion Oct 24, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should send leave too.


void wlr_surface_send_leave(struct wlr_surface *surface,
struct wlr_output *output);

#endif
4 changes: 4 additions & 0 deletions rootston/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,13 +220,17 @@ static int config_ini_handler(void *user, const char *section, const char *name,
oc = calloc(1, sizeof(struct output_config));
oc->name = strdup(output_name);
oc->transform = WL_OUTPUT_TRANSFORM_NORMAL;
oc->scale = 1;
wl_list_insert(&config->outputs, &oc->link);
}

if (strcmp(name, "x") == 0) {
oc->x = strtol(value, NULL, 10);
} else if (strcmp(name, "y") == 0) {
oc->y = strtol(value, NULL, 10);
} else if (strcmp(name, "scale") == 0) {
oc->scale = strtol(value, NULL, 10);
assert(oc->scale >= 1);
} else if (strcmp(name, "rotate") == 0) {
if (strcmp(value, "normal") == 0) {
oc->transform = WL_OUTPUT_TRANSFORM_NORMAL;
Expand Down
9 changes: 9 additions & 0 deletions rootston/cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,11 +383,20 @@ static void handle_touch_motion(struct wl_listener *listener, void *data) {
static void handle_tool_axis(struct wl_listener *listener, void *data) {
struct roots_input *input = wl_container_of(listener, input, cursor_tool_axis);
struct wlr_event_tablet_tool_axis *event = data;

if ((event->updated_axes & WLR_TABLET_TOOL_AXIS_X) &&
(event->updated_axes & WLR_TABLET_TOOL_AXIS_Y)) {
wlr_cursor_warp_absolute(input->cursor, event->device,
event->x_mm / event->width_mm, event->y_mm / event->height_mm);
cursor_update_position(input, event->time_msec);
} else if ((event->updated_axes & WLR_TABLET_TOOL_AXIS_X)) {
wlr_cursor_warp_absolute(input->cursor, event->device,
event->x_mm / event->width_mm, -1);
cursor_update_position(input, event->time_msec);
} else if ((event->updated_axes & WLR_TABLET_TOOL_AXIS_Y)) {
wlr_cursor_warp_absolute(input->cursor, event->device,
-1, event->y_mm / event->height_mm);
cursor_update_position(input, event->time_msec);
}
}

Expand Down
65 changes: 47 additions & 18 deletions rootston/desktop.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,36 +35,64 @@ void view_destroy(struct roots_view *view) {
free(view);
}

void view_get_size(struct roots_view *view, struct wlr_box *box) {
void view_get_size(const struct roots_view *view, struct wlr_box *box) {
if (view->get_size) {
view->get_size(view, box);
return;
} else {
box->width = view->wlr_surface->current->width;
box->height = view->wlr_surface->current->height;
}
box->x = box->y = 0;
box->width = view->wlr_surface->current->width;
box->height = view->wlr_surface->current->height;
box->x = view->x;
box->y = view->y;
}

void view_activate(struct roots_view *view, bool activate) {
if (view->activate) {
view->activate(view, activate);
static void view_update_output(const struct roots_view *view,
const struct wlr_box *before) {
struct roots_desktop *desktop = view->desktop;
struct roots_output *output;
struct wlr_box box;
view_get_size(view, &box);
wl_list_for_each(output, &desktop->outputs, link) {
bool intersected = before->x != -1 && wlr_output_layout_intersects(
desktop->layout, output->wlr_output,
before->x, before->y, before->x + before->width,
before->y + before->height);
bool intersects = wlr_output_layout_intersects(
desktop->layout, output->wlr_output,
view->x, view->y, view->x + box.width, view->y + box.height);
if (intersected && !intersects) {
wlr_surface_send_leave(view->wlr_surface, output->wlr_output);
}
if (!intersected && intersects) {
wlr_surface_send_enter(view->wlr_surface, output->wlr_output);
}
}
}

void view_move(struct roots_view *view, double x, double y) {
struct wlr_box before;
view_get_size(view, &before);
if (view->move) {
view->move(view, x, y);
return;
} else {
view->x = x;
view->y = y;
}
}

view->x = x;
view->y = y;
void view_activate(struct roots_view *view, bool activate) {
if (view->activate) {
view->activate(view, activate);
}
}

void view_resize(struct roots_view *view, uint32_t width, uint32_t height) {
struct wlr_box before;
view_get_size(view, &before);
if (view->resize) {
view->resize(view, width, height);
}
view_update_output(view, &before);
}

void view_move_resize(struct roots_view *view, double x, double y,
Expand All @@ -85,8 +113,8 @@ void view_close(struct roots_view *view) {
}

bool view_center(struct roots_view *view) {
struct wlr_box size;
view_get_size(view, &size);
struct wlr_box box;
view_get_size(view, &box);

struct roots_desktop *desktop = view->desktop;
struct wlr_cursor *cursor = desktop->server->input->cursor;
Expand All @@ -109,19 +137,20 @@ bool view_center(struct roots_view *view) {
int width, height;
wlr_output_effective_resolution(output, &width, &height);

double view_x = (double)(width - size.width) / 2 + l_output->x;
double view_y = (double)(height - size.height) / 2 + l_output->y;

double view_x = (double)(width - box.width) / 2 + l_output->x;
double view_y = (double)(height - box.height) / 2 + l_output->y;
view_move(view, view_x, view_y);

return true;
}

void view_setup(struct roots_view *view) {
view_center(view);

struct roots_input *input = view->desktop->server->input;
view_center(view);
set_view_focus(input, view->desktop, view);
struct wlr_box before;
view_get_size(view, &before);
view_update_output(view, &before);
}

void view_teardown(struct roots_view *view) {
Expand Down
19 changes: 15 additions & 4 deletions rootston/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,13 @@ static void render_surface(struct wlr_surface *surface,
struct roots_desktop *desktop, struct wlr_output *wlr_output,
struct timespec *when, double lx, double ly, float rotation) {
if (surface->texture->valid) {
int width = surface->current->buffer_width;
int height = surface->current->buffer_height;
float scale_factor = (float)wlr_output->scale / surface->current->scale;
int width = surface->current->buffer_width * scale_factor;
int height = surface->current->buffer_height * scale_factor;
double ox = lx, oy = ly;
wlr_output_layout_output_coords(desktop->layout, wlr_output, &ox, &oy);
ox *= wlr_output->scale;
oy *= wlr_output->scale;

if (wlr_output_layout_intersects(desktop->layout, wlr_output,
lx, ly, lx + width, ly + height)) {
Expand All @@ -32,15 +35,22 @@ static void render_surface(struct wlr_surface *surface,
float translate_origin[16];
wlr_matrix_translate(&translate_origin,
(int)ox + width / 2, (int)oy + height / 2, 0);

float rotate[16];
wlr_matrix_rotate(&rotate, rotation);

float translate_center[16];
wlr_matrix_translate(&translate_center, -width / 2, -height / 2, 0);

float scale[16];
wlr_matrix_scale(&scale, width, height, 1);

float transform[16];
wlr_matrix_mul(&translate_origin, &rotate, &transform);
wlr_matrix_mul(&transform, &translate_center, &transform);
wlr_surface_get_matrix(surface, &matrix,
&wlr_output->transform_matrix, &transform);
wlr_matrix_mul(&transform, &scale, &transform);
wlr_matrix_mul(&wlr_output->transform_matrix, &transform, &matrix);

wlr_render_with_matrix(desktop->server->renderer,
surface->texture, &matrix);

Expand Down Expand Up @@ -217,6 +227,7 @@ void output_add_notify(struct wl_listener *listener, void *data) {
if (output_config->mode.width) {
set_mode(wlr_output, output_config);
}
wlr_output->scale = output_config->scale;
wlr_output_transform(wlr_output, output_config->transform);
wlr_output_layout_add(desktop->layout,
wlr_output, output_config->x, output_config->y);
Expand Down
2 changes: 1 addition & 1 deletion rootston/xdg_shell_v6.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include "rootston/server.h"
#include "rootston/input.h"

static void get_size(struct roots_view *view, struct wlr_box *box) {
static void get_size(const struct roots_view *view, struct wlr_box *box) {
assert(view->type == ROOTS_XDG_SHELL_V6_VIEW);
struct wlr_xdg_surface_v6 *surf = view->xdg_surface_v6;
// TODO: surf->geometry can be NULL
Expand Down
4 changes: 2 additions & 2 deletions types/wlr_cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,8 +261,8 @@ void wlr_cursor_warp_absolute(struct wlr_cursor *cur,
mapping = wlr_output_layout_get_box(cur->state->layout, NULL);
}

double x = mapping->width * x_mm + mapping->x;
double y = mapping->height * y_mm + mapping->y;
double x = x_mm > 0 ? mapping->width * x_mm + mapping->x : cur->x;
double y = y_mm > 0 ? mapping->height * y_mm + mapping->y : cur->y;

wlr_cursor_warp_unchecked(cur, x, y);
}
Expand Down
12 changes: 9 additions & 3 deletions types/wlr_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,14 +231,15 @@ void wlr_output_destroy(struct wlr_output *output) {

void wlr_output_effective_resolution(struct wlr_output *output,
int *width, int *height) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it's worth it to have doubles here too?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I'm not sure we get any benefit from that. This isn't a place where loss of precision impacts anything.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, we use it below for the cursor code:

https://github.com/swaywm/wlroots/pull/329/files#diff-8c8783fe608815c9626588d85b00f2f4R273

What we basically do is: (int)(width / scale) * scale.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, but there are no displays (or if there are, I've never heard of them) with odd dimensions so you are always going to be dealing with integers here anyway.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, so we should be fine for now. We won't be anymore when we'll introduce fractional scaling.

// TODO: Scale factor
if (output->transform % 2 == 1) {
*width = output->height;
*height = output->width;
} else {
*width = output->width;
*height = output->height;
}
*width /= output->scale;
*height /= output->scale;
}

void wlr_output_make_current(struct wlr_output *output) {
Expand Down Expand Up @@ -269,6 +270,8 @@ static void output_cursor_render(struct wlr_output_cursor *cursor) {
output_box.x = output_box.y = 0;
wlr_output_effective_resolution(cursor->output, &output_box.width,
&output_box.height);
output_box.width *= cursor->output->scale;
output_box.height *= cursor->output->scale;

struct wlr_box cursor_box;
output_cursor_get_box(cursor, &cursor_box);
Expand Down Expand Up @@ -471,7 +474,10 @@ void wlr_output_cursor_set_surface(struct wlr_output_cursor *cursor,
}
}

bool wlr_output_cursor_move(struct wlr_output_cursor *cursor, int x, int y) {
bool wlr_output_cursor_move(struct wlr_output_cursor *cursor,
double x, double y) {
x *= cursor->output->scale;
y *= cursor->output->scale;
cursor->x = x;
cursor->y = y;

Expand All @@ -483,7 +489,7 @@ bool wlr_output_cursor_move(struct wlr_output_cursor *cursor, int x, int y) {
if (!cursor->output->impl->move_cursor) {
return false;
}
return cursor->output->impl->move_cursor(cursor->output, x, y);
return cursor->output->impl->move_cursor(cursor->output, (int)x, (int)y);
}

struct wlr_output_cursor *wlr_output_cursor_create(struct wlr_output *output) {
Expand Down
28 changes: 26 additions & 2 deletions types/wlr_surface.c
Original file line number Diff line number Diff line change
Expand Up @@ -649,8 +649,8 @@ void wlr_surface_get_matrix(struct wlr_surface *surface,
float (*matrix)[16],
const float (*projection)[16],
const float (*transform)[16]) {
int width = surface->texture->width / surface->current->scale;
int height = surface->texture->height / surface->current->scale;
int width = surface->texture->width;
int height = surface->texture->height;
float scale[16];
wlr_matrix_identity(matrix);
if (transform) {
Expand Down Expand Up @@ -905,3 +905,27 @@ struct wlr_subsurface *wlr_surface_subsurface_at(struct wlr_surface *surface,

return NULL;
}

void wlr_surface_send_enter(struct wlr_surface *surface,
struct wlr_output *output) {
struct wl_client *client = wl_resource_get_client(surface->resource);
struct wl_resource *resource;
wl_resource_for_each(resource, &output->wl_resources) {
if (client == wl_resource_get_client(resource)) {
wl_surface_send_enter(surface->resource, resource);
break;
}
}
}

void wlr_surface_send_leave(struct wlr_surface *surface,
struct wlr_output *output) {
struct wl_client *client = wl_resource_get_client(surface->resource);
struct wl_resource *resource;
wl_resource_for_each(resource, &output->wl_resources) {
if (client == wl_resource_get_client(resource)) {
wl_surface_send_leave(surface->resource, resource);
break;
}
}
}