#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/promif.h>
#include <sys/promimpl.h>
int
prom_stdout_is_framebuffer(void)
{
static int remember = -1;
if (remember != -1)
return (remember);
remember = prom_devicetype((pnode_t)prom_stdout_node(),
OBP_DISPLAY);
if (remember == 0)
remember = prom_devicetype((pnode_t)prom_stdout_node(),
OBP_DISPLAY_CONSOLE);
return (remember);
}
void
prom_get_tem_inverses(int *inverse, int *inverse_screen)
{
prom_interpret(
"my-self >r stdout @ is my-self "
"inverse? swap l! inverse-screen? swap l! "
"r> is my-self",
(uintptr_t)inverse, (uintptr_t)inverse_screen, 0, 0, 0);
}
void
prom_get_tem_pos(uint32_t *row, uint32_t *col)
{
prom_interpret(
"my-self >r stdout @ is my-self "
"line# swap l! column# swap l! "
"r> is my-self",
(uintptr_t)row, (uintptr_t)col, 0, 0, 0);
}
void
prom_get_term_font_size(int *charheight, int *window_top)
{
prom_interpret(
"my-self >r stdout @ is my-self "
"char-height swap l! window-top swap l! "
"r> is my-self",
(uintptr_t)charheight, (uintptr_t)window_top, 0, 0, 0);
}
void
prom_hide_cursor(void)
{
prom_interpret(
"my-self >r stdout @ is my-self "
"toggle-cursor "
"1 delete-characters "
"r> is my-self",
0, 0, 0, 0, 0);
}
static size_t
prom_atol(const char *str, int len)
{
size_t n = 0;
while (len-- && (*str != '\0')) {
n = n * 10 + (*str - '0');
str++;
}
return (n);
}
void
prom_get_tem_size(size_t *height, size_t *width)
{
char buf[MAXPATHLEN];
char name[16];
pnode_t node;
int len;
if ((node = prom_optionsnode()) == OBP_BADNODE)
return;
(void) prom_strcpy(name, "screen-#rows");
if ((len = prom_getproplen(node, (caddr_t)name)) > 0) {
(void) prom_getprop(node, (caddr_t)name, (caddr_t)buf);
*height = prom_atol(buf, len);
}
(void) prom_strcpy(name, "screen-#columns");
if ((len = prom_getproplen(node, (caddr_t)name)) > 0) {
(void) prom_getprop(node, (caddr_t)name, (caddr_t)buf);
*width = prom_atol(buf, len);
}
}