1cb93a386Sopenharmony_ci//
2cb93a386Sopenharmony_ci// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
4cb93a386Sopenharmony_ci// found in the LICENSE file.
5cb93a386Sopenharmony_ci//
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_ci// WindowTest.cpp: Sample used to test various function of OSWindow
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci#include <algorithm>
10cb93a386Sopenharmony_ci#include <iostream>
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ci#include "util/OSWindow.h"
13cb93a386Sopenharmony_ci#include "util/test_utils.h"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ciint main(int argc, char *argv[])
16cb93a386Sopenharmony_ci{
17cb93a386Sopenharmony_ci    OSWindow *window = OSWindow::New();
18cb93a386Sopenharmony_ci    int width        = 400;
19cb93a386Sopenharmony_ci    int height       = 400;
20cb93a386Sopenharmony_ci    int x            = 0;
21cb93a386Sopenharmony_ci    int y            = 0;
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ci    if (!window->initialize("Window Test", width, height))
24cb93a386Sopenharmony_ci    {
25cb93a386Sopenharmony_ci        return -1;
26cb93a386Sopenharmony_ci    }
27cb93a386Sopenharmony_ci    window->setVisible(true);
28cb93a386Sopenharmony_ci    window->setPosition(x, y);
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ci    bool running = true;
31cb93a386Sopenharmony_ci    while (running)
32cb93a386Sopenharmony_ci    {
33cb93a386Sopenharmony_ci        Event event;
34cb93a386Sopenharmony_ci        while (window->popEvent(&event))
35cb93a386Sopenharmony_ci        {
36cb93a386Sopenharmony_ci            if (event.Type == Event::EVENT_CLOSED)
37cb93a386Sopenharmony_ci            {
38cb93a386Sopenharmony_ci                running = false;
39cb93a386Sopenharmony_ci                break;
40cb93a386Sopenharmony_ci            }
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci            if (event.Type == Event::EVENT_KEY_PRESSED)
43cb93a386Sopenharmony_ci            {
44cb93a386Sopenharmony_ci                int newWidth  = width;
45cb93a386Sopenharmony_ci                int newHeight = height;
46cb93a386Sopenharmony_ci                int newX      = x;
47cb93a386Sopenharmony_ci                int newY      = y;
48cb93a386Sopenharmony_ci                switch (event.Key.Code)
49cb93a386Sopenharmony_ci                {
50cb93a386Sopenharmony_ci                    case KEY_ESCAPE:
51cb93a386Sopenharmony_ci                        running = false;
52cb93a386Sopenharmony_ci                        break;
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ci                    case KEY_W:
55cb93a386Sopenharmony_ci                        newWidth = std::max(0, width + (event.Key.Shift ? -20 : 20));
56cb93a386Sopenharmony_ci                        break;
57cb93a386Sopenharmony_ci                    case KEY_H:
58cb93a386Sopenharmony_ci                        newHeight = std::max(0, height + (event.Key.Shift ? -20 : 20));
59cb93a386Sopenharmony_ci                        break;
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci                    case KEY_LEFT:
62cb93a386Sopenharmony_ci                        newX = x - 20;
63cb93a386Sopenharmony_ci                        break;
64cb93a386Sopenharmony_ci                    case KEY_RIGHT:
65cb93a386Sopenharmony_ci                        newX = x + 20;
66cb93a386Sopenharmony_ci                        break;
67cb93a386Sopenharmony_ci                    case KEY_UP:
68cb93a386Sopenharmony_ci                        newY = y - 20;
69cb93a386Sopenharmony_ci                        break;
70cb93a386Sopenharmony_ci                    case KEY_DOWN:
71cb93a386Sopenharmony_ci                        newY = y + 20;
72cb93a386Sopenharmony_ci                        break;
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_ci                    case KEY_C:
75cb93a386Sopenharmony_ci                        window->setMousePosition(width / 2, height / 2);
76cb93a386Sopenharmony_ci                        break;
77cb93a386Sopenharmony_ci                    case KEY_T:
78cb93a386Sopenharmony_ci                        window->signalTestEvent();
79cb93a386Sopenharmony_ci                        window->messageLoop();
80cb93a386Sopenharmony_ci                        if (window->didTestEventFire())
81cb93a386Sopenharmony_ci                        {
82cb93a386Sopenharmony_ci                            std::cout << "Test event did fire" << std::endl;
83cb93a386Sopenharmony_ci                        }
84cb93a386Sopenharmony_ci                        else
85cb93a386Sopenharmony_ci                        {
86cb93a386Sopenharmony_ci                            std::cout << "Test event did not fire" << std::endl;
87cb93a386Sopenharmony_ci                        }
88cb93a386Sopenharmony_ci                        break;
89cb93a386Sopenharmony_ci                    case KEY_S:
90cb93a386Sopenharmony_ci                        window->setVisible(false);
91cb93a386Sopenharmony_ci                        window->messageLoop();
92cb93a386Sopenharmony_ci                        angle::Sleep(1000);
93cb93a386Sopenharmony_ci                        window->setVisible(true);
94cb93a386Sopenharmony_ci                        window->messageLoop();
95cb93a386Sopenharmony_ci                        break;
96cb93a386Sopenharmony_ci
97cb93a386Sopenharmony_ci                    default:
98cb93a386Sopenharmony_ci                        break;
99cb93a386Sopenharmony_ci                }
100cb93a386Sopenharmony_ci
101cb93a386Sopenharmony_ci                if (newWidth != width || newHeight != height)
102cb93a386Sopenharmony_ci                {
103cb93a386Sopenharmony_ci                    width  = newWidth;
104cb93a386Sopenharmony_ci                    height = newHeight;
105cb93a386Sopenharmony_ci                    window->resize(width, height);
106cb93a386Sopenharmony_ci                }
107cb93a386Sopenharmony_ci                if (newX != x || newY != y)
108cb93a386Sopenharmony_ci                {
109cb93a386Sopenharmony_ci                    x = newX;
110cb93a386Sopenharmony_ci                    y = newY;
111cb93a386Sopenharmony_ci                    window->setPosition(x, y);
112cb93a386Sopenharmony_ci                }
113cb93a386Sopenharmony_ci
114cb93a386Sopenharmony_ci                angle::Sleep(0);
115cb93a386Sopenharmony_ci                window->messageLoop();
116cb93a386Sopenharmony_ci                if (window->getWidth() != width || window->getHeight() != height)
117cb93a386Sopenharmony_ci                {
118cb93a386Sopenharmony_ci                    std::cout << "Discrepancy between set dimensions and retrieved dimensions"
119cb93a386Sopenharmony_ci                              << std::endl;
120cb93a386Sopenharmony_ci                    std::cout << "Width: " << width << " vs. " << window->getWidth() << std::endl;
121cb93a386Sopenharmony_ci                    std::cout << "Height: " << height << " vs. " << window->getHeight()
122cb93a386Sopenharmony_ci                              << std::endl;
123cb93a386Sopenharmony_ci                }
124cb93a386Sopenharmony_ci                if (window->getX() != x || window->getY() != y)
125cb93a386Sopenharmony_ci                {
126cb93a386Sopenharmony_ci                    std::cout << "Discrepancy between set position and retrieved position"
127cb93a386Sopenharmony_ci                              << std::endl;
128cb93a386Sopenharmony_ci                    std::cout << "X: " << x << " vs. " << window->getX() << std::endl;
129cb93a386Sopenharmony_ci                    std::cout << "Y: " << y << " vs. " << window->getY() << std::endl;
130cb93a386Sopenharmony_ci                }
131cb93a386Sopenharmony_ci            }
132cb93a386Sopenharmony_ci        }
133cb93a386Sopenharmony_ci
134cb93a386Sopenharmony_ci        angle::Sleep(0);
135cb93a386Sopenharmony_ci        window->messageLoop();
136cb93a386Sopenharmony_ci    }
137cb93a386Sopenharmony_ci
138cb93a386Sopenharmony_ci    window->destroy();
139cb93a386Sopenharmony_ci}
140