added options for window position, size and class

This commit is contained in:
Jarcode
2017-11-30 21:02:34 -08:00
parent 2a7d41cf2a
commit 93fa812aa0
6 changed files with 115 additions and 27 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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*);

View File

@@ -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
View File

@@ -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);
}

1
xwin.h
View File

@@ -1,2 +1,3 @@
bool xwin_should_render(void);
void xwin_settype(struct renderer* rd, const char* type);