257int main(
int argc,
char* argv[]) {
264 n_abort(
"Could not init Allegro.\n");
266 if (!al_install_audio()) {
269 if (!al_init_acodec_addon()) {
270 n_log(
LOG_ERR,
"Unable to initialize audio codec addon");
272 if (!al_init_image_addon()) {
273 n_abort(
"Unable to initialize image addon\n");
275 if (!al_init_primitives_addon()) {
276 n_abort(
"Unable to initialize primitives addon\n");
278 if (!al_init_font_addon()) {
279 n_abort(
"Unable to initialize font addon\n");
281 if (!al_init_ttf_addon()) {
282 n_abort(
"Unable to initialize ttf_font addon\n");
284 if (!al_install_keyboard()) {
285 n_abort(
"Unable to initialize keyboard handler\n");
287 if (!al_install_mouse()) {
288 n_abort(
"Unable to initialize mouse handler\n");
292 char ver_str[128] =
"";
293 while ((
getoptret = getopt(argc, argv,
"hvV:L:t:")) != EOF) {
296 n_log(
LOG_NOTICE,
"\n %s -h help -v version -V DEBUGLEVEL -L logfile -t theme.json", argv[0]);
299 sprintf(ver_str,
"%s %s", __DATE__, __TIME__);
303 if (!strncmp(
"NOTICE", optarg, 6)) {
305 }
else if (!strncmp(
"VERBOSE", optarg, 7)) {
307 }
else if (!strncmp(
"ERROR", optarg, 5)) {
309 }
else if (!strncmp(
"DEBUG", optarg, 5)) {
325 n_log(
LOG_ERR,
"\n %s -h help -v version -V DEBUGLEVEL -L logfile -t theme.json", argv[0]);
330 ALLEGRO_EVENT_QUEUE* event_queue = al_create_event_queue();
332 n_abort(
"Failed to create event queue!\n");
335 al_set_new_display_flags(ALLEGRO_OPENGL | ALLEGRO_WINDOWED | ALLEGRO_RESIZABLE);
338 n_abort(
"Unable to create display\n");
340 al_set_window_title(
display,
"Nilorea GUI Demo - All Widgets + Dropdown Menus");
342 ALLEGRO_TIMER*
fps_timer = al_create_timer(1.0 / 60.0);
344 al_register_event_source(event_queue, al_get_display_event_source(
display));
345 al_register_event_source(event_queue, al_get_timer_event_source(
fps_timer));
346 al_register_event_source(event_queue, al_get_keyboard_event_source());
347 al_register_event_source(event_queue, al_get_mouse_event_source());
351 ALLEGRO_FONT* font = al_create_builtin_font();
353 n_abort(
"Unable to create builtin font\n");
387 int win_menu =
win_ids[win_idx];
393 "Windows", 10, 2, 120, 22,
398 "File", 140, 2, 100, 22, NULL, NULL);
416 al_map_rgba(120, 30, 30, 230), al_map_rgba(160, 40, 40, 240), al_map_rgba(200, 60, 60, 255),
417 al_map_rgba(200, 80, 80, 255), al_map_rgba(230, 100, 100, 255), al_map_rgba(255, 120, 120, 255),
418 al_map_rgba(255, 220, 220, 255), al_map_rgba(255, 255, 255, 255), al_map_rgba(255, 255, 255, 255),
429 win_names[win_idx] =
"Sliders (resizable)";
434 n_gui_add_slider(
gui, win2, 20, 20, 180, 24, 0.0, 100.0, 50.0,
N_GUI_SLIDER_VALUE,
on_slider_change, NULL);
435 n_gui_add_slider(
gui, win2, 20, 60, 180, 24, 0.0, 100.0, 25.0,
N_GUI_SLIDER_PERCENT,
on_slider_change, NULL);
437 int sld_dis =
n_gui_add_slider(
gui, win2, 20, 100, 180, 24, -50.0, 50.0, 0.0,
N_GUI_SLIDER_VALUE,
on_slider_change, NULL);
442 n_gui_add_vslider(
gui, win2, 240, 10, 24, 120, 0.0, 100.0, 75.0,
N_GUI_SLIDER_VALUE,
on_slider_change, NULL);
443 n_gui_add_vslider(
gui, win2, 275, 10, 24, 120, 0.0, 100.0, 40.0,
N_GUI_SLIDER_PERCENT,
on_slider_change, NULL);
457 win_names[win_idx] =
"Checkboxes (auto)";
556 win_names[win_idx] =
"Combo / Labels / Image";
582 "Click this link!",
"https://example.com",
587 ALLEGRO_BITMAP* img_192 = al_load_bitmap(
"DATAS/img/android-chrome-192x192.png");
588 ALLEGRO_BITMAP* img_32 = al_load_bitmap(
"DATAS/img/favicon-32x32.png");
654 al_map_rgba(40, 60, 40, 230), al_map_rgba(50, 80, 50, 240), al_map_rgba(30, 120, 30, 255),
655 al_map_rgba(60, 100, 60, 255), al_map_rgba(70, 140, 70, 255), al_map_rgba(40, 160, 40, 255),
656 al_map_rgba(200, 255, 200, 255), al_map_rgba(255, 255, 255, 255), al_map_rgba(255, 255, 255, 255),
658 for (
int i = 0; i < 4; i++) {
683 win_names[win_idx] =
"Scrollable (vertical only)";
684 int win_scroll =
win_ids[win_idx];
690 for (
int i = 0; i < 20; i++) {
692 snprintf(buf,
sizeof(buf),
"Scrollable line %d - wide content clipped, not h-scrolled", i + 1);
703 ALLEGRO_BITMAP* skin_win_bg = NULL;
704 ALLEGRO_BITMAP* skin_win_tb = NULL;
705 ALLEGRO_BITMAP* skin_sld_track = NULL;
706 ALLEGRO_BITMAP* skin_sld_fill = NULL;
707 ALLEGRO_BITMAP* skin_sld_handle = NULL;
708 ALLEGRO_BITMAP* skin_sld_handle_h = NULL;
709 ALLEGRO_BITMAP* skin_chk_unchecked = NULL;
710 ALLEGRO_BITMAP* skin_chk_checked = NULL;
716 ALLEGRO_BITMAP* skin_btn_normal = NULL;
717 ALLEGRO_BITMAP* skin_btn_hover = NULL;
718 ALLEGRO_BITMAP* skin_btn_active = NULL;
719 ALLEGRO_BITMAP* skin_list_bg = NULL;
720 ALLEGRO_BITMAP* skin_list_item = NULL;
721 ALLEGRO_BITMAP* skin_list_sel = NULL;
722 ALLEGRO_BITMAP* skin_drop_panel = NULL;
723 ALLEGRO_BITMAP* skin_drop_hover = NULL;
724 ALLEGRO_BITMAP* skin_text_bg = NULL;
725 ALLEGRO_BITMAP* skin_tb_close_n = NULL;
726 ALLEGRO_BITMAP* skin_tb_close_h = NULL;
727 ALLEGRO_BITMAP* skin_tb_close_a = NULL;
731 ALLEGRO_BITMAP* prev_target = al_get_target_bitmap();
734 skin_win_bg = al_create_bitmap(64, 64);
735 al_set_target_bitmap(skin_win_bg);
736 for (
int row = 0; row < 64; row++) {
737 float t = (float)row / 63.0f;
738 al_draw_line(0, (
float)row, 64, (
float)row,
739 al_map_rgba((
unsigned char)(20 + 40 * t), (
unsigned char)(40 + 60 * t), (
unsigned char)(80 + 80 * t), 230), 1.0f);
743 skin_win_tb = al_create_bitmap(64, 16);
744 al_set_target_bitmap(skin_win_tb);
745 for (
int row = 0; row < 16; row++) {
746 float t = (float)row / 15.0f;
747 al_draw_line(0, (
float)row, 64, (
float)row,
748 al_map_rgba((
unsigned char)(60 + 40 * t), (
unsigned char)(30 + 30 * t), (
unsigned char)(100 + 50 * t), 240), 1.0f);
752 skin_sld_track = al_create_bitmap(32, 8);
753 al_set_target_bitmap(skin_sld_track);
754 al_clear_to_color(al_map_rgba(50, 50, 60, 200));
757 skin_sld_fill = al_create_bitmap(32, 8);
758 al_set_target_bitmap(skin_sld_fill);
759 al_clear_to_color(al_map_rgba(100, 180, 255, 230));
762 skin_sld_handle = al_create_bitmap(16, 16);
763 al_set_target_bitmap(skin_sld_handle);
764 al_clear_to_color(al_map_rgba(0, 0, 0, 0));
765 al_draw_filled_circle(8, 8, 7, al_map_rgba(200, 200, 220, 240));
768 skin_sld_handle_h = al_create_bitmap(16, 16);
769 al_set_target_bitmap(skin_sld_handle_h);
770 al_clear_to_color(al_map_rgba(0, 0, 0, 0));
771 al_draw_filled_circle(8, 8, 7, al_map_rgba(150, 220, 255, 255));
774 skin_chk_unchecked = al_create_bitmap(16, 16);
775 al_set_target_bitmap(skin_chk_unchecked);
776 al_clear_to_color(al_map_rgba(60, 60, 80, 220));
777 al_draw_rectangle(0.5f, 0.5f, 15.5f, 15.5f, al_map_rgba(150, 150, 200, 255), 1.0f);
779 skin_chk_checked = al_create_bitmap(16, 16);
780 al_set_target_bitmap(skin_chk_checked);
781 al_clear_to_color(al_map_rgba(80, 140, 255, 240));
782 al_draw_rectangle(0.5f, 0.5f, 15.5f, 15.5f, al_map_rgba(150, 150, 200, 255), 1.0f);
783 al_draw_line(3, 8, 7, 13, al_map_rgb(255, 255, 255), 2.0f);
784 al_draw_line(7, 13, 13, 3, al_map_rgb(255, 255, 255), 2.0f);
786 al_set_target_bitmap(prev_target);
791 int win_skin =
win_ids[win_idx];
814 n_gui_add_label(
gui, win_skin,
"Window bg, titlebar, slider, checkbox,", 20, 180, 260, 16,
N_GUI_ALIGN_LEFT);
825 ALLEGRO_BITMAP* prev_target = al_get_target_bitmap();
828 skin_btn_normal = al_create_bitmap(64, 32);
829 al_set_target_bitmap(skin_btn_normal);
830 al_clear_to_color(al_map_rgba(60, 100, 180, 230));
831 skin_btn_hover = al_create_bitmap(64, 32);
832 al_set_target_bitmap(skin_btn_hover);
833 al_clear_to_color(al_map_rgba(90, 140, 220, 240));
834 skin_btn_active = al_create_bitmap(64, 32);
835 al_set_target_bitmap(skin_btn_active);
836 al_clear_to_color(al_map_rgba(40, 80, 140, 255));
839 skin_list_bg = al_create_bitmap(32, 32);
840 al_set_target_bitmap(skin_list_bg);
841 al_clear_to_color(al_map_rgba(25, 35, 55, 240));
842 skin_list_item = al_create_bitmap(32, 16);
843 al_set_target_bitmap(skin_list_item);
844 al_clear_to_color(al_map_rgba(40, 50, 70, 220));
845 skin_list_sel = al_create_bitmap(32, 16);
846 al_set_target_bitmap(skin_list_sel);
847 al_clear_to_color(al_map_rgba(80, 140, 220, 255));
850 skin_drop_panel = al_create_bitmap(64, 64);
851 al_set_target_bitmap(skin_drop_panel);
852 al_clear_to_color(al_map_rgba(35, 25, 55, 245));
853 skin_drop_hover = al_create_bitmap(32, 16);
854 al_set_target_bitmap(skin_drop_hover);
855 al_clear_to_color(al_map_rgba(120, 80, 200, 230));
858 skin_text_bg = al_create_bitmap(64, 24);
859 al_set_target_bitmap(skin_text_bg);
860 al_clear_to_color(al_map_rgba(245, 245, 220, 255));
863 skin_tb_close_n = al_create_bitmap(16, 16);
864 al_set_target_bitmap(skin_tb_close_n);
865 al_clear_to_color(al_map_rgba(0, 0, 0, 0));
866 al_draw_filled_circle(8, 8, 6, al_map_rgba(200, 60, 60, 255));
867 skin_tb_close_h = al_create_bitmap(16, 16);
868 al_set_target_bitmap(skin_tb_close_h);
869 al_clear_to_color(al_map_rgba(0, 0, 0, 0));
870 al_draw_filled_circle(8, 8, 7, al_map_rgba(255, 100, 100, 255));
871 skin_tb_close_a = al_create_bitmap(16, 16);
872 al_set_target_bitmap(skin_tb_close_a);
873 al_clear_to_color(al_map_rgba(0, 0, 0, 0));
874 al_draw_filled_circle(8, 8, 6, al_map_rgba(140, 30, 30, 255));
876 al_set_target_bitmap(prev_target);
879 win_names[win_idx] =
"Bitmap Skinning II";
880 int win_skin2 =
win_ids[win_idx];
885 skin_tb_close_n, skin_tb_close_h, skin_tb_close_a);
890 skin_btn_normal, skin_btn_hover, skin_btn_active,
930 n_gui_add_label(
gui, win_skin2,
"Button, textarea, listbox, radiolist,", 20, 255, 250, 16,
N_GUI_ALIGN_LEFT);
939 int win_layout =
win_ids[win_idx];
952 int win_login =
win_ids[win_idx];
969 int login_sources[2] = {txt_user, txt_pass};
1008 int app_needs_redraw = 1;
1013 char last_status[256] =
"", last_proj[128] =
"", last_coord[160] =
"";
1015 al_clear_keyboard_state(NULL);
1016 al_flush_event_queue(event_queue);
1020 al_wait_for_event(event_queue, &ev);
1022 if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
1025 if (ev.type == ALLEGRO_EVENT_KEY_DOWN && ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE) {
1031 if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE) {
1032 al_acknowledge_resize(
display);
1033 int new_w = al_get_display_width(
display);
1034 int new_h = al_get_display_height(
display);
1045 if (ev.type == ALLEGRO_EVENT_MOUSE_AXES) {
1048 app_needs_redraw = 1;
1051 if (ev.type == ALLEGRO_EVENT_TIMER) {
1053 char status_buf[256];
1054 snprintf(status_buf,
sizeof(status_buf),
1055 "Player:%s Height:%s Grid:%s Smooth:%s Ghost:%s",
1065 if (strcmp(last_status, status_buf) != 0) {
1067 snprintf(last_status,
sizeof(last_status),
"%s", status_buf);
1073 if (strcmp(last_proj, proj_buf) != 0) {
1075 snprintf(last_proj,
sizeof(last_proj),
"%s", proj_buf);
1083 float vmx_lbl = 0, vmy_lbl = 0;
1085 char coord_buf[160];
1086 snprintf(coord_buf,
sizeof(coord_buf),
1087 "Coords: screen=(%d,%d) virtual=(%.1f,%.1f) "
1088 "(via n_gui_screen_to_virtual)",
1089 mx, my, (
double)vmx_lbl, (
double)vmy_lbl);
1090 if (strcmp(last_coord, coord_buf) != 0) {
1092 snprintf(last_coord,
sizeof(last_coord),
"%s", coord_buf);
1101 al_set_target_bitmap(al_get_backbuffer(
display));
1102 al_clear_to_color(al_map_rgba(30, 30, 35, 255));
1112 ALLEGRO_TRANSFORM overlay_tf;
1113 al_identity_transform(&overlay_tf);
1118 al_use_transform(&overlay_tf);
1120 float cross_thick = 1.0f;
1124 al_draw_line(vmx - 6, vmy, vmx + 6, vmy, al_map_rgb(255, 100, 100), cross_thick);
1125 al_draw_line(vmx, vmy - 6, vmx, vmy + 6, al_map_rgb(255, 100, 100), cross_thick);
1132 ALLEGRO_TRANSFORM instr_tf;
1133 al_identity_transform(&instr_tf);
1138 al_use_transform(&instr_tf);
1140 al_draw_text(font, al_map_rgb(180, 180, 180), 10, virt_h - 18, 0,
1141 "Drag windows | Click widgets | Scroll lists | Resize corners/display | 'Windows' dropdown | ESC to quit");
1143 ALLEGRO_TRANSFORM identity;
1144 al_identity_transform(&identity);
1145 al_use_transform(&identity);
1149 app_needs_redraw = 0;
1155 if (img_192) al_destroy_bitmap(img_192);
1156 if (img_32) al_destroy_bitmap(img_32);
1158 if (skin_win_bg) al_destroy_bitmap(skin_win_bg);
1159 if (skin_win_tb) al_destroy_bitmap(skin_win_tb);
1160 if (skin_sld_track) al_destroy_bitmap(skin_sld_track);
1161 if (skin_sld_fill) al_destroy_bitmap(skin_sld_fill);
1162 if (skin_sld_handle) al_destroy_bitmap(skin_sld_handle);
1163 if (skin_sld_handle_h) al_destroy_bitmap(skin_sld_handle_h);
1164 if (skin_chk_unchecked) al_destroy_bitmap(skin_chk_unchecked);
1165 if (skin_chk_checked) al_destroy_bitmap(skin_chk_checked);
1167 if (skin_btn_normal) al_destroy_bitmap(skin_btn_normal);
1168 if (skin_btn_hover) al_destroy_bitmap(skin_btn_hover);
1169 if (skin_btn_active) al_destroy_bitmap(skin_btn_active);
1170 if (skin_list_bg) al_destroy_bitmap(skin_list_bg);
1171 if (skin_list_item) al_destroy_bitmap(skin_list_item);
1172 if (skin_list_sel) al_destroy_bitmap(skin_list_sel);
1173 if (skin_drop_panel) al_destroy_bitmap(skin_drop_panel);
1174 if (skin_drop_hover) al_destroy_bitmap(skin_drop_hover);
1175 if (skin_text_bg) al_destroy_bitmap(skin_text_bg);
1176 if (skin_tb_close_n) al_destroy_bitmap(skin_tb_close_n);
1177 if (skin_tb_close_h) al_destroy_bitmap(skin_tb_close_h);
1178 if (skin_tb_close_a) al_destroy_bitmap(skin_tb_close_a);
1179 al_destroy_font(font);
1181 al_destroy_event_queue(event_queue);
1183 al_uninstall_system();