YAD - Tips

For discussions about programming, programming questions/advice, and projects that don't really have anything to do with Puppy.
Message
Author
User avatar
Argolance
Posts: 3767
Joined: Sun 06 Jan 2008, 22:57
Location: PORT-BRILLET (Mayenne - France)
Contact:

#521 Post by Argolance »

Bonjour,
Mike Walsh wrote:I know folks think I'm odd.....because even though I place icons in the accepted 'paths', I still give the full path-name to make absolutely certain I get it!
I'm not of those who think so: I usually do the same! :wink:
My script doesn't have any icon except the yad one (that I copied to /usr/local/share/pixmaps but should be ignored because the window is "undecorated") and the gtk stock icons for which the problem of the path does not arise either...
I recompiled yad but the standard button labels (ok, cancel..) are still in English while there were in French running the 0.30 yad version.

Cordialement.

User avatar
misko_2083
Posts: 114
Joined: Tue 08 Nov 2016, 13:42

#522 Post by misko_2083 »

Xlunch is one of Fredx181's favourite applications :lol: ,
however yad can also serve a fullscreen launcher.

Here's what happened:

A dev from a distro I never heard of before, with minimalistic goals, asked me:
miyo wrote: What I'm trying to do is...create a full-screen application launcher that will close AFTER a user clicks on an application. Here is the basic command that I'm working with...

yad --icons --read-dir=/usr/share/applications --fullscreen --sort-by-name --undecorated --single-click --skip-taskbar

If I can figure this out, I will also add...

--no-buttons

...to the command.

I know that you can close yad after clicking on a button, but I can't find a way to close it after clicking on one of the icons in the window.

I've tried xlunch, and it works well. smile

I'm just trying to keep extra packages out if I can...so that there are no packages (or as few packages as possible) not included in the system's repositories. wink

If I can't figure this out, I may use xlunch.
A light bulb flashed over my head , :idea:
and told him to get the process id of the yad window and use the strace to watch for SIGCHLD signal.
When the SIGCHLD signal is emited, send SIGURS1 signal to yad.

Code: Select all

#!/bin/bash
yad --icons --read-dir=/usr/share/applications \
--fullscreen --sort-by-name --undecorated \
--single-click --skip-taskbar --no-buttons & ICONS_PID=$!

strace -p $ICONS_PID -e trace=signal -s 32 2>&1 \
| while read -r line; do
        if [[ $line =~ "--- SIGCHLD" ]];then
           kill -s SIGUSR1 $ICONS_PID
           break
         fi
done
Signal SIGUSR1 closes the yad dialog with 0 exit status.

Problem bypassed.

User avatar
MochiMoppel
Posts: 2084
Joined: Wed 26 Jan 2011, 09:06
Location: Japan

#523 Post by MochiMoppel »

misko_2083 wrote:A light bulb flashed over my head , :idea:
and told him to get the process id of the yad window and use the strace to watch for SIGCHLD signal.
...if he has the strace command installed. My Puppy hasn't.

This is another idea. Works similar to a menu. yad is killed when it loses focus:

Code: Select all

#!/bin/bash
yad --icons --read-dir=/usr/share/applications \
 --fullscreen --sort-by-name --undecorated \
 --single-click --skip-taskbar --no-buttons & ICONS_PID=$!

sleep 1	#allow some time to create yad window
ACTIVEWINDOW=$(xprop -root _NET_ACTIVE_WINDOW)
while : ;do
	sleep 1
	[[ $(xprop -root _NET_ACTIVE_WINDOW) != $ACTIVEWINDOW ]] && kill $ICONS_PID && break
done

User avatar
misko_2083
Posts: 114
Joined: Tue 08 Nov 2016, 13:42

#524 Post by misko_2083 »

Spying on the root window's property _NET_ACTIVE_WINDOW is very useful when a new window is added to the window stack.

There is --close-on-unfocus, which closes the yad window when it loses focus. Not sure from which version of yad.

