Allegro.cc - Online Community

Allegro.cc Forums » Allegro Development » Problem with ALLEGRO_FULLSCREEN_WINDOW and multi monitor

This thread is locked; no one can reply to it. rss feed Print
Problem with ALLEGRO_FULLSCREEN_WINDOW and multi monitor
Edgar Reynaldo
Member #8,592
May 2007
avatar

The following code works. When changing it to use ALLEGRO_FULLSCREEN_WINDOW however it does not. src + BG.png here : https://www.allegro.cc/files/attachment/611139

https://pastebin.com/3YW7ddns

#SelectExpand
1#include "allegro5/allegro.h" 2#include "allegro5/allegro_font.h" 3#include "allegro5/allegro_ttf.h" 4#include "allegro5/allegro_image.h" 5#include "allegro5/allegro_primitives.h" 6 7 8 9void DrawLightB(int x , int y , int r , float fr , float fg , float fb); 10void DrawLightB(int x , int y , int r , float fr , float fg , float fb) { 11 al_draw_filled_circle(x,y,r,al_map_rgb_f(fr,fg,fb)); 12} 13void DrawLightA(int x , int y , int r , float fr , float fg , float fb); 14void DrawLightA(int x , int y , int r , float fr , float fg , float fb) { 15 int rad = r; 16 float l = 1. / ((float) r); 17 while (rad > 0) { 18 al_draw_filled_circle(x , y , rad , al_map_rgb_f(fr*l,fg*l,fb*l)); 19 rad -= 1; 20 } 21} 22void DrawLightC(int x , int y , int r , float fr , float fg , float fb); 23void DrawLightC(int x , int y , int r , float fr , float fg , float fb) { 24 int rad = r; 25 while (rad > 0) { 26 float l = (r-rad)/(float)(r*10.0);///1. / ((float) r); 27 al_draw_filled_circle(x , y , rad , al_map_rgb_f(fr*l,fg*l,fb*l)); 28 rad -= 10; 29 } 30} 31 32 33 34///#include "allegro5/allegro_direct3d.h" 35 36 37 38int main(int argc , char** argv) { 39 40 (void)argc; 41 (void)argv; 42 43 44 if (!al_init()) { 45 return 1; 46 } 47 if (!al_init_image_addon()) {return 2;} 48 if (!al_init_font_addon()) {return 3;} 49 if (!al_init_ttf_addon()) {return 4;} 50 if (!al_init_primitives_addon()) {return 5;} 51 52 al_install_keyboard(); 53 al_install_mouse(); 54 55 al_set_new_display_flags(ALLEGRO_FULLSCREEN | ALLEGRO_OPENGL); 56/// al_set_new_display_flags(ALLEGRO_FULLSCREEN_WINDOW | ALLEGRO_OPENGL); 57 ALLEGRO_DISPLAY* d = al_create_display(1920,1080); 58 59 ALLEGRO_TIMER* t = al_create_timer(1.0/60.0); 60 61 ALLEGRO_EVENT_QUEUE* q = al_create_event_queue(); 62 63 al_register_event_source(q , al_get_timer_event_source(t)); 64 al_register_event_source(q , al_get_display_event_source(d)); 65 al_register_event_source(q , al_get_keyboard_event_source()); 66 al_register_event_source(q , al_get_mouse_event_source()); 67 68 ALLEGRO_BITMAP* lmap = al_create_bitmap(1920,1080); 69 ALLEGRO_BITMAP* bg = al_load_bitmap("BG.png"); 70 71 if (!bg || !lmap) {return 7;} 72 73 int mx = 0; 74 int my = 0; 75 76 77 78 ALLEGRO_BITMAP* lmap2 = al_create_bitmap(2048,2048); 79 80 /// draw our light map 81 al_set_target_bitmap(lmap2); 82 al_clear_to_color(al_map_rgb(0,0,0)); 83 84 mx = 1024; 85 my = 1024; 86 87 // Additive blending 88 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE); 89/// DrawLight(0 , 0 , 200); 90/// DrawLight(mx , my , 200 , 1.0 , 1.0 , 1.0); 91 DrawLightA(mx - 100 , my - 100 , 400 , 1.0 , 0.0 , 0.0); 92 DrawLightA(mx + 100 , my - 100 , 400 , 0.0 , 1.0 , 0.0); 93 DrawLightA(mx , my + 73 , 400 , 0.0 , 0.0 , 1.0); 94 95 al_start_timer(t); 96 97 bool run = true; 98 bool draw = true; 99 while (run) { 100 if (draw) { 101 /// draw our light map 102 al_set_target_bitmap(lmap); 103 al_clear_to_color(al_map_rgb(0,0,0)); 104 105 // Additive blending 106 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE); 107 108 al_draw_bitmap(lmap2 , mx - 1024 , my - 1024 , 0); 109 110/// DrawLight(0 , 0 , 200); 111/// DrawLight(mx , my , 200 , 1.0 , 1.0 , 1.0); 112/** 113 114 DrawLightA(mx - 100 , my - 100 , 400 , 1.0 , 0.0 , 0.0); 115 DrawLightA(mx + 100 , my - 100 , 400 , 0.0 , 1.0 , 0.0); 116 DrawLightA(mx , my + 73 , 400 , 0.0 , 0.0 , 1.0); 117 118 DrawLightB(mx - 100 , my - 100 , 300 , 1.0 , 0.0 , 0.0); 119 DrawLightB(mx + 100 , my - 100 , 300 , 0.0 , 1.0 , 0.0); 120 DrawLightB(mx , my + 73 , 300 , 0.0 , 0.0 , 1.0); 121 122 DrawLightC(mx - 100 , my - 100 , 400 , 1.0 , 0.0 , 0.0); 123 DrawLightC(mx + 100 , my - 100 , 400 , 0.0 , 1.0 , 0.0); 124 DrawLightC(mx , my + 73 , 400 , 0.0 , 0.0 , 1.0); 125*/ 126 127 al_set_target_backbuffer(d); 128 al_clear_to_color(al_map_rgb_f(1,1,1)); 129 130 // Default blending (premult alpha) 131 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); 132 al_draw_bitmap(bg , (1920 - al_get_bitmap_width(bg))/2 , (1080 - al_get_bitmap_height(bg))/2 , 0); 133 134 // Mult source & dest blending 135 al_set_blender(ALLEGRO_ADD, ALLEGRO_DEST_COLOR, ALLEGRO_ZERO); 136 al_draw_bitmap(lmap , 0 , 0 , 0); 137 al_flip_display(); 138 draw = false; 139 } 140 141 do { 142 ALLEGRO_EVENT ev; 143 al_wait_for_event(q , &ev); 144 if (ev.type == ALLEGRO_EVENT_MOUSE_AXES) { 145 mx = ev.mouse.x; 146 my = ev.mouse.y; 147 draw = true; 148 } 149 if (ev.type == ALLEGRO_EVENT_KEY_DOWN && ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { 150 run = false; 151 } 152 if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { 153 run = false; 154 } 155 if (ev.type == ALLEGRO_EVENT_TIMER) { 156 draw = true; 157 } 158 } while (!al_is_event_queue_empty(q)); 159 160 } 161 return 0; 162}

If you change line 55 to use ALLEGRO_FULLSCREEN_WINDOW, it goes crazy and can't display itself properly. I have to unplug the second monitor before it becomes responsive again using a dual monitor setup where the second display is cloned from the first.

This is on Windows 10 with MinGW-W64 Gcc 7.1 and Allegro 5.2.3.

It should look like this :
{"name":"611138","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/e\/9\/e9be3b4f5126be6d638296adfc6aa11c.png","w":1026,"h":801,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/e\/9\/e9be3b4f5126be6d638296adfc6aa11c"}611138

Go to: