From 8f8bd9d5e931557d322744db14a439ff3111b745 Mon Sep 17 00:00:00 2001 From: Kevin Lange Date: Sat, 24 Nov 2012 00:18:53 -0800 Subject: [PATCH] Completely redesign login screen --- hdd/usr/share/logo_login.png | Bin 0 -> 9804 bytes userspace/glogin.c | 242 ++++++++++++++++++----------------- 2 files changed, 126 insertions(+), 116 deletions(-) create mode 100644 hdd/usr/share/logo_login.png diff --git a/hdd/usr/share/logo_login.png b/hdd/usr/share/logo_login.png new file mode 100644 index 0000000000000000000000000000000000000000..05e49c93e0569a775b55f1340940cb47c04ebaf8 GIT binary patch literal 9804 zcmV-SCbQXzP)sNoMcv>AqX7=l$cH zs#|sYc26&NlIb|#=egZ?tvXfpt>5|WM@T7I4Z`)$03HXNsULd_&n@8lz@7T>AHcsz z&q-F@=xLnB0K{rU6t4d~;2L0T9ozgK@N(dz(sNd4`DvVn#)?D~u3rHT0aHSPkqShr z{u?QX6a<3Qkm_MVY?Ze4e}Sh;&k0WcVVuTRhqcOQyMQTxv6h9A2#}!vDCAEC0EsE- zH6*bu0iFoF8hGi5$9x(OLKv%j*2tf&ae_5tL32@1>51&E7Yo<_(Txu7H2&vcH6qRd zF+i`D64X+nN{SS#{6eGN5g19n{a0^(n5Xez$BB%Ue*vCUdQ(CrG^lrs6{c$SIhKP3bw|NJoAerwoMaH-K}1CFwbLZ)6**>4*T&0-gsvO7G|*1og0*V#b0>u(EhG z6M-hB1zZ5!xRC*##;FV8`d0$a1)dHx^?TO=e;_^QKi0La6ZsJbc037u6nKo0!uW#4 zN)izX$G4@K9rIM_IUionz)s`TgmC>?lz@6JaLEc^OM$0J&-uujx4Rx9>VaGaTn{j| zXkx~N4+n_2G@X)~0Q{!(oWESxj!xsGK)C)k;8##&d9U=GBPaO&6lzBNG5xrlf^A`R zBPvH**vC2~HJf1H6iK53&;x#4dd^qZG_Lg$Q4j7Au%q5K%G2`z5f``R#?5o2=e%d# zJ35V#Lb(3V0Ph2)^;=!wDbjO3sXwoxRIrE8Ctrzp03wmta~

