Hallo,
Ik ben aan het knoeien met een stuk software uit de FreeBSD ports: x11/libfm. Dit is de ondersteunende library van de PCmanfm filemanager.
Een leuke eigenschap van PCmanfm is dat ie ook in "desktop-mode" kan draaien, dwz hij kan de X.org/openbox desktop hetzelfde behandelen als een folder. Je kan bestanden en directories slepen of aanmaken en er is een programmeerbaar right-click menu.
Wat ik nu wil (het is vergezocht maar ik doe een poging) is die PCmanfm blijven gebruiken maar alleen voor die desktop-mode. De filemanager x11-fm/xfe moet de normale vensters gaan verzorgen.
Het probleem is dus dat PCmanfm zelf xfe moet opstarten als er op een desktop directory wordt geklikt. Oorspronkelijk startte hij een fork van zichzelf op in een nieuw venster met de betreffende directory.
In de libfm source heb ik het stukje code daarvoor gevonden:
Hier wordt een nieuw pcmanfm venster gestart in de directory die waarschijnlijk in de "folders" parameter zit bij de aanroep launcher->open_folder(ctx, folders, user_data, &err);
Met de g_debug() functie kan ik tussentijdse info naar stdout sturen en met system() kan ik xfe opstarten vanuit een C-programma.
Eerste aanpassing:
De console output daarvan na een run:
(onderaan de g_debug output, die missende icons zijn niet van belang.)
Wat ik nou niet voor elkaar krijg is die directorynaam leesbaar maken. De bedoeling is dat die system() aanroep een string krijgt als "/usr/local/bin/xfe <pad>"
Greppen naar "launcher" en "open_folders" in andere libfm source bestanden levert een hoop hits op, maar ik kan er niet achter komen hoe die data in (volgens mij) de "folders" parameter eruit ziet om dat vervolgens in een normale string te krijgen.
Ergens heb ik het idee dat ik een goeie C-GUI nodig heb die types en structs e.d. automatisch erbij zoekt. Tot nu toe ben ik alleen in terminals bezig. Heeft er iemand goeie raad m.b.t. hoe nu verder te gaan?
Ik ben aan het knoeien met een stuk software uit de FreeBSD ports: x11/libfm. Dit is de ondersteunende library van de PCmanfm filemanager.
Een leuke eigenschap van PCmanfm is dat ie ook in "desktop-mode" kan draaien, dwz hij kan de X.org/openbox desktop hetzelfde behandelen als een folder. Je kan bestanden en directories slepen of aanmaken en er is een programmeerbaar right-click menu.
Wat ik nu wil (het is vergezocht maar ik doe een poging) is die PCmanfm blijven gebruiken maar alleen voor die desktop-mode. De filemanager x11-fm/xfe moet de normale vensters gaan verzorgen.
Het probleem is dus dat PCmanfm zelf xfe moet opstarten als er op een desktop directory wordt geklikt. Oorspronkelijk startte hij een fork van zichzelf op in een nieuw venster met de betreffende directory.
In de libfm source heb ik het stukje code daarvoor gevonden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // deel van bestand fm-file-launcher.c if(folders) { folders = g_list_reverse(folders); if(launcher->open_folder) { launcher->open_folder(ctx, folders, user_data, &err); if(err) { if(launcher->error) launcher->error(ctx, err, user_data); g_error_free(err); err = NULL; } } g_list_free(folders); } return TRUE; |
Hier wordt een nieuw pcmanfm venster gestart in de directory die waarschijnlijk in de "folders" parameter zit bij de aanroep launcher->open_folder(ctx, folders, user_data, &err);
Met de g_debug() functie kan ik tussentijdse info naar stdout sturen en met system() kan ik xfe opstarten vanuit een C-programma.
Eerste aanpassing:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| if(folders) { folders = g_list_reverse(folders); if(launcher->open_folder) { // we hebben hier dus de die directory locatie nodig. Xfe opent zo altijd // in de directory van waaruit X.org is gestart. // call naar pcmanfm alvast vervangen met kaal shellcommando voor xfe // launcher->open_folder(ctx, folders, user_data, &err); system ("/usr/local/bin/xfe"); // proberen met g_debug de benodigde info op stdout te krijgen (tevergeefs, dit is niet leesbaar): g_debug("ctx: %s", ctx); g_debug("folders: %s", folders); g_debug("user_data: %s", user_data); if(err) { if(launcher->error) launcher->error(ctx, err, user_data); g_error_free(err); err = NULL; } } g_list_free(folders); } return TRUE; |
De console output daarvan na een run:
(onderaan de g_debug output, die missende icons zijn niet van belang.)
code:
1
2
3
4
5
6
7
| ** (pcmanfm:11606): DEBUG: adding new FmBackgroundCache for /usr/MBSD/wallpapers/freebsd.jpg ** (pcmanfm:11606): DEBUG: unable to load icon . GThemedIcon text-plain gnome-mime-text-plain text-x-generic application-x-executable ** (pcmanfm:11606): DEBUG: unable to load icon . GThemedIcon folder inode-directory gnome-mime-inode-directory inode-x-generic ** (pcmanfm:11606): DEBUG: unable to load icon . GThemedIcon folder inode-directory gnome-mime-inode-directory inode-x-generic ** (pcmanfm:11606): DEBUG: ctx: ** (pcmanfm:11606): DEBUG: folders: \xb0\xe0D\u0007\u0008 ** (pcmanfm:11606): DEBUG: user_data: \xa0\x80G\u0007\u0008 |
Wat ik nou niet voor elkaar krijg is die directorynaam leesbaar maken. De bedoeling is dat die system() aanroep een string krijgt als "/usr/local/bin/xfe <pad>"
Greppen naar "launcher" en "open_folders" in andere libfm source bestanden levert een hoop hits op, maar ik kan er niet achter komen hoe die data in (volgens mij) de "folders" parameter eruit ziet om dat vervolgens in een normale string te krijgen.
Ergens heb ik het idee dat ik een goeie C-GUI nodig heb die types en structs e.d. automatisch erbij zoekt. Tot nu toe ben ik alleen in terminals bezig. Heeft er iemand goeie raad m.b.t. hoe nu verder te gaan?
You are in a maze of little twisting passages, all different.