`geany.activate()` is supposed activate a document and return true. If it is unable, it returns false. However, it is not activating the document. Accepted arguments are a tab id (negative numbers), document id (positive numbers), or full document path. Test code attempting to call `geany.activate()` with the document id (test1) and path (test2) follows: ``` test1 = geany.activate(geany.documents(geany.filename()))
doc_id = geany.documents(geany.filename()) test2 = geany.activate(doc_id)
for key,val in pairs({ test1, test2 }) do if val then geany.status("true") else geany.status("false") geany.status(geany.documents(geany.filename())) geany.status(geany.filename()) end end ``` Results in status window are: ``` false 1 /tmp/test false 1 /tmp/test ```
For reference, an excerpt from the GeanyLua [documentation](https://plugins.geany.org/geanylua/geanylua-ref.html#activate):
**`geany.activate ( tab_id )`**
Activates the document specified by tab_id.
If `tab_id` is a number, it activates the document at that index. A positive number refers to the internal document array, and a negative number refers to the (absolute) GtkNotebook index. Note that the indices begin at (1) and (-1) respectively.
If `tab_id` is a string, the function will try to activate the notebook tab whose filename matches that string. ( The full pathname is required! )
Returns `true` on success, or `false` if the tab could not be found.
Relevant code is in [`geanylua/glspi_doc.c`](https://github.com/geany/geany-plugins/blob/master/geanylua/glspi_doc.c#L95-...). I don't see why it doesn't work. ```C /* Actvate and focus the specified document */ static gint glspi_activate(lua_State* L) { gint idx=-1; if (lua_gettop(L)>0) { if (lua_isnumber(L,1)) { idx=(lua_tonumber(L,1)); if (idx<0) { /* Negative number refers to (absolute) GtkNotebook index */ idx=(0-idx)-1; if (idx>=gtk_notebook_get_n_pages(NOTEBOOK)) { idx=-1;} } else { /* A positive number refers to the geany->documents_array index */ idx=doc_idx_to_tab_idx(idx-1); }
} else { if (lua_isstring(L,1)) { idx=doc_idx_to_tab_idx(filename_to_doc_idx(lua_tostring(L, 1))); } else { if (!lua_isnil(L,1)) { return FAIL_STR_OR_NUM_ARG(1); } } } } if (idx>=0) { if (idx!=gtk_notebook_get_current_page(NOTEBOOK)) { gtk_notebook_set_current_page(NOTEBOOK, idx); } } lua_pushboolean(L, (idx>0)); return 1; } ```
I'm not sure the OPs code should do anything, correct me if I'm wrong, but AFAICT it gets the current document which is the one in the current notebook tab, then sets the notebook tab to that tab, but the code from above:
```C if (idx!=gtk_notebook_get_current_page(NOTEBOOK)) { gtk_notebook_set_current_page(NOTEBOOK, idx); ```
makes it do nothing if the current tab == the tab requested == the tab of the current document == the document of the current tab so its guaranteed to do nothing.
Even if it did set the notebook tab [GTK](https://docs.gtk.org/gtk3/method.Notebook.set_current_page.html) does not say it grabs focus, so the Geanylua doc that says:
``` function activate ( tab_id ) -- Focus the specified editor tab. ``` is wrong anyway.
I'm not sure the OPs code should do anything...
In my Lua test code, what I'm interested in is the return value. Even if the function ultimately doesn't have to switch tabs, `idx` should still be set greater than `0` and return true. But no matter what I send, including numbers that should work, like `1`, it returns `false`.
Even if it did set the notebook tab [GTK](https://docs.gtk.org/gtk3/method.Notebook.set_current_page.html) does not say it grabs focus, so the Geanylua doc... is wrong anyway.
Okay. But the tab isn't changed. Even if focus isn't changed, changing the tab would be an improvement. Somehow by the end of the function, `idx <= 0`, causing `false` to be returned. Maybe the problem is `lua_gettop(L)>0` and `idx` is never changed from its initialized value?
Presumably, this function did work at some time in GeanyLua's past?
But the tab isn't changed ... (eg, if I'm on tab 3, call geany.activate(1), tabs don't change.)
Ok, thats pretty clearly a bug.
The OP seemed to keep using the current document so they would not have changed anything IIUC, so not sure what they meant to describe.
For this bug `idx` gets values assigned to it all over the place, is there a confusion between the axes, Lua tab index positive starting at 1, Lua doc index negative starting at -1, and notebook page number positive starting at 0 or negative for last, you know usual off by one thingy?
The OP seemed to keep using the current document so they would not have changed anything IIUC
Even though that code does not change the tab, the return value should still be `true`. According to the (erroneous) documentation, the only time it should return `false` is "if the tab could not be found". That code clearly demonstrates that the document id *could* be found (so the tab should exist). There is also a demo script `info/list-open-files.lua` that is supposed to change tabs using `geany.activate()`, but does not.
maybe there should be two different local variables, `lua_idx` and `notebook_page` to avoid confusion
I'll poke at `glspi_activate()` later to see if I can find where it's misbehaving. If I manage to find the problem, I'll try to rewrite it as you suggest.
github-comments@lists.geany.org