window.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <thread.h>
  5. #include <mouse.h>
  6. #include <jay.h>
  7. #include "fns.h"
  8. void mousethread(void* v);
  9. const unsigned long jaystacksize = 8192;
  10. Mousectl *m;
  11. Widget *
  12. initjayapp(char *name){
  13. if(initdraw(nil, nil, name) < 0){
  14. sysfatal("initdraw failed");
  15. }
  16. m = initmouse(nil, screen);
  17. if (m == nil){
  18. sysfatal("mouse error");
  19. }
  20. initdefaultconfig();
  21. Widget *w = createPanel1("main", screen->r, screen->r.min);
  22. if (w == nil){
  23. sysfatal("createPanel failed");
  24. }
  25. return w;
  26. }
  27. void
  28. startjayapp(Widget * w){
  29. Channel *exitchan;
  30. if (w == nil){
  31. sysfatal("startjayapp nil widget");
  32. }
  33. exitchan = chancreate(sizeof(int), 0);
  34. w->_draw(w, screen);
  35. flushimage(display, 1);
  36. yield();
  37. threadcreate(mousethread, w, jaystacksize);
  38. recv(exitchan, nil);
  39. }
  40. void
  41. mousethread(void* v){
  42. Widget *w = v;
  43. unsigned int msec = 0;
  44. int button = 0;
  45. int isdown = 0;
  46. threadsetname("mousethread");
  47. enum {
  48. MReshape,
  49. MMouse,
  50. NALT
  51. };
  52. static Alt alts[NALT+1];
  53. alts[MReshape].c = m->resizec;
  54. alts[MReshape].v = nil;
  55. alts[MReshape].op = CHANRCV;
  56. alts[MMouse].c = m->c;
  57. alts[MMouse].v = (Mouse *)m;
  58. alts[MMouse].op = CHANRCV;
  59. alts[NALT].op = CHANEND;
  60. for(;;){
  61. switch(alt(alts)){
  62. case MMouse:
  63. if(m->buttons != 0){
  64. if(msec == 0 || button != m->buttons || (m->msec - msec) > jayconfig->doubleclickTime){
  65. msec = m->msec;
  66. button = m->buttons;
  67. isdown = 1;
  68. w->_mpressdown(w, (Mouse*)m);
  69. } else if(!isdown){
  70. w->_dclick(w, (Mouse *)m);
  71. msec = 0;
  72. button = 0;
  73. isdown = 0;
  74. }
  75. } else if (isdown){
  76. msec = m->msec;
  77. w->_mpressup(w, (Mouse *)m);
  78. w->_click(w, (Mouse *)m);
  79. isdown=0;
  80. } else {
  81. w->_hover(w, (Mouse *)m);
  82. }
  83. break;
  84. case MReshape:
  85. if (getwindow(display, Refnone)<0){
  86. sysfatal("failed to re-attach window");
  87. }
  88. Point d = Pt(screen->r.min.x - w->p.x, screen->r.min.y - w->p.y);
  89. w->_resize(w, d);
  90. break;
  91. }
  92. }
  93. }