<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>garotosopa &#187; linux</title>
	<atom:link href="http://garotosopa.wordpress.com/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://garotosopa.wordpress.com</link>
	<description>juntando as letrinhas desde 1986</description>
	<lastBuildDate>Mon, 05 Oct 2009 12:00:34 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='garotosopa.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/1aa997062c21c77622f350c2011b4705?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>garotosopa &#187; linux</title>
		<link>http://garotosopa.wordpress.com</link>
	</image>
			<item>
		<title>Alterando software livre do jeito Debian &#8211; Patch para o Transmission</title>
		<link>http://garotosopa.wordpress.com/2009/10/05/alterando-software-livre-jeito-debian-patch-transmission/</link>
		<comments>http://garotosopa.wordpress.com/2009/10/05/alterando-software-livre-jeito-debian-patch-transmission/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 12:00:34 +0000</pubDate>
		<dc:creator>garotosopa</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[transmission]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://garotosopa.wordpress.com/?p=682</guid>
		<description><![CDATA[Um dos argumentos dos evangelistas de software livre é que, tendo acesso ao código fonte do programa, você altera o que quiser. Mas quem tem o mínimo de experiência em desenvolvimento sabe que o processo é um pouquinho trabalhoso.
Primeiro você baixa o código fonte do repositório oficial (às vezes tendo que baixar um programa diferente [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=682&subd=garotosopa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Um dos argumentos dos evangelistas de software livre é que, tendo acesso ao <strong><span style="font-weight:normal;background-color:#df8;">código fonte</span></span></strong> do programa, você <strong><span style="font-weight:normal;background-color:#df8;">altera o que quiser</span></strong>. Mas quem tem o mínimo de experiência em desenvolvimento sabe que o processo é um <strong><span style="font-weight:normal;background-color:#df8;">pouquinho trabalhoso</span></strong>.</p>
<p>Primeiro você baixa o código fonte do repositório oficial (às vezes tendo que baixar um programa diferente de controle de versão), baixa todos os pacotes de desenvolvimento dependentes (quando eles dizem quais são), se familiariza com o código fonte (mesmo sem documentação), aprende uma nova linguagem e todas as APIs necessárias, tenta alterar e depois fica compilando até que tudo funcione (o que às vezes não ocorre).</p>
<p>Eu não sei vocês, mas só de imaginar tudo isso eu <strong><span style="font-weight:normal;background-color:#df8;">prefiro esperar</span></strong> e torcer pra que a funcionalidade que eu quero esteja disponível na versão seguinte.</p>
<p>Só que isso faz de você um <strong><span style="font-weight:normal;background-color:#df8;">mau menino</span></strong>, e os nerds olham feio pra você nos eventos de tecnologia e nas listas de discussão.</p>
<p>Abaixo você verá algumas <strong><span style="font-weight:normal;background-color:#df8;">etapas simples</span></strong> de como começar a <strong><span style="font-weight:normal;background-color:#df8;">alterar softwares</span></strong> utilizando os pacotes de <strong><span style="font-weight:normal;background-color:#df8;">source do Debian</span></strong> (Ubuntu ou qualquer derivado), através de passos reais que segui para adicionar uma pequena funcionalidade ao <a href="http://www.transmissionbt.com/">Transmission</a>, mesmo sem conhecer nada de C, Gtk ou do código fonte do programa (na verdade, ainda nem comecei, estou escrevendo o post e fazendo).</p>
<p>Prepare-se para <strong><span style="font-weight:normal;background-color:#df8;">impressionar as gatinhas</span></strong>!</p>
<p><span id="more-682"></span></p>
<h3>Baixando o código fonte e todas as dependências</h3>
<p>Antes de começar qualquer projeto de pacote Debian em C, é fundamental que você tenha o <em>essencial para construção</em> instalado, que inclui <strong><span style="font-weight:normal;background-color:#df8;">compilador e biblioteca para criar pacotes</span></strong>, além do pacote <em>fakeroot</em>, necessário ao montar o pacote no final de todas as etapas:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>/home/diogo/transmission# <strong><span style="background-color:#df8;">aptitude install build-essential fakeroot</span></strong></pre>
</div>
<p>Em seguida, baixe o <strong><span style="font-weight:normal;background-color:#df8;">fonte do programa</span></strong> que deseja alterar; no meu caso, o Transmission:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission$ <strong><span style="background-color:#df8;">apt-get source transmission</span></strong></pre>
</div>
<p>O comando <em>apt-get source</em> deve ser feito com o seu usuário mesmo, e não como root, apenas para baixar o código fonte no diretório atual.</p>
<p>Ao terminar, você terá os arquivos abaixo e todo o código fonte no diretório <em>transmission-1.75</em>:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission$ <strong>ls -l</strong>
total 6568
drwxr-x--- 15 diogo diogo    4096 2009-10-03 13:01 transmission-1.75
-rw-r-----  1 diogo diogo   17251 2009-09-20 19:30 transmission_1.75-1.diff.gz
-rw-r-----  1 diogo diogo    1519 2009-09-20 19:30 transmission_1.75-1.dsc
-rw-r-----  1 diogo diogo 6681496 2009-09-20 19:30 transmission_1.75.orig.tar.gz</pre>
</div>
<p>Depois, como root, é necessário instalar no sistema todas as <strong><span style="font-weight:normal;background-color:#df8;">bibliotecas necessárias para compilar</span></strong> o programa:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>/home/diogo/transmission# <strong><span style="background-color:#df8;">apt-get build-dep transmission</span></strong></pre>
</div>
<p>Aqui foi necessário baixar 70 pacotes (27MB) com todos os cabeçalhos (arquivos .h) e demais dependências necessárias. Talvez você queira copiar a lista de pacotes que o <em>apt-get</em> mostrou para poder removê-los depois de compilar o programa.</p>
<p>Finalizando, apenas para concluir o fluxo, assim que quiser <strong><span style="font-weight:normal;background-color:#df8;">compilar o programa e montar um pacote</span></strong>, basta executar o comando abaixo, a partir do diretório dos arquivos fonte:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75$ <strong><span style="background-color:#df8;">dpkg-buildpackage -rfakeroot -uc -b</span></strong></pre>
</div>
<p>O <strong><span style="font-weight:normal;background-color:#df8;">pacote <em>.deb</em> será gerado</span></strong> no diretório acima e poderá ser instalado com <em>dpkg -i nomedopacote.deb</em>.</p>
<h3>Alterando o código fonte</h3>
<p>Já tenho o código fonte e já sei como montar o pacote, mas <strong><span style="font-weight:normal;background-color:#df8;">não faço a menor idéia de como alterar</span></strong> o programa. Tentemos assim mesmo.</p>
<p>Sabendo que o Transmission é um cliente de torrent, o recurso que quero adicionar é poder <strong><span style="font-weight:normal;background-color:#df8;">salvar os arquivos no mesmo diretório onde está localizado o .torrent</span></strong>. Para isso, a idéia é incluir uma opção na tela de configuração como na montagem abaixo em vermelho:</p>
<p><img src="http://garotosopa.files.wordpress.com/2009/10/samedirectory.png?w=415&#038;h=356" alt="Included the checkbox: Save to the same directory as torrent file" title="Save to the same directory as torrent file" width="415" height="356" class="size-full wp-image-685" /></p>
<p>Antes de começar a bagunçar o código fonte que baixamos, é interessante fazer uma cópia do original para facilitar a geração de um <em>patch</em> depois:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75$ <strong><span style="background-color:#df8;">cp -r transmission-1.75/ transmission-1.75-original</span></strong></pre>
</div>
<p>Dando uma olhada no diretório do código fonte, temos o seguinte:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75$ <strong>ls -F</strong>
aclocal.m4     configure*    <strong><span style="font-weight:normal;background-color:#df8;">gtk/</span></strong>              Makefile.am  third-party/
AUTHORS        configure.ac  INSTALL           Makefile.in  transmission.spec.in
autogen.sh*    COPYING       install-sh*       missing*     Transmission.xcodeproj/
ChangeLog      daemon/       libtransmission/  NEWS         update-version-h.sh*
cli/           debian/       ltmain.sh*        po/          web/
config.guess*  depcomp*      m4/               qt/
config.sub*    doc/          macosx/           README</pre>
</div>
<p>Como estou interessado em alterar a interface Gtk, vamos ao seu diretório:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75/gtk$ <strong>ls -F</strong>
actions.c     icons.h         sexy-icon-entry.c        tr-core.h
actions.h     lock.h          sexy-icon-entry.h        tr-icon.c
add-dialog.c  logo.h          sexy-marshal.c           tr-icon.h
add-dialog.h  main.c          sexy-marshal.h           tr-prefs.c
<strong><span style="font-weight:normal;background-color:#df8;">conf.c</span></strong>        Makefile.am     stats.c                  tr-prefs.h
conf.h        Makefile.in     stats.h                  tr-torrent.c
details.c     makemeta-ui.c   torrent-cell-renderer.c  tr-torrent.h
details.h     makemeta-ui.h   torrent-cell-renderer.h  tr-window.c
dialogs.c     marshal.list    tracker-list.c           tr-window.h
dialogs.h     msgwin.c        tracker-list.h           turtles.h
file-list.c   msgwin.h        transmission.1           ui.h
file-list.h   notify.c        transmission.desktop.in  util.c
hig.c         notify.h        transmission.png         util.h
hig.h         options-icon.h  tr-core.c
icons/        relocate.c      tr-core-dbus.h
icons.c       relocate.h      tr-core-dbus.xml</pre>
</div>
<p>Mesmo não conhecendo nada sobre a estrutura do programa, depois de dar uma olhada no nome dos arquivos, um <strong><span style="font-weight:normal;background-color:#df8;">bom palpite é que o arquivo <em>conf.c</em></span></strong> esteja relacionado com o que preciso alterar, já que é o mais parecido com algo referente à janela de configuração. Edite-no-lo.</p>
<p>Como de praxe, o arquivo começa com alguns includes e em seguida passa para definições de funções. Todas estão com pelo menos uma linha de comentário e têm nomes legíveis. Até que um <strong><span style="font-weight:normal;background-color:#df8;">comentário chama atenção</span></strong>:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>/**
 * This is where we initialize the preferences file with the default values.
 * If you add a <strong><span style="font-weight:normal;background-color:#df8;">new preferences key, you /must/ add a default value here</span></strong>.
 */</pre>
</div>
<p>Vamos <strong><span style="font-weight:normal;background-color:#df8;">precisar adicionar uma <em>preference key</em></span></strong>, para determinar se o novo checkbox da janela de configuração está marcado ou não. Então, melhor <strong><span style="font-weight:normal;background-color:#df8;">seguir a recomendação do comentário</span></strong> e definir um valor padrão para a nova chave:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission$ <strong>diff -u transmission-1.75-original/gtk/conf.c transmission-1.75/gtk/conf.c</strong>
--- transmission-1.75-original/gtk/conf.c	2009-10-03 14:03:28.000000000 -0300
+++ transmission-1.75/gtk/conf.c	2009-10-03 14:20:54.000000000 -0300
@@ -192,6 +192,7 @@
 #endif
     if( !str ) str = tr_getDefaultDownloadDir( );
     tr_bencDictAddStr( d, TR_PREFS_KEY_DOWNLOAD_DIR, str );
+    <strong><span style="font-weight:normal;background-color:#df8;">tr_bencDictAddBool( d, PREF_KEY_DOWNLOAD_SAME_DIR, FALSE );</span></strong>

     tr_bencDictAddBool( d, PREF_KEY_ASKQUIT, TRUE );
</pre>
</div>
<p>Se você não está familiarizado com o <strong><span style="font-weight:normal;background-color:#df8;">commando <em>diff</em></span></strong>, basta saber que as primeiras linhas ali definem os arquivos comparados (o conf.c com o mesmo arquivo do diretório original), em seguida o numero da linha do trecho onde ocorreu a alteração, e logo abaixo a alteração: as linhas iniciadas com + foram adicionadas e com &#8211; removidas, as demais são apenas para referência da posição.</p>
<p>Contudo, a <strong><span style="font-weight:normal;background-color:#df8;">chave adicionada <em>PREF_KEY_DOWNLOAD_SAME_DIR</em> não existe ainda</span></strong>, foi inventada agora, e é necessário definí-la em algum lugar, que não sabemos onde. Meu primeiro palpite foi o arquivo <em>conf.h</em>, mas não tinha nada de relevante lá. Para não ter que ficar procurando arquivo por arquivo, vamos procurar onde uma outra chave qualquer já tenha sido definida:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75/gtk$ <strong><span style="background-color:#df8;">grep PREF_KEY_START *</span></strong>
conf.c:    tr_bencDictAddBool( d, PREF_KEY_START, TRUE );
tr-core.c:        tr_ctorSetPaused( ctor, TR_FORCE, !pref_flag_get( PREF_KEY_START ) );
tr-core.c:    const gboolean doStart = pref_flag_eval( start, PREF_KEY_START );
tr-prefs.c:    w = new_check_button( s, PREF_KEY_START, core );
tr-prefs.h:<strong><span style="font-weight:normal;background-color:#df8;">#define PREF_KEY_START</span></strong>                      "start-added-torrents"</pre>
</div>
<p>Pronto, agora sabemos que a definição de <em>PREF_KEY_START</em> (uma preferência de checkbox no mesmo lugar onde adicionaremos a nova) foi <strong><span style="font-weight:normal;background-color:#df8;">feita no arquivo <em>tr-prefs.h</em></span></strong>. Vamos lá adicionar nossa chave nova também:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission$ <strong>diff -u transmission-1.75-original/gtk/tr-prefs.h transmission-1.75/gtk/tr-prefs.h</strong>
--- transmission-1.75-original/gtk/tr-prefs.h	2009-10-03 14:03:28.000000000 -0300
+++ transmission-1.75/gtk/tr-prefs.h	2009-10-03 14:38:55.000000000 -0300
@@ -26,6 +26,7 @@
 #define PREF_KEY_INHIBIT_HIBERNATION        "inhibit-desktop-hibernation"
 #define PREF_KEY_DIR_WATCH                  "watch-dir"
 #define PREF_KEY_DIR_WATCH_ENABLED          "watch-dir-enabled"
+<strong><span style="font-weight:normal;background-color:#df8;">#define PREF_KEY_DOWNLOAD_SAME_DIR          "download-same-dir"</span></strong>
 #define PREF_KEY_SHOW_TRAY_ICON             "show-notification-area-icon"
 #define PREF_KEY_SHOW_DESKTOP_NOTIFICATION  "show-desktop-notification"
 #define PREF_KEY_START                      "start-added-torrents"</pre>
</div>
<p>Ainda olhando o resultado do último <em>grep</em>, é possível observar que o <strong><span style="font-weight:normal;background-color:#df8;">arquivo <em>tr-prefs.c</em> também será útil</span></strong>, pois nele tem uma <strong><span style="font-weight:normal;background-color:#df8;">chamada a <em>new_check_button</em></span></strong>, que apesar de não conhecer, dá a entender que cria um checkbox na janela de preferências. Editemos esse arquivo e adicionemos nosso checkbox novo:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission$ <strong>diff -u transmission-1.75-original/gtk/tr-prefs.c transmission-1.75/gtk/tr-prefs.c</strong>
--- transmission-1.75-original/gtk/tr-prefs.c	2009-10-03 14:03:28.000000000 -0300
+++ transmission-1.75/gtk/tr-prefs.c	2009-10-03 15:08:09.000000000 -0300
@@ -305,6 +305,10 @@
     w = new_path_chooser_button( TR_PREFS_KEY_DOWNLOAD_DIR, core );
     hig_workarea_add_row( t, &amp;row, _( "Save to _Location:" ), w, NULL );

+    <strong><span style="font-weight:normal;background-color:#df8;">s = _( "Save to the same directory as torrent file" );</span></strong>
+    <strong><span style="font-weight:normal;background-color:#df8;">w = new_check_button( s, PREF_KEY_DOWNLOAD_SAME_DIR, core );</span></strong>
+    <strong><span style="font-weight:normal;background-color:#df8;">hig_workarea_add_wide_control( t, &amp;row, w );</span></strong>
+
     hig_workarea_add_section_divider( t, &amp;row );
     hig_workarea_add_section_title( t, &amp;row, _( "Limits" ) );
 </pre>
</div>
<p>O trecho adicionado foi baseado numa opção já existente. Para o que precisamos, não é necessário saber pra que servem as funções utilizadas, apesar de que em alguns minutos é possível descobrir isso e se familiarizar melhor com o que está acontecendo.</p>
<p>Bem, a princípio, o <strong><span style="font-weight:normal;background-color:#df8;">checkbox</span></strong> para configurar se queremos salvar os arquivos no mesmo diretório foi <strong><span style="font-weight:normal;background-color:#df8;">adicionado</span></strong>. Falta só <strong><span style="font-weight:normal;background-color:#df8;">utilizar o valor desta opção na janela de adicionar torrents</span></strong>.</p>
<p>Olhando novamente o diretório <em>gtk</em>, o <strong><span style="font-weight:normal;background-color:#df8;">provável arquivo que monta a janela que precisamos é o <em>add-dialog.c</em></span></strong>. O que queremos nele é: caso o checkbox com a configuração <em>PREF_KEY_DOWNLOAD_SAME_DIR</em> esteja marcado, devemos usar o diretório do arquivo torrent ao invés do diretório configurado. Desta vez não teve muita mágica para encontrar onde mexer. A dica é ler as funções definidas e tentar identificar o que estamos procurando.</p>
<p>Dentro da <strong><span style="font-weight:normal;background-color:#df8;">função <em>addSingleTorrentDialog</em> no arquivo <em>add-dialog.c</em></span></strong> foi possível encontrar o seguinte trecho:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>    if( <strong><span style="font-weight:normal;background-color:#df8;">tr_ctorGetDownloadDir</span></strong>( ctor, TR_FORCE, <strong><span style="font-weight:normal;background-color:#df8;">&amp;str</span></strong> ) )
        g_assert_not_reached( );
    g_assert( str );

    data = g_new0( struct AddData, 1 );
    data-&gt;core = core;
    data-&gt;ctor = ctor;
    data-&gt;filename = g_strdup( tr_ctorGetSourceFile( ctor ) );
    <strong><span style="font-weight:normal;background-color:#df8;">data-&gt;downloadDir = g_strdup( str );</span></strong></pre>
</div>
<p>Julgando pelos nomes, a função <em>tr_ctorGetDownloadDir</em> preenche o diretório de download do torrent da variável <em>ctor</em> na variável <em>str</em>.</p>
<p>O que precisamos então é <strong><span style="font-weight:normal;background-color:#df8;">definir a variável <em>str</em> para o diretório do arquivo torrent</span></strong> caso o checkbox <em>PREF_KEY_DOWNLOAD_SAME_DIR</em> esteja marcado.</p>
<p>Olhando o trecho de código anterior, sabemos que o <strong><span style="font-weight:normal;background-color:#df8;">caminho do arquivo</span></strong> pode ser obtido através da função <em>tr_ctorGetSourceFile</em> e, ainda no mesmo arquivo, é possível ver que consultamos se o <strong><span style="font-weight:normal;background-color:#df8;">checkbox da configuração</span></strong> está marcado com a função <em>pref_flag_get</em>. A única coisa que fica faltando é conseguir o <strong><span style="font-weight:normal;background-color:#df8;">nome do diretório</span></strong> a partir do caminho completo.</p>
<p>É comum que o diretório de um caminho completo seja retornado pela função ou comando chamado <em>dirname</em>. Como <strong><span style="font-weight:normal;background-color:#df8;">não sei nada de C</span></strong> pra ter certeza de como fazer, dei um <em>grep</em> por <em>dirname</em> para saber como o resto do programa obtém essa informação. <strong><span style="font-weight:normal;background-color:#df8;">Achei</span></strong> o cabeçalho <em>libtransmission/utils.h</em> que define a <strong><span style="font-weight:normal;background-color:#df8;">função <em>tr_dirname</em></span></strong>. Tudo que eu precisava.</p>
<p>A alteração final, já incluindo o arquivo .h necessário para a função de diretório, ficou assim:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission$ <strong>diff -u transmission-1.75-original/gtk/add-dialog.c transmission-1.75/gtk/add-dialog.c</strong>
--- transmission-1.75-original/gtk/add-dialog.c	2009-10-03 14:03:28.000000000 -0300
+++ transmission-1.75/gtk/add-dialog.c	2009-10-03 15:26:40.000000000 -0300
@@ -17,6 +17,7 @@
 #include "file-list.h"
 #include "hig.h"
 #include "tr-prefs.h"
+<strong><span style="font-weight:normal;background-color:#df8;">#include "libtransmission/utils.h"</span></strong>

 /****
 *****
@@ -285,8 +286,12 @@
                                              GTK_RESPONSE_CANCEL,
                                              -1 );

-    if( tr_ctorGetDownloadDir( ctor, TR_FORCE, &amp;str ) )
-        g_assert_not_reached( );
+    if ( <strong><span style="font-weight:normal;background-color:#df8;">pref_flag_get( PREF_KEY_DOWNLOAD_SAME_DIR )</span></strong> ) {
+        str = <strong><span style="font-weight:normal;background-color:#df8;">tr_dirname</span></strong>( tr_strdup( <strong><span style="font-weight:normal;background-color:#df8;">tr_ctorGetSourceFile</span></strong>( ctor ) ) );
+    } else {
+        if( tr_ctorGetDownloadDir( ctor, TR_FORCE, &amp;str ) )
+            g_assert_not_reached( );
+    }
     g_assert( str );

     data = g_new0( struct AddData, 1 );</pre>
</div>
<p>O resto foi apenas <strong><span style="font-weight:normal;background-color:#df8;">baseado em código já existente</span></strong>.</p>
<h3>Compilando e instalando o pacote</h3>
<p>Para finalizar, basta deixar que o Debian compile e gere o pacote:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75$ <strong><span style="background-color:#df8;">dpkg-buildpackage -rfakeroot -uc -b</span></strong></pre>
</div>
<p>Em seguida, para instalar o pacote que foi gerado no diretório acima do diretório do código fonte, execute como root:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>/home/diogo/transmission# <strong><span style="background-color:#df8;">dpkg -i transmission-gtk_1.75-1_amd64.deb</span></strong></pre>
</div>
<h3>Gerando um patch</h3>
<p>A forma universal de trocar alterações em código é através de patch, um arquivo com todos os <em>diff</em>&#8217;s mostrados acima.</p>
<p>Mas antes de criar o patch, é preciso remover alguns arquivos gerados pela compilação:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75$ <strong><span style="background-color:#df8;">dpkg-buildpackage -rfakeroot -Tclean</span></strong></pre>
</div>
<p>Agora é possível utilizar o <em>diff</em> para comparar o diretório original com o diretório onde as alterações foram feitas:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission$ <strong><span style="background-color:#df8;">diff -ru transmission-1.75-original/ transmission-1.75/ &gt; download-same-directory.diff</span></strong></pre>
</div>
<p>Ao enviar o patch para alguém ou para simplesmente aplicá-lo no diretório original, basta fazer:</p>
<div style="margin-bottom:10px;background-color:#eaeaea;color:000;border-left:3px solid #ccc;padding:5px;">
<pre>~/transmission/transmission-1.75-original$ <strong><span style="background-color:#df8;">patch -p1 &lt; ../download-same-directory.diff</span></strong>
patching file gtk/add-dialog.c
patching file gtk/conf.c
patching file gtk/tr-prefs.c
patching file gtk/tr-prefs.h</pre>
</div>
<p>Se você abrir o patch vai reparar que o caminho para os arquivos inicia com o nome dos diretórios <em>transmission-1.75-original</em> e <em>transmission-1.75</em>. O argumento <em>-p1</em> do <em>patch</em> é justamente para ignorar esse primeiro pedaço do path, uma vez que já estamos no diretório onde as alterações devem ser aplicadas.</p>
<h3>Considerações finais</h3>
<p>Esta alteração, na verdade, foi extremamente <strong><span style="font-weight:normal;background-color:#df8;">simples e com fim didático</span></strong>. Para modificações reais, é fundamental ter <strong><span style="font-weight:normal;background-color:#df8;">mais dedicação</span></strong> para entender a estrutura do projeto e produzir um <strong><span style="font-weight:normal;background-color:#df8;">patch de qualidade</span></strong>, que eventualmente possa ser <strong><span style="font-weight:normal;background-color:#df8;">utilizado pelo autor</span></strong>. No caso mostrado, por exemplo, é provável que a melhor abordagem seria alterar o <em>downloadDir</em> do <em>optional_args</em> do <em>tr_ctor</em>, mas seria mais chato para descrever neste post.</p>
<p>Os passos acima são voltados mais para <strong><span style="font-weight:normal;background-color:#df8;">começar com pequenas alterações de forma prática, sem ter que participar ativamente do projeto</span></strong>.</p>
<p>Caso deseje realmente participar, a melhor forma continua sendo utilizar o <strong><span style="font-weight:normal;background-color:#df8;">repositório oficial</span></strong> e interagir com os <strong><span style="font-weight:normal;background-color:#df8;">colaboradores</span></strong>, até mesmo pra saber se a sua idéia já não está em desenvolvimento ou se você pode coloborar com tarefas mais importantes.</p>
<p>Além disso, é bem comum que os desenvolvedores <strong><span style="font-weight:normal;background-color:#df8;">não aceitem um patch</span></strong> porque ele foi feito baseado no <strong><span style="font-weight:normal;background-color:#df8;">código de uma versão anterior</span></strong> ao trunk / head (que é o caso dos releases de pacotes do Debian), não sendo mais possível aplicá-lo depois de tantas alterações na versão de desenvolvimento.</p>
<p>Já estou até imaginando a galera toda alterando seus programas agora&#8230; <strong><span style="font-weight:normal;background-color:#df8;">Boa sorte!</span></strong></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/garotosopa.wordpress.com/682/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/garotosopa.wordpress.com/682/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/garotosopa.wordpress.com/682/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/garotosopa.wordpress.com/682/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/garotosopa.wordpress.com/682/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/garotosopa.wordpress.com/682/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/garotosopa.wordpress.com/682/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/garotosopa.wordpress.com/682/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/garotosopa.wordpress.com/682/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/garotosopa.wordpress.com/682/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=682&subd=garotosopa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://garotosopa.wordpress.com/2009/10/05/alterando-software-livre-jeito-debian-patch-transmission/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f427a182ea6627ec1e874ff21a5ad2d7?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">garotosopa</media:title>
		</media:content>

		<media:content url="http://garotosopa.files.wordpress.com/2009/10/samedirectory.png" medium="image">
			<media:title type="html">Save to the same directory as torrent file</media:title>
		</media:content>
	</item>
		<item>
		<title>Aproveitando melhor o aptitude</title>
		<link>http://garotosopa.wordpress.com/2009/04/26/aproveitando-melhor-o-aptitude/</link>
		<comments>http://garotosopa.wordpress.com/2009/04/26/aproveitando-melhor-o-aptitude/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 23:45:14 +0000</pubDate>
		<dc:creator>garotosopa</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://garotosopa.wordpress.com/?p=599</guid>
		<description><![CDATA[Pra quem usa Debian ou semelhante, como o Ubuntu, talvez as notas abaixo sejam úteis na hora de gerenciar os pacotes pelo aptitude.
Resumo

CTRL-T para acessar o menu
%D é o atributo de package size no display format
u para update
U para upgrade
g para executar e confirmar as alterações
: para ignorar a atualização de um pacote
= para deixar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=599&subd=garotosopa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Pra quem usa Debian ou semelhante, como o Ubuntu, talvez as notas abaixo sejam úteis na hora de gerenciar os pacotes pelo <strong>aptitude</strong>.</p>
<h3>Resumo</h3>
<ul>
<li><strong>CTRL-T</strong> para acessar o menu</li>
<li><strong>%D</strong> é o atributo de <em>package size</em> no <em>display format</em></li>
<li><strong>u</strong> para update</li>
<li><strong>U</strong> para upgrade</li>
<li><strong>g</strong> para executar e confirmar as alterações</li>
<li><strong>:</strong> para ignorar a atualização de um pacote</li>
<li><strong>=</strong> para deixar o pacote nesta versão até a segunda ordem</li>
<li><strong>G</strong> para filtrar ou alterar a exibição da lista de pacotes</li>
<li><strong>filter(~i !~M)</strong> mostra apenas os pacotes instalados manualmente</li>
<li><strong>m</strong> para marcar um pacote como instalado manualmente</li>
<li><strong>M</strong> para marcar um pacote como instalado automaticamente</li>
<li>Isso é só cultura inútil, ignore se tiver outra coisa pra fazer</li>
</ul>
<p><span id="more-599"></span></p>
<h3>Pacotes recomendados</h3>
<p>Uma boa coisa a se fazer ao instalar o sistema do zero é configurar o aptitude para não instalar os pacotes recomendados automaticamente, somente as dependências. Isso poupa dezena de pacotes que você provavelmente não quer.</p>
<p>A opção está disponível no menu <strong>Options -&gt; Preferences</strong>, que pode ser acessado pressionando <strong>CTRL-T</strong>. Desmarque a opção <em>Install recommended packages automatically</em>.</p>
<h3>Pacotes desnecessários</h3>
<p>Logo abaixo tem a opção <em>Remove unused packages automatically</em>. Confirme que ela esteja marcada para garantir que pacotes que foram instalados para satisfazer dependências sejam removidos quando não forem mais necessários.</p>
<h3>Package size</h3>
<p>Ainda nas preferências, acho legal incluir a coluna com o tamanho do pacote a ser baixado, em caso de atualização ou nova instalação.</p>
<p>Edite a opção <em>The display format for package views</em> e inclua o atributo <strong>%D</strong>. Aqui a configuração ficou <em><span style="background-color:#eaeaea;">%c%a%M%S %p %Z %D %v %V</span></em>.</p>
<p>Saber o tamanho do pacote ajuda na hora de priorizar alguns e desistir de outros, caso tenha muita coisa para atualizar.</p>
<h3>Ignorando atualizações</h3>
<p>Para atualizar o sistema, utiliza-se a tecla <strong>u</strong> (minúsculo) para atualizar a lista de pacotes do repositório (o mesmo que o comando aptitude update ou apt-get update) e depois a tecla <strong>U</strong> (maiúsculo) para marcar para atualização os pacotes com versões mais novas disponíveis (o mesmo que aptitude upgrade ou apt-get upgrade).</p>
<p>Para executar as alterações, pressione <strong>g</strong> (minúsculo). Você será levado para uma tela de preview. Pressione <strong>g</strong> novamente para confirmar.</p>
<p>Se quiser ignorar alguma atualização, pressione <strong>:</strong> em cima do pacote que deseja ignorar. Ele ficará como <em>upgradable</em> até o próximo upgrade (<strong>U</strong>).</p>
<p>Caso prefira manter o pacote na versão atual indefinidamente, pressione <strong>=</strong> em cima do pacote para deixá-lo em <em>hold</em>. Ele ficará aguardando neste status até que você remova o hold.</p>
<h3>Filtrando a lista de pacotes</h3>
<p>Na tela principal do aptitude estão listados todos os pacotes dos repositórios agrupados por tarefa, status e seção. Este agrupamento pode ser trocado através da tecla <strong>G</strong> (maiúsculo).</p>
<p>Uma visualização que faço frequentemente é filtrar os pacotes instalados com o filtro <em><span style="background-color:#eaeaeal;">filter(~i !~M)</span></em>. O atributo <em>~i</em> lista os pacotes instalados e o atributo <em>~M</em> lista os pacotes instalados automaticamente para satisfazer dependências (neste caso, utilizado com negação).</p>
<p>Ao pressionar <strong>G</strong>, o filtro e agrupamentos ficam <em><span style="background-color:#eaeaea;">filter(~i !~M),section</span></em>.</p>
<h3>Marcar pacotes como instalados automaticamente</h3>
<p>O benefício do filtro acima é poder diferenciar os pacotes que realmente se quer instalados dos que foram instalados por necessidade.</p>
<p>Utilizando o filtro e agrupmento como no exemplo anterior, a seção <em>libs</em> deveria mostrar uma quantidade mínima de pacotes, já que o que utilizamos são os programas, sendo as bibliotecas apenas para satisfazer dependências (salvo algumas exceções como a libdvdcss2, por exemplo).</p>
<p>Se com o filtro anterior forem exibidos vários pacotes na seção libs é porque, pro aptitude, estas bibliotecas foram instaladas manualmente. O problema disso é que, se todos os programas que utilizam a biblioteca forem removidos, ela vai continuar lá.</p>
<p>Para marcar os pacotes como instalados automaticamente, pressione <strong>M</strong> (maiúsculo) em cima do pacote, ou em cima da seção para marcar todos como automáticos, como no caso das libs.</p>
<p>Se esta é a primeira vez que você faz isso, é comum que vários pacotes sejam removidos. Nesse caso, ao pressionar <strong>g</strong> para concluir as alterações, vale a pena dar uma boa olhada no preview antes de pressionar <strong>g</strong> novamente para confirmar.</p>
<p>Para marcar um pacote como instalado manualmente e evitar que ele seja removido quando nenhum outro pacote depender mais dele, pressione <strong>m</strong> (minúsculo) em cima do pacote.</p>
<p>Caso você tenha muita paciência ou mais nada de interessante pra fazer, pode ser um <del>bom</del> longo passatempo percorrer toda a lista de pacotes (com <em>filter(~i !~M)</em>) e marcar como instalação automática aqueles que você desconhece ou acha que não precisa. </p>
<p>Na dúvida é melhor deixar instalado, principalmente se for algum relacionado a boot ou filesystem.</p>
<h3>Ignore tudo isso</h3>
<p>Em quase 100% dos casos os usuários vão preferir desconhecer os pacotes instalados e só usar o Synaptic de vez em quando. Eu entendo. Afinal são só pacotes no computador. É que eu estava sem o que fazer e precisava de algum lugar pra anotar isso, porque sempre esqueço.</p>
<p>Caso alguém se interesse, o User&#8217;s Manual disponível no menu (através de <strong>CTRL-T</strong>) é mais completo do que <em>man aptitude</em>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/garotosopa.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/garotosopa.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/garotosopa.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/garotosopa.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/garotosopa.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/garotosopa.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/garotosopa.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/garotosopa.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/garotosopa.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/garotosopa.wordpress.com/599/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=599&subd=garotosopa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://garotosopa.wordpress.com/2009/04/26/aproveitando-melhor-o-aptitude/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f427a182ea6627ec1e874ff21a5ad2d7?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">garotosopa</media:title>
		</media:content>
	</item>
		<item>
		<title>Could not create GL context com driver da Nvidia</title>
		<link>http://garotosopa.wordpress.com/2008/08/31/could-not-create-gl-context-com-driver-da-nvidia/</link>
		<comments>http://garotosopa.wordpress.com/2008/08/31/could-not-create-gl-context-com-driver-da-nvidia/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 14:19:56 +0000</pubDate>
		<dc:creator>garotosopa</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://garotosopa.wordpress.com/?p=79</guid>
		<description><![CDATA[Ontem fui tentar jogar Frets On Fire e recebi o erro Could not create GL Context.
O problema ocorreu porque a biblioteca libglx.so deveria apontar para o arquivo da Nvidia, no entanto o arquivo original do Xorg estava sendo usado. Isso deve ter acontecido por causa de alguma atualização do Xorg depois de já ter instalado [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=79&subd=garotosopa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ontem fui tentar jogar Frets On Fire e recebi o erro Could not create GL Context.</p>
<p>O problema ocorreu porque a biblioteca <strong>libglx.so</strong> deveria apontar para o arquivo da <strong>Nvidia</strong>, no entanto o arquivo original do Xorg estava sendo usado. Isso deve ter acontecido por causa de alguma atualização do Xorg depois de já ter instalado o driver da Nvidia.</p>
<p>Pra não ter que instalar o driver da Nvidia de novo, fiz o seguinte:<br />
<span id="more-79"></span><br />
<code style="font-size:.9em;text-align:left;">root@olivia:~# <strong><span style="background-color:#FDD;">cd /usr/lib/xorg/modules/extensions/</span></strong><br />
&nbsp;<br />
root@olivia:/usr/lib/xorg/modules/extensions/# <strong><span style="background-color:#FDD;">ls -l</span></strong><br />
-rw-r--r-- 1 root root   19243 2008-08-02 18:44 libdbe.so<br />
-rw-r--r-- 1 root root   40804 2008-08-02 18:44 libdri.so<br />
-rw-r--r-- 1 root root  151848 2008-08-02 18:44 libextmod.so<br />
-rw-r--r-- 1 root root 2487120 2008-08-02 18:44 libGLcore.so<br />
-rw-r--r-- 1 root root  426657 2008-08-02 18:44 <strong>libglx.so</strong><br />
-rwxr-xr-x 1 root root  763656 2008-04-06 14:34 <strong>libglx.so.169.12</strong><br />
-rw-r--r-- 1 root root   28767 2008-08-02 18:44 librecord.so<br />
-rw-r--r-- 1 root root   40153 2008-08-02 18:44 libxtrap.so<br />
&nbsp;<br />
root@olivia:/usr/lib/xorg/modules/extensions/# <strong><span style="background-color:#FDD;">mv libglx.so libglx.so.xorg</span></strong><br />
&nbsp;<br />
root@olivia:/usr/lib/xorg/modules/extensions/# <strong><span style="background-color:#FDD;">ln -s $PWD/libglx.so.169.12 libglx.so</span></strong><br />
&nbsp;<br />
root@olivia:/usr/lib/xorg/modules/extensions/# <strong><span style="background-color:#FDD;">ls -l</span></strong><br />
-rw-r--r-- 1 root root   19243 2008-08-02 18:44 libdbe.so<br />
-rw-r--r-- 1 root root   40804 2008-08-02 18:44 libdri.so<br />
-rw-r--r-- 1 root root  151848 2008-08-02 18:44 libextmod.so<br />
-rw-r--r-- 1 root root 2487120 2008-08-02 18:44 libGLcore.so<br />
lrwxrwxrwx 1 root root      16 2008-08-30 15:36 <strong>libglx.so -&gt; libglx.so.169.12</strong><br />
-rwxr-xr-x 1 root root  763656 2008-04-06 14:34 libglx.so.169.12<br />
-rw-r--r-- 1 root root  426657 2008-08-02 18:44 libglx.so.xorg<br />
-rw-r--r-- 1 root root   28767 2008-08-02 18:44 librecord.so<br />
-rw-r--r-- 1 root root   40153 2008-08-02 18:44 libxtrap.so<br />
&nbsp;</code></p>
<p>Agora sim o Xorg vai utilizar a extensão GLX da Nvidia e finalmente vou conseguir jogar Frets On Fire :)</p>
<p>Se o outro arquivo libglx.so com o número da versão do driver não existir, daí não tem jeito, tem que instalar o driver da Nvidia.</p>
<p>Pra evitar que isso ocorra na próxima atualização do Xorg, sugiro <a href="http://wiki.debian.org/NvidiaGraphicsDrivers">instalar o driver da Nvidia do jeito Debian</a>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/garotosopa.wordpress.com/79/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/garotosopa.wordpress.com/79/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/garotosopa.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/garotosopa.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/garotosopa.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/garotosopa.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/garotosopa.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/garotosopa.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/garotosopa.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/garotosopa.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/garotosopa.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/garotosopa.wordpress.com/79/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=79&subd=garotosopa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://garotosopa.wordpress.com/2008/08/31/could-not-create-gl-context-com-driver-da-nvidia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f427a182ea6627ec1e874ff21a5ad2d7?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">garotosopa</media:title>
		</media:content>
	</item>
		<item>
		<title>Janelas maximizadas sem borda com o Devilspie</title>
		<link>http://garotosopa.wordpress.com/2008/03/23/janelas-maximizadas-sem-borda-com-o-devilspie/</link>
		<comments>http://garotosopa.wordpress.com/2008/03/23/janelas-maximizadas-sem-borda-com-o-devilspie/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 22:59:02 +0000</pubDate>
		<dc:creator>garotosopa</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://garotosopa.wordpress.com/2008/03/23/janelas-maximizadas-sem-borda-com-o-devilspie/</guid>
		<description><![CDATA[Sempre gostei de interfaces minimalistas, e uma coisa que estava me chateando ultimamente era o desperdício de espaço com a barra de título em algumas janelas que eu só utilizo maximizadas. Nada que o Devil&#8217;s Pie não resolva.
O Devil&#8217;s Pie funciona observando as janelas que são abertas e, pra cada janela que se encaixar em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=44&subd=garotosopa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Sempre gostei de interfaces minimalistas, e uma coisa que estava me chateando ultimamente era o desperdício de espaço com a barra de título em algumas janelas que eu só utilizo maximizadas. Nada que o Devil&#8217;s Pie não resolva.</p>
<p>O Devil&#8217;s Pie funciona observando as janelas que são abertas e, pra cada janela que se encaixar em alguma regra predefinida, executa as ações desejadas.</p>
<p>Dentre as opções de ação, é possível maximizar, definir tamanho, colocar a janela em fullscreen, jogar para outra workspace, definir posição, entre outras coisas. O que me interessou foi poder utilizar o recurso <strong>undecorate</strong> para remover a <em>window decoration</em>, a borda com a barra de título.</p>
<p><span id="more-44"></span><br />
O primeiro passo é instalá-lo:<br />
<code># <strong>aptitude install devilspie</strong></code></p>
<p>O Devil&#8217;s Pie lê todos os arquivos com extensão <strong>.ds</strong> localizados em <strong>~/.devilspie/</strong>, então, sem seguida, cria-se um arquivo com as regras e ações.</p>
<p><strong>~/.devilspie/fullscreen.ds</strong><br />
<code style="display:block;background:#eaeaea;">(if<br />
&nbsp;&nbsp;&nbsp;&nbsp;(and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(or<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(is&nbsp;(window_class)&nbsp;"Firefox-bin")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(is&nbsp;(window_class)&nbsp;"Xchat")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(contains&nbsp;(window_property&nbsp;"_NET_WM_STATE")&nbsp;"_NET_WM_STATE_MAXIMIZED_VERT")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(contains&nbsp;(window_property&nbsp;"_NET_WM_STATE")&nbsp;"_NET_WM_STATE_MAXIMIZED_HORZ")<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(undecorate)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unmaximize)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(maximize)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
)</code></p>
<p>Neste caso o script verifica <strong>se a janela é do Firefox ou Xchat e se estão maximizadas vertical e horizontalmente</strong> e, caso a janela se enquadre nestes critérios, a decoração é removida e a janela remaximizada.</p>
<p>As ações de <em>unmaximize</em> e <em>maximize</em> são necessárias porque após remover a decoração sobraria um espaço vazio.</p>
<p>Agora basta executar <strong>devilspie</strong> que as alterações serão feitas e, se for o caso, colocar o comando para ser executado ao iniciar o X.</p>
<h3>Firefox maximizado ainda com a barra de título</h3>
<p><img src='http://garotosopa.com/wp-content/uploads/2008/03/devilspie-antes.png' alt='Antes do Devil’s Pie' /></p>
<h3>Firefox maximizado sem borda com o Devil&#8217;s Pie</h3>
<p><img src='http://garotosopa.com/wp-content/uploads/2008/03/devilspie-depois.png' alt='Depois do Devil’s Pie' /></p>
<p>Uma forma de descobrir o <em>window_name</em> para utilizar na regra é criando um script qualquer, <em>~/.devilspie/debug.ds</em> por exemplo, com a ação <em>(debug)</em>. Ao executar o devilspie novamente, serão mostrados no terminal alguns detalhes das janelas.</p>
<p>Para conhecer outras regras e ações, recomendo <a href="http://foosel.org/linux/devilspie">este ótimo artigo sobre o Devil&#8217;s Pie</a>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/garotosopa.wordpress.com/44/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/garotosopa.wordpress.com/44/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/garotosopa.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/garotosopa.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/garotosopa.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/garotosopa.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/garotosopa.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/garotosopa.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/garotosopa.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/garotosopa.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/garotosopa.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/garotosopa.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=44&subd=garotosopa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://garotosopa.wordpress.com/2008/03/23/janelas-maximizadas-sem-borda-com-o-devilspie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f427a182ea6627ec1e874ff21a5ad2d7?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">garotosopa</media:title>
		</media:content>

		<media:content url="http://garotosopa.com/wp-content/uploads/2008/03/devilspie-antes.png" medium="image">
			<media:title type="html">Antes do Devil’s Pie</media:title>
		</media:content>

		<media:content url="http://garotosopa.com/wp-content/uploads/2008/03/devilspie-depois.png" medium="image">
			<media:title type="html">Depois do Devil’s Pie</media:title>
		</media:content>
	</item>
		<item>
		<title>Diminuindo a fonte do GTK 1 para o XMMS</title>
		<link>http://garotosopa.wordpress.com/2008/01/19/diminuindo-a-fonte-do-gtk-1-para-o-xmms/</link>
		<comments>http://garotosopa.wordpress.com/2008/01/19/diminuindo-a-fonte-do-gtk-1-para-o-xmms/#comments</comments>
		<pubDate>Sat, 19 Jan 2008 14:58:24 +0000</pubDate>
		<dc:creator>garotosopa</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[xmms]]></category>

		<guid isPermaLink="false">http://garotosopa.wordpress.com/2008/01/19/diminuindo-a-fonte-do-gtk-1-para-o-xmms/</guid>
		<description><![CDATA[As novas dependências do Audacious me fizeram voltar de vez para o XMMS; mas se tem algo que me irrita mais que pacotes esquisitos sendo instalados, são interfaces com fontes gigantes.
O XMMS, por utilizar o velho, feio e bobo GTK 1, era uma dessas interfaces. Contudo, foi só editar o arquivo /etc/gtk/gtkrc.utf-8 para resolver o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=39&subd=garotosopa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As novas dependências do Audacious me fizeram voltar de vez para o XMMS; mas se tem algo que me irrita mais que pacotes esquisitos sendo instalados, são interfaces com fontes gigantes.</p>
<p>O XMMS, por utilizar o velho, feio e bobo GTK 1, era uma dessas interfaces. Contudo, foi só editar o arquivo /etc/gtk/gtkrc.utf-8 para resolver o problema :)<br />
<span id="more-39"></span></p>
<h3>XMMS antes:</h3>
<p><img src='http://garotosopa.files.wordpress.com/2008/01/xmms-gtk1-font-120.png' alt='XMMS com GTK 1 utilizando fontes grandes' /></p>
<p>Editando o arquivo <strong>/etc/gtk/gtkrc.utf-8</strong>:</p>
<p><code>style "default-text" {<br />
       fontset = "-*-arial-medium-r-normal--*-<strong>120</strong>-*-*-*-*-iso10646-1,\<br />
                  -*-helvetica-medium-r-normal--*-<strong>120</strong>-*-*-*-*-*-*"<br />
}<br />
class "GtkWidget" style "default-text"</code></p>
<p><strong>Troquei o tamanho da fonte de 120 para 80</strong> e bastou recarregar o XMMS para ter uma interface muito mais amigável.</p>
<h3>XMMS depois:</h3>
<p><img src='http://garotosopa.files.wordpress.com/2008/01/xmms-gtk1-font-80.png' alt='XMMS com GTK 1 utilizando fontes pequenas' /></p>
<p>Caso o sistema não esteja configurado em UTF-8, será necessário editar o arquivo <em>gtkrc</em> correspondente no diretório /etc/gtkrc/.</p>
<p>&#8230; e adeus Audacious-e-suas-dependências!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/garotosopa.wordpress.com/39/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/garotosopa.wordpress.com/39/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/garotosopa.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/garotosopa.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/garotosopa.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/garotosopa.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/garotosopa.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/garotosopa.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/garotosopa.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/garotosopa.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/garotosopa.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/garotosopa.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=garotosopa.wordpress.com&blog=954761&post=39&subd=garotosopa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://garotosopa.wordpress.com/2008/01/19/diminuindo-a-fonte-do-gtk-1-para-o-xmms/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f427a182ea6627ec1e874ff21a5ad2d7?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">garotosopa</media:title>
		</media:content>

		<media:content url="http://garotosopa.files.wordpress.com/2008/01/xmms-gtk1-font-120.png" medium="image">
			<media:title type="html">XMMS com GTK 1 utilizando fontes grandes</media:title>
		</media:content>

		<media:content url="http://garotosopa.files.wordpress.com/2008/01/xmms-gtk1-font-80.png" medium="image">
			<media:title type="html">XMMS com GTK 1 utilizando fontes pequenas</media:title>
		</media:content>
	</item>
	</channel>
</rss>