Controlar Papéis de Parede

Iniciado por mhkgalvez, 24 de Maio de 2010, 13:15

tópico anterior - próximo tópico

mhkgalvez

Olá pessoal. Estou desenvolvendo um projeto em C++ simples que ficará ligado no sistema e mudará, de tempos em tempos, o papel de parede. Como tem um tempinho que não trabalho com C++ estou com algumas dúvidas. O código abaixo retorna os seguintes erros, no G++.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(void)
{
    int i = 0;
    int j = 0;
    string file[5];
    file[0] = "/home/mhkgalvez/Imagens/Papéis\ de\ Parede\ Bíblicos/aurora.jpg";
    file[1] = "/home/mhkgalvez/Imagens/Papéis\ de\ Parede\ Bíblicos/Bibi.jpg";
    file[2] = "/home/mhkgalvez/Imagens/Papéis\ de\ Parede\ Bíblicos/blackstyle.png";
    file[3] = "/home/mhkgalvez/Imagens/Papéis\ de\ Parede\ Bíblicos/lud.JPG";
    file[4] = "/home/mhkgalvez/Imagens/Papéis\ de\ Parede\ Bíblicos/rose.jpg";
     while (i<1000)
    {
        if (i%2==0)
        {
            system("gconftool-2 -t str -s /desktop/gnome/background/picture_filename "+file[j]);
            j++;
        }
        i++;
    }
    return 0;
}


Citarmain.cpp: In function 'int main()':
main.cpp:11: warning: unknown escape sequence: '\040'
main.cpp:11: warning: unknown escape sequence: '\040'
main.cpp:11: warning: unknown escape sequence: '\040'
main.cpp:12: warning: unknown escape sequence: '\040'
main.cpp:12: warning: unknown escape sequence: '\040'
main.cpp:12: warning: unknown escape sequence: '\040'
main.cpp:13: warning: unknown escape sequence: '\040'
main.cpp:13: warning: unknown escape sequence: '\040'
main.cpp:13: warning: unknown escape sequence: '\040'
main.cpp:14: warning: unknown escape sequence: '\040'
main.cpp:14: warning: unknown escape sequence: '\040'
main.cpp:14: warning: unknown escape sequence: '\040'
main.cpp:15: warning: unknown escape sequence: '\040'
main.cpp:15: warning: unknown escape sequence: '\040'
main.cpp:15: warning: unknown escape sequence: '\040'
main.cpp:20: error: cannot convert 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'const char*' for argument '1' to 'int system(const char*)'

O erro na linha 20 refere-se aos argumentos da função system, que devem ser const char e não string. Como faço essa conversão? E mais, que erro é esse "unknown escape sequence: \040"? Como resolvê-lo?
"A quem vencer, eu o farei coluna no templo do meu Deus, e dele nunca sairá; e escreverei sobre ele o nome do meu Deus, e o nome da cidade do meu Deus, a nova Jerusalém, que desce do céu, do meu Deus, e também o meu novo nome."

jeflui

O problema é a barra invertida "\", use duas "\\" deve resolver.

José Vitor

Citação de: jeflui online 24 de Maio de 2010, 15:54
O problema é a barra invertida "\", use duas "\\" deve resolver.

Use assim:
file[0] = "/home/mhkgalvez/Imagens/Papéis\\ de\\ Parede\\ Bíblicos/aurora.jpg";

ou assim (acho melhor):
file[0] = "'/home/mhkgalvez/Imagens/Papéis de Parede Bíblicos/aurora.jpg'";
com uma aspa simples (apóstrofo) delimitando a string para o shell.

mhkgalvez

