aboutsummaryrefslogtreecommitdiff
path: root/rt/src/util.c
blob: 65767707a98111fdcb13de0e98e462e7acd36bd4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "util.h"
#include "wl.h"

#include <wlr/types/wlr_scene.h>

static struct montis_server *server_from_ctx(void *ctx)
{
  struct montis_server *server = wl_container_of(ctx, server, plugin);
  return server;
}

static struct montis_toplevel *toplevel_at(struct montis_server *server,
                                           double lx, double ly)
{
  double sx = 0.0;
  double sy = 0.0;

  struct wlr_scene_node *node =
      wlr_scene_node_at(&server->scene->tree.node, lx, ly, &sx, &sy);
  if (node == NULL || node->type != WLR_SCENE_NODE_BUFFER) {
    return NULL;
  }
  struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_from_node(node);
  struct wlr_scene_surface *scene_surface =
      wlr_scene_surface_try_from_buffer(scene_buffer);
  if (!scene_surface) {
    return NULL;
  }

  struct wlr_scene_tree *tree = node->parent;
  while (tree != NULL && tree->node.data == NULL) {
    tree = tree->node.parent;
  }
  return tree ? tree->node.data : NULL;
}

void *montis_plugin_toplevel_at(void *ctx, double lx, double ly)
{
  if (!ctx) {
    return NULL;
  }
  struct montis_server *server = server_from_ctx(ctx);
  return toplevel_at(server, lx, ly);
}

void montis_plugin_get_toplevel_position(void *toplevel, double *x, double *y)
{
  if (!toplevel || !x || !y) {
    return;
  }
  struct montis_toplevel *tl = toplevel;
  *x = tl->scene_tree->node.x;
  *y = tl->scene_tree->node.y;
}

void montis_plugin_set_toplevel_position(void *toplevel, double x, double y)
{
  if (!toplevel) {
    return;
  }
  struct montis_toplevel *tl = toplevel;
  wlr_scene_node_set_position(&tl->scene_tree->node, (int)x, (int)y);
}