Skip to content

Commit

Permalink
Correct GLX function pointer loading links
Browse files Browse the repository at this point in the history
  • Loading branch information
jarcode-foss committed Sep 8, 2019
1 parent 25942ec commit 859bfb0
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 44 deletions.
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ If you use GNU Emacs, the above style can be configured via the following elisp:

## Lua

If you are contributing to `glava-config`, we use a style close to standard Lua with some emphasis on compat table definitions and readability
If you are contributing to `glava-config`, we use a style close to standard Lua with some emphasis on compact table definitions and readability

* If an opening brace has no tokens preceding it on the same line, take the first entry in the table and place it on the same line following the brace
* If there are multiple closing braces, combine them onto the same line
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Note that versions since `2.0` use Meson for the build system, although the `Mak

**Ubuntu/Debian users:** the following command ensures you have all the needed packages and headers to compile GLava with the default feature set:
```bash
sudo apt-get install libpulse0 libpulse-dev libxext6 libxext-dev libxrender-dev libxcomposite-dev liblua5.3-dev liblua5.3 lua-lgi lua-filesystem libobs0 libobs-dev meson gcc
sudo apt-get install libpulse0 libpulse-dev libxext6 libxext-dev libxrender-dev libxcomposite-dev liblua5.3-dev liblua5.3 lua-lgi lua-filesystem libobs0 libobs-dev meson build-essential gcc
```

## Installation
Expand Down
79 changes: 49 additions & 30 deletions glava-config/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ local function path_concat(...)
return table.concat(ret, "/")
end

-- Wrap table such that it can be called to index and call its members,
-- useful for switch-style syntax
local function switch(tbl)
local mt = { __call = function(self, i) return rawget(self, i)() end }
return setmetatable(tbl, mt)
end

-- To parse data from GLSL configs we use some complex pattern matching.
--
-- Because Lua's patterns operate on a per-character basis and do not offer
Expand All @@ -41,6 +48,20 @@ end
--
-- This effectively means we have some fairly powerful parsing which allows us
-- to handle things like quoted strings with escaped characters.
local function unquote(match)
local ret = {}
local escaped = false
for c in match:gmatch(".") do
if c == "\"" then
if escaped then ret[#ret + 1] = c end
elseif c ~= "\\" then ret[#ret + 1] = c end
if c == "\\" then
if escaped then ret[#ret + 1] = c end
escaped = not escaped
else escaped = false end
end
return table.concat(ret, "")
end
local function none(...) return ... end
local MATCH_ENTRY_PATTERN = "^%s*%#(%a+)%s+(%a+)"
local MATCH_DATA_PREFIX = "^%s*%#%a+%s+%a+"
Expand All @@ -49,29 +70,25 @@ local MATCH_TYPES = {
pattern = "(%d+.?%d*)",
cast = tonumber,
serialize = tostring
},
["int"] = {
}, ["int"] = {
pattern = "(%d+)",
cast = tonumber,
serialize = function(x) tostring(math.floor(x)) end
},
["string"] = {
}, ["color-expr"] = {
pattern = "(.+)",
cast = none,
serialize = none
}, ["expr"] = {
pattern = "(.+)",
cast = none,
serialize = none
}, ["ident"] = {
pattern = "(%w+)",
cast = none,
serialize = none
}, ["string"] = {
pattern = "(.+)",
-- Strip away string quotation and escape syntax
cast = function(match)
local ret = {}
local escaped = false
for c in match:gmatch(".") do
if c == "\"" then
if escaped then ret[#ret + 1] = c end
elseif c ~= "\\" then ret[#ret + 1] = c end
if c == "\\" then
if escaped then ret[#ret + 1] = c end
escaped = not escaped
else escaped = false end
end
return table.concat(ret, "")
end,
cast = unquote,
-- Read-ahead function to generate a fixed-width pattern
-- to match the next (possibly quoted) string
transform = function(match)
Expand Down Expand Up @@ -134,7 +151,8 @@ local MATCH_TYPES = {
config.path_concat = path_concat
config.path_split = path_split

local function create_p(parts, mode, silent)
local function create_pf(arr, mode, silent)
local parts = {}
local function errfmt(err)
return string.format("Failed to create '%s' in '%s': %s",
path_concat(parts, "/"), path_concat(arr, "/"), err)
Expand All @@ -147,16 +165,17 @@ local function create_p(parts, mode, silent)
local m = (i == #arr and mode or "directory")
local attr, err = lfs.attributes(path, "mode")
if attr == nil then
({
file = function()
local ret, err = lfs.touch(path)
if ret ~= true then return false, errfmt(err) end
end,
directory = function()
local ret, err = lfs.mkdir(path)
if ret ~= true then return false, errfmt(err) end
end,
})[m]()
local ret, err = switch {
file = function()
local ret, err = lfs.touch(path)
if not ret then return false, errfmt(err) end
end,
directory = function()
local ret, err = lfs.mkdir(path)
if not ret then return false, errfmt(err) end
end,
}(m)
if ret == false then return ret, err end
elseif attr ~= m then
if not (silent and #parts == #arr) then
return false, string.format("'%s' is not a %s", path, m)
Expand Down
2 changes: 1 addition & 1 deletion glava-config/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ function main.entry(prog, ...)
end

local mappings = require "glava-config.mappings"
-- Associate `map_name = tbl` from mapping list for future lookups
-- Associate `map_name = tbl` from mapping list for future lookups, etc.
for k, v in pairs(mappings) do
local i = 1
local adv = false
Expand Down
13 changes: 10 additions & 3 deletions glava-config/window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ return function()
end

-- Generators for producing widgets (and their layouts) that bind to configuration values
-- note: `get_data` returns _formatted_ data, such that it can be written directly in GLSL
local widget_generators
widget_generators = {
-- A switch to represent a true/false value
Expand Down Expand Up @@ -286,7 +287,7 @@ return function()
s.internal:get_style_context():add_provider(cssp, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
s.internal:get_style_context():add_class("fixed-width-font-entry")
end
if not attrs.entries then
if not attrs.entries and not attrs._ignore_restrict then
-- Handle idenifier formatting for entries without a preset list
function s.internal:on_changed()
local i = s.internal.text
Expand All @@ -298,6 +299,13 @@ return function()
end
return s
end,
-- A full GLSL expression
["expr"] = function(attrs)
-- Expressions can be implemented by using the identity field and disabling
-- input format restrictions.
attrs._ignore_restrict = true
return widget_generators.ident(attrs)
end,
-- Adjustable and bound floating-point value
["float"] = function(attrs)
local widget = Gtk.SpinButton {
Expand Down Expand Up @@ -487,8 +495,7 @@ return function()
upper = 1000,
lower = -1000,
header = "Scale:"
}
},
} },
-- match against GLSL mix expression, ie.
-- `mix(#3366b2, #a0a0b2, clamp(d / GRADIENT, 0, 1))`
match = "mix%s*%(" ..
Expand Down
25 changes: 17 additions & 8 deletions glava/glx_wcb.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,17 @@ static Atom ATOM__MOTIF_WM_HINTS, ATOM_WM_DELETE_WINDOW, ATOM_WM_PROTOCOLS, ATOM
static GLXContext sharelist_ctx;
static bool sharelist_assigned = false;

#ifdef __APPLE__
static const char *dl_names[] = {
"../Frameworks/OpenGL.framework/OpenGL",
"/Library/Frameworks/OpenGL.framework/OpenGL",
"/System/Library/Frameworks/OpenGL.framework/OpenGL",
"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"
};
#else
static const char *dl_names[] = {"libGL.so.1", "libGL.so"};
#endif

static bool offscreen(void) {
return sharelist_assigned;
}
Expand All @@ -209,20 +220,18 @@ static void init(void) {
maximized = false;
transparent = false;

void* hgl = dlopen("libGL.so.1", RTLD_LAZY);
void* hglx = dlopen("libGLX.so.0", RTLD_LAZY);
void* hgl = NULL;
for(size_t i = 0; i < (sizeof(dl_names) / sizeof(dl_names[0])) && hgl == NULL; ++i)
hgl = dlopen("libGL.so.1", RTLD_LAZY);

if (!hgl && !hglx) {
if (!hgl) {
fprintf(stderr, "Failed to load GLX functions (libGL and libGLX do not exist!)\n");
glava_abort();
}

/* Depending on the graphics driver, the GLX functions that we need may either be in libGL or
libGLX. */

void* resolve_f(const char* symbol) {
void* s = NULL;
if (hgl) s = dlsym(hgl, symbol);
if (!s && hglx) s = dlsym(hglx, symbol);
if (hgl) s = dlsym(hgl, symbol);
if (!s) {
fprintf(stderr, "Failed to resolve GLX symbol: `%s`\n", symbol);
glava_abort();
Expand Down

0 comments on commit 859bfb0

Please sign in to comment.