Usermode/AxWin4 - Screen dimensions acquisition, speedup, window render
[tpg/acess2.git] / Usermode / Libraries / libaxwin4.so_src / wm.cpp
1 /*
2  * AxWin4 Interface Library
3  * - By John Hodge (thePowersGang)
4  *
5  * wm.cpp
6  * - Window Management
7  */
8 #include <axwin4/axwin.h>
9 #include "include/common.hpp"
10 #include <ipc_proto.hpp>
11 #include <vector>
12 #include <algorithm>
13 #include <mutex>
14
15 namespace AxWin {
16
17 static const int        MAX_WINDOW_ID = 16;
18 static ::std::mutex     glWindowList;
19 static ::std::vector<tAxWin4_Window*>   gWindowList;
20
21 extern "C" tAxWin4_Window *AxWin4_CreateWindow(const char *Name)
22 {
23         // Allocate a window ID
24         ::std::lock_guard<std::mutex>   lock(glWindowList);
25         int id = ::std::find(gWindowList.begin(), gWindowList.end(), nullptr) - gWindowList.end();
26         if( id >= MAX_WINDOW_ID ) {
27                 throw ::std::runtime_error("AxWin4_CreateWindow - Out of IDs (TODO: Better exception)");
28         }
29         if( id == gWindowList.size() )
30         {
31                 gWindowList.push_back(nullptr);
32         }
33         
34         // Create window structure locally
35         tAxWin4_Window *ret = new tAxWin4_Window();
36         gWindowList[id] = ret;
37         ret->m_id = id;
38         // Request creation of window
39         CSerialiser     message;
40         message.WriteU8(IPCMSG_CREATEWIN);
41         message.WriteU16(ret->m_id);
42         message.WriteString(Name);
43         ::AxWin::SendMessage(message);
44         return ret;
45 }
46
47 extern "C" void AxWin4_ShowWindow(tAxWin4_Window *Window, bool Show)
48 {
49         CSerialiser     message;
50         message.WriteU8(IPCMSG_SETWINATTR);
51         message.WriteU16(Window->m_id);
52         message.WriteU16(IPC_WINATTR_SHOW);
53         message.WriteU8( (Show ? 1 : 0) );
54         ::AxWin::SendMessage(message);
55 }
56
57 extern "C" void AxWin4_SetWindowFlags(tAxWin4_Window *Window, unsigned int Flags)
58 {
59         CSerialiser     message;
60         message.WriteU8(IPCMSG_SETWINATTR);
61         message.WriteU16(Window->m_id);
62         message.WriteU16(IPC_WINATTR_FLAGS);
63         message.WriteU8( Flags );
64         ::AxWin::SendMessage(message);
65 }
66
67 extern "C" void AxWin4_MoveWindow(tAxWin4_Window *Window, int X, int Y)
68 {
69         CSerialiser     message;
70         message.WriteU8(IPCMSG_SETWINATTR);
71         message.WriteU16(Window->m_id);
72         message.WriteU16(IPC_WINATTR_POSITION);
73         message.WriteS16(X);
74         message.WriteS16(Y);
75         ::AxWin::SendMessage(message);
76 }
77 extern "C" void AxWin4_ResizeWindow(tAxWin4_Window *Window, unsigned int W, unsigned int H)
78 {
79         CSerialiser     message;
80         message.WriteU8(IPCMSG_SETWINATTR);
81         message.WriteU16(Window->m_id);
82         message.WriteU16(IPC_WINATTR_DIMENSIONS);
83         message.WriteU16(W);
84         message.WriteU16(H);
85         ::AxWin::SendMessage(message);
86 }
87
88 extern "C" void AxWin4_SetTitle(tAxWin4_Window *Window, const char *Title)
89 {
90         CSerialiser     message;
91         message.WriteU8(IPCMSG_SETWINATTR);
92         message.WriteU16(Window->m_id);
93         message.WriteU16(IPC_WINATTR_TITLE);
94         message.WriteString(Title);
95         ::AxWin::SendMessage(message);
96 }
97
98 extern "C" void *AxWin4_GetWindowBuffer(tAxWin4_Window *Window)
99 {
100         //if( !Window->m_buffer )
101         //{
102         //      // TODO: Support non-blocking operations        
103         //}
104         return NULL;
105 }
106
107 };      // namespace AxWin
108

UCC git Repository :: git.ucc.asn.au