aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics.c26
-rw-r--r--input_field.c12
-rw-r--r--main.c2
-rw-r--r--state.h6
4 files changed, 25 insertions, 21 deletions
diff --git a/graphics.c b/graphics.c
index 9518937..c6b0650 100644
--- a/graphics.c
+++ b/graphics.c
@@ -147,38 +147,38 @@ void render_frame(client_state *state) {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, state->atlas.texture);
+ // calculate input buffer
float horizontal_spacing = state->line_height / 2.0f;
- float pen_x = horizontal_spacing / 2.0f;
- float pen_y = state->line_height * state->lines - state->atlas.vert_shift;
+ float input_y = state->line_height * state->lines;
+ float input_width;
+ if (state->lines > 0) { input_width = state->width; }
+ else { input_width = state->width / 3.0f; }
// draw input buffer
- if (state->lines > 0) {
- glScissor(pen_x, pen_y + state->atlas.vert_shift, state->width, state->line_height);
- }
- else {
- glScissor(pen_x, pen_y + state->atlas.vert_shift, state->width / 3.0f - pen_x, state->line_height);
- }
+ glScissor(0, input_y, input_width - horizontal_spacing / 2.0f, state->line_height);
glBindVertexArray(state->input_buffer_grafix.vao);
- glUniform2f(state->offset_uniform, pen_x, pen_y);
+ glUniform2f(state->offset_uniform, horizontal_spacing / 2.0f, input_y - state->atlas.vert_shift);
glDrawElements(GL_TRIANGLES, state->input_buffer_grafix.num_elements, GL_UNSIGNED_INT, 0);
+ float pen_x = 0.0f;
+ float pen_y = input_y;
+
// set up starting pen and scissor for options
if (state->lines > 0) {
glScissor(0, 0, state->width, pen_y);
pen_y -= state->line_height;
}
else {
- pen_x += state->width / 3.0f;
+ pen_x = input_width;
glScissor(pen_x, 0, state->width, state->line_height);
- pen_x += horizontal_spacing / 2.0f;
}
// draw options
for (uint32_t i = 0; i < array_size(state->filtered_items); ++i) {
- item_t* item = &state->items[state->filtered_items[i]];
+ item_t* item = state->filtered_items[i].item;
glBindVertexArray(item->text_buffer.vao);
- glUniform2f(state->offset_uniform, pen_x, pen_y);
+ glUniform2f(state->offset_uniform, pen_x + horizontal_spacing / 2.0f, pen_y - state->atlas.vert_shift);
if (i == state->selected_filtered_item) glUniform3f(state->color_uniform, 0.0f, 0.4f, 0.8f);
glDrawElements(GL_TRIANGLES, item->text_buffer.num_elements, GL_UNSIGNED_INT, 0);
if (i == state->selected_filtered_item) glUniform3f(state->color_uniform, 1.0f, 1.0f, 1.0f);
diff --git a/input_field.c b/input_field.c
index 3f32fcc..3e0a3e2 100644
--- a/input_field.c
+++ b/input_field.c
@@ -15,9 +15,9 @@ void filter_items(client_state* state) {
input_buffer_string[len] = '\0';
// add all strings with substring
- for (uint32_t i = 0; i < array_size(state->items); ++i) {
- if (strstr(state->items[i].text, input_buffer_string) != NULL) {
- array_add(state->filtered_items, i);
+ array_for_all(item_t, i, state->items) {
+ if (strstr(i->text, input_buffer_string) != NULL) {
+ array_add(state->filtered_items, (item_display_t){ .item = i });
}
}
@@ -49,7 +49,7 @@ bool type_key(client_state* state, xkb_keysym_t keysym) {
// complete
if ((keysym == XKB_KEY_i && ctrl && alt) || keysym == XKB_KEY_Tab) {
if (state->selected_filtered_item != -1) {
- char* selected = state->items[state->filtered_items[state->selected_filtered_item]].text;
+ char* selected = state->filtered_items[state->selected_filtered_item].item->text;
size_t len = strlen(selected);
array_free(state->input_buffer);
@@ -108,11 +108,11 @@ bool type_key(client_state* state, xkb_keysym_t keysym) {
void submit_line(client_state* state) {
if (state->exact_match) {
if (state->selected_filtered_item == -1) return;
- printf("%s\n", state->items[state->filtered_items[state->selected_filtered_item]].text);
+ printf("%s\n", state->filtered_items[state->selected_filtered_item].item->text);
}
else {
if (state->selected_filtered_item == -1) printf("%.*s\n", (int)array_size(state->input_buffer), state->input_buffer);
- else printf("%s\n", state->items[state->filtered_items[state->selected_filtered_item]].text);
+ else printf("%s\n", state->filtered_items[state->selected_filtered_item].item->text);
}
state->running = false;
state->exit_code = EXIT_SUCCESS;
diff --git a/main.c b/main.c
index faf3be0..b2d847e 100644
--- a/main.c
+++ b/main.c
@@ -35,7 +35,7 @@ int main(int argc, char* argv[]) {
client_state state = {0};
state.running = true;
state.input_buffer = array_new(char, 0);
- state.filtered_items = array_new(uint32_t, 0);
+ state.filtered_items = array_new(item_display_t, 0);
// read input
parse_args(&state, argc, argv);
diff --git a/state.h b/state.h
index e2335ba..1eb9e22 100644
--- a/state.h
+++ b/state.h
@@ -47,6 +47,10 @@ typedef struct {
} item_t;
typedef struct {
+ item_t* item;
+} item_display_t;
+
+typedef struct {
// wayland
struct wl_display* display;
struct wl_registry* registry;
@@ -103,7 +107,7 @@ typedef struct {
int selected_filtered_item;
uint32_t width, height;
item_t* items;
- uint32_t* filtered_items;
+ item_display_t* filtered_items;
bool running;
int exit_code;