destroy any open menus while minimizing the main frame - cygwin

I had a problem with tcl8.5 on Cygwin
the popup menus are not destroyed and keep sticky while minimizing the main frame
Here is an example:
write the following code to the file pop_script.tcl
# Create a menu
set m [menu .popupMenu -takefocus 1]
$m add command -label "Example 1" -command bell
$m add command -label "Example 2" -command bell
# Create something to attach it to
pack [label .l -text "Click me!"]
# Arrange for the menu to pop up when the label is clicked
bind .l <3> {tk_popup .popupMenu %X %Y}
open Cygwin shell and Run the script using the command: wish pop_script.tcl
Right click the label "Click me!"
minimize the main frame
the menu keep sticky
Any ideas how to solve this problem?
Notes:
problem is not reproducible using Cygwin+tcl8.4
I use the TCL associated with the Cygwin package not the active state TCL

Related

gnome-terminal: How to close the original tab?

Just wrote a script that would open 3 new tabs in a window.
tab_init.sh:
#!/bin/bash
# options="--hide-menubar --geometry=140x42"
options=""
options_each=()
# tabs
cmds[1]="cd ~/a; clear"
cmds[2]="cd ~/b; clear"
cmds[3]="cd ~/c; clear"
for i in 1 2 3; do
options_each+=(--tab -e "bash -c '${cmds[i]} ; bash'" )
done
gnome-terminal $options "${options_each[#]}" &
exit 0
Current result:
After executing the script, there will be 3 more tabs opened in current window, plus the original tab, there would be 4 tabs.
Desired result:
But what I want is to open the new tabs in a standalone window, without including any other tab.
The questions are:
How to close the original tab automatically from the script, so that there would be only 3 tabs(the new ones) after executing the script?
Or, can I open the 3 new tabs in a new window, not in the original window, so that it doesn't matter whether I close the original tab.
Kind of found a way to do this.
First, make soft link of the script into $PATH.
e.g link it as tab_init somewhere,
Then, define command shortcuts in ~/.bashrc, to add the extra behavior.
e.g
alias tabinit='tab_init; exit' # init tabs, and close original tab,
alias tabinitne='tab_init' # init tabs, and keep the original tab,
Now, could use command tabinit or tabinitne to choose the behavior desired.

How to check is maximized any window in XFCE?

I want to change top panel color and alpha when any window is maximized.
For now I have something like this:
#!/bin/bash
while [ 1 = 1 ]
do
if window_is_maximized
then
xfconf-query -c xfce4-panel -p /panels/panel-0/background-alpha -s 100
else
xfconf-query -c xfce4-panel -p /panels/panel-0/background-alpha -s 50
fi
done
Maximized windows in X do not have a special state that you can test reliably. From a script, you can use xwininfo:
You can check if the window happens to be the same size as the root (main) window, and its position is the upper-left corner.
If you happen to be using a window manager which supports certain EMWH properties (_NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_MAXIMIZED_HORZ), your script could check for those. But in a quick check for window managers which might do that, I found none.

Can I replace the text in the Title of `ghci` window (i.e. PowerShell.exe or cmd.exe window title)?

Can I replace the text in the Title of ghci window (i.e. PowerShell.exe or cmd.exe window title)?
Using System.Process.callCommand from the process package, you can call the title executable:
> :m System.Process
> callCommand "title A new title for the console window"
The same way you execute any shell command - using :!.
> :!Title NewTitle

How do i make the kdialog a certain width

Im trying to make my first bash script and im trying to use kdialog .
How do i make the progress bar a certain width
here is my attempt
dbusRef=`kdialog --title "Sweet As Buckup Demon" --progressbar "Initializing" 8`
qdbus $dbusRef Set "" value 1
qdbus $dbusRef setLabelText "Getting web site folder and creating mysqldump and grabbing configuration files from the apache Server"
cp -rf /usr/local/websites/sweetassurfwear /home/brett/sweetback/
sleep 4
qdbus $dbusRef Set "" value 2
cd /home/brett/sweetback/
And so on.. if you need the entire script i will post it
Basically at each part of the process it out puts text on the progress bar but the dialog keeps changing width.
How do i make the size standard
Use the --geometry argument, e.g.
kdialog --geometry 300x300+300+300 --title "Sweet As Buckup Demon" --progressbar "Initializing"
You can see the documentation for this option by typing:
kdialog --help-all|grep geometry
I was trying to use the --geometry option to widen an input box dialog and it wouldn't work. Eventually I found out that adding spaces to the end of the input box label forces the dialog to be wider, e.g. if you use
kdialog --title "Input dialog" --inputbox "Input"
You may get something like this:
But if you add extra spaces at the of the input box label:
# The expression $(printf "%0.s " {1..70}) adds 70 space characters to the label
kdialog --title "Input dialog" --inputbox "Input $(printf "%0.s " {1..70})"
You'll get something like this:
Unfortunately kdialog --geometry doesn't work. For a working example of how to fix up the geometry for a kdialog,
see https://github.com/rparkins999/kde-slow-start-wrapper.
Note this example sets the position: the width or height can be set by replacing the first or second -1 in the
wmctrl -r $mytitle -e
command.
I discovered a quirk in kdialog.
Try to start kdialog with the option
--progressbar "$(echo -e "\t\t\tYour window title here\t\t\t")"
Change the number of tabs (\t) in the window title to adjust the window width.

How to show a GUI message box from a bash script in linux?

