From 37cf3bb5cc8ac45ba6571e4a9f7e4301732eb614 Mon Sep 17 00:00:00 2001 From: Guo Rui Date: Mon, 6 Jul 2009 23:36:51 +0800 Subject: [PATCH] Implement layout related interface. Also restructure layout renumbering code to avoid duplication. --- src/lua.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- src/process.c | 29 ++++++++++++++++++----------- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/lua.c b/src/lua.c index 9717e0f..96c70ba 100644 --- a/src/lua.c +++ b/src/lua.c @@ -635,9 +635,56 @@ PUSH_TYPE(layout, struct layout) CHECK_TYPE(layout, struct layout) static const struct Xet_reg layout_getters[] = { - {0,0} + {"title", get_string, offsetof(struct layout, lay_title)}, + {"number", get_string, offsetof(struct layout, lay_title)}, + {"autosave", get_string, offsetof(struct layout, lay_autosave)}, + {0,0} }; +int +layout_change_title(lua_State *L) +{ + struct layout *lay = check_layout(L, 1); + unsigned int len; + const char *title = luaL_checklstring(L, 3, &len); + free(lay->lay_title); + lay->lay_title= SaveStr(title); + return 0; +} + +void LayoutChangeNumber(struct layout *lay, int newnum); + +int +layout_change_number(lua_State *L) +{ + struct layout *lay = check_layout(L, 1); + int newnum = luaL_checkint(L, 3); + LayoutChangeNumber(lay, newnum); + return 0; +} + +static const struct Xet_reg layout_setters[] = { + {"title", 0, 0, layout_change_title/*absolute setter*/}, + {"number", 0, 0, layout_change_number/*absolute setter*/}, + {"autosave", get_string, offsetof(struct layout, lay_autosave)}, + {0, 0} +}; + +int +layout_select(lua_State *L) +{ + struct layout *lay = check_layout(L, 1); + if (!display) return; + LoadLayout(lay, &D_canvas); + Activate(0); + return 0; +} + +static const luaL_reg layout_methods[] = { + {"select", layout_select}, + {0, 0} +}; + static int get_layout(lua_State *L, void *v) { diff --git a/src/process.c b/src/process.c index d6cfda6..af554ce 100644 --- a/src/process.c +++ b/src/process.c @@ -1230,6 +1230,22 @@ FocusCanvas(struct canvas *cv) WindowChanged(0, 'F'); } +void +LayoutChangeNumber(struct layout *lay, int newnum) +{ + struct layout *tmp; + int old = lay->lay_number; + + if (newnum < 0 || newnum >= MAXLAY) + return; + tmp = laytab[newnum]; + laytab[newnum] = lay; + lay->lay_number = newnum; + laytab[old] = tmp; + if (tmp) + tmp->lay_number = old; +} + /*ARGSUSED*/ void DoAction(act, key) @@ -4292,17 +4308,8 @@ int key; Msg(0, "This is layout %d (%s).\n", D_layout->lay_number, D_layout->lay_title); break; } - old = D_layout->lay_number; - n = atoi(args[1]); - if (n < 0 || n >= MAXLAY) - break; - lay = laytab[n]; - laytab[n] = D_layout; - D_layout->lay_number = n; - laytab[old] = lay; - if (lay) - lay->lay_number = old; - break; + LayoutChangeNumber(D_layout, atoi(args[1])); + break; } else if (!strcmp(args[0], "autosave")) { -- 2.11.4.GIT