/uspace/trunk/console/gcons.h |
---|
0,0 → 1,35 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef _GCONS_H_ |
#define _GCONS_H_ |
void gcons_init(int phone); |
void gcons_change_console(int consnum); |
#endif |
/uspace/trunk/console/console.c |
---|
41,6 → 41,8 |
#include <screenbuffer.h> |
#include <sys/mman.h> |
#include "gcons.h" |
#define MAX_KEYREQUESTS_BUFFERED 32 |
#define NAME "CONSOLE" |
177,7 → 179,6 |
conn = &connections[active_console]; |
// if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + CONSOLE_COUNT)) { |
if ((c >= '0') && (c < '0' + CONSOLE_COUNT)) { |
if (c == '0') { |
/* switch to kernel console*/ |
sync_send_2(fb_info.phone, FB_CURSOR_VISIBILITY, 0, 0, NULL, NULL); |
192,6 → 193,8 |
if (c == active_console) |
break; |
active_console = c; |
gcons_change_console(c); |
} |
conn = &connections[active_console]; |
336,6 → 339,12 |
while ((fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) { |
usleep(10000); |
} |
/* Initialize gcons */ |
gcons_init(fb_info.phone); |
/* Synchronize, the gcons can have something in queue */ |
sync_send_2(fb_info.phone, FB_GET_CSIZE, 0, 0, NULL, NULL); |
ipc_call_sync_2(fb_info.phone, FB_GET_CSIZE, 0, 0, &(fb_info.rows), &(fb_info.cols)); |
nsend_call_2(fb_info.phone, FB_SET_STYLE, DEFAULT_FOREGROUND_COLOR, DEFAULT_BACKGROUND_COLOR); |
367,7 → 376,7 |
async_new_connection(phonehash, 0, NULL, keyboard_events); |
nsend_call_2(fb_info.phone, FB_CURSOR_GOTO, 0, 0); |
sync_send_2(fb_info.phone, FB_CURSOR_GOTO, 0, 0, NULL, NULL); |
nsend_call(fb_info.phone, FB_CURSOR_VISIBILITY, 1); |
/* Register at NS */ |
/uspace/trunk/console/gcons.c |
---|
28,8 → 28,11 |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <async.h> |
#include <stdio.h> |
#include "console.h" |
#include "gcons.h" |
#define CONSOLE_TOP 50 |
#define CONSOLE_MARGIN 10 |
38,42 → 41,86 |
#define STATUS_WIDTH 40 |
#define STATUS_HEIGHT 30 |
#define MAIN_COLOR 0x118811 |
static int use_gcons = 0; |
static ipcarg_t xres,yres; |
static int console_vp; |
static int cstatus_vp[CONSOLE_COUNT]; |
static int cstat_row, cstat_col; /* Size of cstatus buttons */ |
static int fbphone; |
enum butstate { |
CONS_ACTIVE = 0, |
CONS_IDLE, |
CONS_HAS_INPUT |
}; |
static struct { |
int fgcolor; |
int bgcolor; |
} stat_colors[] = { |
{0xd0d0d0, 0x808080}, |
{0xd0d0d0, 0x0}, |
{0xd0d0d0, 0xa04040} |
}; |
static int active_console = 0; |
static void vp_switch(int vp) |
{ |
ipc_call_sync_2(fbphone,FB_VIEWPORT_SWITCH, vp, 0, NULL, NULL); |
nsend_call(fbphone,FB_VIEWPORT_SWITCH, vp); |
} |
/** Create view port */ |
static int vp_create(unsigned int x, unsigned int y, |
unsigned int width, unsgined int height) |
unsigned int width, unsigned int height) |
{ |
return ipc_call_sync_2(fbphone, (x << 16) | y, (width << 16) | height, |
NULL, NULL); |
/* Init function, use ipc_call_sync */ |
return ipc_call_sync_2(fbphone, FB_VIEWPORT_CREATE, |
(x << 16) | y, (width << 16) | height, |
NULL, NULL); |
} |
static void fb_clear(void) |
static void clear(void) |
{ |
ipc_call_sync_2(fbphone, FB_CLEAR, 0, 0, NULL, NULL); |
nsend_call(fbphone, FB_CLEAR, 0); |
} |
static void fb_set_style(int fgcolor, int bgcolor) |
static void set_style(int fgcolor, int bgcolor) |
{ |
ipc_call_sync_2(fbphone, ); |
nsend_call_2(fbphone, FB_SET_STYLE, fgcolor, bgcolor); |
} |
static void putch(char c, int row, int col) |
{ |
nsend_call_3(fbphone, FB_PUTCHAR, c, row, col); |
} |
static void draw_stat(int consnum, enum butstate state) |
{ |
char data[5]; |
int i; |
vp_switch(cstatus_vp[consnum]); |
set_style(stat_colors[state].fgcolor, stat_colors[state].bgcolor); |
clear(); |
snprintf(data, 5, "%d", consnum+1); |
for (i=0;data[i];i++) |
putch(data[i], 0, i); |
} |
void gcons_change_console(int consnum) |
{ |
if (!use_gcons) |
return; |
draw_stat(active_console, CONS_IDLE); |
active_console = consnum; |
draw_stat(consnum, CONS_ACTIVE); |
vp_switch(console_vp); |
} |
85,15 → 132,19 |
vp_switch(console_vp); |
} |
void gcons_redraw_console(int phone) |
void gcons_redraw_console(void) |
{ |
int i; |
if (!use_gcons) |
return; |
vp_switch(0); |
/* Set style...*/ |
fb_clear(); |
set_style(MAIN_COLOR, MAIN_COLOR); |
clear(); |
for (i=0;i < CONSOLE_COUNT; i++) |
draw_stat(i, i == active_console ? CONS_ACTIVE : CONS_IDLE); |
vp_switch(console_vp); |
} |
120,7 → 171,7 |
/* Create status buttons */ |
for (i=0; i < CONSOLE_COUNT; i++) { |
cstatus_vp[i] = vp_create(phone, CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE), |
cstatus_vp[i] = vp_create(CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE), |
CONSOLE_MARGIN, STATUS_WIDTH, STATUS_HEIGHT); |
if (cstatus_vp[i] < 0) |
return; |
127,5 → 178,5 |
} |
use_gcons = 1; |
gcons_draw_console(); |
gcons_redraw_console(); |
} |
/uspace/trunk/console/Makefile |
---|
44,7 → 44,8 |
GENERIC_SOURCES = \ |
console.c \ |
screenbuffer.c \ |
../kbd/generic/key_buffer.c |
../kbd/generic/key_buffer.c \ |
gcons.c |
ARCH_SOURCES = |