File: unique_instance.lua

package info (click to toggle)
luakit 1%3A2.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,844 kB
  • sloc: ansic: 12,519; makefile: 140; ruby: 79; sh: 48
file content (84 lines) | stat: -rw-r--r-- 2,568 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
--- Unique instance support for luakit.
--
-- This module provides a simple implementation of unique instances.
-- With this module enabled, only one instance of luakit will be run;
-- opening links from other programs or from the command line will open
-- those links in an already-running instance of luakit.
--
-- This module should be the first module loaded in your configuration file.
--
-- @module unique_instance
-- @copyright 2017 Aidan Holm <aidanholm@gmail.com>

local _M = {}

-- Check that this module is loaded first: simple but effective
for _, k in ipairs({"window", "webview", "lousy", "globals"}) do
    assert(not package.loaded[k], "unique_instance should be loaded before all other modules!")
end

local lfs = require "lfs"
local unique = luakit.unique

--- Whether links from secondary luakit instances should open in a new
-- window; if `true`, links will be opened in a new window, if `false`,
-- links will be opened in an existing luakit window.
-- @type boolean
-- @readwrite
-- @default `false`
_M.open_links_in_new_window = false

if not unique then
    msg.verbose("luakit started with no-unique")
    return _M
end

unique.new("org.luakit")

-- Check for a running luakit instance
if unique.is_running() then
    msg.verbose("a primary instance is already running")
    local pickle = require("lousy.pickle")

    local u = {}
    for i, uri in ipairs(uris) do
        u[i] = lfs.attributes(uri) and ("file://"..os.abspath(uri):gsub(" ","%%20")) or uri
    end

    unique.send_message("open-uri-set " .. pickle.pickle(u))
    luakit.quit()
end

unique.add_signal("message", function (message, screen)
    msg.verbose("received message from secondary instance")
    local lousy, window = require "lousy", require "window"
    local cmd, arg = string.match(message, "^(%S+)%s*(.*)")
    local w

    if cmd == "open-uri-set" then
        local u = lousy.pickle.unpickle(arg)
        -- Get the window to use
        if #u == 0 or _M.open_links_in_new_window then
            w = window.new(u)
        else
            w = lousy.util.table.values(window.bywidget)[1]
        end

        if not _M.open_links_in_new_window then
            for _, uri in ipairs(u) do
                w:new_tab(uri)
            end
        end
    elseif cmd == "tabopen" then
        w = lousy.util.table.values(window.bywidget)[1]
        w:new_tab(arg)
    elseif cmd == "winopen" then
        w = window.new((arg ~= "") and { arg } or {})
    end
    w.win.screen = screen
    w.win.urgency_hint = true
end)

return _M

-- vim: et:sw=4:ts=8:sts=4:tw=80