I was thinking about this. Launching applications doesn't nesesary make yad to lose the focus.
Some apps don't have a window or show a window only when the user press a key combo or at certain time (alarm), some may go to tray or to a different workspace, or simply start behind fullscreen yad.

In those cases you wouldn't know if you launched the application and may start it several times. Closing the icons dialog is like a confirmation in this case and more important, it stays out of your way after it's clicked.

If yad icons could write at stout or stderr we would know when the app is launched from it and close it. But it does not.

User avatar
misko_2083
Posts: 114
Joined: Tue 08 Nov 2016, 13:42

#525 Post by misko_2083 »

Just playing with html dialog.
Loading/previewing images.

Code: Select all

yad --html --uri=/home/misko/Desktop/test.html

Image

Here's test.html

Code: Select all

 <!DOCTYPE html>
<html>
<body>

    <link rel="stylesheet" media="all" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />

<style>
  .thumb {
    height: 300px;
    border: 1px solid #000;
    margin: 10px 5px 0 0;
  }
</style>

example 1

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form1" runat="server">
  <input type='file' id="imgInp" />
  <img id="blah" class="thumb" src="#" alt="your image" />
</form>
<script>
function readURL(input) {

  if (input.files && input.files[0]) {
    var reader = new FileReader();

    reader.onload = function(e) {
      $('#blah').attr('src', e.target.result);
    }

    reader.readAsDataURL(input.files[0]);
  }
}

$("#imgInp").change(function() {
  readURL(this);
});

</script>

<p>example 2</p>



<input type="file" id="files" style="display:none" accept="image/x-png,image/gif,image/jpeg" name="files[]" multiple />
<a href="javascript:;" onclick="getImage()"/>
    <img src="/usr/share/icons/Faenza/actions/32/gtk-open.png"/>
</a>
<output id="list"></output>

<script>
     function getImage(){
       $('#files').click();
     }
</script>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {

      // Only process image files.
      if (!f.type.match('image.*')) {
        continue;
      }

      var reader = new FileReader();

      // Closure to capture the file information.
      reader.onload = (function(theFile) {
        return function(e) {
          // Render thumbnail.
          var span = document.createElement('span');
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
                            '" title="', escape(theFile.name), '"/>'].join('');
          document.getElementById('list').insertBefore(span, null);
        };
      })(f);

      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
    }
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);

</script>
</body>
</html> 
OK but how to set the desktop background now? :lol:

Most likely not possible, but something like Yradio-html radio player is probably doable?!

stemsee

#526 Post by stemsee »

I am interested to know what other ways I can utilise exclusively (time slots) a yad dnd panel which is part of --notebook --paned gui.

So far I am using tee together with a variable which that yad dnd element is piped to. This gives two pipes out of the dnd. When I want only the tee output I redifine the variable to tap=/dev/null . It works. But I found that I can also define the output of the dnd by association, dndout=$(yad --dnd | tee /tmp/outdnd &>$tap &) &, and seems to work without affecting its function in the --notebook gui.

I want to know how many pipes I can feed to without using tee... is this possible in theory

Code: Select all

dndout=$(yad --plug=$$ --tabnum=2  --dnd &>$tap &>$apt &>$pat &) &
currently

Code: Select all

yad --listen --plug=$$ --tabnum=1 --item-separator=" " --form --cycle-read --columns=2 --field=A --field=0 --field=1 --field=2 --field=3 --field=4 --field=5 --field=6 --field=7 --field=8 --field=9 --field=10 <& 2 &
yad --plug=$$ --tabnum=2 --text="\t\t\t\t\t\t\tDnD panel\n\tClick a button\n\tThen Drag the mac address here!" --dnd | tee $pat 1>$tap &
yad --geometry=$(cat $camino/geometry/$WINDOWTITLE) --title="$WINDOWTITLE" --title=Bluetooth --window-icon=$pics/bluetooth-active.png --key=$$ --columns=2 --paned --height=220 --width=300 --tab=Found --tab=DnD --button="Command":"echo command" --button="Scan":"echo btscanfn" --button="Remove":"echo rmdev" --button="Connect":"echo btcon" --button="Disconnect":"echo btdisconfn" 1>/tmp/Wifi-TrayNet/btfn &

