summaryrefslogtreecommitdiff
path: root/fpcsrc/packages/ncurses/examples/tmouse.pp
blob: 9442a87a3786bc848a9c6ae38711dbadcade019d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
program mouse_test;
{$MODE OBJFPC}
{$COPERATORS ON}


uses
  ncurses, panel, sysutils;

procedure draw;

function randomchar: chtype;
var
  ch: Char = #0;
begin
  while not (ch in ['0'..'9','A'..'Z','a'..'z']) do
    ch := Char(Random(123));
  randomchar := chtype(ch);
end;

function randompair: longint;
var
  pair: longint = 0;
begin
  while not (pair in [1..5]) do
    pair := Random(6);
  randompair := pair;
end;

var
  y, x:  Smallint;
begin
  for y := 0 to 2 do
    for x := 0 to COLS - 7 do
      mvaddch(y, x, randomchar OR COLOR_PAIR(randompair));
  attron(A_BOLD OR COLOR_PAIR(7));
  mvaddstr(0, COLS - 6, '      ');
  mvaddstr(1, COLS - 6, ' QUIT ');
  mvaddstr(2, COLS - 6, '      ');
  attroff(A_BOLD OR COLOR_PAIR(7));
  for y := 3 to LINES - 1 do
    for x := 0 to COLS - 1 do
      mvaddch(y, x, randomchar OR COLOR_PAIR(randompair));
end;


var
  win: PWINDOW;
  pan: PPANEL;
  str: AnsiString;
function doevent: chtype;
var
  event: MEVENT;
begin
  getmouse(@event);
  if (event.y > 2) OR (event.x < COLS - 6) then
  begin
    mvwaddstr(win, 1, 1, '                  ');
    str := Format('y := %D, x := %D', [event.y, event.x]);
    mvwaddstr(win, 1, 2, PChar(str));
    wattron(win,A_BOLD);
    mvwaddch(win, 3, 9, mvinch(event.y,event.x ));
    wattroff(win,A_BOLD);
    halfdelay(12);

    show_panel(pan);

    if event.bstate AND  BUTTON1_RELEASED<> 0 then
      mvwaddstr(win, 5, 2,'BUTTON1_RELEASED')
    else if event.bstate AND BUTTON2_RELEASED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON2_RELEASED')
    else if event.bstate AND BUTTON3_RELEASED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON3_RELEASED')
    else if event.bstate AND BUTTON1_PRESSED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON1_PRESSED ')
    else if event.bstate AND BUTTON2_PRESSED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON2_PRESSED ')
    else if event.bstate AND BUTTON3_PRESSED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON3_PRESSED ')
    else if event.bstate AND BUTTON1_CLICKED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON1_CLICKED ')
    else if event.bstate AND BUTTON2_CLICKED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON2_CLICKED ')
    else if event.bstate AND BUTTON3_CLICKED <> 0 then
      mvwaddstr(win, 5, 2,'BUTTON3_CLICKED ');

    doevent := wgetch(win);
    cbreak();
    hide_panel(pan);
  end
  else
    doevent := chtype('q')
end;

var
  ch: chtype = 0;
  my_bg: Smallint = COLOR_BLACK;
begin
  try
    initscr();
    noecho();
    clear();
    cbreak();
    keypad(stdscr, TRUE);
    curs_set(0);
    mousemask(ALL_MOUSE_EVENTS, nil);

    if (has_colors()) then
    begin
      start_color();
      if (use_default_colors() = OK) then
        my_bg := -1
      else
        my_bg := COLOR_BLACK;

      init_pair(1, COLOR_YELLOW, my_bg);
      init_pair(2, COLOR_RED, my_bg);
      init_pair(3, COLOR_MAGENTA, my_bg);
      init_pair(4, COLOR_CYAN, my_bg);
      init_pair(5, COLOR_GREEN, my_bg);
      init_pair(6, COLOR_WHITE, COLOR_BLUE);
      init_pair(7, COLOR_WHITE, COLOR_RED);
    end;

    win:= newwin(7, 20, (LINES - 7) DIV 2 , (COLS - 20) DIV 2);
    pan := new_panel(win);
    box(win, ACS_VLINE, ACS_HLINE);
    wbkgd(win, COLOR_PAIR(6));

    draw;
    repeat
      if ch = KEY_MOUSE then
        ch := doevent
      else
        ch := getch();
    until  (ch = chtype('q')) OR (ch = KEY_F(10));

  finally
    del_panel(pan);
    delwin(win);
    curs_set(1);
    endwin();
  end;
end.