Commit b76fb1ad authored by Tiago Vignatti's avatar Tiago Vignatti

Initial commit

Signed-off-by: 's avatarTiago Vignatti <tiago.vignatti@intel.com>
parents
SUBDIRS = shell
#! /bin/sh
test -n "$srcdir" || srcdir=`dirname "$0"`
test -n "$srcdir" || srcdir=.
(
cd "$srcdir" &&
autoreconf --force -v --install
) || exit
test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
AC_PREREQ([2.64])
AC_INIT([weston],
[1.0.0],
[https://bugs.freedesktop.org/enter_bug.cgi?product=weston],
[weston],
[http://wayland.freedesktop.org/])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
AM_SILENT_RULES([yes])
# Check for programs
AC_PROG_CC
# Initialize libtool
LT_PREREQ([2.2])
LT_INIT([disable-static])
PKG_PROG_PKG_CONFIG()
PKG_CHECK_MODULES([GTK], [wayland-client >= 1.0.2 gtk+-3.0 >= 3.7])
WAYLAND_SCANNER_RULES(['$(top_srcdir)/protocol'])
AC_CONFIG_FILES([Makefile
shell/Makefile
protocol/Makefile
])
AC_OUTPUT
EXTRA_DIST = desktop-shell.xml
desktop.shell.xml is a straight copy of the one in freedesktop's weston and we
want to use the same version containing there:
"protocol: XML files need to be installed and discoverable"
https://bugs.freedesktop.org/show_bug.cgi?id=55183
<protocol name="desktop">
<interface name="desktop_shell" version="1">
<description summary="create desktop widgets and helpers">
Traditional user interfaces can rely on this interface to define the
foundations of typical desktops. Currently it's possible to set up
background, panels and locking surfaces.
</description>
<request name="set_background">
<arg name="output" type="object" interface="wl_output"/>
<arg name="surface" type="object" interface="wl_surface"/>
</request>
<request name="set_panel">
<arg name="output" type="object" interface="wl_output"/>
<arg name="surface" type="object" interface="wl_surface"/>
</request>
<request name="set_lock_surface">
<arg name="surface" type="object" interface="wl_surface"/>
</request>
<request name="unlock"/>
<request name="set_grab_surface">
<description summary="set grab surface">
The surface set by this request will receive a fake
pointer.enter event during grabs at position 0, 0 and is
expected to set an appropriate cursor image as described by
the grab_cursor event sent just before the enter event.
</description>
<arg name="surface" type="object" interface="wl_surface"/>
</request>
<!-- We'll fold most of wl_shell into this interface and then
they'll share the configure event. -->
<event name="configure">
<arg name="edges" type="uint"/>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="width" type="int"/>
<arg name="height" type="int"/>
</event>
<event name="prepare_lock_surface">
<description summary="tell the client to create, set the lock surface">
Tell the shell we want it to create and set the lock surface, which is
a GUI asking the user to unlock the screen. The lock surface is
announced with 'set_lock_surface'. Whether or not the shell actually
implements locking, it MUST send 'unlock' request to let the normal
desktop resume.
</description>
</event>
<event name="grab_cursor">
<description summary="tell client what cursor to show during a grab">
This event will be sent immediately before a fake enter event on the
grab surface.
</description>
<arg name="cursor" type="uint"/>
</event>
<enum name="cursor">
<entry name="none" value="0"/>
<entry name="resize_top" value="1"/>
<entry name="resize_bottom" value="2"/>
<entry name="arrow" value="3"/>
<entry name="resize_left" value="4"/>
<entry name="resize_top_left" value="5"/>
<entry name="resize_bottom_left" value="6"/>
<entry name="move" value="7"/>
<entry name="resize_right" value="8"/>
<entry name="resize_top_right" value="9"/>
<entry name="resize_bottom_right" value="10"/>
<entry name="busy" value="11"/>
</enum>
</interface>
<interface name="screensaver" version="1">
<description summary="interface for implementing screensavers">
Only one client can bind this interface at a time.
</description>
<request name="set_surface">
<description summary="set the surface type as a screensaver">
A screensaver surface is normally hidden, and only visible after an
idle timeout.
</description>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="output" type="object" interface="wl_output"/>
</request>
</interface>
<interface name="input_panel" version="1">
<description summary="interface for implementing keyboards">
Only one client can bind this interface at a time.
</description>
<request name="set_surface">
<description summary="set the surface type as a keyboard">
A keybaord surface is only shown, when a text model is active
</description>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="output" type="object" interface="wl_output"/>
</request>
</interface>
</protocol>
libexec_PROGRAMS = weston-desktop-shell
AM_CFLAGS = $(GCC_CFLAGS)
AM_CPPFLAGS = $(CLIENT_CFLAGS) $(GTK_CFLAGS)
weston_desktop_shell_SOURCES = \
gtk-shell.c \
desktop-shell-client-protocol.h \
desktop-shell-protocol.c
weston_desktop_shell_LDADD = $(GTK_LIBS)
BUILT_SOURCES = \
desktop-shell-client-protocol.h \
desktop-shell-protocol.c
CLEANFILES = $(BUILT_SOURCES)
@wayland_scanner_rules@
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdkwayland.h>
#include "desktop-shell-client-protocol.h"
gchar *filename = "notfound.png";
struct desktop {
struct wl_display *display;
struct wl_registry *registry;
struct desktop_shell *shell;
struct wl_output *output;
struct wl_surface *surface;
GdkDisplay *gdk_display;
GdkWindow *gdk_window;
GtkWidget *widget;
};
static void
desktop_shell_configure(void *data,
struct desktop_shell *desktop_shell,
uint32_t edges,
struct wl_surface *surface,
int32_t width, int32_t height)
{
struct desktop *desktop = wl_surface_get_user_data(surface);
gtk_window_resize(GTK_WINDOW(desktop->widget), width, height);
}
static void
desktop_shell_prepare_lock_surface(void *data,
struct desktop_shell *desktop_shell)
{
}
static void
desktop_shell_grab_cursor(void *data, struct desktop_shell *desktop_shell,
uint32_t cursor)
{
}
static const struct desktop_shell_listener listener = {
desktop_shell_configure,
desktop_shell_prepare_lock_surface,
desktop_shell_grab_cursor
};
static void
background_create(struct desktop *desktop)
{
GtkWidget *image;
desktop->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* XXX: this is actually not working */
image = gtk_image_new_from_file(filename);
gtk_container_add (GTK_CONTAINER (desktop->widget), image);
gtk_window_set_title(GTK_WINDOW(desktop->widget), "gtk shell");
gtk_window_set_decorated(GTK_WINDOW(desktop->widget), FALSE);
gtk_widget_realize(desktop->widget);
desktop->gdk_window = gtk_widget_get_window(desktop->widget);
gdk_wayland_window_set_use_custom_surface(desktop->gdk_window);
desktop->surface =
gdk_wayland_window_get_wl_surface(desktop->gdk_window);
wl_surface_set_user_data(desktop->surface, desktop);
desktop_shell_set_background(desktop->shell, desktop->output,
desktop->surface);
gtk_widget_show_all(desktop->widget);
}
static void
registry_handle_global(void *data, struct wl_registry *registry,
uint32_t name, const char *interface, uint32_t version)
{
struct desktop *d = data;
if (!strcmp(interface, "desktop_shell")) {
d->shell = wl_registry_bind(registry, name,
&desktop_shell_interface, 1);
desktop_shell_add_listener(d->shell, &listener, d);
} else if (!strcmp(interface, "wl_output")) {
/* TODO: create multiple outputs */
d->output = wl_registry_bind(registry, name,
&wl_output_interface, 1);
}
}
static void
registry_handle_global_remove(void *data, struct wl_registry *registry,
uint32_t name)
{
}
static const struct wl_registry_listener registry_listener = {
registry_handle_global,
registry_handle_global_remove
};
int
main(int argc, char *argv[])
{
struct desktop *desktop;
gtk_init(&argc, &argv);
desktop = malloc(sizeof *desktop);
desktop->output = NULL;
desktop->shell = NULL;
desktop->gdk_display = gdk_display_get_default();
desktop->display =
gdk_wayland_display_get_wl_display(desktop->gdk_display);
if (desktop->display == NULL) {
fprintf(stderr, "failed to get display: %m\n");
return -1;
}
desktop->registry = wl_display_get_registry(desktop->display);
wl_registry_add_listener(desktop->registry,
&registry_listener, desktop);
/* Wait until we have been notified about the compositor and shell
* objects */
while (!desktop->output || !desktop->shell)
wl_display_roundtrip (desktop->display);
background_create(desktop);
gtk_main();
return EXIT_SUCCESS;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment