Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(510)

Unified Diff: ui/wayland/wayland_display.cc

Issue 7457023: Adding a Wayland basic toolkit (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fixed argument layout Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/wayland/wayland_display.cc
diff --git a/ui/wayland/wayland_display.cc b/ui/wayland/wayland_display.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2b2777cba690da5f26c074862cb14c5d800bc0f2
--- /dev/null
+++ b/ui/wayland/wayland_display.cc
@@ -0,0 +1,174 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/wayland/wayland_display.h"
+
+#include <string.h>
+#include <wayland-client.h>
+
+#include "ui/wayland/wayland_buffer.h"
+#include "ui/wayland/wayland_input_device.h"
+#include "ui/wayland/wayland_screen.h"
+#include "ui/wayland/wayland_window.h"
+
+namespace ui {
+
+// static
+WaylandDisplay* WaylandDisplay::Connect(char* name) {
+ WaylandDisplay* display = new WaylandDisplay(name);
+ if (!display->display_) {
+ delete display;
+ return NULL;
+ }
+
+ wl_display_set_user_data(display->display_, display);
+ // Register the display initialization handler and iterate over the initial
+ // connection events sent by the server. This is required since the display
+ // will send registration events needed to initialize everything else. This
+ // will create the compositor, visuals, etc.., which are required in creating
+ // a drawing context.
+ wl_display_add_global_listener(display->display_,
+ WaylandDisplay::DisplayHandleGlobal,
+ display);
+ wl_display_iterate(display->display_, WL_DISPLAY_READABLE);
+
+ return display;
+}
+
+// static
+WaylandDisplay* WaylandDisplay::GetDisplay(wl_display* display) {
+ return static_cast<WaylandDisplay*>(wl_display_get_user_data(display));
+}
+
+WaylandDisplay::WaylandDisplay(char* name) : display_(NULL),
+ compositor_(NULL),
+ shell_(NULL),
+ shm_(NULL),
+ visual_(NULL) {
+ display_ = wl_display_connect(name);
+}
+
+WaylandDisplay::~WaylandDisplay() {
+ if (display_)
+ wl_display_destroy(display_);
+ if (compositor_)
+ wl_compositor_destroy(compositor_);
+ if (visual_)
+ wl_visual_destroy(visual_);
+ if (shell_)
+ wl_shell_destroy(shell_);
+ if (shm_)
+ wl_shm_destroy(shm_);
+ for (std::list<WaylandInputDevice*>::iterator it = input_list_.begin();
+ it != input_list_.end(); it++) {
+ delete *it;
+ }
+ for (std::list<WaylandScreen*>::iterator it = screen_list_.begin();
+ it != screen_list_.end(); it++) {
tfarina 2011/07/25 18:34:27 ++i
+ delete *it;
+ }
+}
+
+wl_surface* WaylandDisplay::CreateSurface() {
+ return wl_compositor_create_surface(compositor_);
+}
+
+void WaylandDisplay::SetCursor(WaylandBuffer* buffer,
+ int32_t x, int32_t y) {
+ // Currently there is no way of knowing which input device should have the
+ // buffer attached, so we just attach to every input device.
+ for (std::list<WaylandInputDevice*>::iterator it = input_list_.begin();
+ it != input_list_.end(); it++) {
+ (*it)->Attach(buffer->GetBuffer(), x, y);
+ }
+}
+
+wl_display* WaylandDisplay::GetNativeDisplay() const {
+ return display_;
+}
+
+std::list<WaylandScreen*> WaylandDisplay::GetScreenList() const {
+ return screen_list_;
+}
+
+wl_shell* WaylandDisplay::GetShell() const {
+ return shell_;
+}
+
+wl_shm* WaylandDisplay::GetShm() const {
+ return shm_;
+}
+
+wl_visual* WaylandDisplay::GetVisual() const {
+ return visual_;
+}
+
+// static
+void WaylandDisplay::DisplayHandleGlobal(wl_display* display,
+ uint32_t id,
+ const char* interface,
+ uint32_t version,
+ void* data) {
+ WaylandDisplay* disp = static_cast<WaylandDisplay*>(data);
+
+ static const wl_compositor_listener kCompositorListener = {
+ WaylandDisplay::CompositorHandleVisual,
+ };
+ static const wl_shell_listener kShellListener = {
+ WaylandDisplay::ShellHandleConfigure,
+ };
+
+ if (strcmp(interface, "wl_compositor") == 0) {
+ disp->compositor_ = wl_compositor_create(display, id, 1);
+ wl_compositor_add_listener(disp->compositor_,
+ &kCompositorListener,
+ disp);
+ } else if (strcmp(interface, "wl_output") == 0) {
+ WaylandScreen* screen = new WaylandScreen(disp, id);
+ disp->screen_list_.push_back(screen);
+ } else if (strcmp(interface, "wl_input_device") == 0) {
+ WaylandInputDevice *input_device = new WaylandInputDevice(display, id);
+ disp->input_list_.push_back(input_device);
+ } else if (strcmp(interface, "wl_shell") == 0) {
+ disp->shell_ = wl_shell_create(display, id, 1);
+ wl_shell_add_listener(disp->shell_, &kShellListener, disp);
+ } else if (strcmp(interface, "wl_shm") == 0) {
+ disp->shm_ = wl_shm_create(display, id, 1);
+ }
+}
+
+// static
+void WaylandDisplay::CompositorHandleVisual(void* data,
+ wl_compositor* compositor,
+ uint32_t id,
+ uint32_t token) {
+ WaylandDisplay* display = static_cast<WaylandDisplay*>(data);
+
+ // The compositor may support multiple types of visuals but we really only
+ // need one.
+ switch (token) {
+ case WL_COMPOSITOR_VISUAL_ARGB32:
+ break;
+ case WL_COMPOSITOR_VISUAL_PREMULTIPLIED_ARGB32:
+ display->visual_ = wl_visual_create(display->display_, id, 1);
+ break;
+ case WL_COMPOSITOR_VISUAL_XRGB32:
+ break;
+ }
tfarina 2011/07/25 18:34:27 do you need a default case here?
+}
+
+// static
+void WaylandDisplay::ShellHandleConfigure(void* data,
+ wl_shell* shell,
+ uint32_t time,
+ uint32_t edges,
+ wl_surface* surface,
+ int32_t width,
+ int32_t height) {
+ WaylandWindow* window = static_cast<WaylandWindow*>(
+ wl_surface_get_user_data(surface));
+ window->Configure(time, edges, 0, 0, width, height);
+}
+
+} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698