From cd9cc6e14bb26cb3754fbe0db21dbb39d442d962 Mon Sep 17 00:00:00 2001 From: Jack Jamison Date: Sun, 19 Oct 2025 15:44:08 -0400 Subject: clean up drawing code --- graphics.c | 26 +++++++++++++------------- input_field.c | 12 ++++++------ main.c | 2 +- state.h | 6 +++++- 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 @@ -46,6 +46,10 @@ typedef struct { text_buffer_t text_buffer; } item_t; +typedef struct { + item_t* item; +} item_display_t; + typedef struct { // wayland struct wl_display* display; @@ -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; -- cgit v1.2.3