M3rein

Untitled

May 31st, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 10.38 KB | None | 0 0
  1.         public static void Update()
  2.         {
  3.             // Old mouse states
  4.             bool oldleftdown = LeftDown;
  5.             bool oldrightdown = RightDown;
  6.             bool oldmiddledown = MiddleDown;
  7.  
  8.             // Update all the windows
  9.             Windows.ForEach(w =>
  10.             {
  11.                 if (w != null) w.OnTick.Invoke(w, new EventArgs());
  12.                 if (w.Focus && (LeftDown || MiddleDown || RightDown))
  13.                 {
  14.                     w.OnMousePress.Invoke(w, new MouseEventArgs(OldMouseX, OldMouseY,
  15.                                             OldMouseX, OldMouseY,
  16.                                             oldleftdown, LeftDown,
  17.                                             oldrightdown, RightDown,
  18.                                             oldmiddledown, MiddleDown));
  19.                 }
  20.             });
  21.  
  22.             // Update button key states
  23.             Input.IterationEnd();
  24.  
  25.             // Get events
  26.             SDL_Event e;
  27.  
  28.             bool quit = false;
  29.  
  30.             while (!quit)
  31.             {
  32.                 if (SDL_PollEvent(out e) > 0)
  33.                 {
  34.                     if (e.type == SDL_EventType.SDL_FIRSTEVENT) { quit = true; continue; }
  35.                     if (e.window.windowID == 0) continue;
  36.                     IntPtr sdlwindow = SDL_GetWindowFromID(e.window.windowID);
  37.                     Window w = Windows.Find(win => win != null && win.SDL_Window == sdlwindow);
  38.                     if (w == null) continue;
  39.                     int idx = Windows.IndexOf(w);
  40.                     // After closing a window, there are still a few more events like losing focus;
  41.                     // We can skip these as the window was already destroyed.
  42.                     if (w == null) continue;
  43.                     if (OldMouseX == -1) OldMouseX = e.motion.x;
  44.                     if (OldMouseY == -1) OldMouseY = e.motion.y;
  45.                     if (e.type == SDL_EventType.SDL_WINDOWEVENT)
  46.                     {
  47.                         switch (e.window.windowEvent)
  48.                         {
  49.                             case SDL_WindowEventID.SDL_WINDOWEVENT_CLOSE:
  50.                                 ClosingEventArgs ClosingArgs = new ClosingEventArgs();
  51.                                 w.OnClosing.Invoke(w, ClosingArgs);
  52.                                 if (!ClosingArgs.Cancel)
  53.                                 {
  54.                                     SDL_DestroyWindow(w.SDL_Window);
  55.                                     w.OnClosed.Invoke(w, new ClosedEventArgs());
  56.                                     w.Dispose();
  57.                                     Windows[idx] = null;
  58.                                 }
  59.                                 break;
  60.                             case SDL_WindowEventID.SDL_WINDOWEVENT_MOVED:
  61.                                 break;
  62.                             case SDL_WindowEventID.SDL_WINDOWEVENT_RESIZED:
  63.                                 int width1;
  64.                                 int height1;
  65.                                 SDL_GetWindowSize(w.SDL_Window, out width1, out height1);
  66.                                 w.OnWindowSizeChanged.Invoke(w, new WindowEventArgs(width1, height1));
  67.                                 w.OnWindowResized.Invoke(w, new WindowEventArgs(width1, height1));
  68.                                 break;
  69.                             case SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED:
  70.                                 int width2;
  71.                                 int height2;
  72.                                 SDL_GetWindowSize(w.SDL_Window, out width2, out height2);
  73.                                 w.OnWindowSizeChanged.Invoke(w, new WindowEventArgs(width2, height2));
  74.                                 break;
  75.                             case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
  76.                                 w.Focus = true;
  77.                                 w.OnFocusGained(w, new FocusEventArgs(true));
  78.                                 break;
  79.                             case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
  80.                                 w.Focus = false;
  81.                                 w.OnFocusLost(w, new FocusEventArgs(false));
  82.                                 break;
  83.                         }
  84.                     }
  85.                     if (Windows[idx] == null) continue; // Just disposed this window
  86.                     if (w.Focus)
  87.                     {
  88.                         switch (e.type)
  89.                         {
  90.                             case SDL_EventType.SDL_MOUSEMOTION:
  91.                                 if (e.motion.x != OldMouseX || e.motion.y != OldMouseY)
  92.                                 {
  93.                                     LeftDown = (e.button.button & Convert.ToInt32(MouseButtons.Left)) == Convert.ToInt32(MouseButtons.Left);
  94.                                     RightDown = (e.button.button & Convert.ToInt32(MouseButtons.Right)) == Convert.ToInt32(MouseButtons.Right);
  95.                                     MiddleDown = (e.button.button & Convert.ToInt32(MouseButtons.Middle)) == Convert.ToInt32(MouseButtons.Middle);
  96.                                     w.OnMouseMoving.Invoke(w, new MouseEventArgs(OldMouseX, OldMouseY,
  97.                                             e.motion.x, e.motion.y,
  98.                                             oldleftdown, LeftDown,
  99.                                             oldrightdown, RightDown,
  100.                                             oldmiddledown, MiddleDown));
  101.                                 }
  102.                                 OldMouseX = e.motion.x;
  103.                                 OldMouseY = e.motion.y;
  104.                                 break;
  105.                             case SDL_EventType.SDL_MOUSEBUTTONDOWN:
  106.                                 if (e.button.button == 1 && !LeftDown ||
  107.                                     e.button.button == 2 && !MiddleDown ||
  108.                                     e.button.button == 3 && !RightDown)
  109.                                 {
  110.                                     if (e.button.button == 1) LeftDown = true;
  111.                                     if (e.button.button == 2) MiddleDown = true;
  112.                                     if (e.button.button == 3) RightDown = true;
  113.                                     w.OnMouseDown.Invoke(w, new MouseEventArgs(OldMouseX, OldMouseY,
  114.                                             e.motion.x, e.motion.y,
  115.                                             oldleftdown, LeftDown,
  116.                                             oldrightdown, RightDown,
  117.                                             oldmiddledown, MiddleDown));
  118.                                 }
  119.                                 break;
  120.                             case SDL_EventType.SDL_MOUSEBUTTONUP:
  121.                                 if (e.button.button == 1 && LeftDown ||
  122.                                     e.button.button == 2 && MiddleDown ||
  123.                                     e.button.button == 3 && RightDown)
  124.                                 {
  125.                                     if (e.button.button == 1 && LeftDown) LeftDown = false;
  126.                                     if (e.button.button == 2 && MiddleDown) MiddleDown = false;
  127.                                     if (e.button.button == 3 && RightDown) RightDown = false;
  128.                                     w.OnMouseUp.Invoke(w, new MouseEventArgs(OldMouseX, OldMouseY,
  129.                                             e.motion.x, e.motion.y,
  130.                                             oldleftdown, LeftDown,
  131.                                             oldrightdown, RightDown,
  132.                                             oldmiddledown, MiddleDown));
  133.                                 }
  134.                                 break;
  135.                             case SDL_EventType.SDL_MOUSEWHEEL:
  136.                                 w.OnMouseWheel.Invoke(w, new MouseEventArgs(OldMouseX, OldMouseY,
  137.                                         OldMouseX, OldMouseY,
  138.                                         oldleftdown, LeftDown,
  139.                                         oldrightdown, RightDown,
  140.                                         oldmiddledown, MiddleDown,
  141.                                         e.wheel.y));
  142.                                 break;
  143.                             case SDL_EventType.SDL_KEYDOWN:
  144.                                 SDL_Keycode sym1 = e.key.keysym.sym;
  145.                                 Input.Register(sym1, true);
  146.                                 string txt = "";
  147.                                 bool backspace = false;
  148.                                 if (sym1 == SDL_Keycode.SDLK_RETURN) txt = "\n";
  149.                                 if (sym1 == SDL_Keycode.SDLK_BACKSPACE) backspace = true;
  150.                                 if (txt.Length > 0 || backspace)
  151.                                 {
  152.                                     w.OnTextInput.Invoke(w, new TextInputEventArgs(txt, backspace));
  153.                                 }
  154.                                 break;
  155.                             case SDL_EventType.SDL_KEYUP:
  156.                                 SDL_Keycode sym2 = e.key.keysym.sym;
  157.                                 Input.Register(sym2, false);
  158.                                 break;
  159.                             case SDL_EventType.SDL_TEXTINPUT:
  160.                                 byte[] bytes = new byte[32];
  161.                                 unsafe
  162.                                 {
  163.                                     byte* ptr = e.text.text;
  164.                                     byte* data = ptr;
  165.                                     int i = 0;
  166.                                     while (*data != 0)
  167.                                     {
  168.                                         bytes[i] = *data;
  169.                                         data++;
  170.                                         i++;
  171.                                     }
  172.                                 }
  173.                                 string text = "";
  174.                                 foreach (char c in Encoding.UTF8.GetChars(bytes)) text += c;
  175.                                 w.OnTextInput.Invoke(w, new TextInputEventArgs(text.TrimEnd('\x00')));
  176.                                 break;
  177.                         }
  178.                     }
  179.                 }
  180.                 else
  181.                 {
  182.                     quit = true;
  183.                 }
  184.             }
  185.  
  186.             for (int i = 0; i < Renderers.Count; i++)
  187.             {
  188.                 Renderers[i].UpdateGraphics();
  189.             }
  190.         }
Add Comment
Please, Sign In to add comment