You are not logged in.

#51 2019-12-05 09:40:32

misko_2083
Member
Registered: 2016-05-24
Posts: 299

Re: Alarm clock scripts

^Well that depends from the chemical composition of the water, temerature, volume of the pot, barometric pressure, density of the spaghetti...
No, I'm pretty sure they boil them in the microwave oven. For science... :-)
Time is relative, for someone hungry waiting for spaghetti to boil - it takes too long, for someone who had a snack when no one was watching those 12 minutes are a blink of an eye.


Што ни оштровиди ум сагледати не може - љубав превазилази.

Offline

#52 2020-01-21 14:10:05

misko_2083
Member
Registered: 2016-05-24
Posts: 299

Re: Alarm clock scripts

New script with at command.

You can choose between running the file in mpv or a custom command.
If you type in custom command, don't use "@" character. This is the limitation.
Custom command can be firefox "www.youtube.com" for example.
Leave the custom blank for mpv.
Ticking "Loop forever" overides "repeat".
Job can be listed and removed via "List at Job" button.


#!/bin/bash
# Fancy alarm Misko_2083 @ 2020
# Requires: at, yad 0.42 (with html dialog), mpv

#########################
# Begin User Interface  #
#########################

# JavaScript, HTML and CSS

YURI="$(cat << EOF
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">

<!--CSS for the page-->
<style>
.body, .html {
  overflow-y: hidden;
  cursor: default;
  background-color: #CECECE;
}

#jsalarmclock{
font-weight: bold;
font-size: 14px;
}

#jsalarmclock div{
margin-bottom: 0.8em;
}

#jsalarmclock div.leftcolumn{
float: left;
width: 150px;
font-size: 14px;
clear: left;
}

#jsalarmclock span{
 margin-right: 10px;
}

#jsalarmclock input[type=number]{
 width: 50px;
}

p {
 font-weight: bold;
 font-size: 11px;
}

.default:hover {
  background: #000000;
  color: white;
  text-decoration: none;
}

.title {
 font-size: 10px
 cursor: default;
}
</style>

<!--Script to prevent right click menu-->
<script type="text/javascript">
    if (document.addEventListener) { // IE >= 9; other browsers
        document.addEventListener('contextmenu', function(e) {
            //here you do nothing
            e.preventDefault();
        }, false);
    } else { // IE < 9
        document.attachEvent('oncontextmenu', function() {
            alert("You've tried to open context menu");
            window.event.returnValue = false;
        });
    }
</script>


<script type="text/javascript">

/***********************************************

* JavaScript Alarm Clock- by JavaScript Kit (www.javascriptkit.com)
* This notice must stay intact for usage
* Visit JavaScript Kit at http://www.javascriptkit.com/ for this script and 100s more

***********************************************/

/* Modified for my needs Misko_2083 */

