Split the main header to avoid having it as dependency in so many places.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
if BUILD_ENABLE_UTERM
lib_LTLIBRARIES += libuterm.la
-include_HEADERS += src/uterm.h
+include_HEADERS += \
+ src/uterm.h \
+ src/uterm_video.h
pkgconfig_DATA += docs/pc/libuterm.pc
endif
$(SHL_HOOK) \
$(SHL_MISC) \
src/uterm.h \
+ src/uterm_video.h \
src/uterm_input_internal.h \
src/uterm_video_internal.h \
src/uterm_systemd_internal.h \
#include <errno.h>
#include <stdlib.h>
#include "kmscon_module.h"
-#include "uterm.h"
+#include "uterm_video.h"
/* fonts */
#include <string.h>
#include "font.h"
#include "log.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "font_8x16"
#include "log.h"
#include "shl_dlist.h"
#include "shl_hashtable.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "font_freetype2"
#include "shl_dlist.h"
#include "shl_hashtable.h"
#include "tsm_unicode.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "font_pango"
#include <string.h>
#include "font.h"
#include "log.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "font_unifont"
#include "kmscon_conf.h"
#include "log.h"
#include "shl_misc.h"
-#include "uterm.h"
+#include "uterm_video.h"
static void print_help()
{
#include "shl_misc.h"
#include "text.h"
#include "uterm.h"
+#include "uterm_video.h"
struct app_video {
struct shl_dlist list;
#include "log.h"
#include "shl_dlist.h"
#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "seat"
#include "conf.h"
#include "eloop.h"
#include "uterm.h"
+#include "uterm_video.h"
struct kmscon_seat;
struct kmscon_session;
#include "tsm_screen.h"
#include "tsm_vte.h"
#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "terminal"
#include "shl_dlist.h"
#include "shl_register.h"
#include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "text"
#include "font.h"
#include "kmscon_module.h"
#include "tsm_screen.h"
-#include "uterm.h"
+#include "uterm_video.h"
/* text renderer */
#include <string.h>
#include "log.h"
#include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "text_bblit"
#include <string.h>
#include "log.h"
#include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "text_bbulk"
#include "shl_hashtable.h"
#include "static_gl.h"
#include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
#define LOG_SUBSYSTEM "text_gltex"
#ifndef UTERM_UTERM_H
#define UTERM_UTERM_H
+#include <eloop.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdlib.h>
-#include "eloop.h"
-
-/*
- * Video Control
- * Linux provides 2 famous ways to access the video hardware: fbdev and drm
- * fbdev is the older one of both and is simply a mmap() of the framebuffer into
- * main memory. It does not allow 3D acceleration and if you need 2D
- * acceleration you should use libraries like cairo to draw into the framebuffer
- * provided by this library.
- * DRM is the new approach which provides 3D acceleration with mesa. It allows
- * much more configuration as fbdev and is the recommended way to access video
- * hardware on modern computers.
- * Modern mesa provides 3D acceleration on fbdev, too. This is used in systems
- * like Android. This will allow us to provide an fbdev backend here.
- *
- * Famous linux graphics systems like X.Org/X11 or Wayland use fbdev or DRM
- * internally to access the video hardware. This API allows low-level access to
- * fbdev and DRM without the need of X.Org/X11 or Wayland. If VT support is
- * enabled in your kernel, each application can run on a different VT. For
- * instance, X.Org may run on VT-7, Wayland on VT-8, your application on VT-9
- * and default consoles on VT-1 to VT-6. You can switch between them with
- * ctrl-alt-F1-F12.
- * If VT support is not available (very unlikely) you need other ways to switch
- * between applications.
- *
- * The main object by this API is uterm_video. This object attaches to a single
- * graphics card via DRM or on a single frambuffer via fbdev. Many DRM drivers
- * also provide an fbdev driver so you must go sure not to write to both
- * simulatneously. Use "UTERM_VIDEO_DRM" to scan for DRM devices. Otherwise,
- * fbdev is used. DRM is the recommended way. Use fbdev only on embedded devices
- * which do not come with an DRM driver.
- * The uterm_video object scans for graphic-cards and connected displays. Each
- * display is represented as a uterm_display object. The uterm_video object is
- * hotplug-capable so it reports if a display is connected or disconnected.
- * Each uterm_display object can be activated/deactivated independently of the
- * other displays. To draw to a display you need to create a uterm_screen object
- * and add your display to the screen. The screen object allows to spread a
- * single screen onto multiple displays. Currently, the uterm_screen object
- * allows only one display per screen but we may extend this in the future.
- *
- * If you are using fbdev, you *must* correctly destroy your uterm_video object
- * and also call uterm_video_segfault() if you abnormally abort your
- * application. Otherwise your video device remains in undefined state and other
- * applications might not display correctly.
- * If you use DRM, the same operations are recommended but not required as the
- * kernel can correctly reset video devices on its own.
- */
-
-struct uterm_mode;
-struct uterm_display;
-struct uterm_video;
-
-enum uterm_display_state {
- UTERM_DISPLAY_ACTIVE,
- UTERM_DISPLAY_ASLEEP,
- UTERM_DISPLAY_INACTIVE,
- UTERM_DISPLAY_GONE,
-};
-
-enum uterm_display_dpms {
- UTERM_DPMS_ON,
- UTERM_DPMS_STANDBY,
- UTERM_DPMS_SUSPEND,
- UTERM_DPMS_OFF,
- UTERM_DPMS_UNKNOWN,
-};
-
-enum uterm_video_type {
- UTERM_VIDEO_DRM,
- UTERM_VIDEO_DUMB,
- UTERM_VIDEO_FBDEV,
-};
-
-enum uterm_video_action {
- UTERM_WAKE_UP,
- UTERM_SLEEP,
- UTERM_NEW,
- UTERM_GONE,
-};
-
-struct uterm_video_hotplug {
- struct uterm_display *display;
- int action;
-};
-
-enum uterm_display_action {
- UTERM_PAGE_FLIP,
-};
-
-struct uterm_display_event {
- int action;
-};
-
-enum uterm_video_format {
- UTERM_FORMAT_GREY,
- UTERM_FORMAT_XRGB32,
-};
-
-struct uterm_video_buffer {
- unsigned int width;
- unsigned int height;
- unsigned int stride;
- unsigned int format;
- uint8_t *data;
-};
-
-struct uterm_video_blend_req {
- const struct uterm_video_buffer *buf;
- unsigned int x;
- unsigned int y;
- uint8_t fr;
- uint8_t fg;
- uint8_t fb;
- uint8_t br;
- uint8_t bg;
- uint8_t bb;
-};
-
-typedef void (*uterm_video_cb) (struct uterm_video *video,
- struct uterm_video_hotplug *arg,
- void *data);
-typedef void (*uterm_display_cb) (struct uterm_display *disp,
- struct uterm_display_event *arg,
- void *data);
-
-/* misc */
-
-const char *uterm_dpms_to_name(int dpms);
-bool uterm_video_available(unsigned int type);
-
-/* display modes interface */
-
-void uterm_mode_ref(struct uterm_mode *mode);
-void uterm_mode_unref(struct uterm_mode *mode);
-struct uterm_mode *uterm_mode_next(struct uterm_mode *mode);
-
-const char *uterm_mode_get_name(const struct uterm_mode *mode);
-unsigned int uterm_mode_get_width(const struct uterm_mode *mode);
-unsigned int uterm_mode_get_height(const struct uterm_mode *mode);
-
-/* display interface */
-
-void uterm_display_ref(struct uterm_display *disp);
-void uterm_display_unref(struct uterm_display *disp);
-struct uterm_display *uterm_display_next(struct uterm_display *disp);
-
-int uterm_display_register_cb(struct uterm_display *disp, uterm_display_cb cb,
- void *data);
-void uterm_display_unregister_cb(struct uterm_display *disp,
- uterm_display_cb cb, void *data);
-
-struct uterm_mode *uterm_display_get_modes(struct uterm_display *disp);
-struct uterm_mode *uterm_display_get_current(struct uterm_display *disp);
-struct uterm_mode *uterm_display_get_default(struct uterm_display *disp);
-
-int uterm_display_get_state(struct uterm_display *disp);
-int uterm_display_activate(struct uterm_display *disp, struct uterm_mode *mode);
-void uterm_display_deactivate(struct uterm_display *disp);
-int uterm_display_set_dpms(struct uterm_display *disp, int state);
-int uterm_display_get_dpms(const struct uterm_display *disp);
-
-int uterm_display_use(struct uterm_display *disp);
-int uterm_display_swap(struct uterm_display *disp);
-bool uterm_display_is_swapping(struct uterm_display *disp);
-
-int uterm_display_fill(struct uterm_display *disp,
- uint8_t r, uint8_t g, uint8_t b,
- unsigned int x, unsigned int y,
- unsigned int width, unsigned int height);
-int uterm_display_blit(struct uterm_display *disp,
- const struct uterm_video_buffer *buf,
- unsigned int x, unsigned int y);
-int uterm_display_fake_blend(struct uterm_display *disp,
- const struct uterm_video_buffer *buf,
- unsigned int x, unsigned int y,
- uint8_t fr, uint8_t fg, uint8_t fb,
- uint8_t br, uint8_t bg, uint8_t bb);
-int uterm_display_fake_blendv(struct uterm_display *disp,
- const struct uterm_video_blend_req *req,
- size_t num);
-
-/* video interface */
-
-int uterm_video_new(struct uterm_video **out,
- struct ev_eloop *eloop,
- unsigned int type,
- const char *node);
-void uterm_video_ref(struct uterm_video *video);
-void uterm_video_unref(struct uterm_video *video);
-
-void uterm_video_segfault(struct uterm_video *video);
-int uterm_video_use(struct uterm_video *video);
-struct uterm_display *uterm_video_get_displays(struct uterm_video *video);
-int uterm_video_register_cb(struct uterm_video *video, uterm_video_cb cb,
- void *data);
-void uterm_video_unregister_cb(struct uterm_video *video, uterm_video_cb cb,
- void *data);
-
-void uterm_video_sleep(struct uterm_video *video);
-int uterm_video_wake_up(struct uterm_video *video);
-bool uterm_video_is_awake(struct uterm_video *video);
-void uterm_video_poll(struct uterm_video *video);
/*
* Input Devices
#include "eloop.h"
#include "log.h"
#include "shl_hook.h"
-#include "uterm.h"
+#include "uterm_video.h"
#include "uterm_video_internal.h"
#define LOG_SUBSYSTEM "video"
--- /dev/null
+/*
+ * uterm_video - Linux User-Space Terminal Video Handling
+ *
+ * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@googlemail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Video Control
+ * Linux provides 2 famous ways to access the video hardware: FBDEV and DRM.
+ * fbdev is the older one of both and is simply a mmap() of the framebuffer into
+ * main memory. It does not allow 3D acceleration and if you need 2D
+ * acceleration you should use libraries like cairo to draw into the framebuffer
+ * provided by this library.
+ * DRM is the new approach which provides 3D acceleration with mesa. It allows
+ * much more configuration as fbdev and is the recommended way to access video
+ * hardware on modern computers.
+ * Modern mesa provides 3D acceleration on fbdev, too. This is used in systems
+ * like Android. This will allow us to provide an fbdev backend here.
+ *
+ * Famous linux graphics systems like X.Org/X11 or Wayland use fbdev or DRM
+ * internally to access the video hardware. This API allows low-level access to
+ * fbdev and DRM without the need of X.Org/X11 or Wayland. If VT support is
+ * enabled in your kernel, each application can run on a different VT. For
+ * instance, X.Org may run on VT-7, Wayland on VT-8, your application on VT-9
+ * and default consoles on VT-1 to VT-6. You can switch between them with
+ * ctrl-alt-F1-F12.
+ * If VT support is not available you need other ways to switch between
+ * applications. See uterm_vt for more.
+ */
+
+#ifndef UTERM_UTERM_VIDEO_H
+#define UTERM_UTERM_VIDEO_H
+
+#include <eloop.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+struct uterm_mode;
+struct uterm_display;
+struct uterm_video;
+
+enum uterm_display_state {
+ UTERM_DISPLAY_ACTIVE,
+ UTERM_DISPLAY_ASLEEP,
+ UTERM_DISPLAY_INACTIVE,
+ UTERM_DISPLAY_GONE,
+};
+
+enum uterm_display_dpms {
+ UTERM_DPMS_ON,
+ UTERM_DPMS_STANDBY,
+ UTERM_DPMS_SUSPEND,
+ UTERM_DPMS_OFF,
+ UTERM_DPMS_UNKNOWN,
+};
+
+enum uterm_video_type {
+ UTERM_VIDEO_DRM,
+ UTERM_VIDEO_DUMB,
+ UTERM_VIDEO_FBDEV,
+};
+
+enum uterm_video_action {
+ UTERM_WAKE_UP,
+ UTERM_SLEEP,
+ UTERM_NEW,
+ UTERM_GONE,
+};
+
+struct uterm_video_hotplug {
+ struct uterm_display *display;
+ int action;
+};
+
+enum uterm_display_action {
+ UTERM_PAGE_FLIP,
+};
+
+struct uterm_display_event {
+ int action;
+};
+
+enum uterm_video_format {
+ UTERM_FORMAT_GREY,
+ UTERM_FORMAT_XRGB32,
+};
+
+struct uterm_video_buffer {
+ unsigned int width;
+ unsigned int height;
+ unsigned int stride;
+ unsigned int format;
+ uint8_t *data;
+};
+
+struct uterm_video_blend_req {
+ const struct uterm_video_buffer *buf;
+ unsigned int x;
+ unsigned int y;
+ uint8_t fr;
+ uint8_t fg;
+ uint8_t fb;
+ uint8_t br;
+ uint8_t bg;
+ uint8_t bb;
+};
+
+typedef void (*uterm_video_cb) (struct uterm_video *video,
+ struct uterm_video_hotplug *arg,
+ void *data);
+typedef void (*uterm_display_cb) (struct uterm_display *disp,
+ struct uterm_display_event *arg,
+ void *data);
+
+/* misc */
+
+const char *uterm_dpms_to_name(int dpms);
+bool uterm_video_available(unsigned int type);
+
+/* display modes interface */
+
+void uterm_mode_ref(struct uterm_mode *mode);
+void uterm_mode_unref(struct uterm_mode *mode);
+struct uterm_mode *uterm_mode_next(struct uterm_mode *mode);
+
+const char *uterm_mode_get_name(const struct uterm_mode *mode);
+unsigned int uterm_mode_get_width(const struct uterm_mode *mode);
+unsigned int uterm_mode_get_height(const struct uterm_mode *mode);
+
+/* display interface */
+
+void uterm_display_ref(struct uterm_display *disp);
+void uterm_display_unref(struct uterm_display *disp);
+struct uterm_display *uterm_display_next(struct uterm_display *disp);
+
+int uterm_display_register_cb(struct uterm_display *disp, uterm_display_cb cb,
+ void *data);
+void uterm_display_unregister_cb(struct uterm_display *disp,
+ uterm_display_cb cb, void *data);
+
+struct uterm_mode *uterm_display_get_modes(struct uterm_display *disp);
+struct uterm_mode *uterm_display_get_current(struct uterm_display *disp);
+struct uterm_mode *uterm_display_get_default(struct uterm_display *disp);
+
+int uterm_display_get_state(struct uterm_display *disp);
+int uterm_display_activate(struct uterm_display *disp, struct uterm_mode *mode);
+void uterm_display_deactivate(struct uterm_display *disp);
+int uterm_display_set_dpms(struct uterm_display *disp, int state);
+int uterm_display_get_dpms(const struct uterm_display *disp);
+
+int uterm_display_use(struct uterm_display *disp);
+int uterm_display_swap(struct uterm_display *disp);
+bool uterm_display_is_swapping(struct uterm_display *disp);
+
+int uterm_display_fill(struct uterm_display *disp,
+ uint8_t r, uint8_t g, uint8_t b,
+ unsigned int x, unsigned int y,
+ unsigned int width, unsigned int height);
+int uterm_display_blit(struct uterm_display *disp,
+ const struct uterm_video_buffer *buf,
+ unsigned int x, unsigned int y);
+int uterm_display_fake_blend(struct uterm_display *disp,
+ const struct uterm_video_buffer *buf,
+ unsigned int x, unsigned int y,
+ uint8_t fr, uint8_t fg, uint8_t fb,
+ uint8_t br, uint8_t bg, uint8_t bb);
+int uterm_display_fake_blendv(struct uterm_display *disp,
+ const struct uterm_video_blend_req *req,
+ size_t num);
+
+/* video interface */
+
+int uterm_video_new(struct uterm_video **out, struct ev_eloop *eloop,
+ unsigned int type, const char *node);
+void uterm_video_ref(struct uterm_video *video);
+void uterm_video_unref(struct uterm_video *video);
+
+void uterm_video_segfault(struct uterm_video *video);
+int uterm_video_use(struct uterm_video *video);
+struct uterm_display *uterm_video_get_displays(struct uterm_video *video);
+int uterm_video_register_cb(struct uterm_video *video, uterm_video_cb cb,
+ void *data);
+void uterm_video_unregister_cb(struct uterm_video *video, uterm_video_cb cb,
+ void *data);
+
+void uterm_video_sleep(struct uterm_video *video);
+int uterm_video_wake_up(struct uterm_video *video);
+bool uterm_video_is_awake(struct uterm_video *video);
+void uterm_video_poll(struct uterm_video *video);
+
+#endif /* UTERM_UTERM_VIDEO_H */
#include <xf86drmMode.h>
#include "eloop.h"
#include "log.h"
-#include "uterm.h"
+#include "uterm_video.h"
#include "uterm_video_internal.h"
#define LOG_SUBSYSTEM "video_drm"
#include <xf86drmMode.h>
#include "eloop.h"
#include "log.h"
-#include "uterm.h"
+#include "uterm_video.h"
#include "uterm_video_internal.h"
#define LOG_SUBSYSTEM "video_dumb"
#include <sys/mman.h>
#include <unistd.h>
#include "log.h"
-#include "uterm.h"
+#include "uterm_video.h"
#include "uterm_video_internal.h"
#define LOG_SUBSYSTEM "video_fbdev"
#include <stdlib.h>
#include "eloop.h"
#include "shl_hook.h"
-#include "uterm.h"
+#include "uterm_video.h"
/* backend-operations */
#include "tsm_unicode.h"
#include "tsm_screen.h"
#include "tsm_vte.h"
+#include "uterm_video.h"
#include "wlt_main.h"
#include "wlt_terminal.h"
#include "wlt_toolkit.h"