Se passer de flash avec surf

Salut thuban!!

Tes explications sont très claires, je comprends tout a fait maintenant!!!

C’est même logique une fois que c’est bien expliqué…

Par contre, si on veut aller plus loin dans la compréhension de la fonction “spawn”, comment peut elle être traduite ou interprétée??

S’agit il simplement d’une fonction créée dans les sources C de surf qui associe cette fonction à un événement??

Encore merci en tout cas

Je me sens encore plus “libre” depuis que j’utilise dwm & Co :laughing: , j’espère également gagner en connaissance et particulièrement en script bash et en C…Voilà, je viens de signer un bail à vie avec cet univers :mrgreen: :mrgreen:

:slightly_smiling:
Si tu regardes les sources de surf (pareil pour dwm), tu trouveras une fonction spawn. Je ne suis pas très bien capable de la comprendre tout à fait, mais en gros elle permet l’éxécution de commandes. En l’occurence, là tu éxécute la commande définie dans le define CLIVE .
Si des puristes de C passent dans le coin, ils vont de fusiller…

[quote=“M3t4linux”]Par contre, si on veut aller plus loin dans la compréhension de la fonction “spawn”, comment peut elle être traduite ou interprétée??

S’agit il simplement d’une fonction créée dans les sources C de surf qui associe cette fonction à un événement??[/quote]
Au début de surf, cette fonction n’y était pas intégrée, elle est apparue tout d’abord dans le config.h, puis elle a migré dans surf.c.

Cette fonction n’est pas spécifique à surf, je te colle d’abord la fonction telle qu’on peut la trouver dans surf
et ensuite telle que l’on peut la trouver dans dwm.

surf spawn : void spawn(Client *c, const Arg *arg) { if(fork() == 0) { if(dpy) close(ConnectionNumber(dpy)); setsid(); execvp(((char **)arg->v)[0], (char **)arg->v); fprintf(stderr, "surf: execvp %s", ((char **)arg->v)[0]); perror(" failed"); exit(0); } }dwm spawn : void spawn(const Arg *arg) { if(fork() == 0) { if(dpy) close(ConnectionNumber(dpy)); setsid(); execvp(((char **)arg->v)[0], (char **)arg->v); fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); perror(" failed"); exit(0); } }Comme tu peux le constater, on dirait qu’il existe un lien entre ces deux programmes. :smt003

Sinon, dans XMonad, on la retrouve aussi
(les lignes commençant par – sont des commentaires) -- | spawn. Launch an external application. Specifically, it double-forks and -- runs the 'String' you pass as a command to /bin/sh. spawn :: MonadIO m => String -> m () spawn x = spawnPID x >> return ()Le Haskell est plutôt concis comme langage…

void spawn(Client *c, const Arg *arg) { if(fork() == 0) { // fork duplique le processus c'est une fonction très importantes dans un système d'exploitation // à partir de cette instruction tu as 2 procéssus surf complètement identique // à la différence qu'ils n'ont pas le même pid et que l'un est le fils de l'autre // fork renvoie le pid du fils si on est dans le père et 0 si on est dans le fils // donc seul le fils rentre dans cette condition et executera la suite de la fonction if(dpy) // Je sais pas ce qu'est dpy mais il le fe close(ConnectionNumber(dpy)); setsid(); // défini l'identifiant du processus execvp(((char **)arg->v)[0], (char **)arg->v); // execute un programme // cette fonction remplace le processus courant par le programme en premier argument (d'où l'utilisation du fork // le second argument est la liste des arguments du programme commençant par le non du programme lui même // execvp n'est pas cencé revenir c'est à dire que tout ce qui se trouve après n'est pas executé sauf en cas d'erreur d'où les messages d'erreurs fprintf(stderr, "surf: execvp %s", ((char **)arg->v)[0]); perror(" failed"); exit(0); } }

MisterFreez => Merci pour ces explications sur le code :smt006

Alors ça c’est super chouette d’avoir traduit! Merci, il n’y a rien de tel pour se familiariser un peu (mêm si ça reste encore flou pour moi)
C’est super! :slightly_smiling:

thuban=> la compilation se déroule bien à présent mais lors d’un ctrl+v (le raccourcis clavier paramétré), il y a une fenêtre noire qui s’ouvre et se referme rapidement

J’essaie par exemple avec www.youtube.fr

Comment utiliser tes manip’??

Peux tu donner un exempe concret??

Bien sûr que je peux. En fait, si tu vas juste sur youtube.fr, il n’y a pas réellement de video à télécharger. Il faut que tu ouvres la page où il y a la video, puis que tu lance le script. En fait, le script récupère l’adresse web de la page courante, puis l’envoie dans cclive, qui lui récupère la video.
Au fait, il faut mplayer d’installé avec la config que j’ai mis, mais tu peux changer ça dans le .ccliverc.
Il faudrait que je mette la possibilité de faire un raccourci clavier, puis lorsque l’on clique sur un lien ça éxécute le script pour ce lien. Mais si tu utilises gnash en mode pause ta video ne se lancera pas automatiquement. Si tu a mis une nouvelle entrée dans le menu, et que tu clic-droit sur un lien ça devrait marcher aussi
Bon, un exemple, tu vas sur cette page (c’est une video) : youtube.com/watch?v=8taxD5rrtz4
Puis tu lance le script via ton raccourci. la fenetre qui s’ouvre, c’est un terminal, qui éxécute cclive (je l’ai mis pour avoir une barre de progression)

Le script marche mieux avec le modifications proposées par eol : #!/bin/sh #cclive for surf url=`xprop -id $1 | grep "_SURF_URI" | awk '{print $3}' | sed 's/\"//g'` urxvt -e cclive $url exit 0

Bonjour,

[quote=“thuban”]Le script marche mieux avec le modifications proposées par eol : url=`xprop -id $1 | grep "_SURF_URI" | awk '{print $3}' | sed 's/\"//g'`[/quote]Ce que j’avais proposé pour avoir l’url, c’était xprop -id $1 _SURF_URI |cut -d \" -f2qui donne le même résultat avec un code un peu plus court et moins d’appel à différents programmes.

#!/bin/sh #cclive for surf url=`xprop -id $1 | awk '/_SURF_URI/{gsub(/"/, "", $3); print $3}'` urxvt -e cclive $url exit 0
Si je puis me permettre :slightly_smiling:

Merci à vous, tout va bien maintenant

Au rayon des broutilles, j’ai juste rajouté un chemin vers un dossier temporaire dans mon /home pour télécharger les vidéos.

Je me permets de relancer ce topic pour faire part de l’erreur que je recontre pour la compilation de surf après avoir tenté d’appliquer le script “DMENUDL”

J’ai donc créé ledit script dans ~/.surf/dmenudl.sh en le rendant exécutable
Je modifie le config.h de cette façon :

#define DMENUDL { .v = (char *[]){ "/bin/zsh", "-c", \ "~/.surf/dmenudl.sh $0", winid, NULL } }

{ MODKEY,               GDK_z,      spawn,      DMENUDL }, 

Et là; j’ai droit à un :

In file included from surf.c:126 config.h:45 error: stray '\302' in program config.h:45 error: stray '\240' in program

Habituellement, j’arrive à comprendre les messages d’erreurs pour débugguer, mais là, je ne vois pas ce que “stray” signifie…

Merci pour vos aides éventuelles :smt006

[quote=“M3t4linux”]Je me permets de relancer ce topic pour faire part de l’erreur que je recontre pour la compilation de surf après avoir tenté d’appliquer le script “DMENUDL”

J’ai donc créé ledit script dans ~/.surf/dmenudl.sh en le rendant exécutable
Je modifie le config.h de cette façon :

#define DMENUDL { .v = (char *[]){ "/bin/zsh", "-c", \ "~/.surf/dmenudl.sh $0", winid, NULL } }

{ MODKEY,               GDK_z,      spawn,      DMENUDL }, 

Et là; j’ai droit à un :

In file included from surf.c:126 config.h:45 error: stray '\302' in program config.h:45 error: stray '\240' in program

Habituellement, j’arrive à comprendre les messages d’erreurs pour débugguer, mais là, je ne vois pas ce que “stray” signifie…

Merci pour vos aides éventuelles :smt006[/quote]Bonjour,
J’ai déjà eu exactement le même message.
C’est un problème de copier-coller, pour être sûr, réécrit entièrement la ligne 45 de ton config.h à la main, ça devrait être suffisant.

En réécrivant la ligne, le message d’erreur à la compilation reste identique.

Si j’écris une ligne dans la rubrique static Item items le message d’erreur est identique lui aussi…

Je n’arrive pas à comprendre cette erreur et en particulier le stray '\302' :unamused:

edit : erreur de citation, on oublie.
Franchement je suis certain que ce n’est pas une faute dans le code mais un bête problème de recopiage.

Bonsoir,

Effectivement, tu avais raison, il a suffit de ressaisir les lignes pour que le compilation se termine.

Donc, compil’ OK mais résultat KO…

J’essais de lancer un download,en raccourcis clavier ou via le menu de la souris, (d’une page web ou d’un fichier) et rien ne se passe, rien ne se lance.

Voici mon config.h :

[code]/* modifier 0 means no modifier */
static char *useragent = “Mozilla/5.0 (X11; U; Linux; en-us) AppleWebKit/531.2+ (KHTML, like Gecko, surf-“VERSION”) Safari/531.2+”;
static char *progress = “#FF0000”;
static char *progress_trust = “#00FF00”;
static char *stylefile = “.surf/style.css”;
static char *scriptfile = “.surf/script.js”;
static char *cookiefile = “.surf/cookies.txt”;
static char *dldir = “/home/m3t4linux/temp/”;
static time_t sessiontime = 3600;
static int indicator_thickness = 4;

#define SETPROP§ { .v = (char *[]){ “/bin/sh”, “-c”,
“prop=”dmenu < /dev/null" &&"
“xprop -id $1 -f $0 8s -set $0 “$prop””,
p, winid, NULL } }
#define MODKEY GDK_CONTROL_MASK
#define DLOAD { .v = (char *[]){ “/bin/sh”, “-c”,
“~/.surf/dmenudl.sh $0”, winid, NULL } }
#define CLIVE { .v = (char *[]){ “/bin/zsh”, “-c”,
“~/.surf/clivesurf.sh $0”, winid, NULL } }

