Add logging and new windows into layout tree

This commit is contained in:
Drew DeVault 2015-08-08 17:01:22 -04:00
parent 2786fa2215
commit 0427fddb5a
7 changed files with 150 additions and 10 deletions

View file

@ -5,11 +5,12 @@
#include <string.h>
#include <ctype.h>
#include "stringop.h"
#include "log.h"
#include "commands.h"
int cmd_set(struct sway_config *config, int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Invalid set command (expected 2 arguments, got %d)\n", argc);
sway_log(L_ERROR, "Invalid set command (expected 2 arguments, got %d)", argc);
return 1;
}
struct sway_variable *var = malloc(sizeof(struct sway_variable));
@ -23,7 +24,7 @@ int cmd_set(struct sway_config *config, int argc, char **argv) {
int cmd_bindsym(struct sway_config *config, int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "Invalid bindsym command (expected 2 arguments, got %d)\n", argc);
sway_log(L_ERROR, "Invalid set command (expected 2 arguments, got %d)", argc);
return 1;
}
argv[0] = do_var_replacement(config, argv[0]);
@ -39,7 +40,7 @@ int cmd_bindsym(struct sway_config *config, int argc, char **argv) {
// TODO: Parse modifier keys
xkb_keysym_t sym = xkb_keysym_from_name(split->items[i], XKB_KEYSYM_CASE_INSENSITIVE);
if (!sym) {
fprintf(stderr, "bindsym - unknown key '%s'\n", (char *)split->items[i]);
sway_log(L_ERROR, "bindsym - unknown key %s", (char *)split->items[i]);
// Ignore for now, we need to deal with modifier keys
// return 1;
}
@ -52,7 +53,7 @@ int cmd_bindsym(struct sway_config *config, int argc, char **argv) {
// TODO: Check if there are other commands with this key binding
list_add(config->current_mode->bindings, binding);
fprintf(stderr, "bindsym - Bound %s to command %s\n", argv[0], binding->command);
sway_log(L_DEBUG, "bindsym - Bound %s to command %s", argv[0], binding->command);
return 0;
}
@ -139,7 +140,7 @@ int handle_command(struct sway_config *config, char *exec) {
}
struct cmd_handler *handler = find_handler(handlers, sizeof(handlers) / sizeof(struct cmd_handler), cmd);
if (handler == NULL) {
fprintf(stderr, "Unknown command '%s'\n", cmd);
sway_log(L_ERROR, "Unknown command '%s'", cmd);
return 0; // TODO: return error, probably
}
int argc;

View file

@ -17,18 +17,17 @@ void handle_output_resolution_change(wlc_handle output, const struct wlc_size *f
}
bool handle_view_created(wlc_handle view) {
printf("View created, focusing");
wlc_view_focus(view);
wlc_view_bring_to_front(view);
add_view(view);
return true;
}
void handle_view_destroyed(wlc_handle view) {
printf("View destroyed");
wlc_view_focus(get_topmost(wlc_view_get_output(view), 0));
destroy_view(view);
return true;
}
void handle_view_focus(wlc_handle view, bool focus) {
printf("View focused\n");
wlc_view_set_state(view, WLC_BIT_ACTIVATED, focus);
focused_view = view;
}

View file

@ -2,12 +2,18 @@
#include <stdbool.h>
#include <wlc/wlc.h>
#include "list.h"
#include "log.h"
#include "layout.h"
list_t *outputs;
wlc_handle focused_view;
void arrange_windows() {
}
void init_layout() {
outputs = create_list();
focused_view = -1;
}
struct sway_container *get_container(wlc_handle output, int *index) {
@ -21,6 +27,74 @@ struct sway_container *get_container(wlc_handle output, int *index) {
return NULL;
}
struct sway_container *get_container_for_view_recurse(wlc_handle handle, int *index, struct sway_container *parent) {
int j;
for (j = 0; j < parent->children->length; ++j) {
struct sway_container *child = parent->children->items[j];
if (child->layout == LAYOUT_IS_VIEW) {
if (child->output == handle) {
*index = j;
return parent;
}
} else {
struct sway_container *res;
if ((res = get_container_for_view_recurse(handle, index, child))) {
return res;
}
}
}
return NULL;
}
struct sway_container *get_container_for_view(wlc_handle handle, int *index) {
int i;
for (i = 0; i < outputs->length; ++i) {
struct sway_container *c = outputs->items[i];
struct sway_container *res;
if ((res = get_container_for_view_recurse(handle, index, c))) {
return res;
}
}
return NULL;
}
void add_view(wlc_handle view_handle) {
struct sway_container *container;
int _;
if (focused_view == -1) { // Add it to the output container
sway_log(L_DEBUG, "Adding initial view for output", view_handle);
wlc_handle output = wlc_get_focused_output();
container = get_container(output, &_);
} else {
sway_log(L_DEBUG, "Adding view %d to output", view_handle);
// TODO
}
// Create "container" for this view
struct sway_container *view = malloc(sizeof(struct sway_container));
view->layout = LAYOUT_IS_VIEW;
view->children = NULL;
view->output = view_handle;
list_add(container->children, view);
wlc_view_focus(view_handle);
arrange_windows();
}
void destroy_view(wlc_handle view) {
sway_log(L_DEBUG, "Destroying view %d", view);
int index;
struct sway_container *container = get_container_for_view(view, &index);
list_del(container->children, index);
wlc_view_focus(get_topmost(wlc_view_get_output(view), 0));
arrange_windows();
}
void add_output(wlc_handle output) {
struct sway_container *container = malloc(sizeof(struct sway_container));
// TODO: Get default layout from config

View file

@ -5,6 +5,7 @@
#include "list.h"
typedef enum {
LAYOUT_IS_VIEW,
LAYOUT_TILE_HORIZ,
LAYOUT_TILE_VERT,
LAYOUT_TABBED,
@ -15,12 +16,17 @@ struct sway_container {
wlc_handle output;
list_t *children;
container_layout_t layout;
struct sway_container *parent;
};
extern list_t *outputs;
extern wlc_handle focused_view;
void init_layout();
void add_output(wlc_handle output);
void destroy_output(wlc_handle output);
wlc_handle get_topmost(wlc_handle output, size_t offset);
void destroy_view(wlc_handle view);
void add_view(wlc_handle view);
#endif

43
sway/log.c Normal file
View file

@ -0,0 +1,43 @@
#include "log.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
int colored = 1;
int v = 0;
const char *verbosity_colors[] = {
"", // L_SILENT
"\x1B[1;31m", // L_ERROR
"\x1B[1;34m", // L_INFO
"\x1B[1;30m", // L_DEBUG
};
void init_log(int verbosity) {
v = verbosity;
}
void sway_abort(char *format, ...) {
fprintf(stderr, "ERROR: ");
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fprintf(stderr, "\n");
exit(1);
}
void sway_log(int verbosity, char* format, ...) {
if (verbosity <= v) {
int c = verbosity;
if (c > sizeof(verbosity_colors) / sizeof(char *)) {
c = sizeof(verbosity_colors) / sizeof(char *) - 1;
}
fprintf(stderr, verbosity_colors[c]);
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fprintf(stderr, "\x1B[0m\n");
}
}

15
sway/log.h Normal file
View file

@ -0,0 +1,15 @@
#ifndef _SWAY_LOG_H
#define _SWAY_LOG_H
typedef enum {
L_SILENT = 0,
L_ERROR = 1,
L_INFO = 2,
L_DEBUG = 3,
} log_importance_t;
void init_log(int verbosity);
void sway_log(int verbosity, char* format, ...);
void sway_abort(char* format, ...);
#endif

View file

@ -4,6 +4,7 @@
#include <wlc/wlc.h>
#include "layout.h"
#include "config.h"
#include "log.h"
#include "handlers.h"
struct sway_config *config;
@ -27,6 +28,7 @@ void load_config() {
}
int main(int argc, char **argv) {
init_log(L_DEBUG); // TODO: Control this with command line arg
load_config();
init_layout();