mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
This commit is contained in:
parent
1b575ce816
commit
48ba23fc8d
9 changed files with 105 additions and 96 deletions
|
|
@ -3,7 +3,7 @@
|
||||||
#define LABWC_DIRECTION_H
|
#define LABWC_DIRECTION_H
|
||||||
|
|
||||||
#include <wlr/types/wlr_output_layout.h>
|
#include <wlr/types/wlr_output_layout.h>
|
||||||
#include "config/types.h"
|
#include "common/edge.h"
|
||||||
|
|
||||||
bool direction_from_edge(enum lab_edge edge, enum wlr_direction *direction);
|
bool direction_from_edge(enum lab_edge edge, enum wlr_direction *direction);
|
||||||
enum wlr_direction direction_get_opposite(enum wlr_direction direction);
|
enum wlr_direction direction_get_opposite(enum wlr_direction direction);
|
||||||
|
|
|
||||||
38
include/common/edge.h
Normal file
38
include/common/edge.h
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
#ifndef LABWC_EDGE_H
|
||||||
|
#define LABWC_EDGE_H
|
||||||
|
|
||||||
|
#include <wayland-server-core.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an edge or direction (e.g. window tiling, window motion)
|
||||||
|
*/
|
||||||
|
enum lab_edge {
|
||||||
|
LAB_EDGE_INVALID = 0,
|
||||||
|
|
||||||
|
LAB_EDGE_LEFT = (1 << 0),
|
||||||
|
LAB_EDGE_RIGHT = (1 << 1),
|
||||||
|
LAB_EDGE_UP = (1 << 2),
|
||||||
|
LAB_EDGE_DOWN = (1 << 3),
|
||||||
|
LAB_EDGE_CENTER = (1 << 4), /* for window tiling */
|
||||||
|
LAB_EDGE_ANY = (1 << 5), /* for window rules */
|
||||||
|
|
||||||
|
/* for window tiling */
|
||||||
|
LAB_EDGE_UPLEFT = (LAB_EDGE_UP | LAB_EDGE_LEFT),
|
||||||
|
LAB_EDGE_UPRIGHT = (LAB_EDGE_UP | LAB_EDGE_RIGHT),
|
||||||
|
LAB_EDGE_DOWNLEFT = (LAB_EDGE_DOWN | LAB_EDGE_LEFT),
|
||||||
|
LAB_EDGE_DOWNRIGHT = (LAB_EDGE_DOWN | LAB_EDGE_RIGHT),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum lab_edge lab_edge_parse(const char *direction, bool tiled, bool any);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lab_edge_invert() - select the opposite of a provided edge
|
||||||
|
*
|
||||||
|
* Returns LAB_EDGE_INVALID for edges other than UP/DOWN/LEFT/RIGHT.
|
||||||
|
*
|
||||||
|
* @edge: edge to be inverted
|
||||||
|
*/
|
||||||
|
enum lab_edge lab_edge_invert(enum lab_edge edge);
|
||||||
|
|
||||||
|
#endif /* LABWC_EDGE_H */
|
||||||
|
|
@ -11,28 +11,6 @@
|
||||||
* For the full config struct, see config/rcxml.h.
|
* For the full config struct, see config/rcxml.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Edges to which a view can be snapped. "Any" is used as
|
|
||||||
* a catch-all for every valid edge in order to simplify certain
|
|
||||||
* types of conditionals, but it is only valid for a selection
|
|
||||||
* of options in rc.xml.
|
|
||||||
*/
|
|
||||||
enum lab_edge {
|
|
||||||
LAB_EDGE_INVALID = 0,
|
|
||||||
|
|
||||||
LAB_EDGE_LEFT = (1 << 0),
|
|
||||||
LAB_EDGE_RIGHT = (1 << 1),
|
|
||||||
LAB_EDGE_UP = (1 << 2),
|
|
||||||
LAB_EDGE_DOWN = (1 << 3),
|
|
||||||
LAB_EDGE_CENTER = (1 << 4),
|
|
||||||
LAB_EDGE_ANY = (1 << 5),
|
|
||||||
|
|
||||||
LAB_EDGE_UPLEFT = (LAB_EDGE_UP | LAB_EDGE_LEFT),
|
|
||||||
LAB_EDGE_UPRIGHT = (LAB_EDGE_UP | LAB_EDGE_RIGHT),
|
|
||||||
LAB_EDGE_DOWNLEFT = (LAB_EDGE_DOWN | LAB_EDGE_LEFT),
|
|
||||||
LAB_EDGE_DOWNRIGHT = (LAB_EDGE_DOWN | LAB_EDGE_RIGHT),
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether tablet tool motion events should be reported using
|
* Indicates whether tablet tool motion events should be reported using
|
||||||
* absolute or relative coordinates
|
* absolute or relative coordinates
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include <wayland-util.h>
|
#include <wayland-util.h>
|
||||||
#include <wlr/util/box.h>
|
#include <wlr/util/box.h>
|
||||||
#include <xkbcommon/xkbcommon.h>
|
#include <xkbcommon/xkbcommon.h>
|
||||||
|
#include "common/edge.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "config/types.h"
|
#include "config/types.h"
|
||||||
|
|
||||||
|
|
@ -422,15 +423,6 @@ void view_array_append(struct server *server, struct wl_array *views,
|
||||||
enum view_wants_focus view_wants_focus(struct view *view);
|
enum view_wants_focus view_wants_focus(struct view *view);
|
||||||
bool view_contains_window_type(struct view *view, enum lab_window_type window_type);
|
bool view_contains_window_type(struct view *view, enum lab_window_type window_type);
|
||||||
|
|
||||||
/**
|
|
||||||
* view_edge_invert() - select the opposite of a provided edge
|
|
||||||
*
|
|
||||||
* LAB_EDGE_CENTER and LAB_EDGE_INVALID both map to LAB_EDGE_INVALID.
|
|
||||||
*
|
|
||||||
* @edge: edge to be inverted
|
|
||||||
*/
|
|
||||||
enum lab_edge view_edge_invert(enum lab_edge edge);
|
|
||||||
|
|
||||||
/* If view is NULL, the size of SSD is not considered */
|
/* If view is NULL, the size of SSD is not considered */
|
||||||
struct wlr_box view_get_edge_snap_box(struct view *view, struct output *output,
|
struct wlr_box view_get_edge_snap_box(struct view *view, struct output *output,
|
||||||
enum lab_edge edge);
|
enum lab_edge edge);
|
||||||
|
|
@ -601,7 +593,6 @@ void view_init(struct view *view);
|
||||||
void view_destroy(struct view *view);
|
void view_destroy(struct view *view);
|
||||||
|
|
||||||
enum view_axis view_axis_parse(const char *direction);
|
enum view_axis view_axis_parse(const char *direction);
|
||||||
enum lab_edge view_edge_parse(const char *direction, bool tiled, bool any);
|
|
||||||
enum lab_placement_policy view_placement_parse(const char *policy);
|
enum lab_placement_policy view_placement_parse(const char *policy);
|
||||||
|
|
||||||
/* xdg.c */
|
/* xdg.c */
|
||||||
|
|
|
||||||
|
|
@ -347,7 +347,7 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
|
||||||
if (!strcmp(argument, "direction")) {
|
if (!strcmp(argument, "direction")) {
|
||||||
bool tiled = (action->type == ACTION_TYPE_TOGGLE_SNAP_TO_EDGE
|
bool tiled = (action->type == ACTION_TYPE_TOGGLE_SNAP_TO_EDGE
|
||||||
|| action->type == ACTION_TYPE_SNAP_TO_EDGE);
|
|| action->type == ACTION_TYPE_SNAP_TO_EDGE);
|
||||||
enum lab_edge edge = view_edge_parse(content, tiled, /*any*/ false);
|
enum lab_edge edge = lab_edge_parse(content, tiled, /*any*/ false);
|
||||||
if (edge == LAB_EDGE_INVALID) {
|
if (edge == LAB_EDGE_INVALID) {
|
||||||
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
|
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
|
||||||
action_names[action->type], argument, content);
|
action_names[action->type], argument, content);
|
||||||
|
|
@ -455,7 +455,7 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (!strcmp(argument, "direction")) {
|
if (!strcmp(argument, "direction")) {
|
||||||
enum lab_edge edge = view_edge_parse(content,
|
enum lab_edge edge = lab_edge_parse(content,
|
||||||
/*tiled*/ false, /*any*/ false);
|
/*tiled*/ false, /*any*/ false);
|
||||||
if (edge == LAB_EDGE_INVALID) {
|
if (edge == LAB_EDGE_INVALID) {
|
||||||
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
|
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
|
||||||
|
|
|
||||||
59
src/common/edge.c
Normal file
59
src/common/edge.c
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
#include "common/edge.h"
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
|
enum lab_edge
|
||||||
|
lab_edge_parse(const char *direction, bool tiled, bool any)
|
||||||
|
{
|
||||||
|
if (!direction) {
|
||||||
|
return LAB_EDGE_INVALID;
|
||||||
|
}
|
||||||
|
if (!strcasecmp(direction, "left")) {
|
||||||
|
return LAB_EDGE_LEFT;
|
||||||
|
} else if (!strcasecmp(direction, "up")) {
|
||||||
|
return LAB_EDGE_UP;
|
||||||
|
} else if (!strcasecmp(direction, "right")) {
|
||||||
|
return LAB_EDGE_RIGHT;
|
||||||
|
} else if (!strcasecmp(direction, "down")) {
|
||||||
|
return LAB_EDGE_DOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (any) {
|
||||||
|
if (!strcasecmp(direction, "any")) {
|
||||||
|
return LAB_EDGE_ANY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tiled) {
|
||||||
|
if (!strcasecmp(direction, "center")) {
|
||||||
|
return LAB_EDGE_CENTER;
|
||||||
|
} else if (!strcasecmp(direction, "up-left")) {
|
||||||
|
return LAB_EDGE_UPLEFT;
|
||||||
|
} else if (!strcasecmp(direction, "up-right")) {
|
||||||
|
return LAB_EDGE_UPRIGHT;
|
||||||
|
} else if (!strcasecmp(direction, "down-left")) {
|
||||||
|
return LAB_EDGE_DOWNLEFT;
|
||||||
|
} else if (!strcasecmp(direction, "down-right")) {
|
||||||
|
return LAB_EDGE_DOWNRIGHT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return LAB_EDGE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum lab_edge
|
||||||
|
lab_edge_invert(enum lab_edge edge)
|
||||||
|
{
|
||||||
|
switch (edge) {
|
||||||
|
case LAB_EDGE_LEFT:
|
||||||
|
return LAB_EDGE_RIGHT;
|
||||||
|
case LAB_EDGE_RIGHT:
|
||||||
|
return LAB_EDGE_LEFT;
|
||||||
|
case LAB_EDGE_UP:
|
||||||
|
return LAB_EDGE_DOWN;
|
||||||
|
case LAB_EDGE_DOWN:
|
||||||
|
return LAB_EDGE_UP;
|
||||||
|
default:
|
||||||
|
return LAB_EDGE_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@ labwc_sources += files(
|
||||||
'box.c',
|
'box.c',
|
||||||
'buf.c',
|
'buf.c',
|
||||||
'dir.c',
|
'dir.c',
|
||||||
|
'edge.c',
|
||||||
'fd-util.c',
|
'fd-util.c',
|
||||||
'file-helpers.c',
|
'file-helpers.c',
|
||||||
'font.c',
|
'font.c',
|
||||||
|
|
|
||||||
|
|
@ -444,7 +444,7 @@ fill_action_query(struct action *action, xmlNode *node, struct view_query *query
|
||||||
} else if (!strcasecmp(key, "omnipresent")) {
|
} else if (!strcasecmp(key, "omnipresent")) {
|
||||||
query->omnipresent = parse_tristate(content);
|
query->omnipresent = parse_tristate(content);
|
||||||
} else if (!strcasecmp(key, "tiled")) {
|
} else if (!strcasecmp(key, "tiled")) {
|
||||||
query->tiled = view_edge_parse(content,
|
query->tiled = lab_edge_parse(content,
|
||||||
/*tiled*/ true, /*any*/ true);
|
/*tiled*/ true, /*any*/ true);
|
||||||
} else if (!strcasecmp(key, "tiled_region")) {
|
} else if (!strcasecmp(key, "tiled_region")) {
|
||||||
xstrdup_replace(query->tiled_region, content);
|
xstrdup_replace(query->tiled_region, content);
|
||||||
|
|
|
||||||
62
src/view.c
62
src/view.c
|
|
@ -429,25 +429,6 @@ view_offer_focus(struct view *view)
|
||||||
* They may be called repeatably during output layout changes.
|
* They may be called repeatably during output layout changes.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum lab_edge
|
|
||||||
view_edge_invert(enum lab_edge edge)
|
|
||||||
{
|
|
||||||
switch (edge) {
|
|
||||||
case LAB_EDGE_LEFT:
|
|
||||||
return LAB_EDGE_RIGHT;
|
|
||||||
case LAB_EDGE_RIGHT:
|
|
||||||
return LAB_EDGE_LEFT;
|
|
||||||
case LAB_EDGE_UP:
|
|
||||||
return LAB_EDGE_DOWN;
|
|
||||||
case LAB_EDGE_DOWN:
|
|
||||||
return LAB_EDGE_UP;
|
|
||||||
case LAB_EDGE_CENTER:
|
|
||||||
case LAB_EDGE_INVALID:
|
|
||||||
default:
|
|
||||||
return LAB_EDGE_INVALID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct wlr_box
|
struct wlr_box
|
||||||
view_get_edge_snap_box(struct view *view, struct output *output,
|
view_get_edge_snap_box(struct view *view, struct output *output,
|
||||||
enum lab_edge edge)
|
enum lab_edge edge)
|
||||||
|
|
@ -2020,7 +2001,7 @@ view_move_to_edge(struct view *view, enum lab_edge direction, bool snap_to_windo
|
||||||
int destination_y = view->pending.y;
|
int destination_y = view->pending.y;
|
||||||
|
|
||||||
/* Compute the new position in the direction of motion */
|
/* Compute the new position in the direction of motion */
|
||||||
direction = view_edge_invert(direction);
|
direction = lab_edge_invert(direction);
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case LAB_EDGE_LEFT:
|
case LAB_EDGE_LEFT:
|
||||||
destination_x = left;
|
destination_x = left;
|
||||||
|
|
@ -2120,45 +2101,6 @@ view_axis_parse(const char *direction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum lab_edge
|
|
||||||
view_edge_parse(const char *direction, bool tiled, bool any)
|
|
||||||
{
|
|
||||||
if (!direction) {
|
|
||||||
return LAB_EDGE_INVALID;
|
|
||||||
}
|
|
||||||
if (!strcasecmp(direction, "left")) {
|
|
||||||
return LAB_EDGE_LEFT;
|
|
||||||
} else if (!strcasecmp(direction, "up")) {
|
|
||||||
return LAB_EDGE_UP;
|
|
||||||
} else if (!strcasecmp(direction, "right")) {
|
|
||||||
return LAB_EDGE_RIGHT;
|
|
||||||
} else if (!strcasecmp(direction, "down")) {
|
|
||||||
return LAB_EDGE_DOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (any) {
|
|
||||||
if (!strcasecmp(direction, "any")) {
|
|
||||||
return LAB_EDGE_ANY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tiled) {
|
|
||||||
if (!strcasecmp(direction, "center")) {
|
|
||||||
return LAB_EDGE_CENTER;
|
|
||||||
} else if (!strcasecmp(direction, "up-left")) {
|
|
||||||
return LAB_EDGE_UPLEFT;
|
|
||||||
} else if (!strcasecmp(direction, "up-right")) {
|
|
||||||
return LAB_EDGE_UPRIGHT;
|
|
||||||
} else if (!strcasecmp(direction, "down-left")) {
|
|
||||||
return LAB_EDGE_DOWNLEFT;
|
|
||||||
} else if (!strcasecmp(direction, "down-right")) {
|
|
||||||
return LAB_EDGE_DOWNRIGHT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return LAB_EDGE_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum lab_placement_policy
|
enum lab_placement_policy
|
||||||
view_placement_parse(const char *policy)
|
view_placement_parse(const char *policy)
|
||||||
{
|
{
|
||||||
|
|
@ -2215,7 +2157,7 @@ view_snap_to_edge(struct view *view, enum lab_edge edge,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When switching outputs, jump to the opposite edge */
|
/* When switching outputs, jump to the opposite edge */
|
||||||
edge = view_edge_invert(edge);
|
edge = lab_edge_invert(edge);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view->maximized != VIEW_AXIS_NONE) {
|
if (view->maximized != VIEW_AXIS_NONE) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue