"Add Icon" script


Forum: DSL Ideas and Suggestions
Topic: "Add Icon" script
started by: RoGuE_StreaK

Posted by RoGuE_StreaK on Feb. 12 2005,13:15
Another "just had a thought" from my delusional brain.
How about a small script, run from the "Desktop" part of the menu, to add a bit of user-friendliness to the creation of an icon, by using the inputed variables to create a .lnk file?  Say, on click of "menu / Desktop / Create icon" =>
1.  "Icon Caption" - gives the caption, and the file name for the created .lnk
2.  "Executable Command, eg. /usr/bin/gimp" - gives the command line, obviously may be a little too much for complete newbies, but...
3.  "Icon Image" - gives the name of the gif or png, maybe tells them to place it in /home/dsl/.xtdesktop?

Coordinates don't need to be specified, 'cause once it's made, the user can just drag the new icon to where they want it.

Of course it would be good if the "Command" and "Icon Image" had a "browse" function, but I'm guessing this would complicate it a bit.

The basic version should be a fairly small and simple script?  I'm not too knowledgeale about scripting, but I think I could probably figure out how to do this to some degree if need be?
Would just add a little bit more user-friendliness for those coming from windoze who are used to being able to create icons etc by right-clicking the desktop.

Hmm, actually, a similar principal could possibly apply to the menu, or at least the mydsl part of it, correct?  As each mydsl item creates it's own seperate link file under /var/temp/mydsl.menu
?

Posted by TyphoonMentat (not logged in) on Feb. 12 2005,16:01
How about something like this:

Code Sample

#!/bin/sh
DIA="Xdialog --wmclass"

$DIA --2inputsbox "Please enter a name and a command for your icon." 0 0 "Name:" "" "Command:" "" 2>/tmp/tic
ICON_NAME=`cat /tmp/tic | perl -e '$x=<>;if($x=~/^(.*?)\/.+/{print $1}'`
ICON_CMD=`cat /tmp/tic | perl -e '$x=<>;if($x=~/^(.*?)\/(.*)/{print $2}'`

$DIA --msgbox "Now choose a picture for your icon." 0 0
$DIA --fselect /home/knoppix/.xtdesktop 0 0 2> /tmp/tic
ICON_PIC=`cat /tmp/tic`
rm -f /tmp/tic

cat <<EOF>/home/knoppix/.xtdesktop/$ICON_NAME.lnk
table Icon
Type: Program
Caption: $ICON_NAME
Command: $ICON_CMD
Icon: $ICON_PIC
X: 25
Y: 270
end
EOF


(apologies for any formatting errors)

Posted by TyphoonMentat on Feb. 12 2005,18:17
Corrected version:

Code Sample
#!/bin/sh
DIA="Xdialog --wmclass --title Icon"

$DIA --2inputsbox "Please enter a name and a command for your icon." 0 0 "Name:" "" "Command:" "" 2>/tmp/tic
ICON_NAME=`cat /tmp/tic | perl -e '$x=<>;if($x=~/^(.*?)\/.+/{print $1}'`
ICON_CMD=`cat /tmp/tic | perl -e '$x=<>;if($x=~/^(.*?)\/(.*)/{print $2}'`

$DIA --msgbox "Now choose a picture for your icon." 0 0
$DIA --fselect /home/dsl/.xtdesktop 0 0 2> /tmp/tic
ICON_PIC=`cat /tmp/tic`
rm -f /tmp/tic

cat <<EOF>/home/dsl/.xtdesktop/$ICON_NAME.lnk
table Icon
Type: Program
Caption: $ICON_NAME
Command: $ICON_CMD
Icon: $ICON_PIC
X: 25
Y: 270
end
EOF

Posted by RoGuE_StreaK on Feb. 13 2005,03:56
Thanks TyphoonMentat, but couldn't get it to work - looking at the script, I assume it needs perl to work, and perl isn't on in the standard iso, correct?
Posted by cbagger01 on Feb. 13 2005,07:10
perl is on the standard iso

But xdialog ISN'T

A slight rewrite with whiptail instead of xdialog is in order.

But I think that the file selector is not supported in whiptail, but I could be wrong.

Posted by TyphoonMentat (not logged in) on Feb. 13 2005,10:11
Well, I guess there're two options:
- Don't use a file selector, and let the user type in the appropriate file within the /home/dsl/.xtdesktop directory
- Include the XDialog binary, which is 78Kb (the Debian package is 880Kb uncompressed, but this is mostly locales and docs)

Posted by clacker on Feb. 13 2005,15:33
Quote
But I think that the file selector is not supported in whiptail, but I could be wrong.


it isn't, but I believe --menu is.  you could make a menu that contained the names of all of the jpg, png, gif files in the .xtdesktop directory.

Posted by mikshaw on Feb. 13 2005,17:02
Good point.  "ls *.{gif,png,jpg,xpm}" or something similar could dynamically create a list for your menu.

