aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics.c12
-rw-r--r--input_field.c16
-rw-r--r--state.h2
3 files changed, 27 insertions, 3 deletions
diff --git a/graphics.c b/graphics.c
index 3032d68..d7b630a 100644
--- a/graphics.c
+++ b/graphics.c
@@ -36,6 +36,7 @@ void main() {\n\
const char* fragmentShader = "#version 330 core\n\
uniform sampler2D u_texture;\n\
+uniform vec3 u_color;\n\
in vec2 o_uv;\n\
\n\
layout (location = 0) out vec4 frag_color;\n\
@@ -44,7 +45,7 @@ void main() {\n\
float d = texture(u_texture, o_uv).r;\n\
float aaf = fwidth(d);\n\
float alpha = smoothstep(0.5 - aaf, 0.5 + aaf, d);\n\
- frag_color = vec4(1.0, 1.0, 1.0, alpha);\n\
+ frag_color = vec4(u_color, alpha);\n\
}";
bool init_gl(client_state* state) {
@@ -126,6 +127,7 @@ bool init_gl(client_state* state) {
state->text_shader = createShader(vertexShader, fragmentShader);
state->screen_size_uniform = glGetUniformLocation(state->text_shader, "u_screen_size");
state->offset_uniform = glGetUniformLocation(state->text_shader, "u_offset");
+ state->color_uniform = glGetUniformLocation(state->text_shader, "u_color");
return true;
}
@@ -140,6 +142,7 @@ void render_frame(client_state *state) {
// bind shader and texture
glUseProgram(state->text_shader);
glUniform2f(state->screen_size_uniform, state->width, state->height);
+ glUniform3f(state->color_uniform, 1.0f, 1.0f, 1.0f);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, state->atlas.texture);
@@ -170,11 +173,14 @@ void render_frame(client_state *state) {
}
// draw options
- array_for_all(uint32_t, i, state->filtered_items) {
- item_t* item = &state->items[*i];
+ for (uint32_t i = 0; i < array_size(state->filtered_items); ++i) {
+ item_t* item = &state->items[state->filtered_items[i]];
+
glBindVertexArray(item->text_buffer.vao);
glUniform2f(state->offset_uniform, pen_x, pen_y);
+ 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);
// shift pen
if (state->lines > 0) {
diff --git a/input_field.c b/input_field.c
index 75a0cbc..0fbaca6 100644
--- a/input_field.c
+++ b/input_field.c
@@ -19,6 +19,10 @@ void filter_items(client_state* state) {
array_add(state->filtered_items, i);
}
}
+
+ // select item
+ if (array_size(state->filtered_items) > 0) state->selected_filtered_item = 0;
+ else state->selected_filtered_item = -1;
}
void update_text_buffer(client_state* state) {
@@ -39,6 +43,18 @@ bool type_key(client_state* state, xkb_keysym_t keysym) {
return false;
}
+ // select next
+ if (keysym == XKB_KEY_n && ctrl) {
+ state->selected_filtered_item = MIN(state->selected_filtered_item + 1, array_size(state->filtered_items) - 1);
+ return true;
+ }
+
+ // select previous
+ if (keysym == XKB_KEY_p && ctrl) {
+ state->selected_filtered_item = MAX(state->selected_filtered_item - 1, 0);
+ return true;
+ }
+
// submit line
if (keysym == XKB_KEY_Return || keysym == XKB_KEY_KP_Enter) {
submit_line(state);
diff --git a/state.h b/state.h
index 8371000..b2cadd0 100644
--- a/state.h
+++ b/state.h
@@ -80,6 +80,7 @@ typedef struct {
GLuint text_shader;
GLuint screen_size_uniform;
GLuint offset_uniform;
+ GLuint color_uniform;
text_buffer_t input_buffer_grafix;
// fonts
@@ -96,6 +97,7 @@ typedef struct {
// state
char* input_buffer;
+ int selected_filtered_item;
uint32_t width, height;
item_t* items;
uint32_t* filtered_items;