uterm: move video API into uterm_video.h
authorDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 7 Jan 2013 17:03:45 +0000 (18:03 +0100)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 7 Jan 2013 17:03:45 +0000 (18:03 +0100)
Split the main header to avoid having it as dependency in so many places.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
24 files changed:
Makefile.am
src/font.h
src/font_8x16.c
src/font_freetype2.c
src/font_pango.c
src/font_unifont.c
src/kmscon_conf.c
src/kmscon_main.c
src/kmscon_seat.c
src/kmscon_seat.h
src/kmscon_terminal.c
src/text.c
src/text.h
src/text_bblit.c
src/text_bbulk.c
src/text_gltex.c
src/uterm.h
src/uterm_video.c
src/uterm_video.h [new file with mode: 0644]
src/uterm_video_drm.c
src/uterm_video_dumb.c
src/uterm_video_fbdev.c
src/uterm_video_internal.h
src/wlt_terminal.c

index 5380f97..5e6203c 100644 (file)
@@ -218,7 +218,9 @@ libtsm_la_LDFLAGS = \
 
 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
 
@@ -227,6 +229,7 @@ libuterm_la_SOURCES = \
        $(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 \
index b3f056f..cf76424 100644 (file)
@@ -33,7 +33,7 @@
 #include <errno.h>
 #include <stdlib.h>
 #include "kmscon_module.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 /* fonts */
 
index ae2cae0..24f8935 100644 (file)
@@ -49,7 +49,7 @@
 #include <string.h>
 #include "font.h"
 #include "log.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "font_8x16"
 
index a035bee..d1cbd71 100644 (file)
@@ -48,7 +48,7 @@
 #include "log.h"
 #include "shl_dlist.h"
 #include "shl_hashtable.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "font_freetype2"
 
index 22b9128..664b99e 100644 (file)
@@ -56,7 +56,7 @@
 #include "shl_dlist.h"
 #include "shl_hashtable.h"
 #include "tsm_unicode.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "font_pango"
 
index 3431d09..0dbb1aa 100644 (file)
@@ -44,7 +44,7 @@
 #include <string.h>
 #include "font.h"
 #include "log.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "font_unifont"
 
index db46692..f88b696 100644 (file)
@@ -36,7 +36,7 @@
 #include "kmscon_conf.h"
 #include "log.h"
 #include "shl_misc.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 static void print_help()
 {
index ed29fb8..3385445 100644 (file)
@@ -41,6 +41,7 @@
 #include "shl_misc.h"
 #include "text.h"
 #include "uterm.h"
+#include "uterm_video.h"
 
 struct app_video {
        struct shl_dlist list;
index e1f054d..aaba005 100644 (file)
@@ -42,6 +42,7 @@
 #include "log.h"
 #include "shl_dlist.h"
 #include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "seat"
 
index 1787f61..398d073 100644 (file)
@@ -37,6 +37,7 @@
 #include "conf.h"
 #include "eloop.h"
 #include "uterm.h"
+#include "uterm_video.h"
 
 struct kmscon_seat;
 struct kmscon_session;
index d122238..a90228d 100644 (file)
@@ -46,6 +46,7 @@
 #include "tsm_screen.h"
 #include "tsm_vte.h"
 #include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "terminal"
 
index e825d37..89c4899 100644 (file)
@@ -39,7 +39,7 @@
 #include "shl_dlist.h"
 #include "shl_register.h"
 #include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "text"
 
index 0504dfc..f2cee79 100644 (file)
@@ -38,7 +38,7 @@
 #include "font.h"
 #include "kmscon_module.h"
 #include "tsm_screen.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 /* text renderer */
 
index 4595b18..ca19fb4 100644 (file)
@@ -38,7 +38,7 @@
 #include <string.h>
 #include "log.h"
 #include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "text_bblit"
 
index 3e589b6..298d252 100644 (file)
@@ -38,7 +38,7 @@
 #include <string.h>
 #include "log.h"
 #include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "text_bbulk"
 
index b8cd8bf..845ae10 100644 (file)
@@ -50,7 +50,7 @@
 #include "shl_hashtable.h"
 #include "static_gl.h"
 #include "text.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 #define LOG_SUBSYSTEM "text_gltex"
 
index 1330f85..39ff67e 100644 (file)
 #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
index 616a2d7..082038d 100644 (file)
@@ -37,7 +37,7 @@
 #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"
diff --git a/src/uterm_video.h b/src/uterm_video.h
new file mode 100644 (file)
index 0000000..e30194b
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * 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 */
index 840ba36..0ba6863 100644 (file)
@@ -46,7 +46,7 @@
 #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"
index 6a8101d..cf721d9 100644 (file)
@@ -39,7 +39,7 @@
 #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"
index e8cfe24..3285baa 100644 (file)
@@ -37,7 +37,7 @@
 #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"
index a7937c1..d34b200 100644 (file)
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include "eloop.h"
 #include "shl_hook.h"
-#include "uterm.h"
+#include "uterm_video.h"
 
 /* backend-operations */
 
index 380e814..1588285 100644 (file)
@@ -44,6 +44,7 @@
 #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"