Code Sample
ICON_DIR=$HOME/.xtdesktop
ICON_CNT=0
ICON_TMP=/tmp/xtdesk-icon.tmp
ICON_LIST="whiptail --menu Choose_an_Icon 24 70 16"

for file in `ls ${ICON_DIR}/*.{png,xpm,jpg,gif} 2>/dev/null`; do
       ICON_CNT=$((ICON_CNT+1))
       ICON_LIST="${ICON_LIST} ${file} ${ICON_CNT}"
done

${ICON_LIST} 2>${ICON_TMP}

The content of the ICON_TMP file would then be read back in as the icon filename.
This doesn't work with filenames containing spaces.  I messed around with it for a while but didn't come up with a fix for it.  Honestly, with all the trouble I've had in the past trying to script for filename spaces I decided long ago just to never use spaces in filenames, ever.

Also, This wasn't tested with Busybox, so I can't say that it will work as is in DSL.

I'm thinking it might be fun to do this with Lua FLTK rather than Bash, as we might be able to display the icon choices as graphic buttons rather than choosing from a text list.

Posted by Delboy on Feb. 15 2005,13:53
Has anyone tried the icon creation fluxbox plugin 'fbdesk' it can be installed from the Debian packages site using apt-get install ----?.  I suggested this a long while ago for icons but there seemed to be more resistance to 'eye candy' then.
Posted by mikshaw on Feb. 15 2005,21:01
I've tried it a little...doesn't seem to be much different than xtdesk.

I put together a Lua FLTK script for making icons.  The file browser in Lua FLTK seems to be pretty limited...it doesn't seem to have a lot of the options that are available in FLTK. There is apparently no image support, and I don't even think you can change the font.

Code Sample

#!/bin/flua

-- dsl-create_icon.flua
-- mikshaw Feb2005

-- DEFAULTS
xtdesk_dir = getenv("HOME").."/.xtdesktop/"
xtdesk_tmp = "/tmp/xtdeskPIDtmp"
w_main_width = 360
w_main_height = 380
b_w = 80        -- button width
b_h = 25        -- button height
b_vs = b_h+5    -- button vertical spacing
b_hs = b_w+30   -- button horizontal spacing
Fl_Widget.initializers = {textfont = 15, labelfont = 15, labelcolor = 15}
Fl_Input_.initializers = {when = When.changed, color = 0, textcolor = 2, cursor_color = 15, selection_color = 8}
Fl_Button.initializers = {box = Boxtype.thin_up, down_box = Boxtype.thin_down, color = 8, labelcolor = 2}
Fl_Round_Button.initializers = {box = Boxtype.none, color = 8, labelcolor = 15, selection_color = 2, type = Buttontype.radio, align = Align.right}
Fl_Window.initializers = {box = Boxtype.thin_down, color = 0}

function hide_mounts()
icon_mount_label:hide()
icon_mount:hide()
icon_mount_browse:hide()
icon_umount_label:hide()
icon_umount:hide()
icon_umount_browse:hide()
icon:show()
icon_label:show()
icon_browse:show()
end

function show_mounts()
icon_mount_label:show()
icon_mount:show()
icon_mount_browse:show()
icon_umount_label:show()
icon_umount:show()
icon_umount_browse:show()
icon:hide()
icon_label:hide()
icon_browse:hide()
end

-- BEGIN LAYOUT
-- HELP
w_help = Window{w_main_width,w_main_height, "help"}
help_text = Box{10-w_main_width,0,w_main_width,w_main_height,"link filename: The filename for your *.lnk file,\nlisted with no extension or leading path.\n\n"..
"\choose icon: The image file(s) used for your icon.\nFor a mount icon two images are requested, one for \nthe unmounted state and one for the mounted state.\n\n"..
"command: The full command which will be run when \nthe icon is clicked.\n\n"..
"caption: The text which will be displayed on the \ndesktop next to the icon.\n\n"..
"x pos & y pos: The horizontal(X) and vertical(Y) \nlocation of your icon, in pixels.\n\n"..
"more: Additional features for the icons. Some features \nmay not work for some versions of xtdesk.\n\n\n\n"..
"lua fltk script by mikshaw, 2005";align=Align.right}
w_help:end_layout()

w_main = Window{w_main_width,w_main_height, "dsl-create_icon"}

-- NAME OF LNK FILE
file_name_label = Box{24,10,100,20,"link filename:"}
file_name = Input{30,30,120,20,".lnk";align=Align.right}

-- SPECIFY TYPE OF ICON
icon_type1 = Round_Button{200,30,20,20,"program"}
function icon_type1.callback()
if old_command_value then command.value = old_command_value end
if old_extras_value then extras.value = old_extras_value end
if old_caption_value then caption.value = old_caption_value end
if old_filename_value then file_name.value = old_filename_value end
hide_mounts()
end
icon_type2 = Round_Button{275,30,20,20,"mount"}
function icon_type2.callback()
if command.value then old_command_value = command.value end
command.value = "mount"
if extras.value then old_extras_value = extras.value end
extras.value = "MenuCommand1: Mount CDROM : mount /dev/cdrom \nMenuCommand2: Umount CDROM : umount /dev/cdrom \nMenuCommand3: Eject CDROM : eject /dev/cdrom \n"
if caption.value then old_caption_value = caption.value end
caption.value = "/dev/cdrom"
if file_name.value then old_filename_value = file_name.value end
file_name.value = "cdrom"
show_mounts()
end
icon_type1.value = 1 -- default is 'Program'

