diff options
author | Kristian Høgsberg <krh@redhat.com> | 2009-01-26 23:42:46 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2009-01-26 23:42:55 -0500 |
commit | 43c28eee32ae9383d3056e45a8f824710ce4615d (patch) | |
tree | 7140bc584f8e7ceff8e6ab570238ccb7779c26b7 /window.c | |
parent | 8e438625ae1599969d6a6dd29fc4e1c05f5763cc (diff) |
Add a toy-display object that caches state.
This will be GdkDisplay for GTK+ on Wayland etc. This restores
the terminal fullscreen mode.
Diffstat (limited to 'window.c')
-rw-r--r-- | window.c | 140 |
1 files changed, 84 insertions, 56 deletions
@@ -38,12 +38,21 @@ #include "window.h" -struct window { +struct display { struct wl_display *display; struct wl_compositor *compositor; + struct wl_output *output; + struct wl_input_device *input_device; + struct rectangle screen_allocation; + cairo_drm_context_t *ctx; + int fd; +}; + +struct window { + struct display *display; struct wl_surface *surface; const char *title; - struct rectangle allocation, saved_allocation, screen_allocation; + struct rectangle allocation, saved_allocation; int minimum_width, minimum_height; int margin; int drag_x, drag_y; @@ -51,7 +60,6 @@ struct window { int fullscreen; struct wl_input_device *grab_device; uint32_t name; - cairo_drm_context_t *ctx; cairo_surface_t *cairo_surface; @@ -85,7 +93,7 @@ window_draw_decorations(struct window *window) int width, height; window->cairo_surface = - cairo_drm_surface_create(window->ctx, + cairo_drm_surface_create(window->display->ctx, CAIRO_CONTENT_COLOR_ALPHA, window->allocation.width, window->allocation.height); @@ -170,7 +178,7 @@ window_draw_decorations(struct window *window) cairo_fill(cr); cairo_destroy(cr); - visual = wl_display_get_premultiplied_argb_visual(window->display); + visual = wl_display_get_premultiplied_argb_visual(window->display->display); wl_surface_attach(window->surface, cairo_drm_surface_get_name(window->cairo_surface), window->allocation.width, @@ -191,12 +199,12 @@ window_draw_fullscreen(struct window *window) struct wl_visual *visual; window->cairo_surface = - cairo_drm_surface_create(window->ctx, + cairo_drm_surface_create(window->display->ctx, CAIRO_CONTENT_COLOR_ALPHA, window->allocation.width, window->allocation.height); - visual = wl_display_get_premultiplied_argb_visual(window->display); + visual = wl_display_get_premultiplied_argb_visual(window->display->display); wl_surface_attach(window->surface, cairo_drm_surface_get_name(window->cairo_surface), window->allocation.width, @@ -287,7 +295,7 @@ window_handle_motion(void *data, struct wl_input_device *input_device, window->allocation.y - window->margin, window->allocation.width, window->allocation.height); - wl_compositor_commit(window->compositor, 1); + wl_compositor_commit(window->display->compositor, 1); break; case WINDOW_RESIZING_LOWER_RIGHT: if (window->fullscreen) @@ -396,7 +404,7 @@ cairo_surface_t * window_create_surface(struct window *window, struct rectangle *rectangle) { - return cairo_drm_surface_create(window->ctx, + return cairo_drm_surface_create(window->display->ctx, CAIRO_CONTENT_COLOR_ALPHA, rectangle->width, rectangle->height); @@ -437,7 +445,7 @@ window_set_fullscreen(struct window *window, int fullscreen) window->fullscreen = fullscreen; if (window->fullscreen) { window->saved_allocation = window->allocation; - window->allocation = window->screen_allocation; + window->allocation = window->display->screen_allocation; } else { window->allocation = window->saved_allocation; } @@ -459,78 +467,98 @@ window_set_key_handler(struct window *window, window->user_data = data; } +struct window * +window_create(struct display *display, const char *title, + int32_t x, int32_t y, int32_t width, int32_t height) +{ + struct window *window; + + window = malloc(sizeof *window); + if (window == NULL) + return NULL; + + memset(window, 0, sizeof *window); + window->display = display; + window->title = strdup(title); + window->surface = wl_compositor_create_surface(display->compositor); + window->allocation.x = x; + window->allocation.y = y; + window->allocation.width = width; + window->allocation.height = height; + window->saved_allocation = window->allocation; + window->margin = 16; + window->state = WINDOW_STABLE; + + wl_compositor_add_listener(display->compositor, + &compositor_listener, window); + + wl_input_device_add_listener(display->input_device, + &input_device_listener, window); + + return window; +} + static void -window_handle_geometry(void *data, - struct wl_output *output, - int32_t width, int32_t height) +display_handle_geometry(void *data, + struct wl_output *output, + int32_t width, int32_t height) { - struct window *window = data; + struct display *display = data; - window->screen_allocation.x = 0; - window->screen_allocation.y = 0; - window->screen_allocation.width = width; - window->screen_allocation.height = height; + display->screen_allocation.x = 0; + display->screen_allocation.y = 0; + display->screen_allocation.width = width; + display->screen_allocation.height = height; } static const struct wl_output_listener output_listener = { - window_handle_geometry, + display_handle_geometry, }; static void -window_handle_global(struct wl_display *display, +display_handle_global(struct wl_display *display, struct wl_object *object, void *data) { - struct window *window = data; + struct display *d = data; if (wl_object_implements(object, "compositor", 1)) { - window->compositor = (struct wl_compositor *) object; - wl_compositor_add_listener(window->compositor, - &compositor_listener, window); + d->compositor = (struct wl_compositor *) object; } else if (wl_object_implements(object, "output", 1)) { - struct wl_output *output = (struct wl_output *) object; - - wl_output_add_listener(output, - &output_listener, window); + d->output = (struct wl_output *) object; + wl_output_add_listener(d->output, &output_listener, d); } else if (wl_object_implements(object, "input_device", 1)) { - struct wl_input_device *input_device = - (struct wl_input_device *) object; - - wl_input_device_add_listener(input_device, - &input_device_listener, window); + d->input_device =(struct wl_input_device *) object; } } -struct window * -window_create(struct wl_display *display, int fd, - const char *title, - int32_t x, int32_t y, int32_t width, int32_t height) +struct display * +display_create(struct wl_display *display, int fd) { - struct window *window; + struct display *d; - window = malloc(sizeof *window); - if (window == NULL) + d = malloc(sizeof *d); + if (d == NULL) return NULL; - memset(window, 0, sizeof *window); - window->display = display; - window->title = strdup(title); - window->compositor = wl_display_get_compositor(display); - window->surface = wl_compositor_create_surface(window->compositor); - window->allocation.x = x; - window->allocation.y = y; - window->allocation.width = width; - window->allocation.height = height; - window->saved_allocation = window->allocation; - window->margin = 16; - window->state = WINDOW_STABLE; - window->ctx = cairo_drm_context_get_for_fd(fd); - if (window->ctx == NULL) { + d->display = display; + d->ctx = cairo_drm_context_get_for_fd(fd); + if (d->ctx == NULL) { fprintf(stderr, "failed to get cairo drm context\n"); return NULL; } + /* Set up listener so we'll catch all events. */ wl_display_add_global_listener(display, - window_handle_global, window); + display_handle_global, d); - return window; + /* Process connection events. */ + wl_display_iterate(display, WL_DISPLAY_READABLE); + + return d; +} + +struct wl_compositor * +display_get_compositor(struct display *display) +{ + return display->compositor; } |