static Key keys[] = {
/* modifier keyval function arg Focus */
{ MODKEY|GDK_SHIFT_MASK,GDK_r, reload, { .b = TRUE } },
{ MODKEY, GDK_r, reload, { .b = FALSE } },
{ MODKEY|GDK_SHIFT_MASK,GDK_p, print, { 0 } },
{ MODKEY, GDK_p, clipboard, { .b = TRUE } },
{ MODKEY, GDK_y, clipboard, { .b = FALSE } },
{ MODKEY|GDK_SHIFT_MASK,GDK_j, zoom, { .i = -1 } },
{ MODKEY|GDK_SHIFT_MASK,GDK_k, zoom, { .i = +1 } },
{ MODKEY|GDK_SHIFT_MASK,GDK_i, zoom, { .i = 0 } },
{ MODKEY, GDK_l, navigate, { .i = +1 } },
{ MODKEY, GDK_h, navigate, { .i = -1 } },
{ MODKEY, GDK_j, scroll, { .i = +1 } },
{ MODKEY, GDK_k, scroll, { .i = -1 } },
{ 0, GDK_Escape, stop, { 0 } },
{ MODKEY, GDK_o, source, { 0 } },
{ MODKEY, GDK_g, spawn, SETPROP("_SURF_URI") },
{ MODKEY, GDK_colon, spawn, SETPROP("_SURF_FIND") },
{ MODKEY, GDK_n, find, { .b = TRUE } },
{ MODKEY|GDK_SHIFT_MASK,GDK_n, find, { .b = FALSE } },
{ MODKEY|GDK_SHIFT_MASK,GDK_v, spawn, CLIVE },
{ MODKEY, GDK_d, download, { 0 } },
{ MODKEY, GDK_w, newwindow, { .v = NULL } },
{ MODKEY, GDK_a, spawn, DLOAD },
};

static Item items[] = {
{ “Back”, navigate, { .i = -1 } },
{ “Forward”, navigate, { .i = +1 } },
{ “New Window”, newwindow, { .v = NULL } },
{ “Reload”, reload, { .b = FALSE } },
{ “Stop”, stop, { 0 } },
{ “Paste URI”, clipboard, { .b = TRUE } },
{ “Copy URI”, clipboard, { .b = FALSE } },
{ “Download”, download, { 0 } },
{ “Cclive”, spawn, CLIVE },
{ “Dmenuload”, spawn, DLOAD },
};

static SearchEngine searchengines[] = {
{ “g”, “http://www.google.fr/search?q=%s” },
{ “s”, “http://www.seeks-project.info/search.php/search?q=%s&qknowm=%s&expansion=1&action=expand” },
};
[/code]

Sinon, j’ai resaisi le script de Thuban

Qu’ais je pu louper??

Merci

Je n’utilise pas ce script pour mes téléchargements, peux tu le remplacer momentanément par celui-ci, histoire qu’on voit si ça vient du script ou pas.
Vu que je ne sais pas si tu utilises le dmenu vertical ou pas, j’ai un peu changé le script, si tu utilises le dmenu vertical il faut rajouter -l 10 après dmenu par exemple.[code]#!/bin/sh
while :; do
dirlist=ls -paX |grep /
index=`echo "Télécharge ici
!

$dirlist
" |dmenu -p $PWDif [ -d "$index" ]; then cd $index; else case "$index" in "Télécharge ici") break;; !) exit 0;; #au cas où je veuille annuler le téléchargement esac fi done url=xprop -id $1 _SURF_URI |cut -d " -f2`
wget $url && sfm
exit 0[/code]Pour le script fonctionne il faudra que tu remplaces “sfm” de l’avant dernière ligne par le nom de ton terminal ou de ton gestionnaire de fichier.

Ce script est pour télécharger la page active, pour télécharger autre chose que la page active, j’en utilise un autre
mais on peut déjà commencer à faire un essai avec celui-là.

edit : sinon pour répondre à ta question, je ne vois pas ce qui peut clocher dans ce que tu m’as montré surtout que d’après ton post d’avant tu n’as pas oublier le chmod +x du script.

avec ton script, ça ne fonctionne pas plus

j’ai exécuter ton script dans un shell pour le vérifier et voici ce qu’il en ressort :

Où est l’erreur stp?? je suis encore très nul en scrpt bash…

Merci

Par contre, le scrip de Thuban lancée dans une console fonctionne…

[quote=“M3t4linux”]avec ton script, ça ne fonctionne pas plus

j’ai exécuter ton script dans un shell pour le vérifier et voici ce qu’il en ressort :

Où est l’erreur stp?? je suis encore très nul en scrpt bash…

Merci[/quote]
Aucune idée, ça fonctionne très bien ici sans aucun message d’erreur.
À quoi est lié /bin/sh chez toi?
Chez moi, que sh soit lié à dash ou bash, le script fonctionne.