EzEXE@tRB9q;<(o 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 #include #include +#include #include "lib/sha2.h" #include "lib/window.h" @@ -23,6 +24,8 @@ uint16_t win_height; int uid = 0; +#define LOGO_FINAL_OFFSET 52 + int checkUserPass(char * user, char * pass) { /* Generate SHA512 */ @@ -67,24 +70,14 @@ int center_y(int y) { return (win_height - y) / 2; } -void init_sprite(int i, char * filename, char * alpha) { - sprites[i] = malloc(sizeof(sprite_t)); - load_sprite(sprites[i], filename); - if (alpha) { - sprites[i]->alpha = 1; - load_sprite(&alpha_tmp, alpha); - sprites[i]->masks = alpha_tmp.bitmap; - } else { - sprites[i]->alpha = 0; - } - sprites[i]->blank = 0x0; +void init_sprite_png(int id, char * path) { + sprites[id] = malloc(sizeof(sprite_t)); + load_sprite_png(sprites[id], path); } #define INPUT_SIZE 1024 -char input_buffer[1024]; -uint32_t input_collected = 0; - -int buffer_put(char c) { +int buffer_put(char * input_buffer, char c) { + int input_collected = strlen(input_buffer); if (c == 8) { /* Backspace */ if (input_collected > 0) { @@ -110,18 +103,38 @@ void * process_input(void * arg) { } } -uint32_t gradient_at(uint16_t j) { - float x = j * 80; - x = x / ctx->height; - return rgb(0, 1 * x, 2 * x); +int32_t min(int32_t a, int32_t b) { + return (a < b) ? a : b; } -void draw_gradient() { - for (uint16_t j = 0; j < ctx->height; ++j) { - draw_line(ctx, 0, ctx->width, j, j, gradient_at(j)); +int32_t max(int32_t a, int32_t b) { + return (a > b) ? a : b; +} + +void draw_box(gfx_context_t * ctx, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) { + int32_t _min_x = max(x, 0); + int32_t _min_y = max(y, 0); + int32_t _max_x = min(x + w - 1, ctx->width - 1); + int32_t _max_y = min(y + h - 1, ctx->height - 1); + + for (int i = _min_y; i < _max_y; ++i) { + draw_line(ctx, _min_x, _max_x, i, i, color); } } +void draw_box_border(gfx_context_t * ctx, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) { + int32_t _min_x = max(x, 0); + int32_t _min_y = max(y, 0); + int32_t _max_x = min(x + w - 1, ctx->width - 1); + int32_t _max_y = min(y + h - 1, ctx->height - 1); + + draw_line(ctx, _min_x, _max_x, _min_y, _min_y, color); + draw_line(ctx, _min_x, _max_x, _max_y, _max_y, color); + draw_line(ctx, _min_x, _min_x, _min_y, _max_y, color); + draw_line(ctx, _max_x, _max_x, _min_y, _max_y, color); +} + + int main (int argc, char ** argv) { while (1) { setup_windowing(); @@ -139,78 +152,95 @@ int main (int argc, char ** argv) { assert(wina); window_reorder (wina, 0); /* Disables movement */ ctx = init_graphics_window_double_buffer(wina); - draw_gradient(); - flip(ctx); + init_sprite_png(0, "/usr/share/logo_login.png"); + + for (int i = 0; i < LOGO_FINAL_OFFSET; ++i) { + draw_fill(ctx, rgb(0,0,0)); + draw_sprite(ctx, sprites[0], center_x(sprites[0]->width), center_y(sprites[0]->height) - i); + flip(ctx); + } - /* Fade in */ size_t buf_size = wina->width * wina->height * sizeof(uint32_t); char * buf = malloc(buf_size); - uint16_t fade = 0; - gfx_context_t fade_ctx; - fade_ctx.backbuffer = buf; - fade_ctx.width = wina->width; - fade_ctx.height = wina->height; - fade_ctx.depth = 32; - gfx_context_t * fc = &fade_ctx; - - sprites[0] = malloc(sizeof(sprite_t)); - sprites[0]->alpha = 0; - load_sprite_png(sprites[0], "/usr/share/wallpaper.png"); - draw_sprite_scaled(fc,sprites[0], 0, 0, width, height); - - while (fade < 256) { - for (uint32_t y = 0; y < wina->height; y++) { - for (uint32_t x = 0; x < wina->width; x++) { - GFX(ctx, x, y) = alpha_blend(GFX(ctx, x, y), GFX(fc, x, y), rgb(fade,0,0)); - } - } - flip(ctx); - fade += 10; - } - - fade = 255; - for (uint32_t y = 0; y < wina->height; y++) { - for (uint32_t x = 0; x < wina->width; x++) { - GFX(ctx, x, y) = alpha_blend(GFX(ctx, x, y), GFX(fc, x, y), rgb(fade,0,0)); - } - } - - init_sprite(1, "/usr/share/bs.bmp", "/usr/share/bs-alpha.bmp"); - draw_sprite_scaled(fc, sprites[1], center_x(sprites[1]->width), center_y(sprites[1]->height), sprites[1]->width, sprites[1]->height); uint32_t i = 0; uint32_t black = rgb(0,0,0); uint32_t white = rgb(255,255,255); + uint32_t red = rgb(240, 20, 20); int x_offset = 65; int y_offset = 64; int fuzz = 3; - set_font_size(22); - - char * m_username = "Username: "; - char * m_password = "Password: "; - - char msg[1024]; - - char username[1024] = {0}; - char password[1024] = {0}; - - input_buffer[0] = '\0'; - input_collected = 0; + char username[INPUT_SIZE] = {0}; + char password[INPUT_SIZE] = {0}; uid = 0; +#define BOX_WIDTH 272 +#define BOX_HEIGHT 104 +#define USERNAME_BOX 1 +#define PASSWORD_BOX 2 +#define EXTRA_TEXT_OFFSET 12 +#define TEXTBOX_INTERIOR_LEFT 4 +#define LEFT_OFFSET 80 + int box_x = center_x(BOX_WIDTH); + int box_y = center_y(0) + 8; + + int focus = USERNAME_BOX; + + set_font_size(12); + + int username_label_left = LEFT_OFFSET - 2 - draw_string_width("Username:"); + int password_label_left = LEFT_OFFSET - 2 - draw_string_width("Password:"); + + char password_circles[INPUT_SIZE * 3]; + + int show_error = 0; + while (1) { + focus = USERNAME_BOX; + memset(username, 0x0, INPUT_SIZE); + memset(password, 0x0, INPUT_SIZE); + memset(password_circles, 0x0, INPUT_SIZE * 3); + while (1) { - snprintf(msg, 1024, "%s%s", m_username, input_buffer); - /* Redraw the background by memcpy (super speedy) */ - memcpy(ctx->backbuffer, buf, buf_size); + strcpy(password_circles, ""); + for (int i = 0; i < strlen(password); ++i) { + strcat(password_circles, "●"); + } - draw_string_shadow(ctx, wina->width / 2 - x_offset, wina->height / 2 + y_offset, white, msg, black, 4, 2, 2, 5.0); + /* Redraw the background */ + draw_fill(ctx, rgb(0,0,0)); + draw_sprite(ctx, sprites[0], center_x(sprites[0]->width), center_y(sprites[0]->height) - LOGO_FINAL_OFFSET); + + /* Draw backdrops */ + draw_box(ctx, box_x, box_y, BOX_WIDTH, BOX_HEIGHT, rgb(45,45,45)); + draw_box(ctx, box_x + LEFT_OFFSET, box_y + 32, 168, 16, rgb(255,255,255)); + draw_box(ctx, box_x + LEFT_OFFSET, box_y + 56, 168, 16, rgb(255,255,255)); + + /* Draw labels */ + draw_string(ctx, box_x + username_label_left, box_y + 32 + EXTRA_TEXT_OFFSET, white, "Username:"); + draw_string(ctx, box_x + password_label_left, box_y + 56 + EXTRA_TEXT_OFFSET, white, "Password:"); + + /* Draw box entries */ + draw_string(ctx, box_x + LEFT_OFFSET + TEXTBOX_INTERIOR_LEFT, box_y + 32 + EXTRA_TEXT_OFFSET, black, username); + draw_string(ctx, box_x + LEFT_OFFSET + TEXTBOX_INTERIOR_LEFT, box_y + 56 + EXTRA_TEXT_OFFSET, black, password_circles); + + if (show_error) { + char * error_message = "Incorrect username or password."; + + draw_string(ctx, box_x + (BOX_WIDTH - draw_string_width(error_message)) / 2, box_y + 8 + EXTRA_TEXT_OFFSET, red, error_message); + } + + if (focus == USERNAME_BOX) { + draw_box_border(ctx, box_x + LEFT_OFFSET, box_y + 32, 168, 16, rgb(8, 193, 236)); + } else if (focus == PASSWORD_BOX) { + draw_box_border(ctx, box_x + LEFT_OFFSET, box_y + 56, 168, 16, rgb(8, 193, 236)); + } flip(ctx); @@ -221,62 +251,42 @@ int main (int argc, char ** argv) { if (kbd->key == '\n') { free(kbd); - goto _have_username; + if (focus == USERNAME_BOX) { + focus = PASSWORD_BOX; + continue; + } else if (focus == PASSWORD_BOX) { + break; + } } - buffer_put(kbd->key); + if (kbd->key == '\t') { + if (focus == USERNAME_BOX) { + focus = PASSWORD_BOX; + } else if (focus == PASSWORD_BOX) { + focus = USERNAME_BOX; + } + continue; + } + + if (focus == USERNAME_BOX) { + buffer_put(username, kbd->key); + } else if (focus == PASSWORD_BOX) { + buffer_put(password, kbd->key); + } free(kbd); } -_have_username: - - input_buffer[input_collected] = '\0'; - sprintf(username, "%s", input_buffer); - - input_collected = 0; - input_buffer[0] = '\0'; - - while (1) { - snprintf(msg, 1024, "%s", m_password); - - /* Redraw the background by memcpy (super speedy) */ - memcpy(ctx->backbuffer, buf, buf_size); - - draw_string_shadow(ctx, wina->width / 2 - x_offset, wina->height / 2 + y_offset, white, msg, black, 4, 2, 2, 5.0); - - flip(ctx); - - w_keyboard_t * kbd = NULL; - do { - kbd = poll_keyboard(); - } while (!kbd); - - if (kbd->key == '\n') { - free(kbd); - goto _have_password; - } - - buffer_put(kbd->key); - free(kbd); - - } - -_have_password: - - input_buffer[input_collected] = '\0'; - sprintf(password, "%s", input_buffer); - - input_collected = 0; - input_buffer[0] = '\0'; uid = checkUserPass(username, password); if (uid >= 0) { break; } + show_error = 1; } - memcpy(ctx->backbuffer, buf, buf_size); + draw_fill(ctx, rgb(0,0,0)); + draw_sprite(ctx, sprites[0], center_x(sprites[0]->width), center_y(sprites[0]->height) - LOGO_FINAL_OFFSET); flip(ctx); teardown_windowing();