};
struct output {
- struct wl_list link;
+ struct wl_list link; /* server::outputs */
struct server *server;
struct wlr_output *wlr_output;
struct wlr_output_damage *damage;
*/
struct view *desktop_cycle_view(struct server *server, struct view *current);
void desktop_focus_topmost_mapped_view(struct server *server);
+
+/**
+ * desktop_view_at - find view or layer-surface at co-ordinate (lx, ly)
+ * Note: If surface points to layer-surface, view will be set to NULL
+ */
struct view *desktop_view_at(struct server *server, double lx, double ly,
- struct wlr_surface **surface, double *sx,
- double *sy, int *view_area);
+ struct wlr_surface **surface, double *sx, double *sy, int *view_area);
void cursor_init(struct seat *seat);
void scale_box(struct wlr_box *box, float scale);
void output_manager_init(struct server *server);
+struct output *output_from_wlr_output(struct server *server, struct wlr_output *wlr_output);
void damage_all_outputs(struct server *server);
void damage_view_whole(struct view *view);
struct wlr_surface *surface;
int view_area;
uint32_t resize_edges;
+
struct view *view = desktop_view_at(server, server->seat.cursor->x,
server->seat.cursor->y, &surface, &sx, &sy, &view_area);
return;
}
- /* handle _press_ on desktop */
+ /* Handle _press_ on a layer surface */
+ if (!view && surface) {
+ /* ...if we've ended up here it must be a layer surface */
+ assert(wlr_surface_is_layer_surface(surface));
+ struct wlr_layer_surface_v1 *layer = wlr_layer_surface_v1_from_wlr_surface(surface);
+ if (layer->current.keyboard_interactive) {
+ seat_set_focus_layer(&server->seat, layer);
+ }
+ return;
+ }
+
+ /* Handle _press_ on root window */
if (!view) {
- /* launch root-menu */
action(server, "ShowMenu", "root-menu");
return;
}
#include "config.h"
#include <assert.h>
#include "labwc.h"
+#include "layers.h"
#include "ssd.h"
static void
return false;
}
+static struct
+wlr_surface *layer_surface_at(struct wl_list *layer, double lx, double ly,
+ double *sx, double *sy)
+{
+ struct lab_layer_surface *surface;
+ wl_list_for_each_reverse(surface, layer, link) {
+ double _sx = lx - surface->geo.x;
+ double _sy = ly - surface->geo.y;
+ struct wlr_surface *wlr_surface;
+ wlr_surface = wlr_layer_surface_v1_surface_at(surface->layer_surface,
+ _sx, _sy, sx, sy);
+ if (wlr_surface) {
+ return wlr_surface;
+ }
+ }
+ return NULL;
+}
+
struct view *
desktop_view_at(struct server *server, double lx, double ly,
struct wlr_surface **surface, double *sx, double *sy,
int *view_area)
{
- /*
- * This iterates over all of our surfaces and attempts to find one under
- * the cursor. It relies on server->views being ordered from
- * top-to-bottom.
- */
+ struct wlr_output *wlr_output = wlr_output_layout_output_at(
+ server->output_layout, lx, ly);
+ struct output *output = output_from_wlr_output(server, wlr_output);
+
+ if ((*surface = layer_surface_at(&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY],
+ lx, ly, sx, sy))) {
+ return NULL;
+ }
+ if ((*surface = layer_surface_at(&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP],
+ lx, ly, sx, sy))) {
+ return NULL;
+ }
+
struct view *view;
wl_list_for_each (view, &server->views, link) {
if (!view->mapped) {
return view;
}
}
+
+ if ((*surface = layer_surface_at(&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM],
+ lx, ly, sx, sy))) {
+ return NULL;
+ }
+ if ((*surface = layer_surface_at(&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND],
+ lx, ly, sx, sy))) {
+ return NULL;
+ }
return NULL;
}
}
}
-static struct output *
-output_from_wlr_output(struct server *server, struct wlr_output *wlr_output)
-{
- struct output *output;
- wl_list_for_each(output, &server->outputs, link) {
- if (output->wlr_output == wlr_output) {
- return output;
- }
- }
- return NULL;
-}
-
static void
output_destroy_notify(struct wl_listener *listener, void *data)
{
wl_signal_add(&server->output_manager->events.apply,
&server->output_manager_apply);
}
+
+struct output *
+output_from_wlr_output(struct server *server, struct wlr_output *wlr_output)
+{
+ struct output *output;
+ wl_list_for_each(output, &server->outputs, link) {
+ if (output->wlr_output == wlr_output) {
+ return output;
+ }
+ }
+ return NULL;
+}