added options for window position, size and class
This commit is contained in:
4
glava.c
4
glava.c
@@ -9,12 +9,12 @@
|
||||
#include "fifo.h"
|
||||
#include "pulse_input.h"
|
||||
#include "render.h"
|
||||
#include "xwincheck.h"
|
||||
#include "xwin.h"
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
const char* audio_source = argc >= 2 ? argv[1] : NULL; //TODO: change
|
||||
|
||||
renderer* r = rd_new(0, 0, 400, 500, "shaders");
|
||||
renderer* r = rd_new("shaders");
|
||||
|
||||
float b0[r->bufsize_request], b1[r->bufsize_request];
|
||||
size_t t;
|
||||
|
||||
79
render.c
79
render.c
@@ -17,6 +17,7 @@
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#include "render.h"
|
||||
#include "xwin.h"
|
||||
#include "glsl_ext.h"
|
||||
|
||||
#define TWOPI 6.28318530718
|
||||
@@ -358,10 +359,11 @@ struct gl_data {
|
||||
int rate; /* framerate */
|
||||
double tcounter;
|
||||
int fcounter, ucounter, kcounter;
|
||||
bool print_fps, avg_window, interpolate;
|
||||
bool print_fps, avg_window, interpolate, force_geometry;
|
||||
void** t_data;
|
||||
float gravity_step, target_spu, fr, ur;
|
||||
float* interpolate_buf[6];
|
||||
int geometry[4];
|
||||
};
|
||||
|
||||
#ifdef GLAD_DEBUG
|
||||
@@ -588,7 +590,7 @@ static struct gl_bind_src* lookup_bind_src(const char* str) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
struct renderer* rd_new(const char* data) {
|
||||
|
||||
renderer* r = malloc(sizeof(struct renderer));
|
||||
*r = (struct renderer) {
|
||||
@@ -601,20 +603,21 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
|
||||
struct gl_data* gl = r->gl;
|
||||
*gl = (struct gl_data) {
|
||||
.stages = NULL,
|
||||
.rate = 0,
|
||||
.tcounter = 0.0D,
|
||||
.fcounter = 0,
|
||||
.ucounter = 0,
|
||||
.kcounter = 0,
|
||||
.fr = 1.0F,
|
||||
.ur = 1.0F,
|
||||
.print_fps = true,
|
||||
.bufscale = 1,
|
||||
.avg_frames = 4,
|
||||
.avg_window = true,
|
||||
.gravity_step = 0.1,
|
||||
.interpolate = true,
|
||||
.stages = NULL,
|
||||
.rate = 0,
|
||||
.tcounter = 0.0D,
|
||||
.fcounter = 0,
|
||||
.ucounter = 0,
|
||||
.kcounter = 0,
|
||||
.fr = 1.0F,
|
||||
.ur = 1.0F,
|
||||
.print_fps = true,
|
||||
.bufscale = 1,
|
||||
.avg_frames = 4,
|
||||
.avg_window = true,
|
||||
.gravity_step = 0.1,
|
||||
.interpolate = true,
|
||||
.force_geometry = false
|
||||
};
|
||||
|
||||
#ifdef GLAD_DEBUG
|
||||
@@ -643,7 +646,7 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
" (GLFW_TRANSPARENT[_FRAMEBUFFER])!\n");
|
||||
#endif
|
||||
|
||||
if (!(gl->w = glfwCreateWindow(w, h, "GLava", NULL, NULL))) {
|
||||
if (!(gl->w = glfwCreateWindow(500, 400, "GLava", NULL, NULL))) {
|
||||
glfwTerminate();
|
||||
abort();
|
||||
}
|
||||
@@ -665,7 +668,7 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
|
||||
|
||||
int shader_version = 330;
|
||||
char* module = NULL;
|
||||
char* module = NULL, * xwintype = NULL;
|
||||
bool loading_module = true;
|
||||
struct gl_sfbo* current = NULL;
|
||||
size_t t_count = 0;
|
||||
@@ -702,6 +705,21 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, *(int*) args[1]);
|
||||
})
|
||||
},
|
||||
{
|
||||
.name = "setgeometry", .fmt = "iiii",
|
||||
.handler = RHANDLER(name, args, {
|
||||
gl->geometry[0] = *(int*) args[0];
|
||||
gl->geometry[1] = *(int*) args[1];
|
||||
gl->geometry[2] = *(int*) args[2];
|
||||
gl->geometry[3] = *(int*) args[3];
|
||||
glfwSetWindowPos(gl->w, gl->geometry[0], gl->geometry[1]);
|
||||
glfwSetWindowSize(gl->w, gl->geometry[2], gl->geometry[3]);
|
||||
})
|
||||
},
|
||||
{ .name = "setforcegeometry", .fmt = "b",
|
||||
.handler = RHANDLER(name, args, { gl->force_geometry = *(bool*) args[0]; }) },
|
||||
{ .name = "setxwintype", .fmt = "s",
|
||||
.handler = RHANDLER(name, args, { xwintype = strdup((char*) args[0]); }) },
|
||||
{ .name = "setshaderversion", .fmt = "i",
|
||||
.handler = RHANDLER(name, args, { shader_version = *(int*) args[0]; }) },
|
||||
{ .name = "setswap", .fmt = "i",
|
||||
@@ -727,7 +745,7 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
{ .name = "setgravitystep", .fmt = "f",
|
||||
.handler = RHANDLER(name, args, { gl->gravity_step = *(float*) args[0]; }) },
|
||||
{ .name = "setinterpolate", .fmt = "b",
|
||||
.handler = RHANDLER(name, args, { gl->interpolate = *(bool*) args[0]; }) },
|
||||
.handler = RHANDLER(name, args, { gl->interpolate = *(bool*) args[0]; }) },
|
||||
{
|
||||
.name = "transform", .fmt = "ss",
|
||||
.handler = RHANDLER(name, args, {
|
||||
@@ -829,9 +847,9 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
.cd = data,
|
||||
.handlers = handlers
|
||||
};
|
||||
|
||||
|
||||
ext_process(&ext, se_buf);
|
||||
|
||||
|
||||
munmap((void*) map, st.st_size);
|
||||
}
|
||||
|
||||
@@ -920,8 +938,11 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
|
||||
/* Only setup a framebuffer and texture if this isn't the final step,
|
||||
as it can rendered directly */
|
||||
if (idx != count)
|
||||
if (idx != count) {
|
||||
int w, h;
|
||||
glfwGetFramebufferSize(gl->w, &w, &h);
|
||||
setup_sfbo(&stages[idx - 1], w, h);
|
||||
}
|
||||
|
||||
glUseProgram(id);
|
||||
|
||||
@@ -976,6 +997,11 @@ struct renderer* rd_new(int x, int y, int w, int h, const char* data) {
|
||||
|
||||
glfwShowWindow(gl->w);
|
||||
|
||||
if (xwintype) {
|
||||
xwin_settype(r, xwintype);
|
||||
free(xwintype);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1190,13 +1216,22 @@ void rd_update(struct renderer* r, float* lb, float* rb, size_t bsz, bool modifi
|
||||
gl->tcounter = 0; /* reset timer */
|
||||
gl->fcounter = 0; /* reset frame counter */
|
||||
gl->ucounter = 0; /* reset update counter */
|
||||
|
||||
/* Refresh window position and size if we are forcing it */
|
||||
if (gl->force_geometry) {
|
||||
glfwSetWindowPos(gl->w, gl->geometry[0], gl->geometry[1]);
|
||||
glfwSetWindowSize(gl->w, gl->geometry[2], gl->geometry[3]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Restore interpolation settings */
|
||||
gl->interpolate = old_interpolate;
|
||||
}
|
||||
|
||||
void* rd_get_impl_window(struct renderer* r) { return r->gl->w; }
|
||||
|
||||
void rd_destroy(struct renderer* r) {
|
||||
/* TODO: delete everything else, not really needed though (as the application exits after here) */
|
||||
glfwTerminate();
|
||||
free(r->gl);
|
||||
free(r);
|
||||
|
||||
3
render.h
3
render.h
@@ -7,7 +7,8 @@ typedef struct renderer {
|
||||
struct gl_data* gl;
|
||||
} renderer;
|
||||
|
||||
struct renderer* rd_new(int x, int y, int w, int h, const char* shader_path);
|
||||
struct renderer* rd_new(const char* shader_path);
|
||||
void rd_update(struct renderer*, float* lb, float* rb, size_t bsz, bool modified);
|
||||
void rd_destroy(struct renderer*);
|
||||
void rd_time(struct renderer*);
|
||||
void* rd_get_impl_window(struct renderer*);
|
||||
|
||||
@@ -17,13 +17,34 @@
|
||||
|
||||
/* GLFW window hints */
|
||||
#request setfloating true
|
||||
#request setdecorated true
|
||||
#request setdecorated false
|
||||
#request setfocused true
|
||||
#request setmaximized false
|
||||
|
||||
/* GLFW window title */
|
||||
#request settitle "GLava"
|
||||
|
||||
/* GLFW window geometry (x, y, width, height) */
|
||||
#request setgeometry 0 0 400 600
|
||||
|
||||
/* Force GLFW window geometry (locking the window in place), useful
|
||||
for some pesky WMs that try to reposition the window when
|
||||
embedding in the desktop. */
|
||||
#request setforcegeometry false
|
||||
|
||||
/* (X11 only) EWMH Window type. Possible values are:
|
||||
|
||||
"desktop", "dock", "toolbar", "menu",
|
||||
"utility", "splash", "dialog", "normal"
|
||||
|
||||
This will set _NET_WM_WINDOW_TYPE to _NET_WM_WINDOW_TYPE_(TYPE),
|
||||
where (TYPE) is the one of the window types listed (after being
|
||||
converted to uppercase). More information can be found at:
|
||||
|
||||
https://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130317606816
|
||||
*/
|
||||
#request setxwintype "normal"
|
||||
|
||||
/* GLFW buffer swap interval (vsync), set to '0' to prevent
|
||||
waiting for refresh, '1' (or more) to wait for the specified
|
||||
amount of frames. */
|
||||
|
||||
32
xwin.c
32
xwin.c
@@ -1,13 +1,21 @@
|
||||
/* X11 specific code and features */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
|
||||
#include "xwincheck.h"
|
||||
#define GLFW_EXPOSE_NATIVE_X11
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <GLFW/glfw3native.h>
|
||||
|
||||
#include "render.h"
|
||||
#include "xwin.h"
|
||||
|
||||
bool xwin_should_render(void) {
|
||||
bool ret = true;
|
||||
@@ -47,3 +55,25 @@ bool xwin_should_render(void) {
|
||||
XCloseDisplay(d);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Set window types defined by the EWMH standard, possible values:
|
||||
-> "desktop", "dock", "toolbar", "menu", "utility", "splash", "dialog", "normal" */
|
||||
void xwin_settype(struct renderer* rd, const char* type) {
|
||||
Window w = glfwGetX11Window((GLFWwindow*) rd_get_impl_window(rd));
|
||||
Display* d = XOpenDisplay(0);
|
||||
Atom wtype = XInternAtom(d, "_NET_WM_WINDOW_TYPE", false);
|
||||
size_t len = strlen(type), t;
|
||||
char formatted[len + 1];
|
||||
for (t = 0; t < len + 1; ++t) {
|
||||
char c = type[t];
|
||||
switch (c) {
|
||||
case 'a' ... 'z': c -= 'a' - 'A';
|
||||
default: formatted[t] = c;
|
||||
}
|
||||
}
|
||||
char buf[256];
|
||||
snprintf(buf, sizeof(buf), "_NET_WM_WINDOW_TYPE_%s", formatted);
|
||||
Atom desk = XInternAtom(d, buf, false);
|
||||
XChangeProperty(d, w, wtype, XA_ATOM, 32, PropModeReplace, (unsigned char*) &desk, 1);
|
||||
XCloseDisplay(d);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user