29 de agosto de 2010

Calendário santo-discordiano no Fluxbox

Acabei de implementar o calendário santo-discordiano no Fluxbox 1.1.1 (última versão).

Link para download do código: fluxbox-ddate-1.1.1-0.tar.bz2

Se você usa Arch Linux, não precisa baixar e compilar manualmente. Basta usar o pkgbuild que o Rev. Beraldo fez para o AUR: aur.archlinux.org/packages.php?ID=40364.

Se você usa Gentoo, não precisa baixar e compilar manualmente. Basta colocar o ebuild que eu fiz num overlay: fluxbox-ddate no Gentoo.

Versões compiladas .deb, .rpm, .tgz etc. e ebuilds, pkgbuilds etc. são bem vindos! Me passem que eu coloco um link aqui!

Como baixar e descompactar

Como você faria com qualquer outro pacote .tar.bz2…

$ wget http://tiagomadeira.com/wp-content/uploads/2010/08/fluxbox-ddate-1.1.1-0.tar.bz2
$ tar xjvf fluxbox-ddate-1.1.1-0.tar.bz2
$ cd fluxbox-ddate-1.1.1-0

Como compilar

Versão simples:

$ ./configure
$ make
$ make install

Versão complicada:

$ export CFLAGS=-O2 -march=native -msse4.1
$ export CXXFLAGS=$CFLAGS
$ ./configure --prefix=/usr --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --enable-nls --disable-xinerama --enable-xft --disable-gnome --enable-imlib2 --enable-slit --enable-toolbar --sysconfdir=/etc/X11/fluxbox
$ make -j3
$ make install

Encontre seu meio termo (ou use a simples) e divirta-se!

Como iniciar um Fluxbox

Inicie o X e peça pra ele abrir a versão que você compilou do Fluxbox da seguinte maneira:

$ startx /usr/local/bin/fluxbox -- :1

(Lembre-se de mudar /usr/local para o --prefix que usou no ./configure)

Esta linha funciona dentro de uma sessão do X (abre outra), por causa do -- :1.

Como usar a data discordiana

Clique com a tecla direita no relógio do seu Fluxbox e Edit clock format. Se você usar um formato de data convencional, do falso calendário (como deve estar usando no momento), nada de especial acontecerá. O segredo está no |fnord|.

Quando você coloca um |fnord| no formato, o Fluxbox interpretará tudo que veio antes como formato de data discordiano.

(Para escolher o formato de data ideal, você pode digitar man ddate num terminal.)

Exemplos de uso:

  • Formato: %c → Saída: Sat 28 Aug 2010 11:50:26 PM BRT
  • Formato: %e of %B of %Y|fnord| → Saída: 21st of Bureaucracy of 3176
  • Formato: %d %b %Y|fnord|, %H:%M:%S → Saída: 21 Bcy 3176, 23:50:26
  • Formato: %.|fnord| → Saída: All Hail Discordia!

Dúvidas, sugestões?

Contate a glândula pineal.

Como funciona o código?

O Fluxbox usa a função strftime para formatar a data do relógio. Isso acontece na linha 274 do arquivo src/ClockTool.cc. Modifiquei este trecho do código adicionando cerca de 23 linhas que separam a string do formato de data no |fnord| e passam o que vem antes dele como parâmetro para uma chamada de sistema pro ddate (sim, de fato pra próxima versão é melhor copiar o código do ddate ou reimplementar pra não ter este overhead) e o que vem depois continua indo pro strftime.

Ficou assim:

char s[255], u[255];
strcpy(s, m_timeformat->c_str());
char *t = strstr(s, "|fnord|");
time_string_len = 0;
if (t != NULL) {
	*t = '�';
	sprintf(u, "ddate +'%s'", s);
	FILE *ddate = popen(u, "r");
	if (fgets(time_string, 255, ddate)) {
		time_string_len = strlen(time_string);
		time_string[--time_string_len] = '�';
		fclose(ddate);
	}
	t+= 7;
} else {
	t = s;
}
time_string_len+= strftime(&time_string[time_string_len], 255 - time_string_len, t, time_type);

Known bugs

  1. Colocar ‘ (aspas simples) no lado esquerdo do |fnord| faz com que a data discordiana não apareça.
  2. Requer util-linux-ng e faz uma chamada de sistema ao ddate uma vez por segundo.
  3. Não trabalha ainda com horas métricas.
  4. … me informe se achar mais algum!

Screenshots

Screenshot 0

Screenshot 1

Screenshot 2

Publicado às 00:00 em Códigos aleatórios, Software Livre | 17 comentários
Tags: , , , , ,

17 comentários

  1. [...] This post was mentioned on Twitter by Tiago Madeira, Tiago Madeira. Tiago Madeira said: Calendário santo-discordiano no Fluxbox: http://bit.ly/bF6sRw [...]

  2. GENIAL!!!!!

    Mas cara, sendo santo-discordiano, assumo que funcione também com o horário… Ou só com datas?

  3. Tiago Madeira disse:

    [Ainda] não funciona com horários! Vou registrar nos “known bugs” pra colocar na próxima versão! :)

  4. FOOODA!

    Agora, rodar make install vai substituir o Fluxbox antigo?

  5. Tiago Madeira disse:

    Depende do --prefix que você colocar no ./configure.

    Seu Fluxbox provavelmente está instalado em /usr, então colocar --prefix=/usr/local deve instalar num lugar diferente, por exemplo.

    Aqui eu usei --prefix=/tmp/fluxbox/build e iniciei com startx /tmp/fluxbox/build/bin/fluxbox -- :1 (vou instalar de verdade depois que escrever um ebuild pra não sujar o Gentoo :))

  6. Tiago, seria realmente interessante se o pacote se chamasse fluxbox-ddate ao invés de simplesmente fluxbox. Como faz isso?

    • Tiago Madeira disse:

      Não acho que o pacote precise mudar de nome. É um patch muito pequeno no Fluxbox (algumas linhas), não acho que se qualifique como fork (por isso a decisão de só adicionar um patch no ebuild do Gentoo :))

  7. Tiago Madeira disse:

    É verdade! Não tinha pensado nisso.
    Vou mudar, gerar um novo tar e editar esse post.

  8. [...] Blog do Tiago Just another WordPress weblog « Calendário santo-discordiano no Fluxbox [...]

  9. Schneider disse:

    Muito massa! Vou usar! :)

  10. Cara, muito, muito foda. Você vai mandar o patch pro upstream? =D

    Se não for muito complicado vou ver se crio um .deb hoje à noite pro Ubuntu

    • Tiago Madeira disse:

      Quando eu corrigir o bug 2 vou tentar mandar pro Fluxbox :) (porque aí não dependeremos mais de ddate/util-linux-ng, o negócio ficará mais eficiente e o código mais bonito. E o item 1 será consertado junto)

      Quando criar o .deb, manda pra eu publicar aqui! :)

  11. Ah, um detalhe que, bem, pode ser um bug: haverá, no futuro, possibilidade de outras línguas (pra poder aparecer burocracia, consequências, etc?)

  12. Santaum disse:

    Repito novamente: sensacional!!!!!

Deixe o seu comentário

A mídia tradicional envia mensagens. Blogs iniciam conversações.