<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Paulo Matias &#187; NetBSD</title>
	<atom:link href="http://matias.archlinux-br.org/archives/category/computacao/software/sistemas-operacionais/bsd/netbsd/feed" rel="self" type="application/rss+xml" />
	<link>http://matias.archlinux-br.org</link>
	<description>Um blog? O.o</description>
	<lastBuildDate>Sun, 31 Jan 2010 18:32:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Instalando o NetBSD 4 em uma Sun Ultra 1</title>
		<link>http://matias.archlinux-br.org/archives/225</link>
		<comments>http://matias.archlinux-br.org/archives/225#comments</comments>
		<pubDate>Thu, 14 Aug 2008 02:02:54 +0000</pubDate>
		<dc:creator>Paulo Matias</dc:creator>
				<category><![CDATA[NetBSD]]></category>

		<guid isPermaLink="false">http://matias.archlinux-br.org/?p=225</guid>
		<description><![CDATA[Este semestre, estou cursando a disciplina de Arquitetura de Computadores II. Alguns dos trabalhos exigidos nessa disciplina são programas escritos em Assembly para arquitetura SPARC64. Como havia uma estação Sun Ultra 1 aposentada nos armários da sala onde trabalho na faculdade, resolvi ressuscitá-la. Afinal, é bem mais legal usar um hardware real do que um [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sun.com"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/logo-sun.jpg" alt="" title="Foto do logotipo da Sun no gabinete do Sun Ultra 1" width="174" height="66" class="alignnone size-full wp-image-231" /></a> <a href="http://en.wikipedia.org/wiki/Ultra_1"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/logo-ultra1.jpg" alt="" title="Foto do logotipo ULTRA 1 no gabinete do Sun Ultra 1" width="222" height="66" class="alignnone size-full wp-image-228" /></a> <a href="http://www.netbsd.org"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/netbsd.png" alt="" title="NetBSD" width="88" height="66" class="alignnone size-medium wp-image-234" /></a></p>
<p>Este semestre, estou cursando a disciplina de <em>Arquitetura de Computadores II</em>. Alguns dos trabalhos exigidos nessa disciplina são programas escritos em Assembly para arquitetura SPARC64.</p>
<p>Como havia uma estação Sun Ultra 1 aposentada nos armários da sala onde trabalho na faculdade, resolvi ressuscitá-la. Afinal, é bem mais legal usar um hardware real do que um emulador.</p>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0025.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0025-225x300.jpg" alt="" title="Workstation Sun Ultra1 na bancada" width="225" height="300" class="aligncenter size-medium wp-image-236" /></a></p>
<p>Neste artigo, conto passo-a-passo como instalei o NetBSD 4 na estação Sun Ultra 1, indicando os problemas que enfrentei e suas soluções.</p>
<p><span id="more-225"></span></p>
<p>Primeiramente, peço que levem em conta que eu nunca usei hardware da Sun antes, então por favor não me xinguem caso existam maneiras mais adequadas de se fazer o que eu fiz.</p>
<p><strong>Baixando o CD de instalação</strong></p>
<p>Antes de tudo, você vai precisar do CD de instalação do NetBSD. Eu recomendo que você baixe do diretório <a href="ftp://ftp.netbsd.org/pub/NetBSD-daily/netbsd-4/">NetBSD-daily/netbsd-4</a> do ftp, pois ele já contém patches corrigindo falhas de segurança que tenham sido encontradas desde o lançamento do NetBSD.</p>
<p>Entre <a href="ftp://ftp.netbsd.org/pub/NetBSD-daily/netbsd-4/">aqui</a>, e você verá cerca de quatro diretórios, nomeados por data. Dentro de cada um deles, há um diretório <code>iso</code>, que contém as imagens iso para gravar em CD para cada arquitetura. A imagem destinada à arquitetura SPARC64 se chama <code>sparc64cd.iso</code>.</p>
<p>Por exemplo, eu baixei a imagem que utilizei <a href="ftp://ftp.netbsd.org/pub/NetBSD-daily/netbsd-4/200808080002Z/iso/sparc64cd.iso">deste link</a>. Provavelmente esse link não vai mais funcionar quando você estiver lendo este artigo, pois eles sempre apagam os diretórios antigos, e criam diretórios mais novos. Portanto, verifique onde baixar a imagem do modo como descrevi acima.</p>
<p><strong>Atenção</strong>: Se não encontrar essa imagem em algum dos diretórios, não se desespere. Tente procurar no diretório correspondente a um dia anterior. Às vezes, por algum motivo, a compilação para alguma das plataformas falha, e a imagem não aparece no diretório de alguma das datas.</p>
<p><strong>Inicializando o sistema pelo CD-ROM</strong></p>
<p>A primeira coisa que você nota ao ligar uma estação da Sun é o OpenFirmware. É ele que carrega o seu sistema operacional. Ele seria semelhante à BIOS de um computador de arquitetura x86 convencional, mas é claro, o OpenFirmware é bem mais completo, e inclui até mesmo uma mini-linguagem de programação.</p>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0016.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0016-300x225.jpg" alt="" title="Tela de boot da estação Sun Ultra 1" width="300" height="225" class="alignnone size-medium wp-image-241" /></a></p>
<p>Dependendo de como o OpenFirmware estiver configurado, ele pode parar em um prompt por alguns segundos, ou então inicializar diretamente o sistema operacional.</p>
<p>Para fazer com que o OpenFirmware pare e lhe forneça uma linha de comando, aperte a combinação de teclas <code>STOP + A</code> logo após ligar a máquina. A tecla <code>STOP</code> costuma ficar naquele conjunto de teclas mais à esquerda do teclado.</p>
<p>A linha de comando do OpenFirmware exibe a palavra <code>ok</code> e fica esperando por um comando. Para consultar a ajuda, como você poderia adivinhar, o comando utilizado é <code>help</code>.</p>
<p>O comando utilizado para inicializar pelo CD-ROM é o <code>boot cdrom</code>. Coloque o CD do NetBSD no drive e entre com esse comando. O sistema começará imediatamente a inicializar o CD de instalação.</p>
<p><strong>Instalando o NetBSD</strong></p>
<p>Durante a inicialização do instalador, ele vai perguntar qual o tipo de teclado que você possui. No meu caso, apenas apertei <code>ENTER</code> para usar a opção padrão (teclado do tipo <code>sun</code>), que funcionou sem problemas.</p>
<p>Em seguida, basta seguir as instruções da tela. Aqui eu realizei uma <code>Full installation</code>, usando o primeiro HD inteiro (a máquina possuía dois HDs SCSI), e criando duas partições, uma para o <code>/</code>, e outra para a <code>swap</code>.</p>
<p>Maiores detalhes sobre o procedimento de instalação podem ser encontrados na <a href="http://www.netbsd.org/docs/guide/en/chap-exinst.html">documentação oficial do NetBSD</a>, mas o processo é simples e você não deverá enfrentar quaisquer problemas.</p>
<p><strong>Primeiro boot</strong></p>
<p>Ao final da instalação, selecione <code>Reboot the computer</code>. O sistema reinicializará, e o OpenFirmware passará a carregar o NetBSD imediatamente. Você já pode tirar o CD do drive.</p>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0030.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0030-225x300.jpg" alt="" title="Inicialização do NetBSD no Sun Ultra 1" width="225" height="300" class="alignnone size-medium wp-image-252" /></a></p>
<p><strong>Problemas no primeiro boot</strong></p>
<p>Entretanto, enfrentei um problema logo durante a primeira inicialização. O NetBSD montava o sistema de arquivos como somente leitura, e aparecia durante o boot a seguinte mensagem:</p>
<pre class="text">mount_ffs: /dev/sd0a on /: specified device does not match mounted device.</pre>
<p>A mensagem pode ser vista na foto abaixo:</p>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0015.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0015-225x300.jpg" alt="" title="Mensagem de erro durante o primeiro boot" width="225" height="300" class="alignnone size-medium wp-image-255" /></a></p>
<p>Prestando mais atenção às mensagens de inicialização, principalmente às mostradas pelo <code>dmesg</code>, percebi as seguintes duas linhas:</p>
<pre class="text">&nbsp;
root on sd0c dumps on sd0b
root file system type: ffs
&nbsp;</pre>
<p>Ao ler isso, percebi que era o <code>/dev/sd0c</code> que estava sendo montado como root inicialmente pelo kernel, e não <code>/dev/sd0a</code>. Não sei por qual motivo isso ocorreu, mas a solução foi simples - editar o <code>/etc/fstab</code> e corrigir o dispositivo.</p>
<p>Se este problema acontecer com você, primeiramente faça login como root para corrigi-lo. Monte o <code>/</code> manualmente para escrita utilizando o seguinte comando:</p>
<pre class="bash">mount_ffs -o rw /dev/sd0c /</pre>
<p>Agora você pode editar o <code>/etc/fstab</code>:</p>
<pre class="bash">vi /etc/fstab</pre>
<p>Aqui, eu troquei o <code>/dev/sd0a</code> pelo <code>/dev/sd0c</code>. Após as modificações, meu <code>/etc/fstab</code> ficou com o seguinte conteúdo:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># NetBSD /etc/fstab</span>
<span style="color: #808080; font-style: italic;"># See /usr/share/examples/fstab/ for more examples.</span>
/dev/sd0c               /       ffs     rw               <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">1</span>
/dev/sd0b               none    swap    sw               <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
kernfs          /kern   kernfs  rw
procfs          /proc   procfs  rw,noauto</pre>
<p>Isso resolveu completamente o problema, e no próximo boot o NetBSD já montou o sistema de arquivos para leitura e escrita.</p>
<p><strong>Configurando o X</strong></p>
<p>Aqui o X não se configurou automaticamente. Constava o seguinte erro nos logs do X:</p>
<pre class="text">SUNCG6(0): Given depth (16) is not supported by this drive</pre>
<p>Pesquisando pela Internet, vi relatos de que isso era comum, mesmo com o Xorg e com outros sistemas operacionais. Era necessário criar um arquivo de configuração para o X especificando a profundidade de cores desejada com a opção <code>DefaultDepth</code>.</p>
<p>Segue uma cópia exata de meu <code>/etc/X11/XF86Config</code>, para referência:</p>
<pre class="python">Section <span style="color: #483d8b;">&quot;ServerLayout&quot;</span>
        Identifier     <span style="color: #483d8b;">&quot;XFree86 Configured&quot;</span>
        Screen      <span style="color: #ff4500;">0</span>  <span style="color: #483d8b;">&quot;Screen0&quot;</span> <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
        InputDevice    <span style="color: #483d8b;">&quot;Mouse0&quot;</span> <span style="color: #483d8b;">&quot;CorePointer&quot;</span>
        InputDevice    <span style="color: #483d8b;">&quot;Keyboard0&quot;</span> <span style="color: #483d8b;">&quot;CoreKeyboard&quot;</span>
EndSection
&nbsp;
Section <span style="color: #483d8b;">&quot;Files&quot;</span>
        RgbPath      <span style="color: #483d8b;">&quot;/usr/X11R6/lib/X11/rgb&quot;</span>
        ModulePath   <span style="color: #483d8b;">&quot;/usr/X11R6/lib/modules&quot;</span>
        FontPath     <span style="color: #483d8b;">&quot;/usr/X11R6/lib/X11/fonts/misc/&quot;</span>
        FontPath     <span style="color: #483d8b;">&quot;/usr/X11R6/lib/X11/fonts/Speedo/&quot;</span>
        FontPath     <span style="color: #483d8b;">&quot;/usr/X11R6/lib/X11/fonts/Type1/&quot;</span>
        FontPath     <span style="color: #483d8b;">&quot;/usr/X11R6/lib/X11/fonts/CID/&quot;</span>
        FontPath     <span style="color: #483d8b;">&quot;/usr/X11R6/lib/X11/fonts/75dpi/&quot;</span>
        FontPath     <span style="color: #483d8b;">&quot;/usr/X11R6/lib/X11/fonts/100dpi/&quot;</span>
EndSection
Section <span style="color: #483d8b;">&quot;Module&quot;</span>
        Load  <span style="color: #483d8b;">&quot;extmod&quot;</span>
        Load  <span style="color: #483d8b;">&quot;glx&quot;</span>
        Load  <span style="color: #483d8b;">&quot;dbe&quot;</span>
        Load  <span style="color: #483d8b;">&quot;record&quot;</span>
        Load  <span style="color: #483d8b;">&quot;xtrap&quot;</span>
        Load  <span style="color: #483d8b;">&quot;type1&quot;</span>
        Load  <span style="color: #483d8b;">&quot;speedo&quot;</span>
EndSection
Section <span style="color: #483d8b;">&quot;InputDevice&quot;</span>
        Identifier  <span style="color: #483d8b;">&quot;Keyboard0&quot;</span>
        Driver      <span style="color: #483d8b;">&quot;kbd&quot;</span>
        Option      <span style="color: #483d8b;">&quot;Protocol&quot;</span> <span style="color: #483d8b;">&quot;wskbd&quot;</span>
        Option      <span style="color: #483d8b;">&quot;Device&quot;</span> <span style="color: #483d8b;">&quot;/dev/wskbd&quot;</span>
EndSection
&nbsp;
Section <span style="color: #483d8b;">&quot;InputDevice&quot;</span>
        Identifier  <span style="color: #483d8b;">&quot;Mouse0&quot;</span>
        Driver      <span style="color: #483d8b;">&quot;mouse&quot;</span>
        Option      <span style="color: #483d8b;">&quot;Protocol&quot;</span> <span style="color: #483d8b;">&quot;wsmouse&quot;</span>
        Option      <span style="color: #483d8b;">&quot;Device&quot;</span> <span style="color: #483d8b;">&quot;/dev/wsmouse&quot;</span>
EndSection
&nbsp;
Section <span style="color: #483d8b;">&quot;Monitor&quot;</span>
        Identifier   <span style="color: #483d8b;">&quot;Monitor0&quot;</span>
        VendorName   <span style="color: #483d8b;">&quot;Monitor Vendor&quot;</span>
        ModelName    <span style="color: #483d8b;">&quot;Monitor Model&quot;</span>
        HorizSync    <span style="color: #ff4500;">29</span><span style="color: #ff4500;">-85</span>
        VertRefresh  <span style="color: #ff4500;">50</span><span style="color: #ff4500;">-150</span>
        Option       <span style="color: #483d8b;">&quot;DPMS&quot;</span>
EndSection
&nbsp;
Section <span style="color: #483d8b;">&quot;Device&quot;</span>
        <span style="color: #808080; font-style: italic;">### Available Driver options are:-</span>
        <span style="color: #808080; font-style: italic;">### Values: &lt;i&gt;: integer, &lt;f&gt;: float, &lt;bool&gt;: &quot;True&quot;/&quot;False&quot;,</span>
        <span style="color: #808080; font-style: italic;">### &lt;string&gt;: &quot;String&quot;, &lt;freq&gt;: &quot;&lt;f&gt; Hz/kHz/MHz&quot;</span>
        <span style="color: #808080; font-style: italic;">### [arg]: arg optional</span>
        <span style="color: #808080; font-style: italic;">#Option     &quot;SWcursor&quot;                  # [&lt;bool&gt;]</span>
        <span style="color: #808080; font-style: italic;">#Option     &quot;HWcursor&quot;                  # [&lt;bool&gt;]</span>
        <span style="color: #808080; font-style: italic;">#Option     &quot;NoAccel&quot;                   # [&lt;bool&gt;]</span>
        Identifier  <span style="color: #483d8b;">&quot;Card0&quot;</span>
        Driver      <span style="color: #483d8b;">&quot;suncg6&quot;</span>
        BusID       <span style="color: #483d8b;">&quot;SBUS:fb0&quot;</span>
        Option      <span style="color: #483d8b;">&quot;UseFBDev&quot;</span>  <span style="color: #483d8b;">&quot;True&quot;</span>
EndSection
&nbsp;
Section <span style="color: #483d8b;">&quot;Screen&quot;</span>
        Identifier <span style="color: #483d8b;">&quot;Screen0&quot;</span>
        Device     <span style="color: #483d8b;">&quot;Card0&quot;</span>
        Monitor    <span style="color: #483d8b;">&quot;Monitor0&quot;</span>
        DefaultDepth   <span style="color: #ff4500;">8</span>
        SubSection <span style="color: #483d8b;">&quot;Display&quot;</span>
                Viewport   <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
                Depth     <span style="color: #ff4500;">1</span>
                Modes     <span style="color: #483d8b;">&quot;1024x768&quot;</span>  <span style="color: #483d8b;">&quot;800x600&quot;</span>  <span style="color: #483d8b;">&quot;640x480&quot;</span>
        EndSubSection
        SubSection <span style="color: #483d8b;">&quot;Display&quot;</span>
                Viewport   <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
                Depth     <span style="color: #ff4500;">4</span>
                Modes     <span style="color: #483d8b;">&quot;1024x768&quot;</span>  <span style="color: #483d8b;">&quot;800x600&quot;</span>  <span style="color: #483d8b;">&quot;640x480&quot;</span>
        EndSubSection
        SubSection <span style="color: #483d8b;">&quot;Display&quot;</span>
                Viewport   <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
                Depth     <span style="color: #ff4500;">8</span>
                Modes     <span style="color: #483d8b;">&quot;1024x768&quot;</span>  <span style="color: #483d8b;">&quot;800x600&quot;</span>  <span style="color: #483d8b;">&quot;640x480&quot;</span>
        EndSubSection
        SubSection <span style="color: #483d8b;">&quot;Display&quot;</span>
                Viewport   <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
                Depth     <span style="color: #ff4500;">15</span>
                Modes     <span style="color: #483d8b;">&quot;1024x768&quot;</span>  <span style="color: #483d8b;">&quot;800x600&quot;</span>  <span style="color: #483d8b;">&quot;640x480&quot;</span>
        EndSubSection
        SubSection <span style="color: #483d8b;">&quot;Display&quot;</span>
                Viewport   <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
                Depth     <span style="color: #ff4500;">16</span>
                Modes     <span style="color: #483d8b;">&quot;1024x768&quot;</span>  <span style="color: #483d8b;">&quot;800x600&quot;</span>  <span style="color: #483d8b;">&quot;640x480&quot;</span>
        EndSubSection
        SubSection <span style="color: #483d8b;">&quot;Display&quot;</span>
                Viewport   <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span>
                Depth     <span style="color: #ff4500;">24</span>
                Modes     <span style="color: #483d8b;">&quot;1024x768&quot;</span>  <span style="color: #483d8b;">&quot;800x600&quot;</span>  <span style="color: #483d8b;">&quot;640x480&quot;</span>
        EndSubSection
EndSection
&nbsp;</pre>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0023.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0023-300x225.jpg" alt="" title="xterm rodando o top" width="300" height="225" class="alignnone size-medium wp-image-275" /></a></p>
<p><strong>Conclusão</strong></p>
<p>A Sun Ultra 1 é uma máquina muito interessante. Se você tem uma dessas encostada, realmente vale a pena colocá-la para funcionar. As últimas versões do NetBSD rodam muito bem nela.</p>
<p><strong>Mais fotos</strong></p>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0018.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0018-150x150.jpg" alt="" title="Gabinete da Sun Ultra 1" width="150" height="150" class="alignnone size-thumbnail wp-image-277" /></a> <a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0020.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0020-150x150.jpg" alt="" title="Tela de login do NetBSD na Sun Ultra 1" width="150" height="150" class="alignnone size-thumbnail wp-image-278" /></a></p>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0021.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0021-150x150.jpg" alt="" title="Welcome to NetBSD" width="150" height="150" class="alignnone size-thumbnail wp-image-279" /></a> <a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0029.jpg"><img src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0029-150x150.jpg" alt="" title="Conectado em rede no xterm" width="150" height="150" class="alignnone size-thumbnail wp-image-280" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://matias.archlinux-br.org/archives/225/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Driver para Hand Pad USB chinês</title>
		<link>http://matias.archlinux-br.org/archives/153</link>
		<comments>http://matias.archlinux-br.org/archives/153#comments</comments>
		<pubDate>Tue, 05 Aug 2008 01:23:16 +0000</pubDate>
		<dc:creator>Paulo Matias</dc:creator>
				<category><![CDATA[BSD]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NetBSD]]></category>

		<guid isPermaLink="false">http://matias.archlinux-br.org/?p=153</guid>
		<description><![CDATA[Comprei um Hand Pad USB chinês Cypress PenPower Touchpad "7th generation" (equipamento semelhante a uma mesa digitalizadora, porém mais barato) no Deal Extreme, com intenção de dá-lo de presente à minha namorada. Mas antes, é claro, era necessário fazer um driver do mesmo para usá-lo no X11. Procurando pelo ID 04b4:fef3 do dispositivo no Google, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0014.jpg"><img class="alignnone size-thumbnail wp-image-173" style="float:left; padding:7px;" title="Hand Pad USB chinês" src="http://matias.archlinux-br.org/wp-content/uploads/2008/08/foto-0014-150x150.jpg" alt="" width="150" height="150" /></a> Comprei um Hand Pad USB chinês Cypress PenPower Touchpad "7th generation" (equipamento semelhante a uma mesa digitalizadora, porém mais barato) no <a href="http://www.dealextreme.com/details.dx/sku.621">Deal Extreme</a>, com intenção de dá-lo de presente à minha namorada. Mas antes, é claro, era necessário fazer um driver do mesmo para usá-lo no X11.</p>
<p>Procurando pelo ID <code>04b4:fef3</code> do dispositivo no Google, encontrei um driver escrito pelo usuário migg de um <a href="http://www.linuxquestions.org/questions/showthread.php?p=3145964#post3145964">fórum</a>.</p>
<p>Entretanto, esse driver não tratava corretamente os botões do Hand Pad, exigia configuração manual no código e só rodava em Linux. Então reescrevi o driver com diversas melhorias - suporte aos botões do handpad, procedimento de calibração e suporte a NetBSD, OpenBSD e FreeBSD.</p>
<p>Segue o código do driver, que na verdade é um programa que deve ser deixado rodando para receber os eventos do Hand Pad e repassá-los ao X.</p>
<p><span id="more-153"></span></p>
<pre class="c">&nbsp;
<span style="color: #808080; font-style: italic;">/* Chinese USB Hand Pad (PenPower Touchpad) Driver
 *   for NetBSD, OpenBSD, FreeBSD and Linux.
 *
 * This driver was tested with the 7th generation handpad (04b4:fef3).
 *
 * To compile, call:
 *
 *   gcc -O2 -o handpadd handpadd.c -lX11 -lXtst -I/usr/X11R6/include \
 *      -L/usr/X11R6/lib -R/usr/X11R6/lib
 *
 * Then call it to calibrate your handpad:
 *
 *   ./handpadd -c
 *
 * Follow the instructions. It will output the command line options
 * you should use to call handpadd to get the correct calibration.
 *
 * Run handpadd with the given command line options every time you
 * want to use your handpad as a mouse in X11.
 */</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*-
 * Copyright (c) 2008 Paulo Matias
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Thanks for migg from linuxquestions.org for writing an earlier
 * driver, from which I got some ideas.
 * http://www.linuxquestions.org/questions/showthread.php?p=3145964
 */</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdint.h&gt;</span>
<span style="color: #339933;">#include &lt;stddef.h&gt;</span>
<span style="color: #339933;">#include &lt;assert.h&gt;</span>
<span style="color: #339933;">#include &lt;fcntl.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/types.h&gt;</span>
&nbsp;
<span style="color: #339933;">#include &lt;X11/extensions/XTest.h&gt;</span>
&nbsp;
<span style="color: #339933;">#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__)</span>
<span style="color: #339933;">#	define BSD</span>
<span style="color: #339933;">#else</span>
<span style="color: #339933;">#	if defined(__linux__)</span>
<span style="color: #339933;">#		define LINUX</span>
<span style="color: #339933;">#	else</span>
<span style="color: #339933;">#		error &quot;Your operating system is not supported.&quot;</span>
<span style="color: #339933;">#	endif</span>
<span style="color: #339933;">#endif</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #66cc66;">&#123;</span>
	uint16_t pos_x;
	uint16_t pos_y;
	<span style="color: #993333;">int</span> btn_right;
	<span style="color: #993333;">int</span> btn_left;
	<span style="color: #993333;">int</span> btn_middle;
	<span style="color: #993333;">int</span> pen_on;
<span style="color: #66cc66;">&#125;</span> packet_t;
&nbsp;
<span style="color: #339933;">#if defined(BSD)</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> read_pkt<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> fd, packet_t *pkt<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	uint8_t buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#93;</span>;
	uint8_t flags;
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>read<span style="color: #66cc66;">&#40;</span>fd, buf, <span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &lt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
&nbsp;
	pkt-&gt;pos_x = buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> | <span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> &lt;&lt; <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span>;
	pkt-&gt;pos_y = buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span> | <span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span> &lt;&lt; <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	flags = buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#93;</span>;
&nbsp;
	pkt-&gt;btn_right  = <span style="color: #66cc66;">&#40;</span>flags &amp; <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> &lt;&lt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
	pkt-&gt;btn_left   = <span style="color: #66cc66;">&#40;</span>flags &amp; <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> &lt;&lt; <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
	pkt-&gt;btn_middle = <span style="color: #66cc66;">&#40;</span>flags &amp; <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> &lt;&lt; <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
	pkt-&gt;pen_on     = <span style="color: #66cc66;">&#40;</span>flags &amp; <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> &lt;&lt; <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">1</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #339933;">#endif</span>
&nbsp;
<span style="color: #339933;">#if defined(LINUX)</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> read_pkt<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> fd, packet_t *pkt<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	uint32_t buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#93;</span>;
	ssize_t sz;
&nbsp;
	<span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sz = read<span style="color: #66cc66;">&#40;</span>fd, buf, <span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> != <span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>sz == <span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	pkt-&gt;pos_x = buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>;
	pkt-&gt;pos_y = buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span>;
&nbsp;
	pkt-&gt;btn_right  = buf<span style="color: #66cc66;">&#91;</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#93;</span> &gt; <span style="color: #cc66cc;">0</span>;
	pkt-&gt;btn_left   = buf<span style="color: #66cc66;">&#91;</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#93;</span> &gt; <span style="color: #cc66cc;">0</span>;
	pkt-&gt;btn_middle = buf<span style="color: #66cc66;">&#91;</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#93;</span> &gt; <span style="color: #cc66cc;">0</span>;
	pkt-&gt;pen_on     = buf<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#93;</span> &gt; <span style="color: #cc66cc;">0</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">1</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #339933;">#endif</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> parse_geometry<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span> *geom, uint16_t *x, uint16_t *y, uint16_t *w, uint16_t *h<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #993333;">char</span> *s;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>s = strtok<span style="color: #66cc66;">&#40;</span>geom, <span style="color: #ff0000;">&quot;x&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
	*x = atoi<span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>s = strtok<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, <span style="color: #ff0000;">&quot;+&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
	*y = atoi<span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>s = strtok<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, <span style="color: #ff0000;">&quot;+&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>*w = atoi<span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>s = strtok<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>*h = atoi<span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">1</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> usage<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> *cmd<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;usage: %s [-c] [-g XxY+W+H] [-d /dev/uhidN]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cmd<span style="color: #66cc66;">&#41;</span>;
	fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;       -c  Execute tablet calibration procedure.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
	fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;       -g  Set tablet geometry setting.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
	fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;       -d  Set device path.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
	exit<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> calibration<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> fd, uint16_t *x, uint16_t *y, uint16_t *w, uint16_t *h<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #993333;">int</span> evt_count;
	packet_t pkt;
&nbsp;
	*x = *y = <span style="color: #cc66cc;">0</span>;
	*w = *h = 0xffff;
&nbsp;
	fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;** Calibration<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	evt_count = <span style="color: #cc66cc;">15</span>;
	fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;-&gt; Please tap the top left corner<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span>--evt_count &amp;&amp; read_pkt<span style="color: #66cc66;">&#40;</span>fd, &amp;pkt<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!pkt.<span style="color: #202020;">pen_on</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #b1b100;">continue</span>;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pkt.<span style="color: #202020;">pos_x</span> &lt; *x<span style="color: #66cc66;">&#41;</span> || <span style="color: #66cc66;">&#40;</span>*x == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			*x = pkt.<span style="color: #202020;">pos_x</span>;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pkt.<span style="color: #202020;">pos_y</span> &lt; *y<span style="color: #66cc66;">&#41;</span> || <span style="color: #66cc66;">&#40;</span>*y == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			*y = pkt.<span style="color: #202020;">pos_y</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
        evt_count = <span style="color: #cc66cc;">15</span>;
        fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;-&gt; Please tap the bottom right corner<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span>--evt_count &amp;&amp; read_pkt<span style="color: #66cc66;">&#40;</span>fd, &amp;pkt<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!pkt.<span style="color: #202020;">pen_on</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #b1b100;">continue</span>;
                <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pkt.<span style="color: #202020;">pos_x</span> &gt; *w<span style="color: #66cc66;">&#41;</span> || <span style="color: #66cc66;">&#40;</span>*w == 0xffff<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                        *w = pkt.<span style="color: #202020;">pos_x</span>;
                <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pkt.<span style="color: #202020;">pos_y</span> &gt; *h<span style="color: #66cc66;">&#41;</span> || <span style="color: #66cc66;">&#40;</span>*h == 0xffff<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                        *h = pkt.<span style="color: #202020;">pos_y</span>;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
	*w -= *x;
	*h -= *y;
&nbsp;
	fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;** Calibration complete<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> argc, <span style="color: #993333;">char</span> **argv<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	Display *dpy;
&nbsp;
	<span style="color: #993333;">int</span> fd;
	packet_t pkt;
&nbsp;
	<span style="color: #993333;">int</span>	state_left   = <span style="color: #cc66cc;">0</span>,
		state_middle = <span style="color: #cc66cc;">0</span>,
		state_right  = <span style="color: #cc66cc;">0</span>;
&nbsp;
	<span style="color: #993333;">int</span> screen_width, screen_height;
	uint16_t pad_x = <span style="color: #cc66cc;">216</span>, pad_y = <span style="color: #cc66cc;">272</span>, pad_w = <span style="color: #cc66cc;">966</span>, pad_h = <span style="color: #cc66cc;">1052</span>;
&nbsp;
	<span style="color: #993333;">int</span> do_calibration = <span style="color: #cc66cc;">0</span>;
&nbsp;
<span style="color: #339933;">#if defined(BSD)</span>
	<span style="color: #993333;">char</span> *dev_name = <span style="color: #ff0000;">&quot;/dev/uhid0&quot;</span>;
<span style="color: #339933;">#endif</span>
<span style="color: #339933;">#if defined(LINUX)</span>
	<span style="color: #993333;">char</span> *dev_name = <span style="color: #ff0000;">&quot;/dev/usb/hiddev0&quot;</span>;
<span style="color: #339933;">#endif</span>
&nbsp;
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">char</span> *optarg;
		<span style="color: #993333;">char</span> ch;
&nbsp;
		<span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>ch = getopt<span style="color: #66cc66;">&#40;</span>argc, argv, <span style="color: #ff0000;">&quot;cg:d:&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> != <span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">switch</span><span style="color: #66cc66;">&#40;</span>ch<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'c'</span>:
				do_calibration = <span style="color: #cc66cc;">1</span>;
				<span style="color: #000000; font-weight: bold;">break</span>;
			<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'g'</span>:
				<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!parse_geometry<span style="color: #66cc66;">&#40;</span>optarg, &amp;pad_x, &amp;pad_y, &amp;pad_w, &amp;pad_h<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;invalid geometry string.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
					usage<span style="color: #66cc66;">&#40;</span>argv<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				<span style="color: #000000; font-weight: bold;">break</span>;
			<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'d'</span>:
				dev_name = optarg;
				<span style="color: #000000; font-weight: bold;">break</span>;
			<span style="color: #b1b100;">default</span>:
				usage<span style="color: #66cc66;">&#40;</span>argv<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	assert<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>dpy = XOpenDisplay<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> != <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;
	assert<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>fd = open<span style="color: #66cc66;">&#40;</span>dev_name, O_RDONLY<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &gt;= <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333;">int</span> screen = DefaultScreen<span style="color: #66cc66;">&#40;</span>dpy<span style="color: #66cc66;">&#41;</span>;
		screen_width  = XDisplayWidth <span style="color: #66cc66;">&#40;</span>dpy, screen<span style="color: #66cc66;">&#41;</span>;
		screen_height = XDisplayHeight<span style="color: #66cc66;">&#40;</span>dpy, screen<span style="color: #66cc66;">&#41;</span>;
<span style="color: #339933;">#if defined(DEBUG)</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;screen dimensions: %dx%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, screen_width, screen_height<span style="color: #66cc66;">&#41;</span>;
<span style="color: #339933;">#endif</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>do_calibration<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		calibration<span style="color: #66cc66;">&#40;</span>fd, &amp;pad_x, &amp;pad_y, &amp;pad_w, &amp;pad_h<span style="color: #66cc66;">&#41;</span>;
		fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>From now on, call %s as follows:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, argv<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;   %s -g '%dx%d+%d+%d'<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, argv<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>, pad_x, pad_y, pad_w, pad_h<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span>read_pkt<span style="color: #66cc66;">&#40;</span>fd, &amp;pkt<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #339933;">#if defined(DEBUG)</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;x=%5u, y=%5u, l=%d, m=%d, r=%d, p=%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
			pkt.<span style="color: #202020;">pos_x</span>, pkt.<span style="color: #202020;">pos_y</span>,
			pkt.<span style="color: #202020;">btn_left</span>, pkt.<span style="color: #202020;">btn_middle</span>, pkt.<span style="color: #202020;">btn_right</span>,
			pkt.<span style="color: #202020;">pen_on</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #339933;">#endif</span>
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>pkt.<span style="color: #202020;">pen_on</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			XTestFakeMotionEvent<span style="color: #66cc66;">&#40;</span>dpy, <span style="color: #cc66cc;">-1</span>,
				<span style="color: #66cc66;">&#40;</span>pkt.<span style="color: #202020;">pos_x</span> - pad_x<span style="color: #66cc66;">&#41;</span>*screen_width /pad_w,
				<span style="color: #66cc66;">&#40;</span>pkt.<span style="color: #202020;">pos_y</span> - pad_y<span style="color: #66cc66;">&#41;</span>*screen_height/pad_h,
				CurrentTime<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>	
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>state_left != pkt.<span style="color: #202020;">btn_left</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			XTestFakeButtonEvent<span style="color: #66cc66;">&#40;</span>dpy, <span style="color: #cc66cc;">1</span>,
				<span style="color: #66cc66;">&#40;</span>state_left = pkt.<span style="color: #202020;">btn_left</span><span style="color: #66cc66;">&#41;</span>,
				CurrentTime<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
                <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>state_middle != pkt.<span style="color: #202020;">btn_middle</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                        XTestFakeButtonEvent<span style="color: #66cc66;">&#40;</span>dpy, <span style="color: #cc66cc;">2</span>,
                                <span style="color: #66cc66;">&#40;</span>state_middle = pkt.<span style="color: #202020;">btn_middle</span><span style="color: #66cc66;">&#41;</span>,
                                CurrentTime<span style="color: #66cc66;">&#41;</span>;
                <span style="color: #66cc66;">&#125;</span>
&nbsp;
                <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>state_right != pkt.<span style="color: #202020;">btn_right</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                        XTestFakeButtonEvent<span style="color: #66cc66;">&#40;</span>dpy, <span style="color: #cc66cc;">3</span>,
                                <span style="color: #66cc66;">&#40;</span>state_right = pkt.<span style="color: #202020;">btn_right</span><span style="color: #66cc66;">&#41;</span>,
                                CurrentTime<span style="color: #66cc66;">&#41;</span>;
                <span style="color: #66cc66;">&#125;</span>
&nbsp;
		XFlush<span style="color: #66cc66;">&#40;</span>dpy<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	close<span style="color: #66cc66;">&#40;</span>fd<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>O código acima também pode ser baixado <a href="http://matias.archlinux-br.org/files/handpadd.c">aqui</a>.</p>
<p>O programa deve ser compilado com:</p>
<pre class="bash"><span style="color: #c20cb9; font-weight: bold;">gcc</span> -O2 -o handpadd handpadd.c -lX11 -lXtst -I/usr/X11R6/include -L/usr/X11R6/lib -R/usr/X11R6/lib</pre>
<p>Em seguida, rode com a opção <code>-c</code> para calibrar o seu handpad:</p>
<pre class="bash">./handpadd -c</pre>
<p>Aperte com a caneta nos cantos superior esquerdo e inferior direito do handpad quando requerido pelo programa. Feito isso, será exibida uma mensagem informando a forma como o <code>handpadd</code> deve ser executado toda vez para manter a calibração, utilizando a opção <code>-g</code>.</p>
<p>O <code>handpadd</code> deve ser deixado executando toda vez que você quiser usar o handpad como mouse no X11.</p>
<p><strong>NOTA</strong>: Se você usa o FreeBSD, será necessário aplicar o seguinte patch no kernel, para que o módulo <code>ums</code> não tente se anexar, sem sucesso, ao dispositivo. Aplicando o patch a seguir, o dispositivo será anexado corretamente ao módulo <code>uhid</code>.</p>
<p>Note que no NetBSD e no OpenBSD <strong>não</strong> é necessário nenhum tipo de patch.</p>
<pre class="diff">diff -Naur sys/dev/usb/ums.c.orig sys/dev/usb/ums.c
<span style="color: #888822;">--- sys/dev/usb/ums.c.orig	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">39</span>:<span style="">38.000000000</span> <span style="">-0300</span></span>
<span style="color: #888822;">+++ sys/dev/usb/ums.c	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">48</span>:<span style="">47.000000000</span> <span style="">-0300</span></span>
<span style="color: #440088;">@@ <span style="">-192</span>,<span style="">6</span> <span style="">+192</span>,<span style="">8</span> @@</span>
 	id = usbd_get_interface_descriptor<span style="">&#40;</span>uaa-&gt;iface<span style="">&#41;</span>;
 	if <span style="">&#40;</span>!id || id-&gt;bInterfaceClass != UICLASS_HID<span style="">&#41;</span>
 		return <span style="">&#40;</span>UMATCH_NONE<span style="">&#41;</span>;
<span style="color: #00b000;">+	if <span style="">&#40;</span>usbd_get_quirks<span style="">&#40;</span>uaa-&gt;device<span style="">&#41;</span>-&gt;uq_flags &amp; UQ_UMS_IGNORE<span style="">&#41;</span></span>
<span style="color: #00b000;">+		return <span style="">&#40;</span>UMATCH_NONE<span style="">&#41;</span>;</span>
&nbsp;
 	err = usbd_read_report_desc<span style="">&#40;</span>uaa-&gt;iface, &amp;desc, &amp;size, M_TEMP<span style="">&#41;</span>;
 	if <span style="">&#40;</span>err<span style="">&#41;</span>
diff -Naur sys/dev/usb/usb_quirks.c.orig sys/dev/usb/usb_quirks.c
<span style="color: #888822;">--- sys/dev/usb/usb_quirks.c.orig	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">39</span>:<span style="">38.000000000</span> <span style="">-0300</span></span>
<span style="color: #888822;">+++ sys/dev/usb/usb_quirks.c	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">47</span>:<span style="">42.000000000</span> <span style="">-0300</span></span>
<span style="color: #440088;">@@ <span style="">-112</span>,<span style="">6</span> <span style="">+112</span>,<span style="">11</span> @@</span>
 	ANY, <span style="">&#123;</span> UQ_KBD_IGNORE <span style="">&#125;</span><span style="">&#125;</span>,
  <span style="">&#123;</span> USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24X,
 	ANY, <span style="">&#123;</span> UQ_KBD_IGNORE <span style="">&#125;</span><span style="">&#125;</span>,
<span style="color: #00b000;">+</span>
<span style="color: #00b000;">+ /* Devices which should be ignored by ums */</span>
<span style="color: #00b000;">+ <span style="">&#123;</span> USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_PENPOWER_TOUCH,</span>
<span style="color: #00b000;">+	ANY, <span style="">&#123;</span> UQ_UMS_IGNORE <span style="">&#125;</span><span style="">&#125;</span>,</span>
<span style="color: #00b000;">+</span>
  <span style="">&#123;</span> <span style="">0</span>, <span style="">0</span>, <span style="">0</span>, <span style="">&#123;</span> <span style="">0</span> <span style="">&#125;</span> <span style="">&#125;</span>
 <span style="">&#125;</span>;
&nbsp;
diff -Naur sys/dev/usb/usb_quirks.h.orig sys/dev/usb/usb_quirks.h
<span style="color: #888822;">--- sys/dev/usb/usb_quirks.h.orig	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">39</span>:<span style="">38.000000000</span> <span style="">-0300</span></span>
<span style="color: #888822;">+++ sys/dev/usb/usb_quirks.h	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">42</span>:<span style="">59.000000000</span> <span style="">-0300</span></span>
<span style="color: #440088;">@@ <span style="">-57</span>,<span style="">6</span> <span style="">+57</span>,<span style="">7</span> @@</span>
 #define UQ_KBD_IGNORE	0x00018000 /* device should be ignored by both kbd and hid class */
 #define	UQ_MS_BAD_CLASS 0x00020000 /* doesn't identify properly */
 #define	UQ_MS_LEADING_BYTE 0x40000 /* mouse sends an unknown leading byte. */
<span style="color: #00b000;">+#define UQ_UMS_IGNORE	0x00080000 /* device should be ignored by mouse class */</span>
 <span style="">&#125;</span>;
&nbsp;
 extern const struct usbd_quirks usbd_no_quirk;
diff -Naur sys/dev/usb/usbdevs.orig sys/dev/usb/usbdevs
<span style="color: #888822;">--- sys/dev/usb/usbdevs.orig	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">39</span>:<span style="">38.000000000</span> <span style="">-0300</span></span>
<span style="color: #888822;">+++ sys/dev/usb/usbdevs	<span style="">2008</span><span style="">-08</span><span style="">-06</span> <span style="">11</span>:<span style="">47</span>:<span style="">19.000000000</span> <span style="">-0300</span></span>
<span style="color: #440088;">@@ <span style="">-1067</span>,<span style="">6</span> <span style="">+1067</span>,<span style="">7</span> @@</span>
 product CYPRESS FMRADIO		0x1002	FM Radio
 product CYPRESS USBRS232	0x5500	USB-RS232 Interface
 product CYPRESS SLIM_HUB	0x6560	Slim Hub
<span style="color: #00b000;">+product CYPRESS PENPOWER_TOUCH	0xfef3  PenPower Touchpad</span>
&nbsp;
 /* Daisy Technology products */
 product DAISY DMC		0x6901	USB MultiMedia Reader
&nbsp;</pre>
<p>O patch acima também pode ser baixado <a href="http://freeshells.ch/~matias/files/freebsd-penpower-usb.diff">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://matias.archlinux-br.org/archives/153/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Tutorial: Configuração de um desktop com Ion3</title>
		<link>http://matias.archlinux-br.org/archives/14</link>
		<comments>http://matias.archlinux-br.org/archives/14#comments</comments>
		<pubDate>Sat, 31 May 2008 05:29:32 +0000</pubDate>
		<dc:creator>Paulo Matias</dc:creator>
				<category><![CDATA[ArchLinux]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NetBSD]]></category>

		<guid isPermaLink="false">http://matias.archlinux-br.org/?p=14</guid>
		<description><![CDATA[Escrevo este tutorial para descrever como configurei meu desktop, para pessoas que estejam interessadas em ter um desktop bonito e funcional com o uso do Ion3. O Ion3 é um ambiente gráfico com gerenciamento de janelas em tiling. Para quem não conhece, isso significa que ele possui suporte a tiles, que são áreas nas quais [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/05/trayion-screenshot.png"><img class="alignnone size-thumbnail wp-image-15" title="Ion3 com Trayion e ArchAssistant" src="http://matias.archlinux-br.org/wp-content/uploads/2008/05/trayion-screenshot-150x150.png" style="float:left;padding:5px;" alt="" width="150" height="150" /></a> Escrevo este tutorial para descrever como configurei meu desktop, para pessoas que estejam interessadas em ter um desktop bonito e funcional com o uso do Ion3. </p>
<p>O Ion3 é um ambiente gráfico com gerenciamento de janelas em <em>tiling</em>. Para quem não conhece, isso significa que ele possui suporte a <em>tiles</em>, que são áreas nas quais podem ser "encaixadas" janelas, de forma que ocupem todo o espaço daquela área.</p>
<p>O Ion3 permite que você divida sua tela em quantas áreas quiser, com a posição e o tamanho que desejar. Sempre que uma área receber mais de uma janela, o Ion3 cria abas (<em>tabs</em>) para as outras janelas. É como se a sua tela tivesse diversas barras de tarefas, que você pode organizar como desejar. Você sempre pode arrastar uma aba (<em>tab</em>) de uma área (<em>tile</em>) para outra, da maneira que preferir.</p>
<p><a href="http://matias.archlinux-br.org/wp-content/uploads/2008/05/ion3-image-edit.png"><img class="alignright size-thumbnail wp-image-16" title="Ion3 com Inkscape e Gimp" src="http://matias.archlinux-br.org/wp-content/uploads/2008/05/ion3-image-edit-150x150.png" style="float:right;padding:5px;" alt="" width="150" height="150" /></a> O Ion3 também permite que você faça janelas flutuarem, ou seja, ficarem por cima sem "encaixar" em nenhuma das áreas. É possível ter também alguns workspaces sem nenhuma área, apenas com janelas flutuantes (<em>floats</em>). </p>
<p>O Ion3 é altamente configurável utilizando a linguagem de script Lua, que é leve, muito fácil de usar e poderosa. O Ion3 já vem com diversos atalhos de teclado para tarefas úteis, como abrir aplicações ou sessões ssh com suporte a tab-completion. O Ion3 é, também, bastante leve, consumindo de 2MB a 4MB de RAM.</p>
<p>Bom, agora que vocês já conhecem as características principais do Ion3, <strong>vamos à instalação e configuração do mesmo</strong>.</p>
<p><span id="more-14"></span></p>
<p><strong>Instalação</strong></p>
<p>Serei bastante breve nesta seção. Verifique se sua distribuição possui um pacote para o Ion3. Verifique também se esse pacote corresponde a uma versão atual, pois praticamente todo mês há novas versões do Ion3.</p>
<p>Os pacotes do Ion3 para o Arch Linux e para o NetBSD são mantidos por mim. O pacote para o Arch pode ser encontrado com o nome <a href="http://aur.archlinux.org/packages.php?ID=16754">ion-3 no AUR</a>. O pacote para o NetBSD pode ser encontrado com o nome <a href="http://pkgsrc.se/wip/ion3">ion3 no pkgsrc-wip</a>.</p>
<p>Caso sua distribuição não possua pacotes para o Ion3, basta baixar o código fonte no <a href="http://modeemi.cs.tut.fi/~tuomov/ion/download.html">site do autor</a>. Certifique-se primeiramente de que você tem o interpretador <a href="http://www.lua.org">Lua</a> instalado, descompacte o código fonte do Ion3, edite o arquivo <code>system.mk</code>, e em seguida efetue um <code>make && make install</code>.</p>
<p><strong>Instalando o Trayion</strong></p>
<p>Eu recomendo, também, a instalação de um aplicativo externo, desenvolvido por mim, chamado Trayion. O Trayion é uma área de notificação que se integra à barra de status do Ion3.</p>
<p>O Ion3, por padrão, suporta apenas <em>dockapps</em> do Window Maker e <em>tray icons</em> usando o protocolo antigo do KDE. Os <em>tray icons</em> utilizados pelas aplicações mais novas, que seguem o padrão FreeDesktop, não são suportados, pois o autor do Ion3 considera o padrão (desnecessariamente) complicado demais para ser implementado diretamente no Ion3.</p>
<p>Se você usa o Arch Linux, instale o Trayion por meio de seu <a href="http://aur.archlinux.org/packages.php?ID=17204">pacote no AUR</a>. Se você usa o NetBSD, instale-o por meio de seu <a href="http://pkgsrc.se/wip/trayion">pacote no pkgsrc-wip</a>. Caso contrário, faça o <a href="http://code.google.com/p/trayion">download do Trayion</a>, descompacte, e execute um <code>make && make install</code>.</p>
<p><strong>Iniciando o Ion3</strong></p>
<p>Para iniciar o Ion3 pela primeira vez, você deve configurar para que o <code>startx</code> ou o seu gerenciador de login iniciem o mesmo. Para isso, basta criar um arquivo <code>~/.xsession</code> contendo os comandos a serem executados quando o X for levantado. O meu <code>~/.xsession</code> contém o seguinte:</p>
<pre class="bash"><span style="color: #808080; font-style: italic;">#!/bin/sh</span>
xrdb ~/.Xresources
display -window root ~/.ion3/wallpaper.jpg
<span style="color: #7a0874; font-weight: bold;">&#40;</span>trayion&amp;<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">exec</span> ion3</pre>
<p>Esse código já carrega um arquivo <code>~/.Xresources</code>, que pode ser utilizado para configurar certos programas, como o <code>urxvt</code>. Em seguida, ele busca um papel de parede em <code>~/.ion3/wallpaper.jpg</code>, carrega o Trayion, e inicia o Ion3.</p>
<p>Para utilizar o comando <code>display</code>, necessário para carregar o papel de parede, você precisa do ImageMagick. No Arch Linux, o nome do pacote é <code>imagemagick</code>. No NetBSD, o nome é <code>ImageMagick</code>.</p>
<p>Note que o <code>startx</code> procura o script de inicialização acima em <code>~/.xinitrc</code>, portanto é conveniente realizar o seguinte link simbólico:</p>
<pre class="text">$ ln -s ~/.xsession ~/.xinitrc</pre>
<p>Agora você está pronto para iniciar o Ion3 pela primeira vez. Reinicie o X.</p>
<p><strong>Primeira vez dentro do Ion3</strong></p>
<p>É importante lembrar alguns atalhos de teclado padrão essenciais do Ion3. A tecla <strong>F2</strong>, por padrão, abre um terminal. A tecla <strong>F3</strong>, por padrão, abre uma pequena caixinha onde você pode digitar um comando qualquer, com suporte a tab-completion.</p>
<p>Se você instalou o Trayion, vai notar que a barra de status está "gorda demais". Isso ocorre por causa de uma configuração que vem por padrão no Ion3 para acomodar <em>dockapps</em> de Window Maker, que possuem tamanho de 64x64 pixels. O Trayion se comporta como uma <em>dockapp</em>, e portanto é afetado por essa configuração. Entretanto, não se preocupe, pois já vamos modificar essas configurações logo em seguida.</p>
<p><strong>Modificando as configurações padrão do Ion3</strong></p>
<p>Ao longo de diversos meses de uso, modifiquei muito pouco as configurações padrão do Ion3. Descreverei aqui quais configurações eu modifiquei, e como realizar essas modificações.</p>
<p>As configurações do Ion3 ficam geralmente em <code>/etc/ion3</code>. Se você instalou pelo pkgsrc no NetBSD, elas estarão em <code>/usr/pkg/etc/ion3</code>. Se você instalou compilando manualmente o código fonte e não modificou o local de instalação no <code>system.mk</code>, elas estarão em <code>/usr/local/etc/ion3</code>.</p>
<p>Cada arquivo de configuração é um script em linguagem Lua. Eu sugiro fortemente que você <strong>não</strong> modifique as configurações diretamente nos diretórios <code>/etc/ion3</code>, pois elas poderão ser sobrescritas durante uma atualização do Ion3.</p>
<p>Sempre que for modificar um arquivo de configuração, copie-o para <code>~/.ion3</code> e modifique-o no <code>~/.ion3</code>. O Ion3 sempre vai buscar os arquivos de configuração primeiro em <code>~/.ion3</code>, e somente depois no <code>/etc/ion3</code>.</p>
<p>Para ter uma configuração semelhante à minha, você deve copiar os seguintes arquivos:</p>
<pre class="text">$ cd /etc/ion3
$ cp cfg_kludges.lua cfg_ion.lua \
     cfg_ioncore.lua cfg_statusbar.lua ~/.ion3</pre>
<p>Explico as configurações que realizei a seguir, da mais importante para a menos importante.</p>
<p><strong>Modificações no cfg_kludges.lua</strong></p>
<p><strong>Se você estiver utilizando o Trayion, essa modificação é crucial</strong>, caso contrário sua barra de status ficará "gorda", ocupando espaço desnecessário da tela, além de ficar horrorosa.</p>
<p>Procure as seguintes linhas no arquivo <code>~/.ion3/cfg_kludges.lua</code>:</p>
<pre class="lua">defwinprop<span style="color: #66cc66;">&#123;</span>
    is_dockapp = <span style="color: #b1b100;">true</span>,
    statusbar = <span style="color: #ff0000;">&quot;systray&quot;</span>,
    max_size = <span style="color: #66cc66;">&#123;</span> w = <span style="color: #cc66cc;">64</span>, h = <span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#125;</span>,
    min_size = <span style="color: #66cc66;">&#123;</span> w = <span style="color: #cc66cc;">64</span>, h = <span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#125;</span>,
<span style="color: #66cc66;">&#125;</span></pre>
<p>E transforme em comentários as linhas que definem o <code>max_size</code> e o <code>min_size</code>. Para fazer isso, basta colocar <code>--</code> na frente das linhas. Dessa forma, o trecho acima ficará assim:</p>
<pre class="lua">defwinprop<span style="color: #66cc66;">&#123;</span>
    is_dockapp = <span style="color: #b1b100;">true</span>,
    statusbar = <span style="color: #ff0000;">&quot;systray&quot;</span>,
    <span style="color: #808080; font-style: italic;">--max_size = { w = 64, h = 64},</span>
    <span style="color: #808080; font-style: italic;">--min_size = { w = 64, h = 64},</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Isso desabilitará a configuração que acomoda todas as <em>dockapps</em> por padrão em uma área de 64x64 pixels, que seria adequada para <em>dockapps</em> padrão do Window Maker. Desabilitando essa configuração, você permite que o Trayion possa ajustar suas próprias dimensões, escolhendo o tamanho mais adequado para si mesmo.</p>
<p><strong>Modificações no cfg_ion.lua</strong></p>
<p>O Ion3 usa o <code>xterm</code> como terminal por padrão. Nada mais justo, afinal o <code>xterm</code> é encontrado em praticamente qualquer instalação padrão de X.</p>
<p>Entretanto, eu prefiro o <code>urxvt</code>, que vem no pacote <code>rxvt-unicode</code> (o nome do pacote é o mesmo tanto no Arch Linux quanto no NetBSD).</p>
<p>Para modificar o terminal que é aberto ao pressionar a tecla <strong>F2</strong> no Ion3, edite o arquivo <code>~/.ion3/cfg_ion.lua</code>. Procure pela seguinte linha:</p>
<pre class="lua"><span style="color: #808080; font-style: italic;">--XTERM=&quot;xterm&quot;</span></pre>
<p>Remova o <code>--</code> para desmarcar como comentário, e modifique para o comando que inicia o terminal de sua preferência, por exemplo:</p>
<pre class="lua">XTERM=<span style="color: #ff0000;">&quot;urxvt&quot;</span></pre>
<p><strong>Modificações no cfg_ioncore.lua</strong></p>
<p>O Ion3 define, por padrão, atalhos de teclado para as teclas <strong>F5</strong> e <strong>F6</strong>, respectivamente para editar e para abrir um arquivo para visualização. Por padrão, esse atalhos utilizam o <code>run-mailcap</code> para determinar qual programa deverá editar ou abrir um certo arquivo.</p>
<p>Como eu uso o gerenciador de arquivos Rox, que vem no pacote <code>rox</code> (mesmo nome de pacote tanto no Arch Linux como no NetBSD), e gosto do editor de textos <code>gvim</code>, eu preferi modificar essas configurações para utilizar o <code>gvim</code> para edição de arquivos, e para utilizar o <code>rox</code> para determinar qual programa deve abrir um certo arquivo.</p>
<p>Para realizar essa modificação, procure pelas seguintes linhas no arquivo <code>~/.ion3/cfg_ioncore.lua</code>:</p>
<pre class="lua">bdoc<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Query for file to edit.&quot;</span><span style="color: #66cc66;">&#41;</span>,
kpress<span style="color: #66cc66;">&#40;</span>ALTMETA..<span style="color: #ff0000;">&quot;F5&quot;</span>,
       <span style="color: #ff0000;">&quot;mod_query.query_editfile(_, 'run-mailcap --action=edit')&quot;</span><span style="color: #66cc66;">&#41;</span>,
&nbsp;
bdoc<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Query for file to view.&quot;</span><span style="color: #66cc66;">&#41;</span>,
kpress<span style="color: #66cc66;">&#40;</span>ALTMETA..<span style="color: #ff0000;">&quot;F6&quot;</span>,
       <span style="color: #ff0000;">&quot;mod_query.query_runfile(_, 'run-mailcap --action=view')&quot;</span><span style="color: #66cc66;">&#41;</span>,</pre>
<p>E modifique os comandos utilizados, fazendo com que esse trecho fique como a seguir.</p>
<pre class="lua">bdoc<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Query for file to edit.&quot;</span><span style="color: #66cc66;">&#41;</span>,
kpress<span style="color: #66cc66;">&#40;</span>ALTMETA..<span style="color: #ff0000;">&quot;F5&quot;</span>,
       <span style="color: #ff0000;">&quot;mod_query.query_editfile(_, 'gvim')&quot;</span><span style="color: #66cc66;">&#41;</span>,
&nbsp;
bdoc<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Query for file to view.&quot;</span><span style="color: #66cc66;">&#41;</span>,
kpress<span style="color: #66cc66;">&#40;</span>ALTMETA..<span style="color: #ff0000;">&quot;F6&quot;</span>,
       <span style="color: #ff0000;">&quot;mod_query.query_runfile(_, 'rox')&quot;</span><span style="color: #66cc66;">&#41;</span>,</pre>
<p><strong>Modificações no cfg_statusbar.lua</strong></p>
<p>Por fim, você pode modificar este arquivo se desejar que informações adicionais sejam exibidas na barra de status. No meu caso, incluí informações sobre velocidade atual e temperatura do processador, e carga da bateria. Por enquanto, experimentei essa modificação apenas no Linux (não a experimentei ainda no NetBSD).</p>
<p>Se você possui um laptop e deseja exibir essas informações na barra de status, faça o download do arquivo <a href="http://modeemi.fi/~tuomov/repos/ion-scripts-3/statusd/statusd_laptopstatus.lua">statusd_laptopstatus.lua</a>, copiando-o para <code>~/.ion3</code>. É esse arquivo que implementa a consulta das informações a respeito da CPU e da bateria.</p>
<p>Em seguida, edite o <code>~/.ion3/cfg_statusbar.lua</code> para indicar em qual local da barra de status você quer que essas informações apareçam. Procure pela linha a seguir:</p>
<pre class="lua">template=<span style="color: #ff0000;">&quot;[ %date || load: %load ] %filler%systray&quot;</span>,</pre>
<p>E modifique-a pela seguinte linha:</p>
<pre class="lua">template=<span style="color: #ff0000;">&quot;[ %date || load: %load ||
CPU: %laptopstatus_cpuspeed %laptopstatus_temperature ||
BATT: %laptopstatus_batterypercent %laptopstatus_batterytimeleft
] %filler%systray&quot;</span>,</pre>
<p><strong>Carregando as modificações dos arquivos de configuração</strong></p>
<p>Sempre que você modificar algum arquivo de configuração do Ion3, você pode recarregar as configurações sem fechar os aplicativos que estão rodando, utilizando a tecla <strong>F12</strong> e chamando a opção <code>session/restart</code> no menu que se abre.</p>
<p>Lembre-se que todos os menus do Ion3 suportam navegação tanto por meio da digitação de parte do nome da opção seguida da tecla Tab (tab-completion) quanto por meio das setas do teclado (histórico). Para ativar a opção selecionada, basta teclar Enter.</p>
<p><strong>Mudando o tema do Ion3</strong></p>
<p>Várias pessoas contribuíram com diversos temas para as bordas e barras de título do Ion3. Esses temas estão disponíveis no site da <a href="http://modeemi.fi/~tuomov/repos/ion-scripts-3/">coleção de scripts para o Ion3</a>. São os scripts cujo nome começa com <code>look</code>.</p>
<p>O tema que utilizo atualmente em minha máquina é o <a href="http://modeemi.fi/~tuomov/repos/ion-scripts-3/styles/look_atme.lua">look_atme.lua</a>. Faça download dos temas que deseja experimentar, copiando-os, como sempre, para <code>~/.ion3</code>.</p>
<p>Para atualizar a lista de temas, realize o mesmo procedimento descrito anteriormente para recarregar as configurações do Ion3, ou seja, tecla <strong>F12</strong>, opção <code>session/restart</code>.</p>
<p>Para trocar de tema, utilize a tecla <strong>F12</strong> e chame a opção <code>styles/look_nomedotema</code> no menu que se abrirá.</p>
<p><strong>Atalhos de teclado mais usados com o Ion3</strong></p>
<p>Você sempre pode consultar os atalhos de teclado pressionando <code>F1</code> e pressionando Enter. Isso abrirá a manpage do Ion3 em um terminal para você. Lá existe a lista de todas as teclas de atalho padrão.</p>
<p>As que eu mais utilizo, tirando <strong>F2</strong> e <strong>F3</strong>, que eu já citei, são:</p>
<ul>
<li><strong>Alt+S</strong>: Divide um <em>tile</em> em dois, um em cima e um embaixo.</li>
<li><strong>Alt+K S</strong>: Divide um <em>tile</em> em dois, um à esquerda, outro à direita.</li>
<li><strong>Alt+K número</strong>: Alterna entre <em>tabs</em> usando o teclado.</li>
<li><strong>Alt+F9</strong>: Cria um novo <em>workspace</em> diretamente, sem burocracia. Existe também o <strong>F9</strong>, que permite dar um nome ao <em>workspace</em> que está sendo criado e outras opções mais avançadas.</li>
<li><strong>Alt+número</strong>: Alterna entre <em>workspaces</em>.</li>
<li><strong>Alt+T</strong> com foco em uma janela, depois <strong>Alt+K A</strong> com foco em outro <em>tile</em>: Transfere uma janela para outro <em>tile</em> usando o teclado. Esse atalho de teclado é especialmente útil para transferir uma janela de um workspace para outro, caso no qual não é possível realizar a transferência simplesmente arrastando a barra de título da janela.</li>
</ul>
<p>Note que muitas das operações podem ser realizadas com o mouse, clicando com o botão direito na barra de título da janela e escolhendo uma opção no menu, ou arrastando a barra de título da janela. Portanto, não se preocupe em ficar decorando atalhos de teclado. Você vai se acostumar com eles com o tempo, pois muitos deles são realmente práticos e úteis.</p>
<p>É importante lembrar que para redimensionar um <em>tile</em>, basta <strong>clicar sobre qualquer ponto do <em>tile</em> e arrastar</strong> com a tecla <strong>Alt</strong> pressionada.</p>
<p>Uma tecla que você talvez utilize pouco, mas que é muito interessante, é a tecla <strong>F4</strong>. Ela abre uma sessão ssh, mas tem um diferencial interessante. Ela autocompleta qualquer host ao qual você já tenha se conectado utilizando tab-completion.</p>
<p>Se ao pressionar <strong>F4</strong> aparecer somente um monte de números na lista de sugestões de autocompletamento, significa que você tem a seguinte opção no seu <code>/etc/ssh/ssh_config</code>:</p>
<pre class="bash">HashKnownHosts <span style="color: #c20cb9; font-weight: bold;">yes</span></pre>
<p>Essa opção vem por padrão no Arch Linux, por exemplo. Se quiser usar o recurso de autocompletar ssh do Ion3, desabilite a linha acima transformando a mesma em um comentário:</p>
<pre class="bash"><span style="color: #808080; font-style: italic;">#HashKnownHosts yes</span></pre>
<p><strong>Macetes interessantes do Ion3</strong></p>
<p>Existe um macete que eu raramente preciso usar, mas que é tão interessante que vale a pena comentar aqui.</p>
<p>Se você perder uma janela de vista, é possível encontrá-la imediatamente no Ion3, mesmo que ela esteja em outro <em>workspace</em>.</p>
<p>Digamos que você esteja procurando pela janela do Opera. Você não sabe onde ela está, mas sabe que o título dela contém o texto "opera". Digite <strong>Alt+K K</strong> opera <strong>Enter</strong>. O Ion3 te levará imediatamente ao <em>workspace</em> e à janela do Opera.</p>
<p>Note que apenas um pedaço do texto da barra de título é necessário, e que esse pedaço de texto pode estar em qualquer parte da barra de título!</p>
<p><strong>Configurando outros programas do desktop</strong></p>
<p>Passarei brevemente outras configurações relevantes para o desktop, mas que não são diretamente relacionadas ao Ion3. As dicas a seguir se aplicariam mesmo que você estivesse utilizando outro gerenciador de janelas.</p>
<p>A primeira é para deixar o <code>urxvt</code> transparente e com a fonte DejaVu. A fonte DejaVu pode ser encontrada no pacote <code>ttf-dejavu</code> no Arch Linux, e no pacote <code>dejavu-ttf</code> no NetBSD. A configuração é realizada no arquivo <code>~/.Xresources</code>:</p>
<pre class="text">URxvt*scrollBar: 0
URxvt*toolBar: 0
URxvt*font: xft:DejaVu Sans Mono:pixelsize=10
URxvt*transparent: True
URxvt*shading: 40
URxvt*tintColor: #000000
URxvt*background: #000000
URxvt*foreground: #fafffa</pre>
<p>Outra configuração que realizei aqui foi criar um arquivo <code>~/.fonts.conf</code>, como a seguir, para forçar antialising nas fontes do Qt3.</p>
<pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="font-weight: bold; color: black;">?&gt;</span></span>
<span style="color: #00bbdd;">&lt;!DOCTYPE fontconfig SYSTEM &quot;fonts.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fontconfig<span style="font-weight: bold; color: black;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;match</span> <span style="color: #000066;">target</span>=<span style="color: #ff0000;">&quot;font&quot;</span> <span style="font-weight: bold; color: black;">&gt;</span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;edit</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;assign&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;antialias&quot;</span> <span style="font-weight: bold; color: black;">&gt;</span></span>
   <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;bool<span style="font-weight: bold; color: black;">&gt;</span></span></span>true<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/bool<span style="font-weight: bold; color: black;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/edit<span style="font-weight: bold; color: black;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/match<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fontconfig<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre>
<p>Outra configuração que necessita ser realizada por meio de arquivo de configuração (a menos que você instale o KDE) é a configuração das fontes nos aplicativos que usem a kdelibs3. Para realizar essa configuração, crie um arquivo <code>~/.kderc</code> contendo as fontes desejadas, como a seguir:</p>
<pre class="ini"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>General<span style="">&#93;</span></span>
<span style="color: #000099;">StandardFont</span>=<span style="color: #660066;">Liberation Sans,<span style="">8</span>,<span style="">-1</span>,<span style="">5</span>,<span style="">50</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span></span>
<span style="color: #000099;">activeFont</span>=<span style="color: #660066;">Liberation Sans,<span style="">8</span>,<span style="">-1</span>,<span style="">5</span>,<span style="">75</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span></span>
<span style="color: #000099;">background</span>=<span style="color: #660066;"><span style="">239</span>,<span style="">239</span>,<span style="">239</span></span>
<span style="color: #000099;">fixed</span>=<span style="color: #660066;">DejaVu Sans Mono,<span style="">8</span>,<span style="">-1</span>,<span style="">5</span>,<span style="">50</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span></span>
<span style="color: #000099;">font</span>=<span style="color: #660066;">Liberation Sans,<span style="">8</span>,<span style="">-1</span>,<span style="">5</span>,<span style="">50</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span></span>
<span style="color: #000099;">menuFont</span>=<span style="color: #660066;">Liberation Sans,<span style="">8</span>,<span style="">-1</span>,<span style="">5</span>,<span style="">50</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span></span>
<span style="color: #000099;">selectBackground</span>=<span style="color: #660066;"><span style="">103</span>,<span style="">141</span>,<span style="">178</span></span>
<span style="color: #000099;">selectForeground</span>=<span style="color: #660066;"><span style="">255</span>,<span style="">255</span>,<span style="">255</span></span>
<span style="color: #000099;">taskbarFont</span>=<span style="color: #660066;">Liberation Sans,<span style="">8</span>,<span style="">-1</span>,<span style="">5</span>,<span style="">50</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span></span>
<span style="color: #000099;">toolBarFont</span>=<span style="color: #660066;">Liberation Sans,<span style="">8</span>,<span style="">-1</span>,<span style="">5</span>,<span style="">50</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span>,<span style="">0</span></span>
<span style="color: #000099;">windowBackground</span>=<span style="color: #660066;"><span style="">255</span>,<span style="">255</span>,<span style="">255</span></span>
<span style="color: #000099;">windowForeground</span>=<span style="color: #660066;"><span style="">0</span>,<span style="">0</span>,<span style="">0</span></span></pre>
<p>O restante das configurações pode ser realizado por meio de aplicativos gráficos.</p>
<p>O tema da Qt pode ser modificado por meio do aplicativo <code>qtconfig</code>, que acompanha a própria biblioteca Qt. Note que existe um <code>qtconfig</code> diferente para cada versão da Qt - um para a Qt4 e outro para a Qt3. No Arch Linux, eles ficam em <code>/usr/bin/qtconfig</code> e <code>/opt/qt/bin/qtconfig</code>, respectivamente. No NetBSD, ficam em <code>/usr/pkg/qt4/bin/qtconfig</code> e <code>/usr/pkg/qt3/bin/qtconfig</code>, respectivamente.</p>
<p>O tema do Gtk pode ser modificado utilizando o aplicativo <code>gtk-chtheme</code>, que vem no pacote <code>gtk-chtheme</code> do Arch, ou <code>gtk2-chtheme</code> do NetBSD.</p>
<p><strong>Automatizando conexão em redes e montagem de dispositivos</strong></p>
<p>Se você utiliza o Arch Linux, recomendo que instale o <a href="http://aur.archlinux.org/packages.php?ID=15655">archassistant</a>. Trata-se de um aplicativo muito interessante que colocará um <em>tray icon</em> no seu Trayion, e que permite que você selecione perfis de rede para conectar-se com um único clique.</p>
<p>O <code>archassistant</code> funciona com o auxílio do <code>netcfg</code> do Arch Linux. Maiores informações podem ser encontradas no artigo <a href="http://wiki.archlinux.org/index.php/Network_Profiles">Network Profiles</a>, da ArchWiki.</p>
<p>Outra tarefa bastante desejável de se automatizar é a montagem de dispositivos, principalmente pendrives e CDs. Em outros ambientes gráficos, isso costuma ser feito pelo próprio ambiente. Entretanto, é muito mais interessante utilizar o recurso <code>autofs4</code> do próprio kernel Linux para realizar essa tarefa. Isso permite que a montagem automatica ocorra até mesmo nos programas do console, e permite também a desmontagem automatica dos dispositivos.</p>
<p>Existe um tutorial para a configuração do <code>autofs4</code> no artigo <a href="http://wiki.archlinux.org/index.php/AutoFS_HowTo">AutoFS HowTo</a> da ArchWiki.</p>
<p><strong>Conclusão</strong></p>
<p>O Ion3 fornece um desktop leve, confortável, moderno, versátil, ágil e configurável.</p>
<p>Após realizadas as configurações adequadas em seu sistema, um desktop Ion3 não deixará nada a desejar com relação a desktops tradicionais como GNOME e KDE.</p>
<p>Depois de acostumado ao modelo de <em>tiling</em>, um usuário deverá sentir até mesmo certa dificuldade ao utilizar novamente gerenciadores de janela tradicionais (não-<em>tiling</em>).</p>
<p>Tentei passar neste artigo toda a minha experiência em configuração de desktops, esgotando completamente tudo o que eu teria para falar. Espero que o conteúdo aqui apresentado possa auxiliar muitos usuários a ingressar no maravilhoso mundo do <em>tiling</em>, não somente com o Ion3, mas também com outros igualmente excelentes gerenciadores janelas como <em>dwm</em>, <em>wmii</em> e <em>xmonad</em>.</p>
<p><strong>Outras referências</strong></p>
<ul>
<li><a href="http://modeemi.fi/~tuomov/ion-doc-3/ionconf/">Configuring and Extending Ion3 with Lua</a> - Este manual explica o funcionamento interno do Ion3 e como escrever novos scripts em Lua para ele. Muito indicado para usuários que queiram se aprofundar.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://matias.archlinux-br.org/archives/14/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