var jsalarm={
	padfield:function(f){
		return (f<10)? "0"+f : f
	},
	showcurrenttime:function(){
		var dateobj=new Date()
		var ct=this.padfield(dateobj.getHours())+":"+this.padfield(dateobj.getMinutes())+":"+this.padfield(dateobj.getSeconds())
		this.ctref.innerHTML=ct
		this.ctref.setAttribute("title", ct)
	},
	init:function(){
		var dateobj=new Date()
		this.ctref=document.getElementById("jsalarm_ct")
		this.submitref=document.getElementById("submitbutton")
		this.submitref.onclick=function(){
			jsalarm.setalarm()
			//this.value="Alarm Set"
			this.disabled=false
			return false
		}
		var selections=document.getElementsByTagName("select")
		this.hourselect=selections[0]
		this.minuteselect=selections[1]
		for (var i=0; i<60; i++){
			if (i<24) //If still within range of hours field: 0-23
			this.hourselect[i]=new Option(this.padfield(i), this.padfield(i), false, dateobj.getHours()==i)
			this.minuteselect[i]=new Option(this.padfield(i), this.padfield(i), false, dateobj.getMinutes()+1==i)

		}
		jsalarm.showcurrenttime()
		jsalarm.timer=setInterval(function(){jsalarm.showcurrenttime()}, 1000)
	},
        info:function(a) {
                var h = document.createElement("p");
                var filename = String(a).replace(/^.*[\\\/]/, '');
                var t = document.createTextNode("Alarm "+filename);
                h.appendChild(t);
                document.body.appendChild(h);
                h.setAttribute("id", "info");
        },
        dom:function(a){
                // DOM 2 Events
                var dispatchMouseEvent = function(target, var_args) {
                  var e = document.createEvent("MouseEvents");
                  // If you need clientX, clientY, etc., you can call
                  // initMouseEvent instead of initEvent
                  e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
                  target.dispatchEvent(e);
                };
                dispatchMouseEvent(a, 'mouseover', true, true);
                dispatchMouseEvent(a, 'mousedown', true, true);
                dispatchMouseEvent(a, 'click', true, true);
                dispatchMouseEvent(a, 'mouseup', true, true);
        },
	setalarm:function(){
		this.hourwake=this.hourselect.options[this.hourselect.selectedIndex].value
		this.minutewake=this.minuteselect.options[this.minuteselect.selectedIndex].value
                var a = document.createElement('a');
                var linkText = document.createTextNode("Go");
                a.appendChild(linkText);
                a.title = "fake link";

                a.href = this.hourselect.options[this.hourselect.selectedIndex].value+":"+this.minuteselect.options[this.minuteselect.selectedIndex].value;
                jsalarm.dom(a)
                jsalarm.info(a)
                a.href = "repeat@"+document.getElementById("repeat").value;
                jsalarm.dom(a)
                if(document.getElementById("forever").checked == true) {
                  a.href = "repeat@"+document.getElementById("forever").value;
                  jsalarm.dom(a)
                }
                a.href = "command@"+document.getElementById("command").value;
                jsalarm.dom(a)
                //a.parentNode.removeChild(linkText);
		//this.hourselect.disabled=true
		//this.minuteselect.disabled=true
	}

}

</script>
</head>
<body class="body">
<br />

 <form action="" method="">
  <div id="jsalarmclock">
  <div><div class="leftcolumn">Current Time:</div> <span id="jsalarm_ct" style="letter-spacing: 2px"></span></div>
  <div><div class="leftcolumn">Set Alarm:</div> <span><select></select> Hour</span> <span><select></select> Minutes</span> </div>

  <div><div class="leftcolumn">Repeat:</div><input size="5" type="number" id="repeat" min="1" value="1"/>  <br>
        <div class="leftcolumn">Loop forever</div> <input type="checkbox" id="forever" value="forever"/>
       <span style="font: normal 11px Tahoma">Loop forever overides repeat</span> <br>
  <div><div class="leftcolumn">Set file:</div><a href="file:///musicfile@"><button type="button">Select a file to play</button></a>
             <span style="font: normal 11px Tahoma">Select a file to run with mpv or type in a custom action</span></div>
  <div><div class="leftcolumn">Set Custom Action:</div> <input type="text" id="command" size="55" value="" /> <br>
       <span style="font: normal 11px Tahoma">*Command to launch, if empty mpv will be used (do not use "@" character here)</span></div>
  <input type="submit" value="Set Alarm!" id="submitbutton" />

  </div>
</form>

<a href="file:///atq@"><button type="button">At Job List</button></a>

<script type="text/javascript">

jsalarm.init()

</script>
</body>
</html>
EOF
)"
#########################
# End of User interface #
#########################

#########################
# Bash functions        #
#########################

# Main window
function _yad_ui(){
    # Set the line buffering with stdbuf
    echo "${YURI}" | stdbuf -oL -eL yad --title="Set Alarm" --width=650 --height=500 --no-escape \
    --html --no-buttons --print-uri --borders=0 --window-icon="alarm1c.png" 2>&1 & echo $!
}

