X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Usermode%2FLibraries%2Flibaxwin4.so_src%2Fwm.cpp;h=f023ea8176e39b3035db37c8126c3d0831dd39c9;hb=145dd00e5c5a36f844be327e16a00b2983245423;hp=12c02c58ec4a44263a4ab5bb223a4066aa2e02ad;hpb=d74e5edc75b4fca94b71eef800b9d3a04760da05;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libaxwin4.so_src/wm.cpp b/Usermode/Libraries/libaxwin4.so_src/wm.cpp index 12c02c58..f023ea81 100644 --- a/Usermode/Libraries/libaxwin4.so_src/wm.cpp +++ b/Usermode/Libraries/libaxwin4.so_src/wm.cpp @@ -8,33 +8,101 @@ #include #include "include/common.hpp" #include +#include +#include +#include namespace AxWin { +static const int MAX_WINDOW_ID = 16; +static ::std::mutex glWindowList; +static ::std::vector gWindowList; + extern "C" tAxWin4_Window *AxWin4_CreateWindow(const char *Name) { // Allocate a window ID + ::std::lock_guard lock(glWindowList); + int id = ::std::find(gWindowList.begin(), gWindowList.end(), nullptr) - gWindowList.end(); + if( id >= MAX_WINDOW_ID ) { + throw ::std::runtime_error("AxWin4_CreateWindow - Out of IDs (TODO: Better exception)"); + } + if( id == gWindowList.size() ) + { + gWindowList.push_back(nullptr); + } + // Create window structure locally + tAxWin4_Window *ret = new tAxWin4_Window(); + gWindowList[id] = ret; + ret->m_id = id; // Request creation of window + CSerialiser message; + message.WriteU8(IPCMSG_CREATEWIN); + message.WriteU16(ret->m_id); + message.WriteString(Name); + ::AxWin::SendMessage(message); + return ret; } -extern "C" void AxWin4_ShowWindow(tAxWin4_Window *Window) +extern "C" void AxWin4_ShowWindow(tAxWin4_Window *Window, bool Show) { CSerialiser message; + message.WriteU8(IPCMSG_SETWINATTR); message.WriteU16(Window->m_id); message.WriteU16(IPC_WINATTR_SHOW); - message.WriteU8(1); + message.WriteU8( (Show ? 1 : 0) ); + ::AxWin::SendMessage(message); +} + +extern "C" void AxWin4_SetWindowFlags(tAxWin4_Window *Window, unsigned int Flags) +{ + CSerialiser message; + message.WriteU8(IPCMSG_SETWINATTR); + message.WriteU16(Window->m_id); + message.WriteU16(IPC_WINATTR_FLAGS); + message.WriteU8( Flags ); + ::AxWin::SendMessage(message); +} + +extern "C" void AxWin4_MoveWindow(tAxWin4_Window *Window, int X, int Y) +{ + CSerialiser message; + message.WriteU8(IPCMSG_SETWINATTR); + message.WriteU16(Window->m_id); + message.WriteU16(IPC_WINATTR_POSITION); + message.WriteS16(X); + message.WriteS16(Y); + ::AxWin::SendMessage(message); +} +extern "C" void AxWin4_ResizeWindow(tAxWin4_Window *Window, unsigned int W, unsigned int H) +{ + CSerialiser message; + message.WriteU8(IPCMSG_SETWINATTR); + message.WriteU16(Window->m_id); + message.WriteU16(IPC_WINATTR_DIMENSIONS); + message.WriteU16(W); + message.WriteU16(H); ::AxWin::SendMessage(message); } extern "C" void AxWin4_SetTitle(tAxWin4_Window *Window, const char *Title) { CSerialiser message; + message.WriteU8(IPCMSG_SETWINATTR); message.WriteU16(Window->m_id); message.WriteU16(IPC_WINATTR_TITLE); message.WriteString(Title); ::AxWin::SendMessage(message); } +extern "C" void *AxWin4_GetWindowBuffer(tAxWin4_Window *Window) +{ + //if( !Window->m_buffer ) + //{ + // // TODO: Support non-blocking operations + //} + return NULL; +} + }; // namespace AxWin