_pui.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /*--------------------------------------------------------------------------
  2. DEPUI-GFX-TK 3.0 - GPL portable source code libraries
  3. http://www.deleveld.dds.nl/depui.htm
  4. See file docs/copying for copyright details
  5. ---------------------------------------------------------------------------*/
  6. /* Fix key recognition for MGRX and allegro
  7. Fix text title for lists and scroll objects
  8. Can you give a modal window the focus when it is popped up? Or maybe it
  9. shouldnt happen to avoid missed/redirected keyboard input.
  10. Fix offset of text chunks for different alignment and themes.
  11. Change theme drawing for focus? Or change focus handling
  12. Add background image to gfxsel dialog. What extensions per platform a
  13. define for this?
  14. Can you make a more sensible define so that DEGFX does nto include the
  15. standard pointer code? MX_DEGFX_POINTER
  16. Make code conventions rules like MXDEBUG_ , uppercase and lower case,
  17. prefixes...
  18. Should tect chunks be MX_RECTATOM or maybe derived from MX_OBJ?
  19. Can I make sub-theme with basic drawing stuff (clip, hline, vline, text)
  20. so that a generic theme can be used?
  21. Text chunking can be used to inject control characters into interface
  22. strings. A button chunker could recognise the & symbol and underline the
  23. following character. Perhaps just using HTML is better...
  24. Make theme dialog and split theme selector from gfx mode selector.
  25. Think about a client/server approach. - Change tree traversal for drawing.
  26. - Make border a separate window. (probably not necessary) - Client gets
  27. pointer to big window the same size as the platform. The client cant use
  28. the root window because the client might want to open more than one window.
  29. Add version counter for make release.
  30. Make speed regression test.
  31. Make function/macro/define naming rules. - Macros that eval arguments more
  32. than once must be capila letters. other macros can be lower case.
  33. How can I make clever visual transformations for window drawing
  34. Make it possible for a window to be double buffered.
  35. Can I separate the gui-tree from the objects? This could make the system
  36. more safe because users could not traverse the tree which could be in
  37. protected memory space.
  38. Making objects at 0,0 makes conversion to a text mode/theme easier.
  39. Transparent windows works ok, but how should trans work wrt layering?
  40. Should lists be appended to or should create function be used for this?
  41. Marking window dirty when making new window means border remains not
  42. updated. - use mx_win_dirty
  43. Can I use debug flags to make sure that classes dont get called inside
  44. handlers?
  45. Make window unresizable.
  46. Make video noise window to check frame rates
  47. Should a font be constant or not? Const is good for compile time error
  48. checking, but works bad with atom destroying. The mx_delete macro needs
  49. non-const pointers. Should it?
  50. Make crashes impossible even from malformed events. The biggest danger
  51. comes from incorrect data but I dont know how to fix this.
  52. Dont try to delete in list iteration. You might need to remove from tree
  53. and delete.
  54. Events break the atomicity of operations. So operations should preferrably
  55. be atomic i.e. generate no events. This makes sure that objects dont get
  56. deleted while they are bieng iterated through.
  57. */
  58. #define MXMODULE_THEME_ALL
  59. #define MXMODULE_FONT_ALL
  60. #define MXMODULE_DRIVER_ALL
  61. #define MXMODULE_FILESEL
  62. #define MXMODULE_FONTSEL
  63. #define MXMODULE_GFXSEL
  64. #define MXMODULE_THEMESEL
  65. #define MXMODULE_EDITTEXT
  66. #define MXMODULE_TEXTEDITOR
  67. #define MXMODULE_ALERT
  68. #define MXMODULE_SYSMENU
  69. #include "depui/depui.c"
  70. typedef struct APP {
  71. union {
  72. MX_WIN_DATA win;
  73. MX_TEXTUAL_DATA textual;
  74. MX_OBJ_DATA obj;
  75. MX_RECTATOM_DATA rectatom;
  76. MX_ATOM atom;
  77. } base;
  78. } APP;
  79. #define FONTSEL_ID 11
  80. #define GFXMODE_ID 12
  81. #define THEME_ID 13
  82. #define ALERT_ID 14
  83. void specialwin_class(void)
  84. {
  85. #ifdef MX_PLATFORM_DEGFX
  86. MX_WIN *w = (MX_WIN *) mx.obj;
  87. if (mx_eventmatch(MX_EXPOSE, w)) {
  88. if (mx_exposing()) {
  89. char ratetext[100];
  90. MX_RECT r = *mx_expose_rect();
  91. const MX_RECT *rect = MXRECT(w);
  92. while (r.y1 <= r.y2) {
  93. MX_BITMAP_ITER ptr = mx_iter(r.x1, r.y1);
  94. const MX_BITMAP_ITER end = mx_iter(r.x2, r.y1) + 1;
  95. while (ptr != end)
  96. *ptr++ = rand();
  97. ++r.y1;
  98. }
  99. sprintf(ratetext, "FPS: %i ", mx__.framerate);
  100. mx_font_draw(0, ratetext, -1, rect->x1, rect->y1, MXRGB(255,255,255));
  101. mx_dirty(w, false);
  102. }
  103. } else
  104. #endif
  105. mx_win_class();
  106. }
  107. void listwinhandler(MX_WIN * win)
  108. {
  109. #ifdef MX_PLATFORM_DEGFX
  110. if (mx_eventmatch(MX_EXPOSE, win)) {
  111. if (mx_exposing()) {
  112. MX_RECT r = *mx_expose_rect();
  113. while (r.y1 <= r.y2) {
  114. MX_BITMAP_ITER ptr = mx_iter(r.x1, r.y1);
  115. const MX_BITMAP_ITER end = mx_iter(r.x2, r.y1);
  116. while (ptr != end)
  117. *ptr++ = rand();
  118. ++r.y1;
  119. }
  120. }
  121. } else {
  122. mx_win_handler(win);
  123. return;
  124. }
  125. #endif
  126. mx_win_handler(win);
  127. }
  128. void handler(MX_WIN * win)
  129. {
  130. if ((mx.event == MX_SELECT) && (mx.data)) {
  131. MX_WIN_DATA *newwin = 0;
  132. if (MXID(mx.obj) == THEME_ID) {
  133. /* MX_TEXTEDITOR *f = mx_texteditor(0); */
  134. MX_THEMESEL * f = mx_themesel(0);
  135. MXDEBUG_ATOMNAME(f, "texteditor_win");
  136. newwin = MXWIN(f);
  137. #ifdef MXDEBUG
  138. int i = 0;
  139. const void * mem = mx__alloc_walk(0);
  140. fprintf(stderr, "#memory start\n");
  141. while (mem) {
  142. fprintf(stderr, "#%i %li %s:%li\n", i, mx__alloc_size, mx__alloc_file, mx__alloc_line);
  143. mem = mx__alloc_walk(mem);
  144. ++i;
  145. }
  146. fprintf(stderr, "#memory end\n");
  147. #endif
  148. } else if (MXID(mx.obj) == FONTSEL_ID) {
  149. MX_FONTSEL *f = mx_fontselwin(0, 0, 0, 0);
  150. MXDEBUG_ATOMNAME(f, "fontsel_win");
  151. mx_text_set(f, "Font select", -1, 0);
  152. mx_fontsel_refresh(f);
  153. newwin = MXWIN(f);
  154. } else if (MXID(mx.obj) == GFXMODE_ID) {
  155. MX_GFXSEL *m = mx_gfxselwin(0, 0, 0, 0);
  156. MXDEBUG_ATOMNAME(m, "gfxsel_win");
  157. mx_modal(m);
  158. mx_text_set(m, "Choose GFX mode", -1, 0);
  159. newwin = MXWIN(m);
  160. }
  161. if (newwin) {
  162. mx_defaultrect(newwin, 0);
  163. mx__layout(MXOBJ(newwin), MX_LAYOUT_CENTER, 0, 0, 0);
  164. mx_geometry(newwin);
  165. mx_dirty(newwin, true);
  166. mx_dirty(newwin->border, true);
  167. return;
  168. }
  169. }
  170. mx_win_handler(win);
  171. }
  172. int main(int argc, char *argv[])
  173. {
  174. APP *app;
  175. MX_WIN *w;
  176. MX_TEXTUAL *text;
  177. MX_BUTTON *btn, *btn1, *btn2;
  178. MX_LIST *list;
  179. MX_SCROLL *scroll;
  180. MX_EDITTEXT *edit;
  181. MX_ALERT* alert;
  182. (void) argc;
  183. (void) argv;
  184. if (!mx_start())
  185. return EXIT_FAILURE;
  186. mx_sysmenu();
  187. w = mx_win((MX_WIN *)0, 0, listwinhandler, 0);
  188. MXOBJ(w)->_class = specialwin_class;
  189. /* w = mx_win(0, 0, 0, 0); */
  190. mx_position(w, 150, 150, 200, 250);
  191. mx_dirty(w, true);
  192. MXDEBUG_ATOMNAME(w, "list_win");
  193. mx_text_set(w, "Listg Window", -1, 0);
  194. mx_geometry(w);
  195. list = mx_list((MX_LIST *)0, 0, w, 0);
  196. mx_position(list, 5, 5, 100, 100);
  197. /**fix mx_text_set(list, "A list", -1, 0); */
  198. /**fix mx_text_align(list, MX_ALIGN_RIGHT); */
  199. edit = mx_edittext((MX_EDITTEXT*)0, 0, w, 0);
  200. mx_text_set(edit, "This should be editable", -1, 0);
  201. mx_layout(edit, MX_LAYOUT_BOTTOM | MX_LAYOUT_X1, list, 0, 5);
  202. mx_defaultrect(edit, 0);
  203. mx_list_append(list, "Selgect 1 is very wide", -1, 0, 0);
  204. mx_list_append(list, "SelTect 2", -1, 0, 0);
  205. mx_list_append(list, "SelgTt 3", -1, 0, 0);
  206. mx_list_append(list, "SelgTt 4\n has more\n than one line", -1, 0, 0);
  207. mx_list_append(list, "SelgTt 5", -1, 0, 1);
  208. mx_list_append(list, "SelgTt 6", -1, 0, 0);
  209. mx_list_append(list, "SelgTt 7", -1, 0, 1);
  210. mx_list_append(list, "SelgTt 8", -1, 0, 0);
  211. mx_list_append(list, "SelgTt 9", -1, 0, 1);
  212. mx_list_append(list, "SelgTt 10", -1, 0, 0);
  213. mx_list_append(list, "SelgTt 11", -1, 0, 1);
  214. mx_list_append(list, "SelgTt 12", -1, 0, 2);
  215. mx_list_append(list, "SelgTt 13", -1, 0, 0);
  216. mx_list_append(list, "SelgTt 14", -1, 0, 0);
  217. mx_list_select_id(list, 2, true);
  218. mx_geometry(list);
  219. app = (APP *) mx_win((MX_WIN *)0, 0, handler, 0);
  220. mx_position(app, 50, 50, 250, 250);
  221. mx_dirty(app, true);
  222. MXDEBUG_ATOMNAME(app, "button_app");
  223. mx_text_set(app, "Buttong Window\nis what I am", -1, 0);
  224. mx_geometry(app);
  225. text = mx_textual((MX_TEXTUAL*) 0, 0, app, 0);
  226. mx_text_set(text, "Whatg am I\nDoing right\nNow?\n", -1, 0);
  227. mx_move(text, 10, 1);
  228. mx_defaultrect(text, 0);
  229. mx_geometry(text);
  230. btn = mx_button((MX_BUTTON *)0, 0, app, THEME_ID);
  231. mx_text_set(btn, "Theme select", -1, 0);
  232. mx_defaultrect(btn, 0);
  233. mx_layout(btn, (MX_LAYOUT_X1 | MX_LAYOUT_BOTTOM), text, 0, 2);
  234. mx_geometry(btn);
  235. btn1 = mx_button((MX_BUTTON *)0, 0, app, FONTSEL_ID);
  236. mx_text_set(btn1, "Font select (child)", -1, 0);
  237. mx_defaultrect(btn1, 0);
  238. mx_text_align(btn1, MX_ALIGN_VCENTER | MX_ALIGN_RIGHT);
  239. mx_layout(btn1, (MX_LAYOUT_X1 | MX_LAYOUT_BOTTOM), btn, 0, 2);
  240. mx_geometry(btn1);
  241. btn2 = mx_button((MX_BUTTON *)0, 0, app, GFXMODE_ID);
  242. mx_text_set(btn2, "Gfx select (modal)", -1, 0);
  243. mx_text_align(btn2, MX_ALIGN_VCENTER | MX_ALIGN_LEFT);
  244. mx_defaultrect(btn2, 0);
  245. mx_layout(btn2, (MX_LAYOUT_X1 | MX_LAYOUT_BOTTOM), btn1, 0, 2);
  246. mx_geometry(btn2);
  247. scroll = mx_scroll((MX_SCROLL *)0, 0, app, 1);
  248. mx_resize(scroll, 100, 100);
  249. mx_layout(scroll, (MX_LAYOUT_X1 | MX_LAYOUT_BOTTOM), btn2, 0,
  250. 2);
  251. btn = mx_button((MX_BUTTON *)0, 0, scroll, 0);
  252. mx_text_set(btn, "This is disabled", -1, 0);
  253. mx_defaultrect(btn, 0);
  254. mx_disable(btn, true);
  255. mx_move(btn, -10, -10);
  256. mx_geometry(btn);
  257. btn = mx_button((MX_BUTTON *)0, 0, scroll, 0);
  258. mx_text_set(btn, "another button", -1, 0);
  259. mx_defaultrect(btn, 0);
  260. mx_position(btn, 70, 150, MXDEFAULT, MXDEFAULT);
  261. mx_geometry(btn);
  262. mx_geometry(scroll);
  263. alert = mx_alert(ALERT_ID);
  264. mx_text_set(alert, "", -1, 0);
  265. mx_text_set(&alert->text, "unmovable\nunresizeable\nuncloseable\nnotitle\nwindow", -1, 0);
  266. mx_defaultrect(alert, 0);
  267. mx_win_noresize(alert, true);
  268. /* mx_win_noclose(alert, true);
  269. mx_win_notitle(alert, true); */
  270. mx_win_nomove(alert, true);
  271. mx_layout(alert, MX_LAYOUT_CENTER, (MX_OBJ*)0, 0, 0);
  272. mx_geometry(alert);
  273. /* fprintf(stderr, "MX_ATOM = %i bytes\n", sizeof(MX_ATOM));
  274. fprintf(stderr, "MX_RECTATOM = %i bytes\n", sizeof(MX_RECTATOM));
  275. fprintf(stderr, "MX_OBJ = %i bytes\n", sizeof(MX_OBJ));
  276. fprintf(stderr, "MX_BUTTON = %i bytes\n", sizeof(MX_BUTTON));
  277. fprintf(stderr, "MX_WIN = %i bytes\n", sizeof(MX_WIN));
  278. */
  279. return mx_execute();
  280. }