i3bar: Implement the output option
This commit is contained in:
parent
6de1590e59
commit
15f021b4fc
|
@ -19,6 +19,8 @@ typedef struct config_t {
|
||||||
char *command;
|
char *command;
|
||||||
char *fontname;
|
char *fontname;
|
||||||
char *tray_output;
|
char *tray_output;
|
||||||
|
int num_outputs;
|
||||||
|
char **outputs;
|
||||||
} config_t;
|
} config_t;
|
||||||
|
|
||||||
config_t config;
|
config_t config;
|
||||||
|
|
|
@ -100,8 +100,11 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(cur_key, "outputs")) {
|
if (!strcmp(cur_key, "outputs")) {
|
||||||
printf("+output %.*s\n", len, val);
|
DLOG("+output %.*s\n", len, val);
|
||||||
/* XXX: these are not implemented yet */
|
int new_num_outputs = config.num_outputs + 1;
|
||||||
|
config.outputs = srealloc(config.outputs, sizeof(char*) * new_num_outputs);
|
||||||
|
asprintf(&config.outputs[config.num_outputs], "%.*s", len, val);
|
||||||
|
config.num_outputs = new_num_outputs;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ struct outputs_json_params {
|
||||||
i3_output *outputs_walk;
|
i3_output *outputs_walk;
|
||||||
char *cur_key;
|
char *cur_key;
|
||||||
char *json;
|
char *json;
|
||||||
bool init;
|
bool in_rect;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -171,6 +171,10 @@ static int outputs_start_map_cb(void *params_) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcmp(params->cur_key, "rect")) {
|
||||||
|
params->in_rect = true;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,7 +184,33 @@ static int outputs_start_map_cb(void *params_) {
|
||||||
*/
|
*/
|
||||||
static int outputs_end_map_cb(void *params_) {
|
static int outputs_end_map_cb(void *params_) {
|
||||||
struct outputs_json_params *params = (struct outputs_json_params*) params_;
|
struct outputs_json_params *params = (struct outputs_json_params*) params_;
|
||||||
/* FIXME: What is at the end of a rect? */
|
if (params->in_rect) {
|
||||||
|
params->in_rect = false;
|
||||||
|
/* Ignore the end of a rect */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See if we actually handle that output */
|
||||||
|
if (config.num_outputs > 0) {
|
||||||
|
bool handle_output = false;
|
||||||
|
for (int c = 0; c < config.num_outputs; c++) {
|
||||||
|
if (strcasecmp(params->outputs_walk->name, config.outputs[c]) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
handle_output = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!handle_output) {
|
||||||
|
DLOG("Ignoring output \"%s\", not configured to handle it.\n",
|
||||||
|
params->outputs_walk->name);
|
||||||
|
FREE(params->outputs_walk->name);
|
||||||
|
FREE(params->outputs_walk->workspaces);
|
||||||
|
FREE(params->outputs_walk->trayclients);
|
||||||
|
FREE(params->outputs_walk);
|
||||||
|
FREE(params->cur_key);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
i3_output *target = get_output_by_name(params->outputs_walk->name);
|
i3_output *target = get_output_by_name(params->outputs_walk->name);
|
||||||
|
|
||||||
|
@ -249,6 +279,7 @@ void parse_outputs_json(char *json) {
|
||||||
params.outputs_walk = NULL;
|
params.outputs_walk = NULL;
|
||||||
params.cur_key = NULL;
|
params.cur_key = NULL;
|
||||||
params.json = json;
|
params.json = json;
|
||||||
|
params.in_rect = false;
|
||||||
|
|
||||||
yajl_handle handle;
|
yajl_handle handle;
|
||||||
yajl_status state;
|
yajl_status state;
|
||||||
|
|
|
@ -144,11 +144,14 @@ static int workspaces_string_cb(void *params_, const unsigned char *val, unsigne
|
||||||
output_name = smalloc(sizeof(const unsigned char) * (len + 1));
|
output_name = smalloc(sizeof(const unsigned char) * (len + 1));
|
||||||
strncpy(output_name, (const char*) val, len);
|
strncpy(output_name, (const char*) val, len);
|
||||||
output_name[len] = '\0';
|
output_name[len] = '\0';
|
||||||
params->workspaces_walk->output = get_output_by_name(output_name);
|
i3_output *target = get_output_by_name(output_name);
|
||||||
|
if (target) {
|
||||||
|
params->workspaces_walk->output = target;
|
||||||
|
|
||||||
TAILQ_INSERT_TAIL(params->workspaces_walk->output->workspaces,
|
TAILQ_INSERT_TAIL(params->workspaces_walk->output->workspaces,
|
||||||
params->workspaces_walk,
|
params->workspaces_walk,
|
||||||
tailq);
|
tailq);
|
||||||
|
}
|
||||||
|
|
||||||
FREE(output_name);
|
FREE(output_name);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue