Set the inotify fd to non-blocking and read file changes
This commit is contained in:
parent
1d6319e928
commit
2b683cb169
2 changed files with 20 additions and 1 deletions
|
@ -2,6 +2,7 @@
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
|
@ -25,6 +26,8 @@ int main(int argc, char *argv[]) {
|
||||||
perror("inotify_init");
|
perror("inotify_init");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
/* Set the inotify file descriptor to be non-blocking */
|
||||||
|
fcntl(state.inotify_fd, F_SETFL, O_NONBLOCK);
|
||||||
|
|
||||||
state.screen_shader.filename = argv[1];
|
state.screen_shader.filename = argv[1];
|
||||||
state.screen_shader.wd =
|
state.screen_shader.wd =
|
||||||
|
|
|
@ -1,14 +1,18 @@
|
||||||
#include <FreeImage.h>
|
#include <FreeImage.h>
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <sys/inotify.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
#include "shaders.h"
|
#include "shaders.h"
|
||||||
|
|
||||||
#define UNUSED(a) (void)a
|
#define UNUSED(a) (void)a
|
||||||
|
#define BUF_LEN (10 * (sizeof(struct inotify_event) + 1))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize GLFW and OpenGL, and create a window.
|
* @brief Initialize GLFW and OpenGL, and create a window.
|
||||||
|
@ -189,10 +193,22 @@ void capture_screenshot() {
|
||||||
* @param state The current state of the renderer.
|
* @param state The current state of the renderer.
|
||||||
*/
|
*/
|
||||||
void process_input(struct renderer_state *state) {
|
void process_input(struct renderer_state *state) {
|
||||||
|
bool should_reload = false;
|
||||||
|
char buf[BUF_LEN] = {0};
|
||||||
|
int num_read = read(state->inotify_fd, buf, BUF_LEN);
|
||||||
|
if (num_read == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
|
||||||
|
// No event, do nothing
|
||||||
|
} else if (num_read <= 0) {
|
||||||
|
log_error("Could not read inotify state");
|
||||||
|
} else {
|
||||||
|
should_reload = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (glfwGetKey(state->window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
if (glfwGetKey(state->window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
||||||
log_debug("Quitting");
|
log_debug("Quitting");
|
||||||
glfwSetWindowShouldClose(state->window, true);
|
glfwSetWindowShouldClose(state->window, true);
|
||||||
} else if (glfwGetKey(state->window, GLFW_KEY_R) == GLFW_PRESS) {
|
} else if (should_reload ||
|
||||||
|
glfwGetKey(state->window, GLFW_KEY_R) == GLFW_PRESS) {
|
||||||
// reinitialize time and frame count
|
// reinitialize time and frame count
|
||||||
state->frame_count = 0;
|
state->frame_count = 0;
|
||||||
state->prev_frame_count = 0;
|
state->prev_frame_count = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue