From 27d6efb5f5a076f825fe2da1875e0cabaf02b4e7 Mon Sep 17 00:00:00 2001
From: chai <chaifix@163.com>
Date: Wed, 17 Nov 2021 23:03:07 +0800
Subject: + LuaMacro

---
 Tools/LuaMacro/tests/winapi.lc | 210 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 210 insertions(+)
 create mode 100644 Tools/LuaMacro/tests/winapi.lc

(limited to 'Tools/LuaMacro/tests/winapi.lc')

diff --git a/Tools/LuaMacro/tests/winapi.lc b/Tools/LuaMacro/tests/winapi.lc
new file mode 100644
index 0000000..723a91c
--- /dev/null
+++ b/Tools/LuaMacro/tests/winapi.lc
@@ -0,0 +1,210 @@
+#define WINDOWS_LEAN_AND_MEAN
+#include <windows.h>
+#include <string.h>
+
+#define eq(s1,s2) (strcmp(s1,s2)==0)
+
+#define WBUFF 2048
+#define MAX_SHOW 100
+
+module "winapi" {
+
+class window {
+  HWND hwnd;
+
+  constructor (HWND h) {
+    this->hwnd = h;
+  }
+
+  static lua_State *sL;
+
+  static BOOL enum_callback(HWND hwnd,LPARAM data) {
+    int ref = (int)data;
+    lua_rawgeti(sL,LUA_REGISTRYINDEX,ref);
+    push_new_window(sL,hwnd);
+    lua_call(sL,1,0);
+    return TRUE;
+  }
+
+  def handle() {
+    lua_pushinteger(L,(int)this->hwnd);
+    return 1;
+  }
+
+  static char buff[WBUFF];
+
+  def get_text() {
+    GetWindowText(this->hwnd,buff,sizeof(buff));
+    lua_pushstring(L,buff);
+    return 1;
+  }
+
+  def show(Int flags = SW_SHOW) {
+    ShowWindow(this->hwnd,flags);
+    return 0;
+  }
+
+  def get_position() {
+    RECT rect;
+    GetWindowRect(this->hwnd,&rect);
+    lua_pushinteger(L,rect.left);
+    lua_pushinteger(L,rect.top);
+    return 2;
+  }
+
+  def get_bounds() {
+    RECT rect;
+    GetWindowRect(this->hwnd,&rect);
+    lua_pushinteger(L,rect.right - rect.left);
+    lua_pushinteger(L,rect.bottom - rect.top);
+    return 2;
+  }
+
+  def is_visible() {
+    lua_pushboolean(L,IsWindowVisible(this->hwnd));
+    return 1;
+  }
+
+  def destroy () {
+    DestroyWindow(this->hwnd);
+    return 0;
+  }
+
+  def resize(Int x0, Int y0, Int w, Int h) {
+    MoveWindow(this->hwnd,x0,y0,w,h,TRUE);
+    return 0;
+  }
+
+  def send_message(Int msg, Int wparam, Int lparam) {
+    SendMessage(this->hwnd,msg,wparam,lparam);
+  }
+
+  def enum_children(Value callback) {
+    int ref;
+    sL = L;
+    lua_pushvalue(L,callback);
+    ref  = luaL_ref(L,LUA_REGISTRYINDEX);
+    EnumChildWindows(this->hwnd,&enum_callback,ref);
+    luaL_unref(L,LUA_REGISTRYINDEX,ref);
+    return 0;
+  }
+
+  def get_parent() {
+    push_new_window(L,GetParent(this->hwnd));
+    return 1;
+  }
+
+  def get_module_filename() {
+    int sz = GetWindowModuleFileName(this->hwnd,buff,sizeof(buff));
+    buff[sz] = '\0';
+    lua_pushstring(L,buff);
+    return 1;
+  }
+
+  def __tostring() {
+    GetWindowText(this->hwnd,buff,sizeof(buff));
+    if (strlen(buff) > MAX_SHOW) {
+      strcpy(buff+MAX_SHOW,"...");
+    }
+    lua_pushstring(L,buff);
+    return 1;
+  }
+
+  def __eq(window other) {
+    lua_pushboolean(L,this->hwnd == other->hwnd);
+    return 1;
+  }
+
+}
+
+def find_window(Str cname, Str wname) {
+  HWND hwnd;
+  if (eq(cname,"")) {
+    cname = NULL;
+  }
+  hwnd = FindWindow(cname,wname);
+  push_new_window(L,hwnd);
+  return 1;
+}
+
+def active_window() {
+  push_new_window(L, GetActiveWindow());
+  return 1;
+}
+
+def desktop_window() {
+  push_new_window(L, GetDesktopWindow());
+  return 1;
+}
+
+def enum_windows(Value callback) {
+  int ref;
+  sL = L;
+  lua_pushvalue(L,callback);
+  ref  = luaL_ref(L,LUA_REGISTRYINDEX);
+  EnumWindows(&enum_callback,ref);
+  luaL_unref(L,LUA_REGISTRYINDEX,ref);
+  return 0;
+}
+
+def tile_windows(window parent, Boolean horiz, Value kids, Value bounds) {
+  RECT rt;
+  HWND *kids_arr;
+  int i,n_kids;
+  LPRECT lpRect = NULL;
+  if (! lua_isnoneornil(L,bounds)) {
+    lua_pushvalue(L,bounds);
+    Int_get(rt.left,"left");
+    Int_get(rt.top,"top");
+    Int_get(rt.right,"right");
+    Int_get(rt.bottom,"bottom");
+    lua_pop(L,1);
+  }
+  n_kids = lua_objlen(L,kids);
+  kids_arr = (HWND *)malloc(sizeof(HWND)*n_kids);
+  for (i = 0; i < n_kids; ++i) {
+    window *w;
+    lua_rawgeti(L,kids,i+1);
+    w = window_arg(L,-1);
+    kids_arr[i] = w->hwnd;
+  }
+  TileWindows(parent->hwnd,horiz ? MDITILE_HORIZONTAL : MDITILE_VERTICAL, lpRect, n_kids, kids_arr);
+  free(kids_arr);
+  return 0;
+}
+
+def shell_exec(StrNil verb, Str file, StrNil parms, StrNil dir, Int show=SW_SHOWNORMAL) {
+  int res = (int)ShellExecute(NULL,verb,file,parms,dir,show);
+  if (res > 32) {
+    lua_pushboolean(L,1);
+    return 1;
+  } else {
+    const char *msg;
+    switch(res) {
+      #define check_err(NAME) case NAME: msg = #NAME; break;
+      check_err(ERROR_FILE_NOT_FOUND);
+      check_err(ERROR_PATH_NOT_FOUND);
+      check_err(ERROR_BAD_FORMAT);
+      check_err(SE_ERR_ACCESSDENIED);
+      check_err(SE_ERR_ASSOCINCOMPLETE);
+      check_err(SE_ERR_DLLNOTFOUND);
+      check_err(SE_ERR_NOASSOC);
+      check_err(SE_ERR_OOM);
+      check_err(SE_ERR_SHARE);
+      default: msg = "unknown error, probably DDE";
+      #undef check_err
+    }
+    lua_pushnil(L);
+    lua_pushstring(L,msg);
+    return 2;
+  }
+}
+
+constants {
+  SW_HIDE,
+  SW_MAXIMIZE,
+  SW_MINIMIZE,
+  SW_SHOWNORMAL
+}
+
+}
-- 
cgit v1.1-26-g67d0