summaryrefslogtreecommitdiff
path: root/main.c3
blob: 742616e7900b8d213d5cf6be1d7d50a0510625b5 (plain)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
module c3term;
import std::io;
import libc;

typedef WL_display = void;
typedef WL_registry = void;
typedef WL_compositor = void;

extern fn WL_display* wl_display_connect(ZString);
extern fn WL_display* wl_display_disconnect(WL_display*);
extern fn CInt wl_display_roundtrip(WL_display*);

extern fn void* wl_registry_bind(WL_registry*, uint, WL_interface*, uint) @cname("_wl_registry_bind");
extern fn CInt wl_registry_add_listener(WL_registry*, WL_registry_listener*, void*) @cname("_wl_registry_add_listener");
extern fn WL_registry* wl_display_get_registry(WL_display*) @cname("_wl_display_get_registry");

alias RegistryListenerGlobalCallback = fn void (void*, WL_registry*, uint, ZString, uint);
alias RegistryListenerGlobalRemoveCallback = fn void (void*, WL_registry*, uint);

struct WL_registry_listener
{
  RegistryListenerGlobalCallback global;
  RegistryListenerGlobalRemoveCallback global_remove;
}

struct WL_message
{
  ZString name;
  ZString signature;
  WL_interface** types;
}

struct WL_interface
{
  ZString name;
  int version;
  int method_count;
  WL_message* methods;
  int event_count;
  WL_message* events;
}

void* wl_client_lib;
WL_interface wl_compositor_interface;

fn void? init()
{
  wl_client_lib = libc::dlopen("libwayland-client.so", libc::RTLD_LAZY);
  wl_compositor_interface = *(WL_interface*)load_symbol("wl_compositor_interface")!;
}

struct State
{
  WL_compositor* compositor;
}

fn void registry_handle_global(void* data, WL_registry* registry, uint name, ZString nterface, uint version)
{
  io::printf("interface: %s\nversion: %d\nname: %d\n", nterface, version, name);
  State* state = data;
  if (nterface == wl_compositor_interface.name)
  {
    state.compositor = wl_registry_bind(registry, name, &wl_compositor_interface, 4);
  }
}

fn void registry_handle_global_remove(void* data, WL_registry* registry, uint name)
{
}


fn int main(String[] args)
{
  init()!!;
  WL_display* display = wl_display_connect(null);
  if (!display) {
    io::printn("failed to connect display");
    return(1);
  };

  WL_registry* registry = wl_display_get_registry(display);
  if (!registry) {
    io::printn("failed to get registry");
    return(1);
  }

  WL_registry_listener registry_listener;
  registry_listener.global = &registry_handle_global;
  registry_listener.global_remove = &registry_handle_global_remove;

  wl_registry_add_listener(registry, &registry_listener, null);

  wl_display_roundtrip(display);

  wl_display_disconnect(display);
  io::printn("disconnected");
  return(0);
}