ÿþ<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>C++ code colored by C++2HTML</title> <meta name="generator" content="C++2HTML by Jasper Bedaux" /> <!-- To generate your own colored code visit http://www.bedaux.net/cpp2html/ --> <style type="text/css"> .comment { color: #999999; font-style: italic; } .pre { color: #000099; } .string { color: #009900; } .char { color: #009900; } .float { color: #996600; } .int { color: #999900; } .bool { color: #000000; font-weight: bold; } .type { color: #FF6633; } .flow { color: #FF0000; } .keyword { color: #990000; } .operator { color: #663300; font-weight: bold; } </style> </head> <body> <pre><span class="pre">#include &lt;stdio.h&gt; #include &lt;sys/select.h&gt; #include &lt;sys/time.h&gt; #include &lt;sys/types.h&gt; #include &lt;sys/stat.h&gt; #include &lt;sys/ioctl.h&gt; #include &lt;fcntl.h&gt; #include &lt;unistd.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;linux/input.h&gt; #include &lt;signal.h&gt; #include &lt;string.h&gt; #include &lt;errno.h&gt; </span><span class="keyword"> static</span><span class="type"> int</span> fd<span class="operator">;</span><span class="keyword"> static</span><span class="type"> int</span> own_dev<span class="operator"> =</span><span class="int"> 1</span><span class="operator">;</span><span class="type"> int</span> grab<span class="operator"> =</span><span class="int"> 1</span><span class="operator">;</span><span class="type"> void</span> catch_signal<span class="operator">(</span><span class="type">int</span> signal<span class="operator">) {</span><span class="flow"> switch</span><span class="operator"> (</span> signal<span class="operator"> ) {</span><span class="flow"> case</span> SIGINT<span class="operator">:</span><span class="comment"> /* release device if needed */</span><span class="flow"> if</span><span class="operator"> (</span> own_dev<span class="operator"> ) {</span> ioctl<span class="operator">(</span>fd<span class="operator">,</span> EVIOCGRAB<span class="operator">,</span> NULL<span class="operator">);</span> own_dev<span class="operator"> =</span><span class="int"> 0</span><span class="operator">; }</span><span class="flow"> else</span><span class="operator"> {</span> ioctl<span class="operator">(</span>fd<span class="operator">,</span> EVIOCGRAB<span class="operator">, &amp;</span>grab<span class="operator">);</span> own_dev<span class="operator"> =</span><span class="int"> 1</span><span class="operator">; }</span><span class="flow"> break</span><span class="operator">;</span><span class="flow"> case</span> SIGSTOP<span class="operator">:</span><span class="flow"> case</span> SIGQUIT<span class="operator">:</span> exit<span class="operator">(</span><span class="int">0</span><span class="operator">);</span><span class="flow"> break</span><span class="operator">; } }</span><span class="type"> int</span><span class="keyword"> main</span><span class="operator">(</span><span class="type">int</span> argc<span class="operator">,</span><span class="type"> char</span><span class="operator"> *</span>argv<span class="operator">[]) {</span> fd_set rfds<span class="operator">;</span><span class="type"> int</span> res<span class="operator">;</span><span class="type"> int</span> version<span class="operator"> = -</span><span class="int">1</span><span class="operator">,</span> ioret<span class="operator"> = -</span><span class="int">1</span><span class="operator">;</span><span class="type"> unsigned</span> numevs<span class="operator">,</span> c<span class="operator">;</span><span class="type"> unsigned char</span> read_buffer<span class="operator">[</span><span class="keyword">sizeof</span><span class="operator">(</span><span class="keyword">struct</span> input_event<span class="operator">)*</span><span class="int">3</span><span class="operator">];</span><span class="comment"> /* max 3 events per read */</span><span class="keyword"> struct</span> input_event<span class="operator"> *</span>currev<span class="operator">;</span><span class="type"> char</span> device_name<span class="operator">[</span><span class="int">1024</span><span class="operator">];</span><span class="keyword"> struct</span> sigaction sighandler<span class="operator">;</span> memset<span class="operator">(&amp;</span>sighandler<span class="operator">,</span><span class="int"> 0</span><span class="operator">,</span><span class="keyword"> sizeof</span><span class="operator">(</span>sighandler<span class="operator">));</span> sighandler<span class="operator">.</span>sa_handler<span class="operator"> =</span> catch_signal<span class="operator">;</span> sigaction<span class="operator">(</span>SIGINT<span class="operator">, &amp;</span>sighandler<span class="operator">,</span> NULL<span class="operator">);</span> sigaction<span class="operator">(</span>SIGQUIT<span class="operator">, &amp;</span>sighandler<span class="operator">,</span> NULL<span class="operator">);</span><span class="flow"> if</span><span class="operator"> (</span> argc<span class="operator"> &lt;</span><span class="int"> 2</span><span class="operator"> ) {</span> fprintf<span class="operator">(</span>stderr<span class="operator">,</span><span class="string"> "Device needed\n"</span><span class="operator">);</span><span class="flow"> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">; }</span> FD_ZERO<span class="operator">(&amp;</span>rfds<span class="operator">);</span> fd<span class="operator"> =</span> open<span class="operator">(</span>argv<span class="operator">[</span><span class="int">1</span><span class="operator">],</span> O_RDONLY<span class="operator">);</span><span class="flow"> if</span><span class="operator"> ( -</span><span class="int">1</span><span class="operator"> ==</span> fd<span class="operator"> ) {</span> fprintf<span class="operator">(</span>stderr<span class="operator">,</span><span class="string"> "unable to read from mice\n"</span><span class="operator">);</span><span class="flow"> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">; }</span> ioret<span class="operator"> =</span> ioctl<span class="operator">(</span>fd<span class="operator">,</span> EVIOCGVERSION<span class="operator">, &amp;</span>version<span class="operator">);</span> ioret<span class="operator"> =</span> ioctl<span class="operator">(</span>fd<span class="operator">,</span> EVIOCGNAME<span class="operator">(</span><span class="keyword">sizeof</span><span class="operator">(</span>device_name<span class="operator">)),</span> device_name<span class="operator">);</span> ioret<span class="operator"> =</span> ioctl<span class="operator">(</span>fd<span class="operator">,</span> EVIOCGRAB<span class="operator">, &amp;</span>grab<span class="operator">);</span><span class="flow"> if</span><span class="operator"> ( -</span><span class="int">1</span><span class="operator"> ==</span> ioret<span class="operator"> ) {</span> perror<span class="operator">(</span><span class="string">"ioctl()"</span><span class="operator">); }</span> fprintf<span class="operator">(</span>stdout<span class="operator">,</span><span class="string"> "ver: %d, ret = %d\n"</span><span class="operator">,</span> version<span class="operator">,</span> ioret<span class="operator">);</span> printf<span class="operator">(</span><span class="string">"device name is: %s\n"</span><span class="operator">,</span> device_name<span class="operator">);</span> FD_SET<span class="operator">(</span>fd<span class="operator">, &amp;</span>rfds<span class="operator">);</span><span class="flow"> while</span><span class="operator"> (</span><span class="int"> 1</span><span class="operator"> ) {</span> res<span class="operator"> =</span> select<span class="operator">(</span>fd<span class="operator"> +</span><span class="int"> 1</span><span class="operator">, &amp;</span>rfds<span class="operator">,</span> NULL<span class="operator">,</span> NULL<span class="operator">,</span> NULL<span class="operator">);</span><span class="flow"> if</span><span class="operator"> ( -</span><span class="int">1</span><span class="operator"> ==</span> res<span class="operator"> &amp;&amp;</span> EINTR<span class="operator"> ==</span> errno<span class="operator"> ) {</span><span class="flow"> continue</span><span class="operator">; }</span><span class="flow"> if</span><span class="operator"> ( -</span><span class="int">1</span><span class="operator"> ==</span> res<span class="operator"> ) {</span> perror<span class="operator">(</span><span class="string">"select() failed"</span><span class="operator">);</span> fprintf<span class="operator">(</span>stderr<span class="operator">,</span><span class="string"> "failed to select, fd is %d\n"</span><span class="operator">,</span> fd<span class="operator">);</span><span class="flow"> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">; }</span><span class="flow"> if</span><span class="operator"> (</span> FD_ISSET<span class="operator">(</span>fd<span class="operator">, &amp;</span>rfds<span class="operator">) ) {</span> fprintf<span class="operator">(</span>stdout<span class="operator">,</span><span class="string"> "got some data\n"</span><span class="operator">);</span> res<span class="operator"> =</span> read<span class="operator">(</span>fd<span class="operator">,</span> read_buffer<span class="operator">,</span><span class="keyword"> sizeof</span><span class="operator">(</span>read_buffer<span class="operator">));</span><span class="flow"> if</span><span class="operator"> ( -</span><span class="int">1</span><span class="operator"> ==</span> res<span class="operator">) {</span> fprintf<span class="operator">(</span>stderr<span class="operator">,</span><span class="string"> "error reading data\n"</span><span class="operator">);</span><span class="flow"> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">; }</span> fprintf<span class="operator">(</span>stdout<span class="operator">,</span><span class="string"> "got %d bytes\n"</span><span class="operator">,</span> res<span class="operator">);</span> numevs<span class="operator"> = (</span> res<span class="operator"> /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="keyword">struct</span> input_event<span class="operator">) );</span><span class="comment"> /* get how many input events we got */</span> fprintf<span class="operator">(</span>stdout<span class="operator">,</span><span class="string"> "got %u events\n"</span><span class="operator">,</span> numevs<span class="operator">);</span><span class="flow"> for</span><span class="operator"> (</span> c<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span> c<span class="operator"> &lt;</span> numevs<span class="operator">;</span> c<span class="operator">++ ) {</span> currev<span class="operator"> = (</span><span class="keyword">struct</span> input_event<span class="operator"> *)(</span>read_buffer<span class="operator"> + (</span><span class="keyword">sizeof</span><span class="operator">(</span><span class="keyword">struct</span> input_event<span class="operator">) *</span> c<span class="operator">));</span> fprintf<span class="operator">(</span>stdout<span class="operator">,</span><span class="string"> "event time %ld/%ld\n"</span><span class="operator">,</span> currev<span class="operator">-&gt;</span>time<span class="operator">.</span>tv_sec<span class="operator">,</span> currev<span class="operator">-&gt;</span>time<span class="operator">.</span>tv_usec<span class="operator">);</span> fprintf<span class="operator">(</span>stdout<span class="operator">,</span><span class="string"> "event type = %hd, code = %hd, value = %d\n"</span><span class="operator">,</span> currev<span class="operator">-&gt;</span>type<span class="operator">,</span> currev<span class="operator">-&gt;</span>code<span class="operator">,</span> currev<span class="operator">-&gt;</span>value<span class="operator">); } }</span><span class="flow"> else</span><span class="operator"> {</span> fprintf<span class="operator">(</span>stderr<span class="operator">,</span><span class="string"> "odd ... no data and we only listen in 1 fd\n"</span><span class="operator">); } }</span><span class="flow"> return</span><span class="int"> 0</span><span class="operator">; }</span> </pre> </body> </html>