История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
Если я правильно понял то вот
- нажми
R
- перезагрузить конфигурацию и применить её к программе - нажми
T
- автоматически следить за конфигурацией и при изменении файла конфигурации перезагрузить файл конфигурации и применить к программе - нажми
Q
- выход
Код говно, но суть думаю понятна.
my_config.txt лежит в том же каталоге что и программа
window_x = 550
window_y = 550
window_name = lalala
программа
#include <SDL2/SDL.h>
#include <stdio.h>
#include <sys/stat.h>
typedef struct
{
SDL_Window *window;
int window_x;
int window_y;
char * window_name;
}my_config;
my_config default_config = {NULL,500,500,"Default window name"};
void load_config(const char * filename, my_config * conf)
{
FILE * config = fopen(filename,"r");
fseek(config,0,SEEK_END);
size_t filesize = ftell(config);
fseek(config,0,SEEK_SET);
while(ftell(config) != filesize)
{
char name[512];
char vale[512];
fscanf(config, "%64s = %64s", name, vale);
if(strcmp(name,"window_x") == 0)
{
conf->window_x = atoi(vale);
}
if(strcmp(name,"window_y") == 0)
{
conf->window_y = atoi(vale);
}
if(strcmp(name,"window_name") == 0)
{
if(conf->window_name != NULL)
{
free(conf->window_name);
}
char *str = malloc(strlen(vale)+1);
sprintf(str,"%s",vale);
conf->window_name = str;
}
}
fclose(config);
};
int check_config(const char * filename)
{
static long long old_time = 0;
struct stat current_state;
FILE * file = fopen(filename,"rb");
if(!file)
{
printf("LOL\n");
}
int err = fstat(fileno(file), ¤t_state);
printf("%lld %zu\n",old_time,current_state.st_mtime);
fclose(file);
if(current_state.st_mtime > old_time)
{
old_time = current_state.st_mtime;
return 1;
}
return 0;
}
void update_my_game(my_config * config)
{
SDL_SetWindowTitle(config->window,config->window_name);
SDL_SetWindowSize(config->window,config->window_x,config->window_y);
}
int main(int argc, char* argv[])
{
my_config config ;
int running = 1;
int auto_update = 0;
int t1 = 0;
SDL_Init(SDL_INIT_EVERYTHING);
config.window = SDL_CreateWindow(
default_config.window_name,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
default_config.window_x,
default_config.window_y,
SDL_WINDOW_OPENGL);
SDL_Event event;
while(running)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_KEYDOWN)
{
const Uint8 *state = SDL_GetKeyboardState(NULL);
if (state[SDL_SCANCODE_R])
{
printf("Reload config & Update configuration KEK \n");
load_config("my_config.txt",&config);
update_my_game(&config);
}
if (state[SDL_SCANCODE_T])
{
printf("ENABLED AUTO Reload config & ENABLED AUTO Update configuration LUL \n");
auto_update = 1;
}
if (state[SDL_SCANCODE_Q])
{
running = 0;
}
}
}
int t2 = SDL_GetTicks();
if(auto_update && t2 > t1)
{
t1 = t2 + 1000;
int updated = check_config("my_config.txt");
if(updated)
{
printf("Auto Update\n");
load_config("my_config.txt",&config);
update_my_game(&config);
}
}
}
if (config.window == NULL) {
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
SDL_DestroyWindow(config.window);
SDL_Quit();
return 0;
}
gcc main.c `pkg-config --libs sdl2` && ./a.out
Вместо простейшего конфига что я привёл можно взять libconfig или ещё что получше или ini какой.
Исправление LINUX-ORG-RU, :
Если я правильно понял то вот
- нажми
R
- перезагрузить конфигурацию и применить её к программе - нажми
T
- автоматически следить за конфигурацией и при изменении файла конфигурации перезагрузить файл конфигурации и применить к программе - нажми
Q
- выход
Код говно, но суть думаю понятна.
my_config.txt лежит в том же каталоге что и программа
window_x = 550
window_y = 550
window_name = lalala
программа
#include <SDL2/SDL.h>
#include <stdio.h>
#include <sys/stat.h>
typedef struct
{
SDL_Window *window;
int window_x;
int window_y;
char * window_name;
}my_config;
my_config default_config = {NULL,500,500,"Default window name"};
void load_config(const char * filename, my_config * conf)
{
FILE * config = fopen(filename,"r");
fseek(config,0,SEEK_END);
size_t filesize = ftell(config);
fseek(config,0,SEEK_SET);
while(ftell(config) != filesize)
{
char name[512];
char vale[512];
fscanf(config, "%64s = %64s", name, vale);
if(strcmp(name,"window_x") == 0)
{
conf->window_x = atoi(vale);
}
if(strcmp(name,"window_y") == 0)
{
conf->window_y = atoi(vale);
}
if(strcmp(name,"window_name") == 0)
{
if(conf->window_name != NULL)
{
free(conf->window_name);
}
char *str = malloc(strlen(vale)+1);
sprintf(str,"%s",vale);
conf->window_name = str;
}
}
fclose(config);
};
int check_config(const char * filename)
{
static long long old_time = 0;
struct stat current_state;
FILE * file = fopen(filename,"rb");
if(!file)
{
printf("LOL\n");
}
int err = fstat(fileno(file), ¤t_state);
printf("%lld %zu\n",old_time,current_state.st_mtime);
fclose(file);
if(current_state.st_mtime > old_time)
{
old_time = current_state.st_mtime;
return 1;
}
return 0;
}
void update_my_game(my_config * config)
{
SDL_SetWindowTitle(config->window,config->window_name);
SDL_SetWindowSize(config->window,config->window_x,config->window_y);
}
int main(int argc, char* argv[])
{
my_config config ;
int running = 1;
int auto_update = 0;
int t1 = 0;
SDL_Init(SDL_INIT_EVERYTHING);
config.window = SDL_CreateWindow(
default_config.window_name,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
default_config.window_x,
default_config.window_y,
SDL_WINDOW_OPENGL);
SDL_Event event;
while(running)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_KEYDOWN)
{
const Uint8 *state = SDL_GetKeyboardState(NULL);
if (state[SDL_SCANCODE_R])
{
printf("Reload config & Update configuration KEK \n");
load_config("my_config.txt",&config);
update_my_game(&config);
}
if (state[SDL_SCANCODE_T])
{
printf("ENABLED AUTO Reload config & ENABLED AUTO Update configuration LUL \n");
auto_update = 1;
}
if (state[SDL_SCANCODE_Q])
{
running = 0;
}
}
}
int t2 = SDL_GetTicks();
if(auto_update && t2 > t1)
{
t1 = t2 + 1000;
int updated = check_config("my_config.txt");
if(updated)
{
printf("Auto Update\n");
load_config("my_config.txt",&config);
update_my_game(&config);
}
}
}
if (config.window == NULL) {
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
SDL_DestroyWindow(config.window);
SDL_Quit();
return 0;
}
gcc main.c `pkg-config --libs sdl2` && ./a.out
Исходная версия LINUX-ORG-RU, :
Если я правильно понял то вот
- нажми
R
- перезагрузить конфигурацию и применить её к программе - нажми
T
- автоматически следить за конфигурацией и при изменении файла конфигурации перезагрузить файл конфигурации и применить к программе - нажми
Q
- выход
Код говно, но суть думаю понятна.
my_config.txt лежит в том же каталоге что и программа
window_x = 550
window_y = 550
window_name = lalala
программа
#include <SDL2/SDL.h>
#include <stdio.h>
#include <sys/stat.h>
typedef struct
{
SDL_Window *window;
int window_x;
int window_y;
char * window_name;
}my_config;
my_config default_config = {NULL,500,500,"Default window name"};
void load_config(const char * filename, my_config * conf)
{
FILE * config = fopen(filename,"r");
fseek(config,0,SEEK_END);
size_t filesize = ftell(config);
fseek(config,0,SEEK_SET);
while(ftell(config) != filesize)
{
char name[512];
char vale[512];
fscanf(config, "%64s = %64s", name, vale);
if(strcmp(name,"window_x") == 0)
{
conf->window_x = atoi(vale);
}
if(strcmp(name,"window_y") == 0)
{
conf->window_y = atoi(vale);
}
if(strcmp(name,"window_name") == 0)
{
if(conf->window_name != NULL)
{
free(conf->window_name);
}
char *str = malloc(strlen(vale)+1);
sprintf(str,"%s",vale);
conf->window_name = str;
}
}
fclose(config);
};
int check_config(const char * filename)
{
static long long old_time = 0;
struct stat current_state;
FILE * file = fopen(filename,"rb");
if(!file)
{
printf("LOL\n");
}
int err = fstat(fileno(file), ¤t_state);
printf("%lld %zu\n",old_time,current_state.st_mtime);
fclose(file);
if(current_state.st_mtime > old_time)
{
old_time = current_state.st_mtime;
return 1;
}
return 0;
}
void update_my_game(my_config * config)
{
SDL_SetWindowTitle(config->window,config->window_name);
SDL_SetWindowSize(config->window,config->window_x,config->window_y);
}
int main(int argc, char* argv[])
{
my_config config ;
int running = 1;
int auto_update = 0;
int t1 = 0;
SDL_Init(SDL_INIT_EVERYTHING);
config.window = SDL_CreateWindow(
default_config.window_name,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
default_config.window_x,
default_config.window_y,
SDL_WINDOW_OPENGL);
SDL_Event event;
while(running)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_KEYDOWN)
{
const Uint8 *state = SDL_GetKeyboardState(NULL);
if (state[SDL_SCANCODE_R])
{
printf("Reload config & Update configuration KEK \n");
load_config("my_config.txt",&config);
update_my_game(&config);
}
if (state[SDL_SCANCODE_T])
{
printf("ENABLED AUTO Reload config & ENABLED AUTO Update configuration LUL \n");
auto_update = 1;
}
if (state[SDL_SCANCODE_Q])
{
running = 0;
}
}
}
int t2 = SDL_GetTicks();
if(auto_update && t2 > t1)
{
t1 = t2 + 1000;
int updated = check_config("my_config.txt");
if(updated)
{
printf("Auto Update\n");
load_config("my_config.txt",&config);
update_my_game(&config);
}
}
}
if (config.window == NULL) {
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
SDL_DestroyWindow(config.window);
SDL_Quit();
return 0;
}
gcc main.c pkg-config --libs sdl2
&& ./a.out