diff options
| author | Jack Jamison <jackqjamison@gmail.com> | 2025-10-19 15:44:08 -0400 |
|---|---|---|
| committer | Jack Jamison <jackqjamison@gmail.com> | 2025-10-19 15:44:08 -0400 |
| commit | cd9cc6e14bb26cb3754fbe0db21dbb39d442d962 (patch) | |
| tree | 7c8fe78f46379306869a14a4aaeef98623383819 | |
| parent | 7877002de2a65ea0a66181aa593af355a2bbf910 (diff) | |
clean up drawing code
| -rw-r--r-- | graphics.c | 26 | ||||
| -rw-r--r-- | input_field.c | 12 | ||||
| -rw-r--r-- | main.c | 2 | ||||
| -rw-r--r-- | state.h | 6 |
4 files changed, 25 insertions, 21 deletions
@@ -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; @@ -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); @@ -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; |
