wayland: store layer properties
[staging/windowmanager.git] / src / main.cpp
index a07a73c..20f04e5 100644 (file)
@@ -19,12 +19,9 @@ struct conn {
 };
 
 namespace {
-int check_events(struct wl::display *d, struct conn *c, int fd)
-{
-   struct pollfd pfd[2] = {
-      { .fd = d->get_fd(), .events = POLLIN, .revents = 0 },
-      { .fd = fd, .events = POLLIN, .revents = 0 }
-   };
+int check_events(struct wl::display *d, struct conn *c, int fd) {
+   struct pollfd pfd[2] = {{.fd = d->get_fd(), .events = POLLIN, .revents = 0},
+                           {.fd = fd, .events = POLLIN, .revents = 0}};
 
    d->flush();
 
@@ -39,20 +36,54 @@ int check_events(struct wl::display *d, struct conn *c, int fd)
          return ret;
 
       if (fd != -1 && (pfd[1].revents & POLLIN)) {
-         char buf[10];
+         char buf[256];
 
-         while (read(pfd[1].fd, buf, 10) == 10)
+         // read all there is ...
+         while (read(pfd[1].fd, buf, sizeof(buf)) == sizeof(buf))
             ;
 
          // Display current status
-         for (auto const &i : c->c->surfaces) {
-            printf("Surface %d\n", i.first);
+         if (!c->c->surfaces.empty()) {
+            puts("Surfaces:");
+            for (auto const &i : c->c->surfaces) {
+               struct genivi::rect const &r = i.second->dst_rect;
+               struct genivi::size const &s = i.second->size;
+               printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h,
+                      r.x, r.y);
+            }
+            puts("\b\b ");
          }
       }
    }
 
    return 0;
 }
+
+void init_layout(struct conn &c) {
+   struct wl::output &o = *c.outputs.begin()->get();
+   struct genivi::screen &s = *c.c->screens.begin()->second;
+   auto &layers = c.c->layers;
+
+   // XXX: Write output dimensions to ivi controller...
+   c.c->output_size = genivi::size{uint32_t(o.width), uint32_t(o.height)};
+
+   // Setup our dummy scene...
+   if (layers.find(100) == layers.end()) {
+      logdebug("Creating layer 100 with output dimensions (%ux%u)", o.width, o.height);
+      c.c->layer_create(100, o.width, o.height);
+   }
+
+   struct genivi::layer &l = *c.c->layers[100].get();
+
+   l.set_destination_rectangle(0, 0, o.width, o.height);
+   s.clear();
+
+   logdebug("Add layer 100 to screen %u", s.id);
+   s.add_layer(&l);
+
+   c.c->commit_changes();
+   // Note: this does not flush the display!
+}
 }
 
 int main(int argc, char **argv) {
@@ -87,8 +118,13 @@ int main(int argc, char **argv) {
    if (!c.c)
       fatal("ivi_controller global not available");
 
+   if (c.outputs.empty())
+      fatal("no output was set up!");
+
+   init_layout(c);
+
    while (check_events(d.get(), &c, STDIN_FILENO) != -1) {
-      ;
+      c.c->execute_pending();
    }
 
    d->roundtrip();