#3
A dica da barra dupla invertida foi a que deu certo. Resolveu este problema. Mas agora, o problema está no funcionamento do aplicativo. Como eu não consegui concatenar a string final dentro já da função system, coloquei o código de mudança do papel de parede já dentro do vetor:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(void)
{
   int i = 0;
   int j = 0;
   const char *file[5];
   file[0] = "gconftool-2 -t str -s /desktop/gnome/background/picture_filename /home/mhkgalvez/Imagens/Papéis\\ de\\ Parede\\ Bíblicos/aurora.jpg";
   file[1] = "gconftool-2 -t str -s /desktop/gnome/background/picture_filename /home/mhkgalvez/Imagens/Papéis\\ de\\ Parede\\ Bíblicos/Bibi.jpg";
   file[2] = "gconftool-2 -t str -s /desktop/gnome/background/picture_filename /home/mhkgalvez/Imagens/Papéis\\ de\\ Parede\\ Bíblicos/blackstyle.png";
   file[3] = "gconftool-2 -t str -s /desktop/gnome/background/picture_filename /home/mhkgalvez/Imagens/Papéis\\ de\\ Parede\\ Bíblicos/lud.JPG";
   file[4] = "gconftool-2 -t str -s /desktop/gnome/background/picture_filename /home/mhkgalvez/Imagens/Papéis\\ de\\ Parede\\ Bíblicos/rose.jpg";
   while (i<1001)
   {
       if (i%200==0)
       {
           system(file[j]);
           j++;
       }
       i++;
   }
   return 0;
}


O problema é que ele não muda para os papéis de parede desejados. Antes, muda uma só vez para a cor marrom e assim permanece até terminar.
Isso na verdade é um problema do comando
Citargconftool-2 -t str -s
pois se eu uso ele puramente no terminal, sem o aplicativo rodando, ele também tem o mesmo efeito, a saber, ao invés de mudar o papel de parede, ele faz a tela ficar marrom.
"A quem vencer, eu o farei coluna no templo do meu Deus, e dele nunca sairá; e escreverei sobre ele o nome do meu Deus, e o nome da cidade do meu Deus, a nova Jerusalém, que desce do céu, do meu Deus, e também o meu novo nome."

irtigor

Não sei se serve para o seu propósito, mas o papel de parede do Gnome pode ser um xml, com quantas imagens você quiser e cada imagem fica o tempo que você desejar. É uma mudança na forma de resolver o seu problema, no lugar de executar um aplicativo o tempo todo, você pode criar um aplicativo que gere o xml a partir de imagens pré-definidas ou mesmo de um diretório. É uma abordagem melhor, na minha opinião.

jeflui

Se for para fazer de outra forma, bastava criar um shell script e colocar no crontab.
Voltando para o seu problema, que tal fazer um teste mais "amigável", coloca uma imagem no seu home mesmo. Sem ser nesse diretório com espaços no nome e acentuado. Teste no terminal, a partir do momento que funcionar, você testa no seu código.

José Vitor

Citação de: irtigor online 24 de Maio de 2010, 21:39
Não sei se serve para o seu propósito, mas o papel de parede do Gnome pode ser um xml, com quantas imagens você quiser e cada imagem fica o tempo que você desejar. É uma mudança na forma de resolver o seu problema, no lugar de executar um aplicativo o tempo todo, você pode criar um aplicativo que gere o xml a partir de imagens pré-definidas ou mesmo de um diretório. É uma abordagem melhor, na minha opinião.

Eu já tinha visto visto esse arquivo backgrounds.xml (ou parecido), mas não tinha me animado o suficiente prá saber como como funciona. Bom saber, apesar de eu detestar xml.

Com relação ao problema do colega acima faria um shell script rodando a partir do .bash_profile...aliás, já fiz isso uma vez...

mhkgalvez

O que é mesmo shell script? E bash_profile?

Quanto a testar um link mais simples, não deu certo. O problema persiste.
"A quem vencer, eu o farei coluna no templo do meu Deus, e dele nunca sairá; e escreverei sobre ele o nome do meu Deus, e o nome da cidade do meu Deus, a nova Jerusalém, que desce do céu, do meu Deus, e também o meu novo nome."

jeflui

gconftool-2 -t str --set /desktop/gnome/background/picture_filename "/home/mhkgalvez/rose.jpg"

Coloca a imagem "rose.jpg" no seu home.

Pelo menos isso tem que funcionar antes de você começar a fazer o resto.

mhkgalvez

Ah sim, e colocaria essas aspas em C++, já que as mesmas são usadas pelo compilador para identificar um string?
"A quem vencer, eu o farei coluna no templo do meu Deus, e dele nunca sairá; e escreverei sobre ele o nome do meu Deus, e o nome da cidade do meu Deus, a nova Jerusalém, que desce do céu, do meu Deus, e também o meu novo nome."