User avatar
misko_2083
Posts: 114
Joined: Tue 08 Nov 2016, 13:42

#527 Post by misko_2083 »

stemsee wrote:I am interested to know what other ways I can utilise exclusively (time slots) a yad dnd panel which is part of --notebook --paned gui.

So far I am using tee together with a variable which that yad dnd element is piped to. This gives two pipes out of the dnd. When I want only the tee output I redifine the variable to tap=/dev/null . It works. But I found that I can also define the output of the dnd by association, dndout=$(yad --dnd | tee /tmp/outdnd &>$tap &) &, and seems to work without affecting its function in the --notebook gui.

I want to know how many pipes I can feed to without using tee... is this possible in theory

Code: Select all

dndout=$(yad --plug=$$ --tabnum=2  --dnd &>$tap &>$apt &>$pat &) &
currently

Code: Select all

yad --listen --plug=$$ --tabnum=1 --item-separator=" " --form --cycle-read --columns=2 --field=A --field=0 --field=1 --field=2 --field=3 --field=4 --field=5 --field=6 --field=7 --field=8 --field=9 --field=10 <& 2 &
yad --plug=$$ --tabnum=2 --text="\t\t\t\t\t\t\tDnD panel\n\tClick a button\n\tThen Drag the mac address here!" --dnd | tee $pat 1>$tap &
yad --geometry=$(cat $camino/geometry/$WINDOWTITLE) --title="$WINDOWTITLE" --title=Bluetooth --window-icon=$pics/bluetooth-active.png --key=$$ --columns=2 --paned --height=220 --width=300 --tab=Found --tab=DnD --button="Command":"echo command" --button="Scan":"echo btscanfn" --button="Remove":"echo rmdev" --button="Connect":"echo btcon" --button="Disconnect":"echo btdisconfn" 1>/tmp/Wifi-TrayNet/btfn &
Hi there Stemsee, long time no chat :)

Thinking that this kind of redirection &>$tap &>$apt &>$pat is possible only in zsh.

About the paned dialog, what is the purpose of the ten fields in the first tab?

step
Posts: 1349
Joined: Fri 04 May 2012, 11:20

#528 Post by step »

Hi stemsee, so you want to fan output to N taps using shell only? What about piping to a "while read; do" loop and echoing to as many files as you need inside the body of the loop? Something like:

Code: Select all