I'm writing a few little bash scripts under Ubuntu linux. I want to be able to run them from the GUI without needing a terminal window to enter any input or view any output.
So far the only input required is a password for sudo - and gksudo handles that fine.
But I haven't found an easy way to show a message box yet. Is there some kind of 'gkmessage' command available? I'd prefer something present in a default Ubuntu install, but I don't mind installing a new package if necessary.
In many Linux distros the notify-send command will throw one of those nice perishable notifications in the top right corner. Like so:
notify-send "My name is bash and I rock da house"
B.e.a.utiful!
I believe Zenity will do what you want. It's specifically designed for displaying GTK dialogs from the command line, and it's available as an Ubuntu package.
Everyone mentions zenity, there seem to be many others. A mixed up but interesting list is at http://alternativeto.net/software/zenity/
zenity:
First, an example of zenity featuring text formatting markup, window title, button label.
zenity \
--info \
--text="<span size=\"xx-large\">Time is $(date +%Hh%M).</span>\n\nGet your <b>coffee</b>." \
--title="Coffee time" \
--ok-label="Sip"
gxmessage:
gxmessage "my text"
xmessage:
xmessage is very old so it is stable and probably available in all distributions that use X (since it's distributed with X). It is customizable through X resources, for those that have been using Linux or Unix for long enough to know what it means (.Xdefaults, anyone ?).
xmessage -buttons Ok:0,"Not sure":1,Cancel:2 -default Ok -nearmouse "Is xmessage enough for the job ?" -timeout 10
kdialog (KDE tool):
kdialog --error "Some error occurred"
YAD (Yet Another Dialog):
Yad is included in newer Ubuntu versions. There is also this PPA: YAD: Zenity On Steroids [Display Graphical Dialogs From Shell Scripts] ~ Web Upd8: Ubuntu / Linux blog. Does not seem to auto-size dialogs.
echo My text | yad \
--text-info \
--width=400 \
--height=200
An bigger example
yad \
--title="Desktop entry editor" \
--text="Simple desktop entry editor" \
--form \
--field="Type:CB" \
--field="Name" \
--field="Generic name" \
--field="Comment" \
--field="Command:FL" \
--field="Icon" \
--field="In terminal:CHK" \
--field="Startup notify:CHK" "Application" "Name" "Generic name" "This is the comment" "/usr/bin/yad" "yad" FALSE TRUE \
--button="WebUpd8:2" \
--button="gtk-ok:0" \
--button="gtk-cancel:1"
Others not in Ubuntu standard repositories:
shellgui
xdialog
gtkdialog
Off-topic (for terminal):
whiptail --msgbox "my text" 10 20
dialog --msgbox "my text" 10 20
Feel free to edit.
The zenity application appears to be what you are looking for.
To take input from zenity, you can specify a variable and have the output of zenity --entry saved to it. It looks something like this:
my_variable=$(zenity --entry)
If you look at the value in my_variable now, it will be whatever was typed in the zenity pop up entry dialog.
If you want to give some sort of prompt as to what the user (or you) should enter in the dialog, add the --text switch with the label that you want. It looks something like this:
my_variable=$(zenity --entry --text="What's my variable:")
Zenity has lot of other nice options that are for specific tasks, so you might want to check those out as well with zenity --help. One example is the --calendar option that let's you select a date from a graphical calendar.
my_date=$(zenity --calendar)
Which gives a nicely formatted date based on what the user clicked on:
echo ${my_date}
gives:
08/05/2009
There are also options for slider selectors, errors, lists and so on.
Hope this helps.
I found the xmessage command, which is sort of good enough.
alert and notify-send seem to be the same thing. I use notify-send for non-input messages as it doesn't steal focus and I cannot find a way to stop zenity etc. from doing this.
e.g.
# This will display message and then disappear after a delay:
notify-send "job complete"
# This will display message and stay on-screen until clicked:
notify-send -u critical "job complete"
if nothing else is present. you can launch an xterm and echo in it, like this:
xterm -e bash -c 'echo "this is the message";echo;echo -n "press enter to continue "; stty sane -echo;answer=$( while ! head -c 1;do true ;done);'
Here's a little Tcl script that will do what you want. The Wish interpreter should be installed by default on Ubuntu.
#!/usr/bin/wish
pack [label .msg -text [lindex $argv 0]]
pack [entry .ent]
bind .ent <KeyPress-Return> { puts [.ent get]; destroy . }
focus .ent
Call it like this:
myanswer=`gui-prompt "type your answer and press enter"`
There is also dialog and the KDE version kdialog. dialog is used by slackware, so it might not be immediately available on other distributions.
How about Ubuntu's alert. It can be used after any operation to alert it finished and even show red cross icon if operaton was finnished with errors
ls -la; alert
Zenity is really the exact tool that I think that you are looking for.
or
zenity --help
You can use shellmarks to display a GUI dialog prior to your shell script running, that will allow the user to enter data that will be placed in the environment.
#!/bin/bash
echo "Hello ${name}"
exit 0
---
[name]
type="text"
label="Please enter your name"
required=true
Running script:
shellmarks hello.sh
If you enter "Steve" in the box and press run, the output will be
Hello Steve
Disclosure: I'm the author of Shellmarks
Kdialog and dialog are both good, but I'd recommend Zenity. Quick, easy, and much better looking the xmessage or dialog.
I'm liking what I'm seeing with script-dialog. It ticks all my boxes, plus some:
pop up GUI boxes, but has text-mode fallback
support for various sudo variants (gksudo, kde-sudo, ...)
can re-launch itself in terminal window
Indeed it's a wrapper for kdialog, zenity, dialog, whiptail and a custom fall-back.
Draw-back is that it doesn't have a CLI, but instead is meant to be sources into a bash script.

Resources