home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / spmio10.zip / gcc2 / pmio / msgs.cc < prev    next >
C/C++ Source or Header  |  1994-06-21  |  10KB  |  418 lines

  1. #include "msgs.h"
  2.  
  3.  
  4. typedef enum {
  5.   msg_batch_on,
  6.   msg_batch_off,
  7.   msg_set_screen_size,
  8.   msg_set_width,
  9.   msg_set_height,
  10.   msg_get_screen_width,
  11.   msg_get_screen_height,
  12.   msg_set_attr,
  13.   msg_set_fg,
  14.   msg_set_bg,
  15.   msg_getx,
  16.   msg_gety,
  17.   msg_gotoxy,
  18.   msg_put_raw,
  19.   msg_put_tty,
  20.   msg_put_std,
  21.   msg_set_cells,
  22.   msg_clrscr,
  23.   msg_clreol,
  24.   msg_scroll_window,
  25.   msg_set_window,
  26.   msg_unset_window,
  27.   msg_hide_cursor,
  28.   msg_set_cursor,
  29.   msg_set_cursor_color,
  30.   msg_get_cursor_color,
  31.   msg_save_screen_content,
  32.   msg_restore_screen_content,
  33. } MessageKind;
  34.  
  35. typedef struct {
  36.   MessageKind kind;
  37.   union {
  38.     struct { int width; int height; } data_set_screen_size;
  39.     /* data_batch_on */
  40.     /* data_batch_off */
  41.     int data_set_width;
  42.     int data_set_height;
  43.     int data_get_screen_width;
  44.     int data_get_screen_height;
  45.     unsigned char data_set_attr;
  46.     unsigned char data_set_fg;
  47.     unsigned char data_set_bg;
  48.     int data_getx;
  49.     int data_gety;
  50.     struct { int x; int y; } data_gotoxy;
  51.     struct { int len; const char *text; } data_put_raw;
  52.     struct { int len; const char *text; } data_put_tty;
  53.     struct { int len; const char *text; } data_put_std;
  54.     struct { int len; const char *text; } data_set_cells;
  55.     /* data_clrscr; */
  56.     /* data_clreol; */
  57.     int data_scroll_window;
  58.     struct { int x1; int y1; int x2; int y2; } data_set_window;
  59.     /* data_unset_window; */
  60.     /* data_hide_cursor; */
  61.     struct { int start_line; int stop_line; } data_set_cursor;
  62.     int data_set_cursor_color;
  63.     int data_get_cursor_color;
  64.     void *data_save_screen_content;
  65.     void *data_restore_screen_content;
  66.   } data;
  67. } Message;
  68.  
  69.  
  70. virtual MRESULT MessageWindow::msg_user1 (MPARAM mp1, MPARAM)
  71. {
  72.   Message *msg = (Message *) mp1;
  73.   switch (msg->kind)
  74.     {
  75.     case msg_batch_on:
  76.       batch_count++;
  77.       break;
  78.     case msg_batch_off:
  79.       batch_count--;
  80.       break;
  81.     case msg_set_screen_size:
  82.       inherited::set_screen_size (msg->data.data_set_screen_size.width,
  83.                   msg->data.data_set_screen_size.height);
  84.       break;
  85.     case msg_set_width:
  86.       inherited::set_width (msg->data.data_set_width);
  87.       break;
  88.     case msg_set_height:
  89.       inherited::set_height (msg->data.data_set_height);
  90.       break;
  91.     case msg_get_screen_width:
  92.       msg->data.data_get_screen_width = inherited::get_screen_width ();
  93.       break;
  94.     case msg_get_screen_height:
  95.       msg->data.data_get_screen_height = inherited::get_screen_height ();
  96.       break;
  97.     case msg_set_attr:
  98.       inherited::set_attr (msg->data.data_set_attr);
  99.       break;
  100.     case msg_set_fg:
  101.       inherited::set_fg (msg->data.data_set_fg);
  102.       break;
  103.     case msg_set_bg:
  104.       inherited::set_bg (msg->data.data_set_bg);
  105.       break;
  106.     case msg_getx:
  107.       msg->data.data_getx = inherited::getx ();
  108.       break;
  109.     case msg_gety:
  110.       msg->data.data_gety = inherited::gety ();
  111.       break;
  112.     case msg_gotoxy:
  113.       inherited::gotoxy (msg->data.data_gotoxy.x,
  114.              msg->data.data_gotoxy.y);
  115.       break;
  116.     case msg_put_raw:
  117.       inherited::put_raw (msg->data.data_put_raw.len,
  118.               msg->data.data_put_raw.text);
  119.       break;
  120.     case msg_put_tty:
  121.       inherited::put_tty (msg->data.data_put_tty.len,
  122.               msg->data.data_put_tty.text);
  123.       break;
  124.     case msg_put_std:
  125.       inherited::put_std (msg->data.data_put_std.len,
  126.               msg->data.data_put_std.text);
  127.       break;
  128.     case msg_set_cells:
  129.       inherited::set_cells (msg->data.data_set_cells.len,
  130.                 msg->data.data_set_cells.text);
  131.       break;
  132.     case msg_clrscr:
  133.       inherited::clrscr ();
  134.       break;
  135.     case msg_clreol:
  136.       inherited::clreol ();
  137.       break;
  138.     case msg_scroll_window:
  139.       inherited::scroll_window (msg->data.data_scroll_window);
  140.       break;
  141.     case msg_set_window:
  142.       inherited::set_window (msg->data.data_set_window.x1,
  143.                  msg->data.data_set_window.y1,
  144.                  msg->data.data_set_window.x2,
  145.                  msg->data.data_set_window.y2);
  146.       break;
  147.     case msg_unset_window:
  148.       inherited::unset_window ();
  149.       break;
  150.     case msg_hide_cursor:
  151.       inherited::hide_cursor ();
  152.       break;
  153.     case msg_set_cursor:
  154.       inherited::set_cursor (msg->data.data_set_cursor.start_line,
  155.                  msg->data.data_set_cursor.stop_line);
  156.       break;
  157.     case msg_set_cursor_color:
  158.       inherited::set_cursor_color (msg->data.data_set_cursor_color);
  159.       break;
  160.     case msg_get_cursor_color:
  161.       msg->data.data_get_cursor_color = inherited::get_cursor_color ();
  162.       break;
  163.     case msg_save_screen_content:
  164.       msg->data.data_save_screen_content = inherited::save_screen_content ();
  165.       break;
  166.     case msg_restore_screen_content:
  167.       inherited::restore_screen_content(msg->data.data_restore_screen_content);
  168.       break;
  169.     }
  170.   if (batch_count == 0)
  171.     refresh_window ();
  172.   return 0;
  173. }
  174.  
  175. void MessageWindow::send_message (void *msg)
  176. {
  177.   send_user1 ((MPARAM) msg, 0);
  178. }
  179.  
  180. MessageWindow::MessageWindow (const char *fontspec,
  181.                   int init_width, int init_height)
  182. : PMTextWindow (fontspec, init_width, init_height),
  183.   batch_count (0)
  184. {
  185. }
  186.  
  187. MessageWindow::~MessageWindow ()
  188. {
  189. }
  190.  
  191. void MessageWindow::batch_on ()
  192. {
  193.   Message msg;
  194.   msg.kind = msg_batch_on;
  195.   send_message (&msg);
  196. }
  197.  
  198. void MessageWindow::batch_off ()
  199. {
  200.   Message msg;
  201.   msg.kind = msg_batch_off;
  202.   send_message (&msg);
  203. }
  204.  
  205. void MessageWindow::set_screen_size (int width, int height)
  206. {
  207.   Message msg;
  208.   msg.kind = msg_set_screen_size;
  209.   msg.data.data_set_screen_size.width = width;
  210.   msg.data.data_set_screen_size.height = height;
  211.   send_message (&msg);
  212. }
  213.  
  214. void MessageWindow::set_width (int width)
  215. {
  216.   Message msg;
  217.   msg.kind = msg_set_width;
  218.   msg.data.data_set_width = width;
  219.   send_message (&msg);
  220. }
  221.  
  222. void MessageWindow::set_height (int height)
  223. {
  224.   Message msg;
  225.   msg.kind = msg_set_height;
  226.   msg.data.data_set_height = height;
  227.   send_message (&msg);
  228. }
  229.  
  230. int MessageWindow::get_screen_width ()
  231. {
  232.   Message msg;
  233.   msg.kind = msg_get_screen_width;
  234.   send_message (&msg);
  235.   return msg.data.data_get_screen_width;
  236. }
  237.  
  238. int MessageWindow::get_screen_height ()
  239. {
  240.   Message msg;
  241.   msg.kind = msg_get_screen_height;
  242.   send_message (&msg);
  243.   return msg.data.data_get_screen_height;
  244. }
  245.  
  246. void MessageWindow::set_attr (unsigned char attr)
  247. {
  248.   Message msg;
  249.   msg.kind = msg_set_attr;
  250.   msg.data.data_set_attr = attr;
  251.   send_message (&msg);
  252. }
  253.  
  254. void MessageWindow::set_fg (unsigned char fg_color)
  255. {
  256.   Message msg;
  257.   msg.kind = msg_set_fg;
  258.   msg.data.data_set_fg = fg_color;
  259.   send_message (&msg);
  260. }
  261.  
  262. void MessageWindow::set_bg (unsigned char bg_color)
  263. {
  264.   Message msg;
  265.   msg.kind = msg_set_bg;
  266.   msg.data.data_set_bg = bg_color;
  267.   send_message (&msg);
  268. }
  269.  
  270. int MessageWindow::getx ()
  271. {
  272.   Message msg;
  273.   msg.kind = msg_getx;
  274.   send_message (&msg);
  275.   return msg.data.data_getx;
  276. }
  277.  
  278. int MessageWindow::gety ()
  279. {
  280.   Message msg;
  281.   msg.kind = msg_gety;
  282.   send_message (&msg);
  283.   return msg.data.data_gety;
  284. }
  285.  
  286. void MessageWindow::gotoxy (int x, int y)
  287. {
  288.   Message msg;
  289.   msg.kind = msg_gotoxy;
  290.   msg.data.data_gotoxy.x = x;
  291.   msg.data.data_gotoxy.y = y;
  292.   send_message (&msg);
  293. }
  294.  
  295. void MessageWindow::put_raw (int len, const char *text)
  296. {
  297.   Message msg;
  298.   msg.kind = msg_put_raw;
  299.   msg.data.data_put_raw.len = len;
  300.   msg.data.data_put_raw.text = text;
  301.   send_message (&msg);
  302. }
  303.  
  304. void MessageWindow::put_tty (int len, const char *text)
  305. {
  306.   Message msg;
  307.   msg.kind = msg_put_tty;
  308.   msg.data.data_put_tty.len = len;
  309.   msg.data.data_put_tty.text = text;
  310.   send_message (&msg);
  311. }
  312.  
  313. void MessageWindow::put_std (int len, const char *text)
  314. {
  315.   Message msg;
  316.   msg.kind = msg_put_std;
  317.   msg.data.data_put_std.len = len;
  318.   msg.data.data_put_std.text = text;
  319.   send_message (&msg);
  320. }
  321.  
  322. void MessageWindow::set_cells (int len, const char *text)
  323. {
  324.   Message msg;
  325.   msg.kind = msg_set_cells;
  326.   msg.data.data_set_cells.len = len;
  327.   msg.data.data_set_cells.text = text;
  328.   send_message (&msg);
  329. }
  330.  
  331. void MessageWindow::clrscr ()
  332. {
  333.   Message msg;
  334.   msg.kind = msg_clrscr;
  335.   send_message (&msg);
  336. }
  337.  
  338. void MessageWindow::clreol ()
  339. {
  340.   Message msg;
  341.   msg.kind = msg_clreol;
  342.   send_message (&msg);
  343. }
  344.  
  345. void MessageWindow::scroll_window (int scroll_distance)
  346. {
  347.   Message msg;
  348.   msg.kind = msg_scroll_window;
  349.   msg.data.data_scroll_window = scroll_distance;
  350.   send_message (&msg);
  351. }
  352.  
  353. void MessageWindow::set_window (int x1, int y1, int x2, int y2)
  354. {
  355.   Message msg;
  356.   msg.kind = msg_set_window;
  357.   msg.data.data_set_window.x1 = x1;
  358.   msg.data.data_set_window.y1 = y1;
  359.   msg.data.data_set_window.x2 = x2;
  360.   msg.data.data_set_window.y2 = y2;
  361.   send_message (&msg);
  362. }
  363.  
  364. void MessageWindow::unset_window ()
  365. {
  366.   Message msg;
  367.   msg.kind = msg_unset_window;
  368.   send_message (&msg);
  369. }
  370.  
  371. void MessageWindow::hide_cursor ()
  372. {
  373.   Message msg;
  374.   msg.kind = msg_hide_cursor;
  375.   send_message (&msg);
  376. }
  377.  
  378. void MessageWindow::set_cursor (int start_line, int stop_line)
  379. {
  380.   Message msg;
  381.   msg.kind = msg_set_cursor;
  382.   msg.data.data_set_cursor.start_line = start_line;
  383.   msg.data.data_set_cursor.stop_line = stop_line;
  384.   send_message (&msg);
  385. }
  386.  
  387. void MessageWindow::set_cursor_color (int cursor_color)
  388. {
  389.   Message msg;
  390.   msg.kind = msg_set_cursor_color;
  391.   msg.data.data_set_cursor_color = cursor_color;
  392.   send_message (&msg);
  393. }
  394.  
  395. int MessageWindow::get_cursor_color ()
  396. {
  397.   Message msg;
  398.   msg.kind = msg_get_cursor_color;
  399.   send_message (&msg);
  400.   return msg.data.data_get_cursor_color;
  401. }
  402.  
  403. void *MessageWindow::save_screen_content ()
  404. {
  405.   Message msg;
  406.   msg.kind = msg_save_screen_content;
  407.   send_message (&msg);
  408.   return msg.data.data_save_screen_content;
  409. }
  410.  
  411. void MessageWindow::restore_screen_content (void *p)
  412. {
  413.   Message msg;
  414.   msg.kind = msg_restore_screen_content;
  415.   msg.data.data_restore_screen_content = p;
  416.   send_message (&msg);
  417. }
  418.