<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>FULLSCREEN_WINDOW and display scaling on high DPI settings - Workaround</title>
		<link>http://www.allegro.cc/forums/view/616109</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 11 Mar 2016 10:52:49 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry for the new thread, for some reason there is no any &quot;reply&quot; button in that thread.</p><p>The problem was:<br />Windows - when display scaling is enabled, al_get_mouse_state returns co-ordinates of the unscaled resolution, while the fullscreen window is created using the scaled resolution. This makes cursor being stuck in the upper-left corner of the screen.</p><p>To reproduce this, use ex_mouse with the FULLSCREEN_WINDOW display.</p><p>I&#39;ve finally used a workaround to fix the problem.</p><p>I&#39;ve added a static float DPIMult that is initialized in init_mouse in wmouse.c</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">static</span> <span class="k1">bool</span> init_mouse<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display<span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>  HDC <a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a><span class="k2">;</span>
<span class="number">  6</span>  <span class="k1">int</span> virtualWidth<span class="k2">;</span>
<span class="number">  7</span>  <span class="k1">int</span> physicalWidth<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  <span class="k1">if</span> <span class="k2">(</span>installed<span class="k2">)</span>
<span class="number"> 10</span>     <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 11</span>  
<span class="number"> 12</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_new_display_flags"><span class="a">al_get_new_display_flags</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span> ALLEGRO_FULLSCREEN<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_new_display_flags"><span class="a">al_get_new_display_flags</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span> ALLEGRO_FULLSCREEN_WINDOW<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 13</span>  <span class="k2">{</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a> <span class="k3">=</span> GetDC<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    virtualWidth <span class="k3">=</span> GetDeviceCaps <span class="k2">(</span><a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a>, <span class="n">8</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    physicalWidth <span class="k3">=</span> GetDeviceCaps <span class="k2">(</span><a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a>, <span class="n">118</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    
<span class="number"> 18</span>    <span class="k1">if</span> <span class="k2">(</span>virtualWidth&gt;0<span class="k2">)</span>
<span class="number"> 19</span>      DPIMult <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>physicalWidth <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>virtualWidth<span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">else</span>
<span class="number"> 21</span>      DPIMult <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 22</span>    
<span class="number"> 23</span>    ReleaseDC <span class="k2">(</span><span class="n">0</span>, <a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>  <span class="k2">}</span>
<span class="number"> 25</span>  <span class="k1">else</span>
<span class="number"> 26</span>    DPIMult <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 27</span>
<span class="number"> 28</span>....
</div></div><p>

Then I use this value in generate_mouse_event
</p><div class="source-code snippet"><div class="inner"><pre>   event.mouse.x <span class="k3">=</span> DPIMult<span class="k3">*</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>x<span class="k2">;</span>
   event.mouse.y <span class="k3">=</span> DPIMult<span class="k3">*</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>y<span class="k2">;</span>
</pre></div></div><p>

set_mouse_xy</p><div class="source-code snippet"><div class="inner"><pre>   <span class="k1">if</span> <span class="k2">(</span>dx <span class="k3">|</span><span class="k3">|</span> dy<span class="k2">)</span> <span class="k2">{</span>
      mouse_state.x <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>x<span class="k3">/</span>DPIMult<span class="k2">;</span>
      mouse_state.y <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>y<span class="k3">/</span>DPIMult<span class="k2">;</span>

      generate_mouse_event<span class="k2">(</span>
         ALLEGRO_EVENT_MOUSE_WARPED,
         mouse_state.x, mouse_state.y, mouse_state.z, mouse_state.w,
         dx, dy, <span class="n">0</span>, <span class="n">0</span>,
         <span class="n">0</span>, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>win_disp<span class="k2">)</span><span class="k2">;</span>
   <span class="k2">}</span>
</pre></div></div><p>

and get_mouse_state</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">static</span> <span class="k1">void</span> get_mouse_state<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_MOUSE_STATE"><span class="a">ALLEGRO_MOUSE_STATE</span></a> <span class="k3">*</span>ret_state<span class="k2">)</span>
<span class="k2">{</span>
   _al_event_source_lock<span class="k2">(</span><span class="k3">&amp;</span>the_mouse.es<span class="k2">)</span><span class="k2">;</span>
   <span class="k3">*</span>ret_state <span class="k3">=</span> mouse_state<span class="k2">;</span>
  ret_state-&gt;x <span class="k3">=</span> DPIMult<span class="k3">*</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>mouse_state.x<span class="k2">;</span>
  ret_state-&gt;y <span class="k3">=</span> DPIMult<span class="k3">*</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>mouse_state.y<span class="k2">;</span>
   _al_event_source_unlock<span class="k2">(</span><span class="k3">&amp;</span>the_mouse.es<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

After these modifications it works fine.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Vi_112)</author>
		<pubDate>Thu, 10 Mar 2016 03:19:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Note that I recently made the change that disabled the scaling for Allegro apps to avoid this issue. I&#39;ll try out your fix and see if it fixes it to me, so that if you for some reason <i>want</i> to use scaling, at least it&#39;ll work ok.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Thu, 10 Mar 2016 10:57:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I would better to disable scaling. Where I can find that piece of code? I need to retrofit it into 5.1.9...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Vi_112)</author>
		<pubDate>Fri, 11 Mar 2016 02:27:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is the commit: <a href="https://github.com/liballeg/allegro5/commit/66eb5e9c3482223e6898f4ee5be084d35fc35639">https://github.com/liballeg/allegro5/commit/66eb5e9c3482223e6898f4ee5be084d35fc35639</a></p><p>Also, I&#39;ve been trying to reproduce your OSX fullscreen window issues without much success. Could you tell me what OSX version you were using and if your bug also happened with something like <span class="source-code">ex_projection2</span> example (press space to make it go fullscreen).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Fri, 11 Mar 2016 10:52:49 +0000</pubDate>
	</item>
</rss>