dndout=$(yad --plug --tabnum=2 --dnd |
while read s; do
  echo "$s" >> $tap; echo "$s" >> $apt; echo "$s" >> $path; echo "$s"
done)
[url=http://murga-linux.com/puppy/viewtopic.php?t=117546]Fatdog64-810[/url]|[url=http://goo.gl/hqZtiB]+Packages[/url]|[url=http://goo.gl/6dbEzT]Kodi[/url]|[url=http://goo.gl/JQC4Vz]gtkmenuplus[/url]

User avatar
lamplinux
Posts: 31
Joined: Mon 21 Jan 2019, 06:05
Contact:

Yad Launcher

#529 Post by lamplinux »

Is it possible for yad to display all file names in a folder, i.e. /usr/share/applications... like firefox.desktop google-chrome.destop, etc. and have a chck box next to each listed file displayed in list.

Then user checks the box of each file they want to use in a home folder (directory).

Then upon button click - checked files are then copied from /usr/share/applications to /home/user/yadlauncher/applications ?

step
Posts: 1349
Joined: Fri 04 May 2012, 11:20

Re: Yad Launcher

#530 Post by step »

lamplinux wrote:Is it possible for yad to display all file names in a folder, i.e. /usr/share/applications... like firefox.desktop google-chrome.destop, etc. and have a chck box next to each listed file displayed in list.

Then user checks the box of each file they want to use in a home folder (directory).

Then upon button click - checked files are then copied from /usr/share/applications to /home/user/yadlauncher/applications ?
Yes. Here's a template you can elaborate on:

Code: Select all

cd /usr/share/local/share/applications/ && ls *.desktop | yad --center --list --column= --checklist --column=file | cut -d'|' -f2 | xargs echo cp -t /dest/dir 
This will print the copy command that would be executed. If that's OK delete "echo" from the command to get a working version. Of course change /dest/dir, absolute path to the destination directory, as you see fit.

If you then want to display an icon grid for the files in /dest/dir use:

Code: Select all

yad --icons --read-dir=/dest/dir
[url=http://murga-linux.com/puppy/viewtopic.php?t=117546]Fatdog64-810[/url]|[url=http://goo.gl/hqZtiB]+Packages[/url]|[url=http://goo.gl/6dbEzT]Kodi[/url]|[url=http://goo.gl/JQC4Vz]gtkmenuplus[/url]

User avatar
lamplinux
Posts: 31
Joined: Mon 21 Jan 2019, 06:05
Contact:

RE: yad list help

#531 Post by lamplinux »

Step, Thank You Very much!! I will work on this tomorrow. I will sleep well tonight knowing it will be a productive day having received your help !

User avatar
MochiMoppel
Posts: 2084
Joined: Wed 26 Jan 2011, 09:06
Location: Japan

#532 Post by MochiMoppel »

@lamplinux As always step was one step ahead :lol:

Normally the --file dialog is used for such task. That's what it is made for:

Code: Select all

TARGET="/home/user/yadlauncher/applications"
CHECKED=$(yad --title="Please select (multiple) files" --file --geometry=700x500 --button="Copy to $TARGET":0 --button=Cancel:1 --file-filter=*.desktop --multiple --filename=/usr/share/applications/* )
(($?)) && exit
IFS=TMP IFS='|'
cp -t "$TARGET" $CHECKED 
IFS=$TMP
The --list dialog with checkboxes is a bit more complicated. I used the sed command to add default values for the checkbox column (without it the dialog would display only every 2nd file of the source directory):

Code: Select all

IFS=TMP IFS=$'\n'
TARGET="/home/user/yadlauncher/applications"
SOURCE=/usr/share/applications
cd "$SOURCE"
SOURCE=$(ls *.desktop | sed 's/^/FALSE\n/')
CHECKED=$(yad  --title="Please select (multiple) files" --list --print-column=2 --separator=$IFS --checklist --geometry=400x600 --column="" --column=Name --button="Copy to $TARGET":0 --button="gtk-cancel":1 $SOURCE) 
(($?)) && exit
cp -t "$TARGET" $CHECKED
IFS=$TMP
If it hasn't to be yad you should also consider Xdialog. The beauty here is that you can click anywhere in the line and don't have to target a tiny checkbox:

Code: Select all

IFS=TMP IFS=$'\n'
TARGET="/home/user/yadlauncher/applications"
SOURCE=/usr/share/applications
cd "$SOURCE"
SOURCE=$(ls *.desktop | sed 's/.*/&\n&\nno/')
CHECKED=$(Xdialog  --title="Please select (multiple)files" --ok-label=Copy --stdout --no-tags  --separate-output --checklist  "Copy selected file to\n $TARGET" 400x600 0 $SOURCE ) 
(($?)) && exit
cp -t "$TARGET" $CHECKED
IFS=$TMP

User avatar
lamplinux
Posts: 31
Joined: Mon 21 Jan 2019, 06:05
Contact:

RE: yad list select

#533 Post by lamplinux »

@MochiMoppel

Thank You. I will use your code tonight and see what it does. I've been using yad for some years now but, I lack experience with bash.

Thank You for code help.

User avatar
lamplinux
Posts: 31
Joined: Mon 21 Jan 2019, 06:05
Contact:

RE: Adding a couple more options.

#534 Post by lamplinux »

Thank you @Step & @MochiMoppel for yad + bash code help.

I would like to expand on this to do the following. Now that I have a starting point I know I can eventually get to what I want to offer to others. (I'm just very slow at it)

Expanding Yad Favorite app launching:

1. Check mark shown for all .desktop files present in base directory.

2. Option for user to remove 1 or more .desktop file from base directory. (If check mark remove, its .desktop file is remove from base directory),

3. Display icon next checkbox for all possible /usr/share/applications/*.desktop files.. (For Example, Reading 3rd line, 5th character and all characters to the right of 5th character to end of line of each icon.desktop file. --- 5th line - "icon=internet_icon).

4. Dropdown or I guess, DND, to allow user to assign each .ldesktop file to specific folders. For example, Internet, Network, Personal, Sparky, Yad, etc.

Does my mod concept sound useful.. What else could this yad script offer to users for each launching of apps, websites, settings, bash commands like "sudo apt update", etc ?

oldaolgeezer
Posts: 64
Joined: Sun 03 Dec 2006, 19:34

YAD - Tips

#535 Post by oldaolgeezer »

It possible for yad to display all grocery item names
and have a check box next to each item displayed in list.
Then the user checks the box of each item they want to buy.
Then upon button click - checked files are then copied to a file

it uses Anthony Tekatch's shopping list.txt file (which can be edited
with your local grocery store's aisle numbers or name with Puppy's Geany editor)
License: GPL
http://unihedron.com/projects/grocget/d ... 0.6.tar.gz
http://freshmeat.sourceforge.net/projects/grocget
Anthony's original program needs Python, and some Gnome modules but just his list.txt file
(which has two fields: the aisle number followed by the grocery item's name)
can be used from his tar file in this yad script example (to save some initial typing)

and a little editing of MochiMoppel's original Xdialog script from:
http://www.murga-linux.com/puppy/viewto ... 31#1016071

the final resultant file: todaysgroceryshoppinglist.txt can be printed out
or emailed or USB'ed to a smart phone for use in the local grocery store so you
only walk on aisles that have what you are buying.

Thank you: Anthony Tekatch and MochiMoppel

Code: Select all

#!/bin/bash 

# It possible for yad to display all grocery names 
#     and have a check box next to each listed item displayed in list.
#Then the user checks the box of each item they want to buy.
#Then upon button click - checked files are then copied to a file

# it uses Anthony Tekatch's shopping list.txt file (which can be edited 
#     with your local grocery store's aisle numbers or name with Puppy's Geany editor)
#    License: GPL
#    http://unihedron.com/projects/grocget/downloads/grocget-0.6.tar.gz
#    http://freshmeat.sourceforge.net/projects/grocget
#  Anthony's original program needs Python, and some Gnome modules but just his list.txt file 
#   (which has two fields: the aisle number followed by the grocery item's name)
#      can be used from his tar file in this yad script example (to save some initial typing)

#  and a little editing of MochiMoppel's original Xdialog script from:
#  http://www.murga-linux.com/puppy/viewtopic.php?p=1016071&sid=4fe9401fedc62e90f7be909e80b63231#1016071

#   the final resultant file: todaysgroceryshoppinglist.txt can be printed out 
#        or emailed or USB'ed to a smart phone for use in the local grocery store so you 
#             only walk on aisles that have what you are buying.

#  The default value of IFS is a space, a tab, and a newline
IFS=TMP IFS=$'\n'

#  current working directory to be the directory that the script is located in
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

SOURCE=$(cat list.txt | sed 's/.*/&\n&\nno/')

CHECKED=$(Xdialog  --title="Please select (multiple) items" --ok-label=Select --stdout --no-tags  --separate-output --checklist  "Copy selected item to\n shopping list" 400x600 0 $SOURCE )  

(($?)) && exit

echo   -e   "$CHECKED"

echo   -e   "$CHECKED"  >   todaysgroceryshoppinglist.txt

IFS=$TMP

User avatar
MochiMoppel
Posts: 2084
Joined: Wed 26 Jan 2011, 09:06
Location: Japan

Re: RE: Adding a couple more options.

#536 Post by MochiMoppel »

@lamplinux: Yad may pose some problems. Placing icons next to the checkmarks may be one of them. Earlier in this thread I posted a demo for an icon finder. For this particular use case it is nice to show the icons in their original size, but in your case you might want to have them automatically resized to fit the row height. AFAIK yad can't do that.

User avatar
lamplinux
Posts: 31
Joined: Mon 21 Jan 2019, 06:05
Contact:

Re: RE: Adding a couple more options.

#537 Post by lamplinux »

@MochiMoppel - all my desktop icons could be copied and resized automatically to say 16px. Then use the reduced size icons. Would that work ?

Also, I am using Your's and @Step code to also select music files too but, with one issue. I'm using mpg123 (in the background). I stop the play with a killall mpg123 command. The files display in Yad list but, fail to copy to base directory because of blank spaces.

How could I handle blank spaces in Awk so the selected files copy to the target directory ?

Thanks for your help.

step
Posts: 1349
Joined: Fri 04 May 2012, 11:20

Re: RE: Adding a couple more options.

#538 Post by step »

lamplinux wrote:@MochiMoppel - all my desktop icons could be copied and resized automatically to say 16px. Then use the reduced size icons. Would that work ?

Also, I am using Your's and @Step code to also select music files too but, with one issue. I'm using mpg123 (in the background). I stop the play with a killall mpg123 command. The files display in Yad list but, fail to copy to base directory because of blank spaces.

How could I handle blank spaces in Awk so the selected files copy to the target directory ?

Thanks for your help.
if you're using something like

Code: Select all

ls *.mp3 | xargs cp -t /dest/dir
change that to

Code: Select all

printf "%s\0" *.mp3 | xargs -0 cp -t /dest/dir
This will take care of filepaths with spaces in them
[url=http://murga-linux.com/puppy/viewtopic.php?t=117546]Fatdog64-810[/url]|[url=http://goo.gl/hqZtiB]+Packages[/url]|[url=http://goo.gl/6dbEzT]Kodi[/url]|[url=http://goo.gl/JQC4Vz]gtkmenuplus[/url]

User avatar
MochiMoppel
Posts: 2084
Joined: Wed 26 Jan 2011, 09:06
Location: Japan

Re: RE: Adding a couple more options.

#539 Post by MochiMoppel »

lamplinux wrote:@MochiMoppel - all my desktop icons could be copied and resized automatically to say 16px. Then use the reduced size icons. Would that work ?
Depends. I'm not sure what you mean by "copied and resized automatically". If you manage to find the full paths of the .desktop icons, copy and resize those icons and then reference them in your yad list it should work.
Also, I am using Your's and @Step code to also select music files too but, with one issue. I'm using mpg123 (in the background). I stop the play with a killall mpg123 command. The files display in Yad list but, fail to copy to base directory because of blank spaces.
If you refer to my code please explain which of the 3 demos fail. They would fail if SOURCE path contains spaces (in which case you would have to put the path - like TARGET - in quotes, e.g SOURCE="/my/music folder").Since files display in the list as you wrote, this can't be the reason
How could I handle blank spaces in Awk so the selected files copy to the target directory ?.
Awk? Where does awk come into play?

User avatar
fredx181
Posts: 4448
Joined: Wed 11 Dec 2013, 12:37
Location: holland

#540 Post by fredx181 »

MochiMoppel wrote:For this particular use case it is nice to show the icons in their original size, but in your case you might want to have them automatically resized to fit the row height. AFAIK yad can't do that.
yad can scale the icons with list display, but only if you specify the name of the icon only, without extension (instead of full path) and should be in icon search path (e.g. /usr/share/pixmaps), so then instead of e.g.

Code: Select all

 /usr/share/pixmaps/browser.png

Just:

Code: Select all

browser
But probably not very useful info for what @lamplinux wants, In case of listing .desktop files, on puppy the "Icon=...." has mostly the full path specified, so icons may show with different sizes then.

Fred

Post Reply