-- SPECIFY ICON FILE
icon_label = Box{18,50,100,20,"choose icon:"}
icon = Input{30,70,280,20}
icon_browse = Button{310,70,20,20,"@>";labeltype=Labeltype.symbol}
function icon_browse.callback()
icon.value = fl_file_chooser("Choose An Icon","*.{jpg,gif,png,xpm}",xtdesk_dir)
end

icon_umount_label = Box{39,50,100,20,"choose umount icon:"}
icon_umount = Input{30,70,280,20}
icon_umount_browse = Button{310,70,20,20,"@>";labeltype=Labeltype.symbol}
function icon_umount_browse.callback()
icon_umount.value = fl_file_chooser("Choose An Icon For Umounted Drive","*.{jpg,gif,png,xpm}",xtdesk_dir)
end

icon_mount_label = Box{36,90,100,20,"choose mount icon:"}
icon_mount = Input{30,110,280,20}
icon_mount_browse = Button{310,110,20,20,"@>";labeltype=Labeltype.symbol}
function icon_mount_browse.callback()
icon_mount.value = fl_file_chooser("Choose An Icon For Mounted Drive","*.{jpg,gif,png,xpm}",xtdesk_dir)
end

command_label = Box{90,130,100,20,"command (including options, if any):"}
command = Input{30,150,280,20}
command_browse = Button{310,150,20,20,"@>";labeltype=Labeltype.symbol}
function command_browse.callback()
command.value = fl_file_chooser("Browse For Application","*","/usr/bin/")
end

caption_label = Box{6,170,100,20,"caption:"}
caption = Input{30,190,200,20}
x_pos_label = Box{220,170,80,20,"x pos:"}
x_pos = Int_Input{240,190,40,20;maximum_size=4}
y_pos_label = Box{270,170,80,20,"y pos:"}
y_pos = Int_Input{290,190,40,20;maximum_size=4}

extras_label = Box{111,220,100,20,"more ( MenuCommand<num>: label : command ):"}
extras = Multiline_Input{30,240,300,56}

b_help = Button{30,320,b_w,b_h,"help"}
function b_help.callback()
       w_help:show()
end

b_create = Button{w_main_width-b_hs*2,320,b_w,b_h,"CREATE ICON"}
function b_create.callback()
filename = xtdesk_dir..file_name.value..".lnk"
if icon_type2.value == 1 then
icontype = "Mount"
command.value = "mount"
else
icontype = "Program"
end
writeto(filename)
write("table Icon\n"..
"Type: "..icontype.."\n"..
"Caption: "..caption.value.."\n"..
"Command: "..command.value.."\n")
if icontype == "Program" then
write("Icon: "..icon.value.."\n")
else
write("IconMount: "..icon_mount.value.."\n"..
"IconUmount: "..icon_umount.value.."\n")
end
write("X: "..x_pos.value.."\n"..
"Y: "..y_pos.value.."\n"..
extras.value.."\nend")
execute("pidof xtdesk && echo \"xtdesk_pid = `pidof xtdesk`\" >"..xtdesk_tmp.." || echo \"xtdesk_pid = 0\" >"..xtdesk_tmp)
dofile(xtdesk_tmp)
remove(xtdesk_tmp)
if xtdesk_pid > 0 then
execute("killall xtdesk")
end
fl_message("Some things and stuff has been written to "..filename)
if xtdesk_pid > 0 then
execute("xtdesk >/dev/null &")
end
exit(0)
end

b_exit = Button{w_main_width-b_hs,320,b_w,b_h,"exit"}
function b_exit.callback()
       exit(0)
end

w_main:end_layout()
hide_mounts()
w_main:show()



Be careful about copy and paste here...lines that wrap may paste as multiple lines.  You may want to stretch your browser window out a bit until lines no longer wrap

Posted by newOldUser on Feb. 16 2005,03:59
You can change the font to "screen", "times", "helvetica" and "courier" by altering line 15 or there abouts like this

Code Sample

Fl_Widget.initializers = {textfont = Font.times, labelfont = Font.times, labelcolor = 15}


Nice script.  Thank you for your efforts

Posted by mikshaw on Feb. 16 2005,04:17
I tried that, or something similar...no matter what settings I added seemed to make no impact on the file selector.  The font  set with Fl_Widget.initializers works fine for every widget except for the ones in the FL dialogs.

I think the developer did just enough work to allow use of fl_file_chooser with file filtering, but not enough to pass widget settings on to it....there was something in the docs about editing the code if we wanted to add more FLTK features to the chooser.

Powered by Ikonboard 3.1.2a
Ikonboard © 2001 Jarvis Entertainment Group, Inc.