tmouse.pp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. program mouse_test;
  2. {$MODE OBJFPC}
  3. {$COPERATORS ON}
  4. uses
  5. ncurses, panel, sysutils;
  6. procedure draw;
  7. function randomchar: chtype;
  8. var
  9. ch: Char = #0;
  10. begin
  11. while not (ch in ['0'..'9','A'..'Z','a'..'z']) do
  12. ch := Char(Random(123));
  13. randomchar := chtype(ch);
  14. end;
  15. function randompair: longint;
  16. var
  17. pair: longint = 0;
  18. begin
  19. while not (pair in [1..5]) do
  20. pair := Random(6);
  21. randompair := pair;
  22. end;
  23. var
  24. y, x: Smallint;
  25. begin
  26. for y := 0 to 2 do
  27. for x := 0 to COLS - 7 do
  28. mvaddch(y, x, randomchar OR COLOR_PAIR(randompair));
  29. attron(A_BOLD OR COLOR_PAIR(7));
  30. mvaddstr(0, COLS - 6, ' ');
  31. mvaddstr(1, COLS - 6, ' QUIT ');
  32. mvaddstr(2, COLS - 6, ' ');
  33. attroff(A_BOLD OR COLOR_PAIR(7));
  34. for y := 3 to LINES - 1 do
  35. for x := 0 to COLS - 1 do
  36. mvaddch(y, x, randomchar OR COLOR_PAIR(randompair));
  37. end;
  38. var
  39. win: PWINDOW;
  40. pan: PPANEL;
  41. str: AnsiString;
  42. function doevent: chtype;
  43. var
  44. event: MEVENT;
  45. begin
  46. getmouse(@event);
  47. if (event.y > 2) OR (event.x < COLS - 6) then
  48. begin
  49. mvwaddstr(win, 1, 1, ' ');
  50. str := Format('y := %D, x := %D', [event.y, event.x]);
  51. mvwaddstr(win, 1, 2, PChar(str));
  52. wattron(win,A_BOLD);
  53. mvwaddch(win, 3, 9, mvinch(event.y,event.x ));
  54. wattroff(win,A_BOLD);
  55. halfdelay(12);
  56. show_panel(pan);
  57. if event.bstate AND BUTTON1_RELEASED<> 0 then
  58. mvwaddstr(win, 5, 2,'BUTTON1_RELEASED')
  59. else if event.bstate AND BUTTON2_RELEASED <> 0 then
  60. mvwaddstr(win, 5, 2,'BUTTON2_RELEASED')
  61. else if event.bstate AND BUTTON3_RELEASED <> 0 then
  62. mvwaddstr(win, 5, 2,'BUTTON3_RELEASED')
  63. else if event.bstate AND BUTTON1_PRESSED <> 0 then
  64. mvwaddstr(win, 5, 2,'BUTTON1_PRESSED ')
  65. else if event.bstate AND BUTTON2_PRESSED <> 0 then
  66. mvwaddstr(win, 5, 2,'BUTTON2_PRESSED ')
  67. else if event.bstate AND BUTTON3_PRESSED <> 0 then
  68. mvwaddstr(win, 5, 2,'BUTTON3_PRESSED ')
  69. else if event.bstate AND BUTTON1_CLICKED <> 0 then
  70. mvwaddstr(win, 5, 2,'BUTTON1_CLICKED ')
  71. else if event.bstate AND BUTTON2_CLICKED <> 0 then
  72. mvwaddstr(win, 5, 2,'BUTTON2_CLICKED ')
  73. else if event.bstate AND BUTTON3_CLICKED <> 0 then
  74. mvwaddstr(win, 5, 2,'BUTTON3_CLICKED ');
  75. doevent := wgetch(win);
  76. cbreak();
  77. hide_panel(pan);
  78. end
  79. else
  80. doevent := chtype('q')
  81. end;
  82. var
  83. ch: chtype = 0;
  84. my_bg: Smallint = COLOR_BLACK;
  85. begin
  86. try
  87. initscr();
  88. noecho();
  89. clear();
  90. cbreak();
  91. keypad(stdscr, TRUE);
  92. curs_set(0);
  93. mousemask(ALL_MOUSE_EVENTS, nil);
  94. if (has_colors()) then
  95. begin
  96. start_color();
  97. if (use_default_colors() = OK) then
  98. my_bg := -1
  99. else
  100. my_bg := COLOR_BLACK;
  101. init_pair(1, COLOR_YELLOW, my_bg);
  102. init_pair(2, COLOR_RED, my_bg);
  103. init_pair(3, COLOR_MAGENTA, my_bg);
  104. init_pair(4, COLOR_CYAN, my_bg);
  105. init_pair(5, COLOR_GREEN, my_bg);
  106. init_pair(6, COLOR_WHITE, COLOR_BLUE);
  107. init_pair(7, COLOR_WHITE, COLOR_RED);
  108. end;
  109. win:= newwin(7, 20, (LINES - 7) DIV 2 , (COLS - 20) DIV 2);
  110. pan := new_panel(win);
  111. box(win, ACS_VLINE, ACS_HLINE);
  112. wbkgd(win, COLOR_PAIR(6));
  113. draw;
  114. repeat
  115. if ch = KEY_MOUSE then
  116. ch := doevent
  117. else
  118. ch := getch();
  119. until (ch = chtype('q')) OR (ch = KEY_F(10));
  120. finally
  121. del_panel(pan);
  122. delwin(win);
  123. curs_set(1);
  124. endwin();
  125. end;
  126. end.