#define LABWC_DIRECTION_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);
enum wlr_direction direction_get_opposite(enum wlr_direction direction);
--- /dev/null
+/* 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 */
* 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
* absolute or relative coordinates
#include <wayland-util.h>
#include <wlr/util/box.h>
#include <xkbcommon/xkbcommon.h>
+#include "common/edge.h"
#include "config.h"
#include "config/types.h"
enum view_wants_focus view_wants_focus(struct view *view);
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 */
struct wlr_box view_get_edge_snap_box(struct view *view, struct output *output,
enum lab_edge edge);
void view_destroy(struct view *view);
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);
/* xdg.c */
if (!strcmp(argument, "direction")) {
bool tiled = (action->type == ACTION_TYPE_TOGGLE_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) {
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
action_names[action->type], argument, content);
goto cleanup;
}
if (!strcmp(argument, "direction")) {
- enum lab_edge edge = view_edge_parse(content,
+ enum lab_edge edge = lab_edge_parse(content,
/*tiled*/ false, /*any*/ false);
if (edge == LAB_EDGE_INVALID) {
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
--- /dev/null
+// 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;
+ }
+}
'box.c',
'buf.c',
'dir.c',
+ 'edge.c',
'fd-util.c',
'file-helpers.c',
'font.c',
} else if (!strcasecmp(key, "omnipresent")) {
query->omnipresent = parse_tristate(content);
} else if (!strcasecmp(key, "tiled")) {
- query->tiled = view_edge_parse(content,
+ query->tiled = lab_edge_parse(content,
/*tiled*/ true, /*any*/ true);
} else if (!strcasecmp(key, "tiled_region")) {
xstrdup_replace(query->tiled_region, content);
* 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
view_get_edge_snap_box(struct view *view, struct output *output,
enum lab_edge edge)
int destination_y = view->pending.y;
/* Compute the new position in the direction of motion */
- direction = view_edge_invert(direction);
+ direction = lab_edge_invert(direction);
switch (direction) {
case LAB_EDGE_LEFT:
destination_x = left;
}
}
-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
view_placement_parse(const char *policy)
{
}
/* When switching outputs, jump to the opposite edge */
- edge = view_edge_invert(edge);
+ edge = lab_edge_invert(edge);
}
if (view->maximized != VIEW_AXIS_NONE) {