Added desktop_init

This commit is contained in:
buffet 2019-03-17 20:04:52 +01:00
parent 88358bd402
commit 593303e672
9 changed files with 96 additions and 42 deletions

View file

@ -0,0 +1,30 @@
/* Copyright (c), Niclas Meyer <niclas@countingsort.com>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#ifndef KIWMI_DESKTOP_DESKTOP_H
#define KIWMI_DESKTOP_DESKTOP_H
#include <wayland-server.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_output_layout.h>
#include "kiwmi/input/cursor.h"
struct kiwmi_desktop {
struct wlr_compositor *compositor;
struct wlr_data_device_manager *data_device_manager;
struct wlr_output_layout *output_layout;
struct kiwmi_cursor *cursor;
struct wl_list outputs; // struct kiwmi_output::link
struct wl_listener new_output;
};
bool desktop_init(struct kiwmi_desktop *desktop, struct wlr_renderer *renderer);
#endif /* KIWMI_DESKTOP_DESKTOP_H */

View file

@ -11,17 +11,17 @@
#include <wayland-server.h>
#include <wlr/types/wlr_output.h>
#include "kiwmi/server.h"
#include "kiwmi/desktop/desktop.h"
struct kiwmi_output {
struct wl_list link;
struct kiwmi_server *server;
struct kiwmi_desktop *desktop;
struct wlr_output *wlr_output;
struct wl_listener frame;
struct wl_listener destroy;
};
struct kiwmi_output *
output_create(struct wlr_output *wlr_output, struct kiwmi_server *server);
output_create(struct wlr_output *wlr_output, struct kiwmi_desktop *desktop);
#endif /* KIWMI_OUTPUT_H */

View file

@ -10,23 +10,15 @@
#include <wayland-server.h>
#include <wlr/backend.h>
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_output_layout.h>
#include "kiwmi/input/cursor.h"
#include "kiwmi/desktop/desktop.h"
struct kiwmi_server {
struct wl_display *wl_display;
struct wlr_backend *backend;
struct wlr_compositor *compositor;
struct wlr_data_device_manager *data_device_manager;
struct wlr_output_layout *output_layout;
const char *socket;
struct kiwmi_desktop desktop;
struct wl_list keyboards; // struct kiwmi_keyboard::link
struct wl_list outputs; // struct kiwmi_output::link
struct wl_listener new_output;
struct kiwmi_cursor *cursor;
struct wl_listener new_input;
};

44
kiwmi/desktop/desktop.c Normal file
View file

@ -0,0 +1,44 @@
/* Copyright (c), Niclas Meyer <niclas@countingsort.com>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#include "kiwmi/desktop/desktop.h"
#include <stdbool.h>
#include <wayland-server.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_output_layout.h>
#include <wlr/util/log.h>
#include "kiwmi/server.h"
#include "kiwmi/desktop/output.h"
#include "kiwmi/input/cursor.h"
bool
desktop_init(struct kiwmi_desktop *desktop, struct wlr_renderer *renderer)
{
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
desktop->compositor = wlr_compositor_create(server->wl_display, renderer);
desktop->data_device_manager =
wlr_data_device_manager_create(server->wl_display);
desktop->output_layout = wlr_output_layout_create();
desktop->cursor = cursor_create(desktop->output_layout);
if (!desktop->cursor) {
wlr_log(WLR_ERROR, "Failed to create cursor");
return false;
}
wl_list_init(&desktop->outputs);
desktop->new_output.notify = new_output_notify;
wl_signal_add(&server->backend->events.new_output, &desktop->new_output);
return true;
}

View file

@ -13,11 +13,14 @@
#include "kiwmi/output.h"
#include "kiwmi/server.h"
#include "kiwmi/desktop/desktop.h"
void
new_output_notify(struct wl_listener *listener, void *data)
{
struct kiwmi_server *server = wl_container_of(listener, server, new_output);
struct kiwmi_desktop *desktop =
wl_container_of(listener, desktop, new_output);
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
struct wlr_output *wlr_output = data;
wlr_log(WLR_DEBUG, "New output %p: %s", wlr_output, wlr_output->name);
@ -28,19 +31,19 @@ new_output_notify(struct wl_listener *listener, void *data)
wlr_output_set_mode(wlr_output, mode);
}
struct kiwmi_output *output = output_create(wlr_output, server);
struct kiwmi_output *output = output_create(wlr_output, desktop);
if (!output) {
wlr_log(WLR_ERROR, "Failed to create output");
return;
}
struct kiwmi_cursor *cursor = server->cursor;
struct kiwmi_cursor *cursor = desktop->cursor;
wlr_xcursor_manager_load(cursor->xcursor_manager, wlr_output->scale);
wl_list_insert(&server->outputs, &output->link);
wl_list_insert(&desktop->outputs, &output->link);
wlr_output_layout_add_auto(server->output_layout, wlr_output);
wlr_output_layout_add_auto(desktop->output_layout, wlr_output);
wlr_output_create_global(wlr_output);
}

View file

@ -17,7 +17,7 @@
static void
new_pointer(struct kiwmi_server *server, struct wlr_input_device *device)
{
wlr_cursor_attach_input_device(server->cursor->cursor, device);
wlr_cursor_attach_input_device(server->desktop.cursor->cursor, device);
}
static void

View file

@ -3,6 +3,7 @@ kiwmi_sources = files(
'input.c',
'output.c',
'server.c',
'desktop/desktop.c',
'desktop/output.c',
'input/cursor.c',
'input/keyboard.c',

View file

@ -13,7 +13,7 @@
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_output.h>
#include "kiwmi/server.h"
#include "kiwmi/desktop/desktop.h"
static void
output_frame_notify(struct wl_listener *listener, void *data)
@ -47,7 +47,7 @@ output_destroy_notify(struct wl_listener *listener, void *UNUSED(data))
{
struct kiwmi_output *output = wl_container_of(listener, output, destroy);
wlr_output_layout_remove(output->server->output_layout, output->wlr_output);
wlr_output_layout_remove(output->desktop->output_layout, output->wlr_output);
wl_list_remove(&output->link);
wl_list_remove(&output->frame.link);
@ -57,7 +57,7 @@ output_destroy_notify(struct wl_listener *listener, void *UNUSED(data))
}
struct kiwmi_output *
output_create(struct wlr_output *wlr_output, struct kiwmi_server *server)
output_create(struct wlr_output *wlr_output, struct kiwmi_desktop *desktop)
{
struct kiwmi_output *output = calloc(1, sizeof(*output));
if (!output) {
@ -65,7 +65,7 @@ output_create(struct wlr_output *wlr_output, struct kiwmi_server *server)
}
output->wlr_output = wlr_output;
output->server = server;
output->desktop = desktop;
output->frame.notify = output_frame_notify;
wl_signal_add(&wlr_output->events.frame, &output->frame);

View file

@ -11,15 +11,10 @@
#include <wayland-server.h>
#include <wlr/backend.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_cursor.h>
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_output_layout.h>
#include <wlr/types/wlr_xcursor_manager.h>
#include <wlr/util/log.h>
#include "kiwmi/desktop/output.h"
#include "kiwmi/desktop/desktop.h"
#include "kiwmi/input.h"
#include "kiwmi/input/cursor.h"
@ -39,24 +34,13 @@ server_init(struct kiwmi_server *server)
struct wlr_renderer *renderer = wlr_backend_get_renderer(server->backend);
wlr_renderer_init_wl_display(renderer, server->wl_display);
server->compositor = wlr_compositor_create(server->wl_display, renderer);
server->data_device_manager =
wlr_data_device_manager_create(server->wl_display);
server->output_layout = wlr_output_layout_create();
server->cursor = cursor_create(server->output_layout);
if (!server->cursor) {
wlr_log(WLR_ERROR, "Failed to create cursor");
if (!desktop_init(&server->desktop, renderer)) {
wlr_log(WLR_ERROR, "Failed to initialize desktop");
wl_display_destroy(server->wl_display);
return false;
}
wl_list_init(&server->keyboards);
wl_list_init(&server->outputs);
server->new_output.notify = new_output_notify;
wl_signal_add(&server->backend->events.new_output, &server->new_output);
server->new_input.notify = new_input_notify;
wl_signal_add(&server->backend->events.new_input, &server->new_input);