Subversion Repositories HelenOS-historic

Rev

Rev 1522 | Rev 1547 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Ondrej Palkovsky
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. #include <ipc/fb.h>
  30. #include <ipc/ipc.h>
  31. #include <async.h>
  32. #include <stdio.h>
  33.  
  34. #include "console.h"
  35. #include "gcons.h"
  36.  
  37. #define CONSOLE_TOP      50
  38. #define CONSOLE_MARGIN   10
  39.  
  40. #define STATUS_SPACE    20
  41. #define STATUS_WIDTH    40
  42. #define STATUS_HEIGHT   30
  43.  
  44. #define MAIN_COLOR      0x118811
  45.  
  46. static int use_gcons = 0;
  47. static ipcarg_t xres,yres;
  48.  
  49. static int console_vp;
  50. static int cstatus_vp[CONSOLE_COUNT];
  51. static int console_has_input[CONSOLE_COUNT];
  52. static int cstat_row, cstat_col; /* Size of cstatus buttons */
  53.  
  54. static int fbphone;
  55.  
  56. enum butstate {
  57.     CONS_ACTIVE = 0,
  58.     CONS_IDLE,
  59.     CONS_HAS_INPUT,
  60.     CONS_DISCONNECTED
  61. };
  62.  
  63. static struct {
  64.     int fgcolor;
  65.     int bgcolor;
  66. } stat_colors[] = {
  67.     {0xd0d0d0, 0x808080},
  68.     {0xd0d0d0, 0x0},
  69.     {0xd0d0d0, 0xa04040},
  70.     {0xd0d0d0, 0x0}
  71. };
  72.  
  73. static int active_console = 0;
  74.  
  75. static void vp_switch(int vp)
  76. {
  77.     nsend_call(fbphone,FB_VIEWPORT_SWITCH, vp);
  78. }
  79.  
  80. /** Create view port */
  81. static int vp_create(unsigned int x, unsigned int y,
  82.              unsigned int width, unsigned int height)
  83. {
  84.     /* Init function, use ipc_call_sync */
  85.     return ipc_call_sync_2(fbphone, FB_VIEWPORT_CREATE,
  86.                    (x << 16) | y, (width << 16) | height,
  87.                    NULL, NULL);
  88. }
  89.  
  90. static void clear(void)
  91. {
  92.     nsend_call(fbphone, FB_CLEAR, 0);
  93.    
  94. }
  95.  
  96. static void set_style(int fgcolor, int bgcolor)
  97. {
  98.     nsend_call_2(fbphone, FB_SET_STYLE, fgcolor, bgcolor);
  99. }
  100.  
  101. static void putch(char c, int row, int col)
  102. {
  103.     nsend_call_3(fbphone, FB_PUTCHAR, c, row, col);
  104. }
  105.  
  106. static void draw_stat(int consnum, enum butstate state)
  107. {
  108.     char data[5];
  109.     int i;
  110.    
  111.     vp_switch(cstatus_vp[consnum]);
  112.     set_style(stat_colors[state].fgcolor, stat_colors[state].bgcolor);
  113.     clear();
  114.     if (state != CONS_DISCONNECTED) {
  115.         snprintf(data, 5, "%d", consnum+1);
  116.         for (i=0;data[i];i++)
  117.             putch(data[i], 0, i);
  118.     }
  119. }
  120.  
  121. void gcons_change_console(int consnum)
  122. {
  123.     if (!use_gcons)
  124.         return;
  125.    
  126.     draw_stat(active_console, CONS_IDLE);
  127.     active_console = consnum;
  128.     draw_stat(consnum, CONS_ACTIVE);
  129.     console_has_input[consnum] = 0;
  130.  
  131.     vp_switch(console_vp);
  132. }
  133.  
  134. void gcons_notify_char(int consnum)
  135. {
  136.     if (!use_gcons)
  137.         return;
  138.  
  139.     if (consnum == active_console || console_has_input[consnum])
  140.         return;
  141.  
  142.     console_has_input[consnum] = 1;
  143.     draw_stat(consnum, CONS_HAS_INPUT);
  144.    
  145.     vp_switch(console_vp);
  146. }
  147.  
  148. void gcons_redraw_console(void)
  149. {
  150.     int i;
  151.  
  152.     if (!use_gcons)
  153.         return;
  154.    
  155.     vp_switch(0);
  156.     set_style(MAIN_COLOR, MAIN_COLOR);
  157.     clear();
  158.  
  159.     for (i=0;i < CONSOLE_COUNT; i++)
  160.         draw_stat(i, i == active_console ? CONS_ACTIVE : CONS_DISCONNECTED);
  161.     vp_switch(console_vp);
  162. }
  163.  
  164. /** Initialize nice graphical console environment */
  165. void gcons_init(int phone)
  166. {
  167.     int rc;
  168.     int i;
  169.  
  170.     fbphone = phone;
  171.  
  172.     rc = ipc_call_sync_2(phone, FB_GET_RESOLUTION, 0, 0, &xres, &yres);
  173.     if (rc)
  174.         return;
  175.    
  176.     if (xres < 800 || yres < 600)
  177.         return;
  178.  
  179.     /* create console viewport */
  180.     console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, xres-2*CONSOLE_MARGIN,
  181.                    yres-(CONSOLE_TOP+CONSOLE_MARGIN));
  182.     if (console_vp < 0)
  183.         return;
  184.    
  185.     /* Create status buttons */
  186.     for (i=0; i < CONSOLE_COUNT; i++) {
  187.         cstatus_vp[i] = vp_create(CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE),
  188.                       CONSOLE_MARGIN, STATUS_WIDTH, STATUS_HEIGHT);
  189.         if (cstatus_vp[i] < 0)
  190.             return;
  191.     }
  192.    
  193.     use_gcons = 1;
  194.     gcons_redraw_console();
  195. }
  196.