introduce support of internal blocks; add internal time and uptime blks

This commit is contained in:
geommer 2016-03-25 15:16:57 +02:00
parent 9909914c06
commit b01d6ee3c6
4 changed files with 142 additions and 45 deletions

View file

@ -92,7 +92,7 @@ static void * ya_exec(void * _blk) {
}
}
else if (blk->attr & BLKA_INTERNAL) {
/*TODO*/
ya_reserved_blks[blk->internal->index].function(blk);
}
/*Shouldn't get here*/
else {

53
src/ya_intern.c Normal file
View file

@ -0,0 +1,53 @@
/*
* Yabar - A modern and lightweight status bar for X window managers.
*
* Copyright (c) 2016, George Badawi
* See LICENSE for more information.
*
*/
#include "yabar.h"
#define YA_INTERNAL
void ya_int_time(ya_block_t * blk);
void ya_int_uptime(ya_block_t * blk);
struct reserved_blk ya_reserved_blks[YA_INTERNAL_LEN] = {
{"YA_INT_TIME", ya_int_time},
{"YA_INT_UPTIME", ya_int_uptime}
};
//#ifdef YA_INTERNAL
#include <time.h>
void ya_int_time(ya_block_t * blk) {
time_t rawtime;
struct tm * ya_tm;
while(1) {
time(&rawtime);
ya_tm = localtime(&rawtime);
strftime(blk->buf, 512, blk->internal->option[0], ya_tm);
ya_draw_pango_text(blk);
sleep(blk->sleep);
}
}
#include <sys/sysinfo.h>
void ya_int_uptime(ya_block_t *blk) {
struct sysinfo ya_sysinfo;
long hr, tmp;
uint8_t min;
while(1) {
sysinfo(&ya_sysinfo);
tmp = ya_sysinfo.uptime;
hr = tmp/3600;
tmp %= 3600;
min = tmp/60;
tmp %= 60;
snprintf(blk->buf, 512, "%ld:%02d:%02ld", hr, min, tmp);
ya_draw_pango_text(blk);
sleep(blk->sleep);
}
}
//#endif //YA_INTERNAL

View file

@ -272,24 +272,75 @@ static void ya_setup_bar(config_setting_t * set) {
ya_create_bar(bar);
}
#define YA_RESERVED_NUM 1
char *ya_reserved_blocks[YA_RESERVED_NUM]={"ya_time"};
//#define YA_INTERNAL_LEN 1
//char *ya_reserved_blocks[YA_INTERNAL_LEN]={"YA_INT_TIME"};
static void ya_setup_block(config_setting_t * set, uint32_t type_init) {
inline static void ya_check_blk_internal(ya_block_t *blk, config_setting_t *set, const char *strexec) {
const char *retstr;
for (int i=0; i < YA_INTERNAL_LEN; i++) {
if(strcmp(strexec, ya_reserved_blks[i].name)==0) {
blk->internal = calloc(1, sizeof(blk_intern_t));
blk->attr |= BLKA_INTERNAL;
blk->internal->index = i;
if(config_setting_lookup_string(set, "internal-prefix", &retstr) == CONFIG_TRUE)
blk->internal->prefix = strdup(retstr);
if(config_setting_lookup_string(set, "internal-suffix", &retstr) == CONFIG_TRUE)
blk->internal->suffix = strdup(retstr);
if(config_setting_lookup_string(set, "internal-option1", &retstr) == CONFIG_TRUE)
blk->internal->option[0] = strdup(retstr);
if(config_setting_lookup_string(set, "internal-option2", &retstr) == CONFIG_TRUE)
blk->internal->option[1] = strdup(retstr);
if(config_setting_lookup_string(set, "internal-option3", &retstr) == CONFIG_TRUE)
blk->internal->option[2] = strdup(retstr);
}
}
//check if the for-loop never found a matching internal block
if ((blk->attr & BLKA_INTERNAL)==0)
blk->attr |= BLKA_EXTERNAL;
}
static void ya_setup_block(config_setting_t * set) {
struct ya_block * blk = calloc(1,sizeof(ya_block_t));
int retcnf, retint;
const char *retstr;
blk->attr = type_init;
blk->pid = -1;
blk->name = strdup(config_setting_name(set));
retcnf = config_setting_lookup_string(set, "inherit", &retstr);
if(retcnf == CONFIG_TRUE) {
ya_inherit_blk(blk, retstr);
}
retcnf = config_setting_lookup_string(set, "exec", &retstr);
if(retcnf == CONFIG_FALSE) {
if(NOT_INHERIT_BLK(blk)) {
fprintf(stderr, "No exec is defined for block: %s.%s. Skipping this block...\n", blk->bar->name, blk->name);
free(blk->name);
free(blk);
return;
}
}
else if(strlen(retstr) < 1) {
fprintf(stderr, "exec entry is empty for block: %s.%s. Skipping this block...\n", blk->bar->name, blk->name);
free(blk->name);
free(blk);
return;
}
else {
ya_check_blk_internal(blk, set, retstr);
if (blk->attr & BLKA_EXTERNAL) {
blk->cmd = strdup(retstr);
}
}
if (blk->attr & BLKA_INTERNAL)
goto skip_type;
retcnf = config_setting_lookup_string(set, "type", &retstr);
if(retcnf == CONFIG_FALSE) {
if(NOT_INHERIT_BLK(blk)) {
fprintf(stderr, "No type is defined for block: %s. Skipping this block...\n", config_setting_name(set));
free(blk->name);
free(blk);
return;
}
@ -303,38 +354,20 @@ static void ya_setup_block(config_setting_t * set, uint32_t type_init) {
}
else if(strcmp(retstr, "periodic")==0) {
blk->attr |= BLKA_PERIODIC;
retcnf = config_setting_lookup_int(set, "interval", &retint);
if(retcnf == CONFIG_FALSE) {
blk->sleep = 5;
}
else {
blk->sleep = retint;
}
}
}
retcnf = config_setting_lookup_string(set, "exec", &retstr);
if(retcnf == CONFIG_FALSE) {
if(NOT_INHERIT_BLK(blk)) {
fprintf(stderr, "No exec is defined for block: %s. Skipping this block...\n", config_setting_name(set));
free(blk);
return;
}
}
else {
int len = strlen(retstr);
if (len) {
blk->cmd = strdup(retstr);
}
else {
fprintf(stderr, "exec is empty for block: %s. Skipping this block...\n", config_setting_name(set));
free(blk);
return;
//TODO handle
}
}
blk->name = strdup(config_setting_name(set));
skip_type:
retcnf = config_setting_lookup_int(set, "interval", &retint);
if(retcnf == CONFIG_FALSE) {
blk->sleep = 5;
}
else {
blk->sleep = retint;
}
retcnf = config_setting_lookup_string(set, "command-button1", &retstr);
if(retcnf == CONFIG_TRUE) {
blk->button_cmd[0] = strdup(retstr);
@ -482,18 +515,9 @@ void ya_config_parse() {
blknum = config_setting_length(blklist_set);
for (int i=0; i < blknum; i++) {
uint32_t type_init = 0;
blkstr = (char *)config_setting_get_string_elem(blklist_set, i);
curblk_set = config_setting_lookup(curbar_set, blkstr);
for(int i=0; i < YA_RESERVED_NUM; i++) {
if(strcmp(blkstr, ya_reserved_blocks[i])==0) {
type_init = BLKA_INTERNAL;
break;
}
}
if(type_init == 0)
type_init = BLKA_EXTERNAL;
ya_setup_block(curblk_set, type_init);
ya_setup_block(curblk_set);
}
}
config_destroy(&ya_conf);

View file

@ -92,8 +92,19 @@ enum {
#define NOT_INHERIT_BLK(blk) (((blk)->attr & BLKA_INHERIT)==0)
#define CMONLEN 16
#define YA_INTERNAL_LEN 2
typedef struct ya_monitor ya_monitor_t;
typedef struct ya_bar ya_bar_t;
typedef struct ya_block ya_block_t;
typedef struct blk_intern blk_intern_t;
typedef void(*funcp)(ya_block_t *);
struct reserved_blk {
char *name;
funcp function;
};
struct ya_monitor {
char name[CMONLEN];
xcb_rectangle_t pos;
@ -101,7 +112,6 @@ struct ya_monitor {
struct ya_monitor *next_mon;
};
typedef struct ya_bar ya_bar_t;
struct ya_block {
char *name;
char buf [BUFSIZE];
@ -129,9 +139,18 @@ struct ya_block {
uint32_t fgcolor; //foreground color
uint32_t ulcolor; //underline color
uint32_t olcolor; //overline color
blk_intern_t *internal;
};
struct blk_intern {
char *prefix;
char *suffix;
char *option[3];
uint8_t index;
};
typedef struct ya_block ya_block_t;
struct ya_bar {
char *name;
@ -189,6 +208,7 @@ typedef struct yabar_gen_info yabar_info_t;
extern yabar_info_t ya;
extern char conf_file[CFILELEN];
extern struct reserved_blk ya_reserved_blks[YA_INTERNAL_LEN];
void ya_init();
void ya_execute();