# Main Function
function _do_stuff(){
    # fetch yad process id
    read YAD_PID

    # read yad stdout line by line
    while read -r line
    do
        case ${line##*/} in
         [0-9][0-9]:[0-9][0-9]*)
            #kill -SIGUSR1 $YAD_PID
            echo "Alarm set to: ${line##*/}"
            alarm_time="${line##*/}"           
;;
                   repeat@*) REPEAT="$(echo  "${line##*@}" | sed 's/%20/ /g')"
;;
                   command@*) COMMAND="$(echo  "${line##*@}" | sed 's/%20/ /g')"

if [ ! -e "/tmp/yalarm.$$" ] ; then
      MUSIC="$(yad --width=600 --height=500 \
                    --title="Alarm" --text="Select a file to play in mpv" \
                    --file-filter="Audio | *.mp3 *.MP3 *.wav *.WAV *.ogg *.OGG" \
                    --file 2>/dev/null)"
      [ $? != 0 ] && continue
       echo "${MUSIC}" > /tmp/yalarm.$$
fi

# Fredx181
hrnow=$(echo $(date +"%k"))

# For when trying to set alarm for next day e.g. from current 21:00 to target 6:00
if [ "${alarm_time%%:*}" -eq "$hrnow" ] &&  [ "${alarm_time##*:}" -le "$(date +"%M")" ]; then
    # prompt yes/no in case accidentally chosen current hour but less than current minute
    yad --center --title="Are you sure?" --text="Are you sure to set the alarm to ${alarm_time} - tomorrow ?" --width=400 --button="Yes:0"  --button="No:1"
[ $? -ne 0 ] &&  continue 
fi

if [ ! "${COMMAND}" = "" ]; then
at "${alarm_time}" << EOF
exec env DISPLAY="$DISPLAY" $(echo  "${line##*@}" | sed 's/%20/ /g') &
EOF
else
    if [  "${REPEAT}" = "forever" ]; then
at "${alarm_time}" << EOF
exec env DISPLAY="$DISPLAY" mpv --force-window --loop inf "$(cat /tmp/yalarm.$$)"
EOF
    else
at "${alarm_time}" << EOF
exec env DISPLAY="$DISPLAY" mpv --force-window --loop "${REPEAT}" "$(cat /tmp/yalarm.$$)"
EOF
   fi
fi

;;
                   atq@*) (REMOVE_JOB="$(atq | yad --list --width=600 --height=500 \
                                                  --text="Select 'at' job to remove or close this window" \
                                                  --column "Job List" \
                                                  --button="Remove at Job" 2>/dev/null \
                                            | awk '{print $1}')"
                          if [[ "${REMOVE_JOB}" == [0-9]* ]]; then
                             echo "${REMOVE_JOB}"
                             atrm "${REMOVE_JOB}"
                             killall mpv
                          fi) &                      
;;
                   musicfile@*) (MUSIC="$(yad --width=600 --height=500 \
                                              --title="Alarm" --text="Select a file to play in mpv" \
                                              --file-filter="Audio | *.mp3 *.wav" \
                                              --file 2>/dev/null)" \
                                               [ $? = 0 ] && echo "${MUSIC}" > /tmp/yalarm.$$) &
;;
       esac 
    done
rm /tmp/yalarm.$$
exit
}

_yad_ui | _do_stuff & wait $! 2>/dev/null

This can be converted from HTML to regular GTK+ dialogs.

Last edited by misko_2083 (2020-01-21 14:17:13)


Што ни оштровиди ум сагледати не може - љубав превазилази.

Offline

#53 2020-01-22 10:30:06

brontosaurusrex
Middle Office
Registered: 2015-09-29
Posts: 1,992
Website

Re: Alarm clock scripts

@misko, nice, some thoughts (I build latest yad)
- position 'Repeat' and 'Loop forever' under 'Select a file to play' so it is clear this is related to sound and not repeating alarm every day (or something)
- Select a file to play' doesn't do anything for me, I get file dialog after clicking 'Set Alarm!'
- 'At Job List' is showing two alarms set at same time, but when running atq from cli there is only single event
- Missing delete event functionality?

edit: I wonder if analog picker like
https://weareoutman.github.io/clockpicker/ or
https://github.com/luncheon/clocklet
could be implemented?

