diff options
author | 2020-05-25 21:16:01 -0400 | |
---|---|---|
committer | 2020-05-25 21:16:01 -0400 | |
commit | f2374c4aba53fa462dc88d4104e10d8cb97e61ba (patch) | |
tree | 5e5a9d26a5ad8915c0e12187dd059b1109fcf22d /src | |
parent | effc636745e8d9c680c3acf42e8e25eed10cd903 (diff) |
Allow views to be used as buffers and update API.
This allows for a superficial separation of buffer- and view-specific Scintilla
functionality. buffers and views can now be used interchangeably for the most
part, and the APIs are guidance, not hard requirements. User scripts do not
require any modification and will continue to function normally.
Diffstat (limited to 'src')
-rw-r--r-- | src/textadept.c | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/src/textadept.c b/src/textadept.c index 59794441..dc79ea47 100644 --- a/src/textadept.c +++ b/src/textadept.c @@ -1188,9 +1188,10 @@ static int call_scintilla( static int call_scintilla_lua(lua_State *L) { Scintilla *view = focused_view; // If optional buffer/view argument is given, check it. - if (is_type(L, 1, "ta_buffer")) view = view_for_doc(L, 1); - //else if (is_type(L, 1, "ta_view")) - // view = lua_toview(L, 1); + if (is_type(L, 1, "ta_buffer")) + view = view_for_doc(L, 1); + else if (is_type(L, 1, "ta_view")) + view = lua_toview(L, 1); // Interface table is of the form {msg, rtype, wtype, ltype}. return call_scintilla( L, view, get_int_field(L, lua_upvalueindex(1), 1), @@ -1239,9 +1240,8 @@ static int tab_clicked(GtkWidget *label, GdkEventButton *event, void *L) { /** `buffer[k].__index` metamethod. */ static int property_index(lua_State *L) { - //Scintilla *view = (lua_getfield(L, 1, "_self"), !is_type(L, -1, "ta_view"))? - // view_for_doc(L, -1) : lua_toview(L, -1); - Scintilla *view = (lua_getfield(L, 1, "_self"), view_for_doc(L, -1)); + Scintilla *view = (lua_getfield(L, 1, "_self"), !is_type(L, -1, "ta_view")) ? + view_for_doc(L, -1) : lua_toview(L, -1); lua_getfield(L, 1, "_iface"); // {get_id, set_id, rtype, wtype}. int msg = get_int_field(L, -1, 1), wtype = get_int_field(L, -1, 4), ltype = SVOID, rtype = get_int_field(L, -1, 3); @@ -1251,9 +1251,8 @@ static int property_index(lua_State *L) { /** `buffer[k].__newindex` metamethod. */ static int property_newindex(lua_State *L) { - //Scintilla *view = (lua_getfield(L, 1, "_self"), !is_type(L, -1, "ta_view"))? - // view_for_doc(L, -1) : lua_toview(L, -1); - Scintilla *view = (lua_getfield(L, 1, "_self"), view_for_doc(L, -1)); + Scintilla *view = (lua_getfield(L, 1, "_self"), !is_type(L, -1, "ta_view")) ? + view_for_doc(L, -1) : lua_toview(L, -1); lua_getfield(L, 1, "_iface"); // {get_id, set_id, rtype, wtype}. int msg = get_int_field(L, -1, 2), wtype = get_int_field(L, -1, 4), ltype = get_int_field(L, -1, 3), rtype = SVOID; @@ -1265,8 +1264,8 @@ static int property_newindex(lua_State *L) { // Helper function for `buffer_index()` and `view_index()` that gets Scintilla // properties. static void get_property(lua_State *L) { - //Scintilla *view = is_type(L, 1, "ta_buffer") ? view_for_doc(L, 1) : - // lua_toview(L, 1); + Scintilla *view = is_type(L, 1, "ta_buffer") ? view_for_doc(L, 1) : + lua_toview(L, 1); // Interface table is of the form {get_id, set_id, rtype, wtype}. int msg = get_int_field(L, -1, 1), wtype = get_int_field(L, -1, 4), ltype = SVOID, rtype = get_int_field(L, -1, 3); @@ -1276,14 +1275,14 @@ static void get_property(lua_State *L) { lua_pushvalue(L, 1), lua_setfield(L, -2, "_self"); lua_pushvalue(L, -2), lua_setfield(L, -2, "_iface"); set_metatable(L, -1, "ta_property", property_index, property_newindex); - } else call_scintilla(L, view_for_doc(L, 1), msg, wtype, ltype, rtype, 2); + } else call_scintilla(L, view, msg, wtype, ltype, rtype, 2); } // Helper function for `buffer_newindex()` and `view_newindex()` that sets // Scintilla properties. static void set_property(lua_State *L) { - //Scintilla *view = is_type(L, 1, "ta_buffer") ? view_for_doc(L, 1) : - // lua_toview(L, 1); + Scintilla *view = is_type(L, 1, "ta_buffer") ? view_for_doc(L, 1) : + lua_toview(L, 1); // Interface table is of the form {get_id, set_id, rtype, wtype}. int msg = get_int_field(L, -1, 2), wtype = get_int_field(L, -1, 3), ltype = get_int_field(L, -1, 4), rtype = SVOID, temp; @@ -1291,7 +1290,7 @@ static void set_property(lua_State *L) { if (wtype == SSTRING || wtype == SSTRINGRET || msg == SCI_SETMARGINLEFT || msg == SCI_SETMARGINRIGHT) temp = wtype != SSTRINGRET ? wtype : SSTRING, wtype = ltype, ltype = temp; - call_scintilla(L, view_for_doc(L, 1), msg, wtype, ltype, rtype, 3); + call_scintilla(L, view, msg, wtype, ltype, rtype, 3); } /** `buffer.__index` metamethod. */ @@ -2101,20 +2100,21 @@ static int view_index(lua_State *L) { if ((p = get_parent_pane(pane, lua_toview(L, 1)))) lua_pushinteger(L, p->split_size); #endif - //} else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_functions"), - // lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TTABLE) - // // If the key is a Scintilla function, return a callable closure. - // lua_pushcclosure(L, call_scintilla_lua, 1); - //else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_properties"), - // lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TTABLE) - // // If the key is a Scintilla property, determine if it is an indexible one - // // or not. If so, return a table with the appropriate metatable; otherwise - // // call Scintilla to get the property's value. - // get_property(L); - //else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_constants"), - // lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TNUMBER); // pushed - // // If the key is a Scintilla constant, return its value. - } else lua_pushvalue(L, 2), lua_rawget(L, 1); + } else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_functions"), + lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TTABLE) + // If the key is a Scintilla function, return a callable closure. + lua_pushcclosure(L, call_scintilla_lua, 1); + else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_properties"), + lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TTABLE) + // If the key is a Scintilla property, determine if it is an indexible one + // or not. If so, return a table with the appropriate metatable; otherwise + // call Scintilla to get the property's value. + get_property(L); + else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_constants"), + lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TNUMBER); // pushed + // If the key is a Scintilla constant, return its value. + else + lua_pushvalue(L, 2), lua_rawget(L, 1); return 1; } @@ -2132,10 +2132,11 @@ static int view_newindex(lua_State *L) { p->split_size = fmax(luaL_checkinteger(L, 3), 0), resize_pane(p, p->rows, p->cols, p->y, p->x); #endif - //} else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_properties"), - // lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TTABLE) - // set_property(L); - } else lua_pushvalue(L, 2), lua_pushvalue(L, 3), lua_rawset(L, 1); + } else if (lua_getfield(L, LUA_REGISTRYINDEX, "ta_properties"), + lua_pushvalue(L, 2), lua_rawget(L, -2) == LUA_TTABLE) + set_property(L); + else + lua_pushvalue(L, 2), lua_pushvalue(L, 3), lua_rawset(L, 1); return 0; } |