Skip to content
4 changes: 2 additions & 2 deletions .rustfmt.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ fn_args_layout = "Visual"
fn_arg_intent = "Tabbed"
reorder_imports = true
reorder_imported_names = true
report_todo = "Always"
report_fixme = "Always"
report_todo = "Never"
report_fixme = "Never"
normalize_comments = true
use_try_shorthand = true
max_width = 110
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ branches:
before_script:
- export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH
- which rustfmt || cargo install rustfmt
- which cargo-install-update || cargo install cargo-update
- cargo install-update -a
- pip install 'travis-cargo<0.2' --user
- mkdir $(pwd)/socket
- export XDG_RUNTIME_DIR="$(pwd)/socket"
Expand Down
9 changes: 8 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,18 @@ version = "0.1.0"
authors = ["Victor Berger <victor.berger@thalesgroup.com>"]

[dependencies]
wayland-server = "0.8.4"
wayland-server = "0.8.6"
nix = "0.7.0"
glutin = { version = "~0.7.4", optional = true }
glium = { version = "~0.16.0", optional = true }
slog = { version = "~1.5.2", features = ["max_level_trace", "release_max_level_info"] }
slog-stdlog = "~1.1.0"
clippy = { version = "*", optional = true }

[dev-dependencies]
slog-term = "~1.5"

[features]
default = ["backend_glutin", "renderer_glium"]
backend_glutin = ["glutin", "wayland-server/dlopen"]
renderer_glium = ["glium"]
36 changes: 36 additions & 0 deletions examples/simple.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
extern crate wayland_server;
extern crate smithay;

use smithay::backend::glutin;
use smithay::backend::input::InputBackend;
use smithay::shm::ShmGlobal;
use wayland_server::protocol::wl_shm;

fn main() {
let (_, mut event_loop) = wayland_server::create_display();

// Insert the ShmGlobal as a handler to your event loop
// Here, we specify tha the standard Argb8888 and Xrgb8888 is the only supported.
let handler_id =
event_loop.add_handler_with_init(ShmGlobal::new(vec![],
None /* we don't provide a logger here */));

// Register this handler to advertise a wl_shm global of version 1
let shm_global = event_loop.register_global::<wl_shm::WlShm, ShmGlobal>(handler_id, 1);

// Retrieve the shm token for later use to access the buffers
let shm_token = {
let state = event_loop.state();
state.get_handler::<ShmGlobal>(handler_id).get_token()
};

// Initialize a simple backend for testing
let (mut renderer, mut input) = glutin::init_windowed().unwrap();

// TODO render stuff

// TODO put input handling on the event loop
input.dispatch_new_events().unwrap();

event_loop.run().unwrap();
}
50 changes: 50 additions & 0 deletions src/backend/glium.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@


use backend::graphics::opengl::{OpenglGraphicsBackend, SwapBuffersError};
use glium::SwapBuffersError as GliumSwapBuffersError;
use glium::backend::Backend;

use std::os::raw::c_void;

impl From<SwapBuffersError> for GliumSwapBuffersError {
fn from(error: SwapBuffersError) -> Self {
match error {
SwapBuffersError::ContextLost => GliumSwapBuffersError::ContextLost,
SwapBuffersError::AlreadySwapped => GliumSwapBuffersError::AlreadySwapped,
}
}
}

pub struct GliumGraphicBackend<T: OpenglGraphicsBackend>(T);

pub trait IntoGlium: OpenglGraphicsBackend + Sized {
fn into_glium(self) -> GliumGraphicBackend<Self>;
}

impl<T: OpenglGraphicsBackend> IntoGlium for T {
fn into_glium(self) -> GliumGraphicBackend<Self> {
GliumGraphicBackend(self)
}
}

unsafe impl<T: OpenglGraphicsBackend> Backend for GliumGraphicBackend<T> {
fn swap_buffers(&self) -> Result<(), GliumSwapBuffersError> {
self.0.swap_buffers().map_err(Into::into)
}

unsafe fn get_proc_address(&self, symbol: &str) -> *const c_void {
self.0.get_proc_address(symbol) as *const c_void
}

fn get_framebuffer_dimensions(&self) -> (u32, u32) {
self.0.get_framebuffer_dimensions()
}

fn is_current(&self) -> bool {
self.0.is_current()
}

unsafe fn make_current(&self) {
self.0.make_current()
}
}
Loading