aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar mitchell <70453897+667e-11@users.noreply.github.com>2020-05-25 21:16:01 -0400
committerGravatar mitchell <70453897+667e-11@users.noreply.github.com>2020-05-25 21:16:01 -0400
commitf2374c4aba53fa462dc88d4104e10d8cb97e61ba (patch)
tree5e5a9d26a5ad8915c0e12187dd059b1109fcf22d /src
parenteffc636745e8d9c680c3acf42e8e25eed10cd903 (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.c67
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;
}