mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -05:00
ssd: add ssd_interactive_box()
...which is used by desktop_view_at() and ssd_at() to determine which decoration part is under the cursor. ssd_interactive_box() allows deocoration parts to extend outside the visible regions, and therefore supports a wider 'resize-edges' area than the border itself.
This commit is contained in:
parent
82e47ac1f5
commit
399322052b
3 changed files with 110 additions and 58 deletions
|
|
@ -48,6 +48,7 @@ struct border ssd_thickness(struct view *view);
|
||||||
struct wlr_box ssd_max_extents(struct view *view);
|
struct wlr_box ssd_max_extents(struct view *view);
|
||||||
struct wlr_box ssd_box(struct view *view, enum ssd_part_type type);
|
struct wlr_box ssd_box(struct view *view, enum ssd_part_type type);
|
||||||
enum ssd_part_type ssd_at(struct view *view, double lx, double ly);
|
enum ssd_part_type ssd_at(struct view *view, double lx, double ly);
|
||||||
|
uint32_t ssd_resize_edges(enum ssd_part_type type);
|
||||||
void ssd_create(struct view *view);
|
void ssd_create(struct view *view);
|
||||||
void ssd_destroy(struct view *view);
|
void ssd_destroy(struct view *view);
|
||||||
void ssd_update_geometry(struct view *view);
|
void ssd_update_geometry(struct view *view);
|
||||||
|
|
|
||||||
43
src/cursor.c
43
src/cursor.c
|
|
@ -4,39 +4,6 @@
|
||||||
#include "menu/menu.h"
|
#include "menu/menu.h"
|
||||||
#include "ssd.h"
|
#include "ssd.h"
|
||||||
|
|
||||||
#define RESIZE_BORDER_WIDTH 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: refactor code to get rid of get_resize_edges()
|
|
||||||
* Use a wl_list of SSD instead and build RESIZE_BORDER_WIDTH into that.
|
|
||||||
* Had to set RESIZE_BORDER_WIDTH to 2 for the time being to get
|
|
||||||
* cursor_name to behave properly when entering surface
|
|
||||||
*/
|
|
||||||
static uint32_t
|
|
||||||
get_resize_edges(struct view *view, double x, double y)
|
|
||||||
{
|
|
||||||
uint32_t edges = 0;
|
|
||||||
int top, right, bottom, left;
|
|
||||||
|
|
||||||
top = view->y - view->margin.top;
|
|
||||||
left = view->x - view->margin.left;
|
|
||||||
bottom = top + view->h + view->margin.top + view->margin.bottom;
|
|
||||||
right = left + view->w + view->margin.left + view->margin.right;
|
|
||||||
|
|
||||||
if (top <= y && y < top + RESIZE_BORDER_WIDTH) {
|
|
||||||
edges |= WLR_EDGE_TOP;
|
|
||||||
} else if (bottom - RESIZE_BORDER_WIDTH <= y && y < bottom) {
|
|
||||||
edges |= WLR_EDGE_BOTTOM;
|
|
||||||
}
|
|
||||||
if (left <= x && x < left + RESIZE_BORDER_WIDTH) {
|
|
||||||
edges |= WLR_EDGE_LEFT;
|
|
||||||
} else if (right - RESIZE_BORDER_WIDTH <= x && x < right) {
|
|
||||||
edges |= WLR_EDGE_RIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return edges;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
request_cursor_notify(struct wl_listener *listener, void *data)
|
request_cursor_notify(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
|
|
@ -149,12 +116,11 @@ process_cursor_motion(struct server *server, uint32_t time)
|
||||||
if (!view) {
|
if (!view) {
|
||||||
cursor_name = XCURSOR_DEFAULT;
|
cursor_name = XCURSOR_DEFAULT;
|
||||||
} else {
|
} else {
|
||||||
uint32_t resize_edges = get_resize_edges(
|
uint32_t resize_edges = ssd_resize_edges(view_area);
|
||||||
view, server->seat.cursor->x, server->seat.cursor->y);
|
|
||||||
switch (resize_edges) {
|
switch (resize_edges) {
|
||||||
case 0:
|
case 0:
|
||||||
if (rc.focus_follow_mouse){
|
if (rc.focus_follow_mouse) {
|
||||||
if (rc.raise_on_focus){
|
if (rc.raise_on_focus) {
|
||||||
desktop_focus_view(&server->seat, view);
|
desktop_focus_view(&server->seat, view);
|
||||||
} else {
|
} else {
|
||||||
desktop_set_focus_view_only(&server->seat, view);
|
desktop_set_focus_view_only(&server->seat, view);
|
||||||
|
|
@ -361,8 +327,7 @@ cursor_button(struct wl_listener *listener, void *data)
|
||||||
desktop_focus_view(&server->seat, view);
|
desktop_focus_view(&server->seat, view);
|
||||||
damage_all_outputs(server);
|
damage_all_outputs(server);
|
||||||
|
|
||||||
resize_edges = get_resize_edges(view, server->seat.cursor->x,
|
resize_edges = ssd_resize_edges(view_area);
|
||||||
server->seat.cursor->y);
|
|
||||||
if (resize_edges != 0) {
|
if (resize_edges != 0) {
|
||||||
interactive_begin(view, LAB_INPUT_STATE_RESIZE, resize_edges);
|
interactive_begin(view, LAB_INPUT_STATE_RESIZE, resize_edges);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
124
src/ssd.c
124
src/ssd.c
|
|
@ -10,6 +10,8 @@
|
||||||
#include "theme.h"
|
#include "theme.h"
|
||||||
#include "ssd.h"
|
#include "ssd.h"
|
||||||
|
|
||||||
|
#define INVISIBLE_MARGIN (16)
|
||||||
|
|
||||||
struct border
|
struct border
|
||||||
ssd_thickness(struct view *view)
|
ssd_thickness(struct view *view)
|
||||||
{
|
{
|
||||||
|
|
@ -36,13 +38,12 @@ ssd_max_extents(struct view *view)
|
||||||
return box;
|
return box;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_box
|
static struct wlr_box
|
||||||
ssd_box(struct view *view, enum ssd_part_type type)
|
ssd_interactive_box(struct view *view, enum ssd_part_type type)
|
||||||
{
|
{
|
||||||
struct theme *theme = view->server->theme;
|
struct theme *theme = view->server->theme;
|
||||||
struct wlr_box box = { 0 };
|
struct wlr_box box = { 0 };
|
||||||
int corner_square = theme->title_height + theme->border_width;
|
int corner_square = theme->title_height + theme->border_width;
|
||||||
assert(view);
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case LAB_SSD_BUTTON_CLOSE:
|
case LAB_SSD_BUTTON_CLOSE:
|
||||||
box.x = view->x + view->w - theme->title_height;
|
box.x = view->x + view->w - theme->title_height;
|
||||||
|
|
@ -63,46 +64,103 @@ ssd_box(struct view *view, enum ssd_part_type type)
|
||||||
box.height = theme->title_height;
|
box.height = theme->title_height;
|
||||||
break;
|
break;
|
||||||
case LAB_SSD_PART_TITLE:
|
case LAB_SSD_PART_TITLE:
|
||||||
box.x = view->x + theme->title_height;
|
box.x = view->x;
|
||||||
box.y = view->y - theme->title_height;
|
box.y = view->y - theme->title_height;
|
||||||
box.width = view->w - 2 * theme->title_height;
|
box.width = view->w;
|
||||||
box.height = theme->title_height;
|
box.height = theme->title_height;
|
||||||
break;
|
break;
|
||||||
case LAB_SSD_PART_TOP:
|
case LAB_SSD_PART_TOP:
|
||||||
box.x = view->x + theme->title_height;
|
box.x = view->x + theme->title_height;
|
||||||
box.y = view->y - corner_square;
|
box.y = view->y - corner_square - INVISIBLE_MARGIN;
|
||||||
box.width = view->w - 2 * theme->title_height;
|
box.width = view->w - 2 * theme->title_height;
|
||||||
box.height = theme->border_width;
|
box.height = theme->border_width + INVISIBLE_MARGIN;
|
||||||
break;
|
break;
|
||||||
case LAB_SSD_PART_RIGHT:
|
case LAB_SSD_PART_RIGHT:
|
||||||
box.x = view->x + view->w;
|
box.x = view->x + view->w;
|
||||||
box.y = view->y;
|
box.y = view->y;
|
||||||
box.width = theme->border_width;
|
box.width = theme->border_width + INVISIBLE_MARGIN;
|
||||||
box.height = view->h;
|
box.height = view->h;
|
||||||
break;
|
break;
|
||||||
case LAB_SSD_PART_BOTTOM:
|
case LAB_SSD_PART_BOTTOM:
|
||||||
box.x = view->x - theme->border_width;
|
box.x = view->x - theme->border_width;
|
||||||
box.y = view->y + view->h;
|
box.y = view->y + view->h;
|
||||||
box.width = view->w + 2 * theme->border_width;
|
box.width = view->w + 2 * theme->border_width;
|
||||||
box.height = +theme->border_width;
|
box.height = +theme->border_width + INVISIBLE_MARGIN;
|
||||||
break;
|
break;
|
||||||
case LAB_SSD_PART_LEFT:
|
case LAB_SSD_PART_LEFT:
|
||||||
box.x = view->x - theme->border_width;
|
box.x = view->x - theme->border_width - INVISIBLE_MARGIN;
|
||||||
box.y = view->y;
|
box.y = view->y;
|
||||||
box.width = theme->border_width;
|
box.width = theme->border_width + INVISIBLE_MARGIN;
|
||||||
box.height = view->h;
|
box.height = view->h;
|
||||||
break;
|
break;
|
||||||
case LAB_SSD_PART_CORNER_TOP_LEFT:
|
case LAB_SSD_PART_CORNER_TOP_LEFT:
|
||||||
box.x = view->x - theme->border_width;
|
box.x = view->x - theme->border_width - INVISIBLE_MARGIN;
|
||||||
box.y = view->y - corner_square;
|
box.y = view->y - corner_square - INVISIBLE_MARGIN;
|
||||||
box.width = corner_square;
|
box.width = corner_square + INVISIBLE_MARGIN;
|
||||||
box.height = corner_square;
|
box.height = corner_square + INVISIBLE_MARGIN;
|
||||||
break;
|
break;
|
||||||
case LAB_SSD_PART_CORNER_TOP_RIGHT:
|
case LAB_SSD_PART_CORNER_TOP_RIGHT:
|
||||||
box.x = view->x + view->w - theme->title_height;
|
box.x = view->x + view->w - theme->title_height;
|
||||||
box.y = view->y - corner_square;
|
box.y = view->y - corner_square - INVISIBLE_MARGIN;
|
||||||
box.width = corner_square;
|
box.width = corner_square + INVISIBLE_MARGIN;
|
||||||
box.height = corner_square;
|
box.height = corner_square + INVISIBLE_MARGIN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wlr_box
|
||||||
|
ssd_box(struct view *view, enum ssd_part_type type)
|
||||||
|
{
|
||||||
|
struct theme *theme = view->server->theme;
|
||||||
|
struct wlr_box box = { 0 };
|
||||||
|
switch (type) {
|
||||||
|
case LAB_SSD_BUTTON_CLOSE:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
break;
|
||||||
|
case LAB_SSD_BUTTON_MAXIMIZE:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
break;
|
||||||
|
case LAB_SSD_BUTTON_ICONIFY:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
break;
|
||||||
|
case LAB_SSD_PART_TITLE:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
box.x += theme->title_height;
|
||||||
|
box.width -= 2 * theme->title_height;
|
||||||
|
break;
|
||||||
|
case LAB_SSD_PART_TOP:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
box.y += INVISIBLE_MARGIN;
|
||||||
|
box.height -= INVISIBLE_MARGIN;
|
||||||
|
break;
|
||||||
|
case LAB_SSD_PART_RIGHT:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
box.width -= INVISIBLE_MARGIN;
|
||||||
|
break;
|
||||||
|
case LAB_SSD_PART_BOTTOM:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
box.height -= INVISIBLE_MARGIN;
|
||||||
|
break;
|
||||||
|
case LAB_SSD_PART_LEFT:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
box.x += INVISIBLE_MARGIN;
|
||||||
|
box.width -= INVISIBLE_MARGIN;
|
||||||
|
break;
|
||||||
|
case LAB_SSD_PART_CORNER_TOP_LEFT:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
box.x += INVISIBLE_MARGIN;
|
||||||
|
box.y += INVISIBLE_MARGIN;
|
||||||
|
box.width -= INVISIBLE_MARGIN;
|
||||||
|
box.height -= INVISIBLE_MARGIN;
|
||||||
|
break;
|
||||||
|
case LAB_SSD_PART_CORNER_TOP_RIGHT:
|
||||||
|
box = ssd_interactive_box(view, type);
|
||||||
|
box.y += INVISIBLE_MARGIN;
|
||||||
|
box.width -= INVISIBLE_MARGIN;
|
||||||
|
box.height -= INVISIBLE_MARGIN;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
@ -115,7 +173,7 @@ ssd_at(struct view *view, double lx, double ly)
|
||||||
{
|
{
|
||||||
enum ssd_part_type type;
|
enum ssd_part_type type;
|
||||||
for (type = 0; type < LAB_SSD_END_MARKER; ++type) {
|
for (type = 0; type < LAB_SSD_END_MARKER; ++type) {
|
||||||
struct wlr_box box = ssd_box(view, type);
|
struct wlr_box box = ssd_interactive_box(view, type);
|
||||||
if (wlr_box_contains_point(&box, lx, ly)) {
|
if (wlr_box_contains_point(&box, lx, ly)) {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
@ -123,6 +181,34 @@ ssd_at(struct view *view, double lx, double ly)
|
||||||
return LAB_SSD_NONE;
|
return LAB_SSD_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t
|
||||||
|
ssd_resize_edges(enum ssd_part_type type)
|
||||||
|
{
|
||||||
|
uint32_t edges = 0;
|
||||||
|
|
||||||
|
if (type == LAB_SSD_PART_TOP) {
|
||||||
|
edges |= WLR_EDGE_TOP;
|
||||||
|
}
|
||||||
|
if (type == LAB_SSD_PART_RIGHT) {
|
||||||
|
edges |= WLR_EDGE_RIGHT;
|
||||||
|
}
|
||||||
|
if (type == LAB_SSD_PART_BOTTOM) {
|
||||||
|
edges |= WLR_EDGE_BOTTOM;
|
||||||
|
}
|
||||||
|
if (type == LAB_SSD_PART_LEFT) {
|
||||||
|
edges |= WLR_EDGE_LEFT;
|
||||||
|
}
|
||||||
|
if (type == LAB_SSD_PART_CORNER_TOP_RIGHT) {
|
||||||
|
edges = WLR_EDGE_RIGHT | WLR_EDGE_TOP;
|
||||||
|
}
|
||||||
|
if (type == LAB_SSD_PART_CORNER_TOP_LEFT) {
|
||||||
|
edges |= WLR_EDGE_TOP;
|
||||||
|
edges |= WLR_EDGE_LEFT;
|
||||||
|
}
|
||||||
|
return edges;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct ssd_part *
|
static struct ssd_part *
|
||||||
add_part(struct view *view, enum ssd_part_type type)
|
add_part(struct view *view, enum ssd_part_type type)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue