12cf9911fSPeter Grehan /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
3ce80faa4SMarcelo Araujo *
42cf9911fSPeter Grehan * Copyright (c) 2015 Tycho Nightingale <tycho.nightingale@pluribusnetworks.com>
52cf9911fSPeter Grehan * All rights reserved.
62cf9911fSPeter Grehan *
72cf9911fSPeter Grehan * Redistribution and use in source and binary forms, with or without
82cf9911fSPeter Grehan * modification, are permitted provided that the following conditions
92cf9911fSPeter Grehan * are met:
102cf9911fSPeter Grehan * 1. Redistributions of source code must retain the above copyright
112cf9911fSPeter Grehan * notice, this list of conditions and the following disclaimer.
122cf9911fSPeter Grehan * 2. Redistributions in binary form must reproduce the above copyright
132cf9911fSPeter Grehan * notice, this list of conditions and the following disclaimer in the
142cf9911fSPeter Grehan * documentation and/or other materials provided with the distribution.
152cf9911fSPeter Grehan *
162cf9911fSPeter Grehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
172cf9911fSPeter Grehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
182cf9911fSPeter Grehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
192cf9911fSPeter Grehan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
202cf9911fSPeter Grehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
212cf9911fSPeter Grehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
222cf9911fSPeter Grehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
232cf9911fSPeter Grehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
242cf9911fSPeter Grehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
252cf9911fSPeter Grehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
262cf9911fSPeter Grehan * SUCH DAMAGE.
272cf9911fSPeter Grehan */
282cf9911fSPeter Grehan
292cf9911fSPeter Grehan #include <sys/types.h>
302cf9911fSPeter Grehan
312cf9911fSPeter Grehan #include "bhyvegc.h"
322cf9911fSPeter Grehan #include "console.h"
332cf9911fSPeter Grehan
342cf9911fSPeter Grehan static struct {
352cf9911fSPeter Grehan struct bhyvegc *gc;
362cf9911fSPeter Grehan
372cf9911fSPeter Grehan fb_render_func_t fb_render_cb;
382cf9911fSPeter Grehan void *fb_arg;
392cf9911fSPeter Grehan
402cf9911fSPeter Grehan kbd_event_func_t kbd_event_cb;
412cf9911fSPeter Grehan void *kbd_arg;
422cf9911fSPeter Grehan int kbd_priority;
432cf9911fSPeter Grehan
442cf9911fSPeter Grehan ptr_event_func_t ptr_event_cb;
452cf9911fSPeter Grehan void *ptr_arg;
462cf9911fSPeter Grehan int ptr_priority;
472cf9911fSPeter Grehan } console;
482cf9911fSPeter Grehan
492cf9911fSPeter Grehan void
console_init(int w,int h,void * fbaddr)502cf9911fSPeter Grehan console_init(int w, int h, void *fbaddr)
512cf9911fSPeter Grehan {
522cf9911fSPeter Grehan console.gc = bhyvegc_init(w, h, fbaddr);
532cf9911fSPeter Grehan }
542cf9911fSPeter Grehan
552cf9911fSPeter Grehan void
console_set_fbaddr(void * fbaddr)562cf9911fSPeter Grehan console_set_fbaddr(void *fbaddr)
572cf9911fSPeter Grehan {
582cf9911fSPeter Grehan bhyvegc_set_fbaddr(console.gc, fbaddr);
592cf9911fSPeter Grehan }
602cf9911fSPeter Grehan
612cf9911fSPeter Grehan struct bhyvegc_image *
console_get_image(void)622cf9911fSPeter Grehan console_get_image(void)
632cf9911fSPeter Grehan {
642cf9911fSPeter Grehan struct bhyvegc_image *bhyvegc_image;
652cf9911fSPeter Grehan
662cf9911fSPeter Grehan bhyvegc_image = bhyvegc_get_image(console.gc);
672cf9911fSPeter Grehan
682cf9911fSPeter Grehan return (bhyvegc_image);
692cf9911fSPeter Grehan }
702cf9911fSPeter Grehan
712cf9911fSPeter Grehan void
console_fb_register(fb_render_func_t render_cb,void * arg)722cf9911fSPeter Grehan console_fb_register(fb_render_func_t render_cb, void *arg)
732cf9911fSPeter Grehan {
742cf9911fSPeter Grehan console.fb_render_cb = render_cb;
752cf9911fSPeter Grehan console.fb_arg = arg;
762cf9911fSPeter Grehan }
772cf9911fSPeter Grehan
782cf9911fSPeter Grehan void
console_refresh(void)792cf9911fSPeter Grehan console_refresh(void)
802cf9911fSPeter Grehan {
812cf9911fSPeter Grehan if (console.fb_render_cb)
822cf9911fSPeter Grehan (*console.fb_render_cb)(console.gc, console.fb_arg);
832cf9911fSPeter Grehan }
842cf9911fSPeter Grehan
852cf9911fSPeter Grehan void
console_kbd_register(kbd_event_func_t event_cb,void * arg,int pri)862cf9911fSPeter Grehan console_kbd_register(kbd_event_func_t event_cb, void *arg, int pri)
872cf9911fSPeter Grehan {
882cf9911fSPeter Grehan if (pri > console.kbd_priority) {
892cf9911fSPeter Grehan console.kbd_event_cb = event_cb;
902cf9911fSPeter Grehan console.kbd_arg = arg;
912cf9911fSPeter Grehan console.kbd_priority = pri;
922cf9911fSPeter Grehan }
932cf9911fSPeter Grehan }
942cf9911fSPeter Grehan
952cf9911fSPeter Grehan void
console_ptr_register(ptr_event_func_t event_cb,void * arg,int pri)962cf9911fSPeter Grehan console_ptr_register(ptr_event_func_t event_cb, void *arg, int pri)
972cf9911fSPeter Grehan {
982cf9911fSPeter Grehan if (pri > console.ptr_priority) {
992cf9911fSPeter Grehan console.ptr_event_cb = event_cb;
1002cf9911fSPeter Grehan console.ptr_arg = arg;
1012cf9911fSPeter Grehan console.ptr_priority = pri;
1022cf9911fSPeter Grehan }
1032cf9911fSPeter Grehan }
1042cf9911fSPeter Grehan
1052cf9911fSPeter Grehan void
console_key_event(int down,uint32_t keysym,uint32_t keycode)106b563ff5dSMichael Reifenberger console_key_event(int down, uint32_t keysym, uint32_t keycode)
1072cf9911fSPeter Grehan {
1082cf9911fSPeter Grehan if (console.kbd_event_cb)
109b563ff5dSMichael Reifenberger (*console.kbd_event_cb)(down, keysym, keycode, console.kbd_arg);
1102cf9911fSPeter Grehan }
1112cf9911fSPeter Grehan
1122cf9911fSPeter Grehan void
console_ptr_event(uint8_t button,int x,int y)1132cf9911fSPeter Grehan console_ptr_event(uint8_t button, int x, int y)
1142cf9911fSPeter Grehan {
1152cf9911fSPeter Grehan if (console.ptr_event_cb)
1162cf9911fSPeter Grehan (*console.ptr_event_cb)(button, x, y, console.ptr_arg);
1172cf9911fSPeter Grehan }
118