edit2: I have repacked some css/html/js/svg clock for testing purposes and it works (but don't feel brave enough for js->yad interface as it would be needed for picker).
https://github.com/brontosaurusrex/svgclockcool
jbTMpz4b.png

Last edited by brontosaurusrex (2020-01-22 23:31:53)

Offline

#54 2020-01-27 13:35:56

misko_2083
Member
Registered: 2016-05-24
Posts: 299

Re: Alarm clock scripts

^I'll check it out.


Што ни оштровиди ум сагледати не може - љубав превазилази.

Offline

#55 2020-01-28 16:58:13

misko_2083
Member
Registered: 2016-05-24
Posts: 299

Re: Alarm clock scripts

brontosaurusrex wrote:

edit: I wonder if analog picker like
https://weareoutman.github.io/clockpicker/ or
could be implemented?

It uses some libraries, you can see them in assets folder JQuery Bootstrap and html5shiv.
Some experimentation.
Unpacked it to Documents and created a file "yad.html" in that directory.
And put next inside:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ClockPicker</title>
<link rel="stylesheet" type="text/css" href="assets/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="dist/bootstrap-clockpicker.min.css">
<link rel="stylesheet" type="text/css" href="assets/css/github.min.css">
<style type="text/css">
.navbar h3 {
	color: #f5f5f5;
	margin-top: 14px;
}
.hljs-pre {
	background: #f8f8f8;
	padding: 3px;
}
.footer {
	border-top: 1px solid #eee;
	margin-top: 40px;
	padding: 40px 0;
}
.input-group {
	width: 110px;
	margin-bottom: 10px;
}
.pull-center {
	margin-left: 0px;
	margin-right: auto;
}
@media (min-width: 768px) {
  .container {
    max-width: 730px;
  }
}
@media (max-width: 767px) {
  .pull-center {
    float: right;
  }
}
</style>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
  <script src="assets/js/html5shiv.js"></script>
  <script src="assets/js/respond.min.js"></script>
<![endif]-->
</head>
<body>



<div class="container">
	<div class="form-group">
                <h4> Local time: </h4>
                <label id="lblTime" style=" font-weight:bold" class=""></label>
		<h4>Pick alarm time:</h4>
		<div class="clearfix">
			<div class="input-group clockpicker-yad data-placement="bottom" data-align="top" data-autoclose="false">
				<input type="text" class="form-control" value="">
				<span class="input-group-addon">
					<span class="glyphicon glyphicon-time"></span>
				</span>
			</div>
		</div>
	</div>
	
</div>


<script type="text/javascript" src="assets/js/jquery.min.js"></script>
<script type="text/javascript" src="assets/js/bootstrap.min.js"></script>
<script type="text/javascript" src="dist/bootstrap-clockpicker.min.js"></script>
<script type="text/javascript">
$('.clockpicker').clockpicker()
	.find('input').change(function(){
		console.log(this.value);
	});
var input = $('#single-input').clockpicker({
	placement: 'bottom',
	align: 'left',
	autoclose: true,
	'default': 'now'
});

$('.clockpicker-yad').clockpicker({
		donetext: 'Done',
		init: function() { 
                        //Set current time +1 on init
                        var now = new Date();
                        var minute = (now.getMinutes()+1);
                        var hour = (now.getHours());
                        if (hour   < 10) { hour   = "0" + hour;   }
                        if (minute < 10) { minute = "0" + minute; }
                        var time = (hour)+":"+(minute) ;
                        $('input[class=form-control]').val(time);
		}
	})
	.find('input[class=form-control]').change(function(){
                var clock = "time set to: "+this.value;
		console.log(clock);
	});

// Manually toggle to the minutes view
$('#check-minutes').click(function(e){
	// Have to stop propagation here
	e.stopPropagation();
	input.clockpicker('show')
			.clockpicker('toggleView', 'minutes');
});
if (/mobile/i.test(navigator.userAgent)) {
	$('input').prop('readOnly', true);
}
</script>
 <script type="text/javascript">  
        // datetime make using jquery  
        $(document)  
            .ready(function ()  
            {  
                ShowTime();  
            });  
  
        function ShowTime()  
        {  
            var dt = new Date();  
            document.getElementById("lblTime")  
                .innerHTML = dt.toLocaleTimeString();  
            window.setTimeout("ShowTime()", 1000); // Here 1000(milliseconds) means one 1 Sec  
        }  
        </script> 
<script type="text/javascript" src="assets/js/highlight.min.js"></script>
<script type="text/javascript">
hljs.configure({tabReplace: '    '});
hljs.initHighlightingOnLoad();
</script>
</body>
</html>

In terminal (remember to change the uri):

stdbuf -oL -eL yad --html --print-uri --uri="/home/misko/Documents/clockpicker-gh-pages/yad.html" --no-buttons --width=800 --height=600 2>&1 | while read line ;do [ "$line" != ""  ] && echo "MSG: $line";done

Once the time is set, click "Done" and it writes out in terminal.

https://i.imgur.com/9MPc8lb.gif

Last edited by misko_2083 (2020-01-28 17:15:48)


Што ни оштровиди ум сагледати не може - љубав превазилази.

Offline

#56 2020-01-28 19:57:54

brontosaurusrex
Middle Office
Registered: 2015-09-29
Posts: 1,992
Website

Re: Alarm clock scripts

^Nice, so this should basically echo js console.log back to terminal/stdsomething?
(Can't make it work for some reason (./openwithyad), not getting anything back to term).

Last edited by brontosaurusrex (2020-01-28 20:39:01)

Offline

#57 2020-01-28 21:52:50

misko_2083
Member
Registered: 2016-05-24
Posts: 299

Re: Alarm clock scripts

brontosaurusrex wrote:

^Nice, so this should basically echo js console.log back to terminal/stdsomething?
(Can't make it work for some reason (./openwithyad), not getting anything back to term).

Yes, Developer Console thing that every web browser has.

Your script is working here.

Let's try without the line buffering.
Needed line buffering for a different method.
This one is simpler.

#!/bin/bash

actual_path=$(readlink -f "${BASH_SOURCE[0]}")
script_dir=$(dirname "$actual_path")

cd "$script_dir" || exit

yad --title="when" --uri="yad.html" --html --width=800 --height=600 --no-buttons 2>&1 \
| while read -r stuff
do
    [ "$stuff" == ""  ] && continue
    echo "$stuff"
done

Downloaded and unpacked, opened the terminal in the dir containing yad.html and then ./openwithyad

What yad version do you have?
yad --version
0.41.0 (GTK+ 2.24.25)


Што ни оштровиди ум сагледати не може - љубав превазилази.

Offline

#58 2020-01-28 22:59:06

brontosaurusrex
Middle Office
Registered: 2015-09-29
Posts: 1,992
Website

Re: Alarm clock scripts

yad --version
5.0 (GTK+ 3.24.5

But i build this, since Debian Buster is not having webkit enabled by default as it seems? The nonbufered version not working either. Must be a custom yad issue...

Last edited by brontosaurusrex (2020-01-28 23:01:35)

Offline

#59 2020-01-29 02:44:33

misko_2083
Member
Registered: 2016-05-24
Posts: 299

Re: Alarm clock scripts

Could be a bug somewhere.

console-test.html

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
  $("button").click(function(){
    console.log("Hello!");
  });
});
</script>
</head>
<body>

<button>Write Hello to console</button>

</body>
</html>

In terminal:

cat console-test.html | yad --html --height=400 --width=500

If that doesn't work, then yad probably has a bug.


Што ни оштровиди ум сагледати не може - љубав превазилази.

Offline

#60 2020-01-29 15:59:37

brontosaurusrex
Middle Office
Registered: 2015-09-29
Posts: 1,992
Website

Re: Alarm clock scripts

It doesn't work.

Offline

#61 2020-01-29 18:01:52

misko_2083
Member
Registered: 2016-05-24
Posts: 299

Re: Alarm clock scripts

It's definitely working here, and writing "Hello!" in the terminal.
Can I suggest a bug report and maybe include this short example?


Што ни оштровиди ум сагледати не може - љубав превазилази.

Offline

#62 2020-01-29 19:46:41

brontosaurusrex
Middle Office
Registered: 2015-09-29
Posts: 1,992
Website

Re: Alarm clock scripts

Offline

Board footer

Powered by FluxBB