Merge pull request #2661 from psychon/selection_global

Change the selection global
This commit is contained in:
mergify[bot] 2019-03-07 02:59:33 +00:00 committed by GitHub
commit 795c792d11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 22 deletions

View File

@ -27,10 +27,7 @@ read_globals = {
"keygrabber",
"mousegrabber",
"root",
"selection_acquire",
"selection_getter",
"selection",
"selection_watcher",
"tag",
"window",
"table.unpack",

View File

@ -52,6 +52,7 @@ static xcb_window_t selection_window = XCB_NONE;
static int
luaA_selection_get(lua_State *L)
{
luaA_deprecate(L, "selection.getter(\"PRIMARY\", \"UTF8_STRING\")");
if(selection_window == XCB_NONE)
{
xcb_screen_t *screen = globalconf.screen;
@ -132,10 +133,48 @@ luaA_selection_get(lua_State *L)
return 0;
}
static void
move_global_to_table(lua_State *L, int index, const char *global_name, const char *local_name)
{
index = luaA_absindex(L, index);
/* Get the global */
lua_getglobal(L, global_name);
assert(!lua_isnil(L, -1));
/* Save it locally */
lua_setfield(L, index, local_name);
/* Set the global to nil */
lua_pushnil(L);
lua_setglobal(L, global_name);
}
void
selection_setup(lua_State *L)
{
/* This table will be the "selection" global */
lua_newtable(L);
/* Setup a metatable */
lua_newtable(L);
/* metatable.__index = metatable */
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
/* Set some more fields */
lua_pushcfunction(L, luaA_selection_get);
lua_setfield(L, -2, "__call");
move_global_to_table(L, -2, "selection_acquire", "acquire");
move_global_to_table(L, -2, "selection_getter", "getter");
move_global_to_table(L, -2, "selection_watcher", "watcher");
/* Set the metatable */
lua_setmetatable(L, -2);
/* Set the "selection" global */
lua_setglobal(L, "selection");
}

View File

@ -61,7 +61,7 @@ runner.run_steps{
-- Now query the state of the clipboard (should be empty)
continue = false
local s = selection_getter{ selection = "CLIPBOARD", target = "TARGETS" }
local s = selection.getter{ selection = "CLIPBOARD", target = "TARGETS" }
s:connect_signal("data", function(...) error("Got unexpected data: " .. dump_return{...}) end)
s:connect_signal("data_end", function()
assert(not continue)
@ -97,7 +97,7 @@ runner.run_steps{
-- Query whether the clipboard contains a text (UTF8_STRING)
continue = false
local s = selection_getter{ selection = "CLIPBOARD", target = "TARGETS" }
local s = selection.getter{ selection = "CLIPBOARD", target = "TARGETS" }
local data = nil
s:connect_signal("data", function(_, d)
assert(not data)
@ -120,7 +120,7 @@ runner.run_steps{
-- Query the text in the clipboard
continue = false
local s = selection_getter{ selection = "CLIPBOARD", target = "UTF8_STRING" }
local s = selection.getter{ selection = "CLIPBOARD", target = "UTF8_STRING" }
local data = nil
s:connect_signal("data", function(_, d)
assert(data == nil)
@ -161,7 +161,7 @@ runner.run_steps{
-- Query the image in the clipboard
continue = false
local s = selection_getter{ selection = "CLIPBOARD", target = "image/bmp" }
local s = selection.getter{ selection = "CLIPBOARD", target = "image/bmp" }
local data = {}
s:connect_signal("data", function(_, d)
table.insert(data, d)

View File

@ -53,7 +53,7 @@ assert_equal(clipboard:wait_for_targets(), nil)
assert_equal(clipboard:wait_for_text(), nil)
]] .. done_footer
local selection
local selection_object
local selection_released
local continue
@ -66,22 +66,22 @@ end
runner.run_steps{
function()
-- Get the selection
local s = assert(selection_acquire{ selection = "CLIPBOARD" },
local s = assert(selection.acquire{ selection = "CLIPBOARD" },
"Failed to acquire the clipboard selection")
-- Steal selection ownership from ourselves and test that it works
local s_released
s:connect_signal("release", function() s_released = true end)
selection = assert(selection_acquire{ selection = "CLIPBOARD" },
selection_object = assert(selection.acquire{ selection = "CLIPBOARD" },
"Failed to acquire the clipboard selection")
assert(s_released)
-- Now test selection transfers
selection = assert(selection_acquire{ selection = "CLIPBOARD" },
selection_object = assert(selection.acquire{ selection = "CLIPBOARD" },
"Failed to acquire the clipboard selection")
selection:connect_signal("request", function(_, target, transfer)
selection_object:connect_signal("request", function(_, target, transfer)
if target == "TARGETS" then
transfer:send{
format = "atom",
@ -108,9 +108,9 @@ runner.run_steps{
continue = false
-- Now test piece-wise selection transfers
selection = assert(selection_acquire{ selection = "CLIPBOARD" },
selection_object = assert(selection.acquire{ selection = "CLIPBOARD" },
"Failed to acquire the clipboard selection")
selection:connect_signal("request", function(_, target, transfer)
selection_object:connect_signal("request", function(_, target, transfer)
if target == "TARGETS" then
transfer:send{
format = "atom",
@ -148,9 +148,9 @@ runner.run_steps{
continue = false
-- Now test a huge transfer
selection = assert(selection_acquire{ selection = "CLIPBOARD" },
selection_object = assert(selection.acquire{ selection = "CLIPBOARD" },
"Failed to acquire the clipboard selection")
selection:connect_signal("request", function(_, target, transfer)
selection_object:connect_signal("request", function(_, target, transfer)
if target == "TARGETS" then
transfer:send{
format = "atom",
@ -195,7 +195,7 @@ runner.run_steps{
continue = false
-- Now test that :release() works
selection:release()
selection_object:release()
awesome.sync()
spawn.with_line_callback({ "lua", "-e", check_empty_selection },
{ stdout = function(line)
@ -214,9 +214,9 @@ runner.run_steps{
continue = false
-- Test for "release" signal when we lose selection
selection = assert(selection_acquire{ selection = "CLIPBOARD" },
selection_object = assert(selection.acquire{ selection = "CLIPBOARD" },
"Failed to acquire the clipboard selection")
selection:connect_signal("release", function() selection_released = true end)
selection_object:connect_signal("release", function() selection_released = true end)
awesome.sync()
spawn.with_line_callback({ "lua", "-e", acquire_and_clear_clipboard },
{ exit = function() continue = true end })

View File

@ -29,9 +29,9 @@ Gtk.main()
local had_error = false
local owned_clipboard_changes, unowned_clipboard_changes = 0, 0
local clipboard_watcher = selection_watcher("CLIPBOARD")
local clipboard_watcher_inactive = selection_watcher("CLIPBOARD")
local primary_watcher = selection_watcher("PRIMARY")
local clipboard_watcher = selection.watcher("CLIPBOARD")
local clipboard_watcher_inactive = selection.watcher("CLIPBOARD")
local primary_watcher = selection.watcher("PRIMARY")
clipboard_watcher:connect_signal("selection_changed", function(_, owned)
if owned then