Implement layout related interface.
authorGuo Rui <firemeteor@Adam.(none)>
Mon, 6 Jul 2009 15:36:51 +0000 (6 23:36 +0800)
committerGuo Rui <firemeteor@Adam.(none)>
Mon, 6 Jul 2009 15:36:51 +0000 (6 23:36 +0800)
Also restructure layout renumbering code to avoid duplication.

src/lua.c
src/process.c

index 9717e0f..96c70ba 100644 (file)
--- 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)
 {
index d6cfda6..af554ce 100644 (file)
@@ -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"))
        {