initial commit
No files matched your search
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# build packages
|
||||||
|
for folder in *; do
|
||||||
|
if [ -d $folder ] && [ ${folder:0:1} != "#" ]; then
|
||||||
|
package="$(cat $folder/DEBIAN/control | grep 'Package: ')"
|
||||||
|
arch="$(cat $folder/DEBIAN/control | grep 'Architecture: ')"
|
||||||
|
version="$(cat $folder/DEBIAN/control | grep 'Version: ')"
|
||||||
|
dpkg --build $folder "${package#*: }_${version#*: }_${arch#*: }.deb"
|
||||||
|
#echo "${package#*: }_${version#*: }_${arch#*: }.deb"
|
||||||
|
fi
|
||||||
|
done
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
rm -fr /assets/packages/*.deb
|
||||||
|
rm -fr /assets/packages/Packages*
|
||||||
|
rm -fr /assets/packages/Release
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
Package: tooloop-gstreamer
|
||||||
|
Maintainer: vollstock <daniel@vollstock.de>
|
||||||
|
Homepage: https://www.vollstock.de
|
||||||
|
Architecture: all
|
||||||
|
Version: 1.8.3
|
||||||
|
Section: tooloop/addon
|
||||||
|
Depends: mpg123,
|
||||||
|
libmpg123-dev,
|
||||||
|
gstreamer1.0-doc,
|
||||||
|
gstreamer1.0-tools,
|
||||||
|
gstreamer1.0-alsa,
|
||||||
|
gstreamer1.0-libav,
|
||||||
|
gstreamer1.0-pulseaudio,
|
||||||
|
gstreamer1.0-plugins-base,
|
||||||
|
gstreamer1.0-plugins-base-doc,
|
||||||
|
gstreamer1.0-plugins-base-dbg,
|
||||||
|
gstreamer1.0-plugins-good,
|
||||||
|
gstreamer1.0-plugins-good-doc,
|
||||||
|
gstreamer1.0-plugins-good-dbg,
|
||||||
|
gstreamer1.0-plugins-bad,
|
||||||
|
gstreamer1.0-plugins-bad-doc,
|
||||||
|
gstreamer1.0-plugins-bad-dbg,
|
||||||
|
gstreamer1.0-plugins-ugly,
|
||||||
|
gstreamer1.0-plugins-ugly-doc,
|
||||||
|
gstreamer1.0-plugins-ugly-dbg,
|
||||||
|
gstreamer1.0-vaapi,
|
||||||
|
gstreamer1.0-vaapi-doc,
|
||||||
|
gstreamer1.0-x,
|
||||||
|
libgstreamer1.0-0,
|
||||||
|
libgstreamer1.0-0-dbg,
|
||||||
|
libgstreamer1.0-dev,
|
||||||
|
va-driver-all,
|
||||||
|
libva-glx1,
|
||||||
|
libva-x11-1,
|
||||||
|
vainfo
|
||||||
|
Description: Gstreamer
|
||||||
|
GStreamer is a library for constructing graphs of media-handling components.
|
||||||
|
The applications it supports range from simple Ogg/Vorbis playback, audio/video
|
||||||
|
streaming to complex audio (mixing) and video (non-linear editing) processing.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Package: tooloop-image-slideshow
|
||||||
|
Version: 0.9.0
|
||||||
|
Maintainer: vollstock <daniel@vollstock.de>
|
||||||
|
Homepage: https://www.vollstock.de
|
||||||
|
Bugs: https://github.com/vollstock/Tooloop-Examples
|
||||||
|
Section: tooloop/presentation
|
||||||
|
Architecture: all
|
||||||
|
Depends: chromium-browser
|
||||||
|
Description: Image slideshow
|
||||||
|
A simple example app using the chromium browser and some javascript to display
|
||||||
|
a fullscreen image slideshow.
|
||||||
|
After Width: | Height: | Size: 899 KiB |
|
After Width: | Height: | Size: 281 KiB |
|
After Width: | Height: | Size: 535 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 466 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 323 KiB |
|
After Width: | Height: | Size: 451 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 262 KiB |
|
After Width: | Height: | Size: 592 KiB |
@@ -0,0 +1,4 @@
|
|||||||
|
/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
|
||||||
|
!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+Line truncated
|
||||||
|
a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fLine truncated
|
||||||
|
void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[Line truncated
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Slideshow</title>
|
||||||
|
<style media="screen">
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
div {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
position:absolute;
|
||||||
|
z-index:1;
|
||||||
|
|
||||||
|
background-size: cover;
|
||||||
|
background-position: center center;
|
||||||
|
}
|
||||||
|
div.active{
|
||||||
|
z-index:3
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="slideshow">
|
||||||
|
<div style="background-image: url(/assets/data/image1.jpg)" class="active"></div>
|
||||||
|
<div style="background-image: url(/assets/data/image2.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image3.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image4.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image5.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image6.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image7.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image8.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image9.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image10.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image11.jpg)" ></div>
|
||||||
|
<div style="background-image: url(/assets/data/image12.jpg)" ></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type='application/javascript' src='jquery-3.1.1.min.js'></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
function nextImage() {
|
||||||
|
var $active = $('#slideshow .active');
|
||||||
|
var $next = ($active.next().length > 0) ? $active.next() : $('#slideshow div:first');
|
||||||
|
|
||||||
|
$next.css('z-index', 2); // move the next image up the pile
|
||||||
|
|
||||||
|
$active.fadeOut(500, function() { // fade out the top image
|
||||||
|
$active.css('z-index',1).show().removeClass('active'); // reset the z-index and unhide the image
|
||||||
|
$next.css('z-index',3).addClass('active'); // make the next image the top one
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
setInterval('nextImage()', 7000);
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
COMMAND="chromium-browser --noerrdialogs --kiosk --incognito /assets/presentation/slideshow.html"
|
||||||
|
|
||||||
|
if [ $EUID == 0 ]; then
|
||||||
|
su tooloop -c "$COMMAND" &
|
||||||
|
else
|
||||||
|
$COMMAND &
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
pkill chromium
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "Image Slideshow",
|
||||||
|
"description": "A browser base image slideshow.",
|
||||||
|
"media": [],
|
||||||
|
"version": "1.0",
|
||||||
|
"last_updated": "2018-02-20",
|
||||||
|
"license": "Public domain",
|
||||||
|
"category": "Examples",
|
||||||
|
"tags": ["example"],
|
||||||
|
"developer": "vollstock",
|
||||||
|
"homepage": "http://www.vollstock.de/",
|
||||||
|
"compatibility": {
|
||||||
|
"s": "True",
|
||||||
|
"m": "True",
|
||||||
|
"l": "True",
|
||||||
|
"xl": "True"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 28 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
Package: tooloop-kiosk-browser
|
||||||
|
Version: 0.9.0
|
||||||
|
Maintainer: vollstock
|
||||||
|
Homepage: https://www.vollstock.de
|
||||||
|
Bugs: https://github.com/vollstock/Tooloop-Examples.git
|
||||||
|
Section: tooloop/presentation
|
||||||
|
Architecture: amd64
|
||||||
|
Depends: chromium-browser
|
||||||
|
Recommends: tooloop-transparent-cursor
|
||||||
|
Description: Kiosk Browser
|
||||||
|
A simple fullscreen kiosk browser based using chromium.
|
||||||
|
You can define its’ homepage in the settings.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit immediately if a command exits with a non-zero status
|
||||||
|
set -e
|
||||||
|
# Restart the settings server
|
||||||
|
systemctl restart tooloop-settings-server
|
||||||
|
# Exit cleanly
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit immediately if a command exits with a non-zero status
|
||||||
|
set -e
|
||||||
|
# Restart the settings server
|
||||||
|
systemctl restart tooloop-settings-server
|
||||||
|
# Exit cleanly
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,217 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Simple Kiosk</title>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
canvas {
|
||||||
|
display: block;
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
#particles {
|
||||||
|
position:absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: #172e4d;
|
||||||
|
/*background: radial-gradient(ellipse at center, #224a5e 0%,#172e4d 100%);*/
|
||||||
|
background: radial-gradient(ellipse at center, #224a5e 0%,#172e4d 50%,#050b23 100%);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
background-position: 50% 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#box {
|
||||||
|
width: 50%;
|
||||||
|
position: absolute;
|
||||||
|
background: rgba(255,255,255,0.9);
|
||||||
|
left: 25%;
|
||||||
|
top: 25%;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 20px;
|
||||||
|
max-width: 640px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 50px 40px 50px 40px;
|
||||||
|
-webkit-user-select: none; /* Chrome all / Safari all */
|
||||||
|
-moz-user-select: none; /* Firefox all */
|
||||||
|
-ms-user-select: none; /* IE 10+ */
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#credits {
|
||||||
|
color: white;
|
||||||
|
z-index: 999;
|
||||||
|
position: absolute;
|
||||||
|
font-size: 10px;
|
||||||
|
right: 20px;
|
||||||
|
bottom: 20px;
|
||||||
|
font-weight: lighter;
|
||||||
|
}
|
||||||
|
|
||||||
|
body, div, h1, p {
|
||||||
|
margin: 0;
|
||||||
|
font-family: 'ClearSans', sans-serif;
|
||||||
|
font-weight: 100;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, p {
|
||||||
|
margin: 0 0 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: lighter;
|
||||||
|
color: #b1148e;
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a, a:visited, a:active {
|
||||||
|
color: #b1148e;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="particles"></div>
|
||||||
|
|
||||||
|
<div id="box">
|
||||||
|
<h1>Simple Kiosk</h1>
|
||||||
|
<p>This is a simple browser for your show room or trade fair booth.</p>
|
||||||
|
<p>It has very few features but works for simple things.</p>
|
||||||
|
<p>By default it loads <span style="font-family: monospace;">/assets/data/index.html</span> but you can choose any page you like.</p>
|
||||||
|
<p>Simple Kiosk comes with a plugin for the Tooloop Settings Server so you can configure it in there.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="credits"><a href="http://vincentgarreau.com/particles.js/">particles.js</a> by Vincent Garreau</div>
|
||||||
|
|
||||||
|
<!-- particles.js lib - https://github.com/VincentGarreau/particles.js -->
|
||||||
|
<script src="particles.min.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
particlesJS("particles", {
|
||||||
|
"particles": {
|
||||||
|
"number": {
|
||||||
|
"value": 100,
|
||||||
|
"density": {
|
||||||
|
"enable": true,
|
||||||
|
"value_area": 1000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"value": "#ffffff"
|
||||||
|
},
|
||||||
|
"shape": {
|
||||||
|
"type": "polygon",
|
||||||
|
"stroke": {
|
||||||
|
"width": 0,
|
||||||
|
"color": "#000000"
|
||||||
|
},
|
||||||
|
"polygon": {
|
||||||
|
"nb_sides": 8
|
||||||
|
},
|
||||||
|
// "image": {
|
||||||
|
// "src": "img/github.svg",
|
||||||
|
// "width": 100,
|
||||||
|
// "height": 100
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
"opacity": {
|
||||||
|
"value": 0.5,
|
||||||
|
"random": false,
|
||||||
|
"anim": {
|
||||||
|
"enable": false,
|
||||||
|
"speed": 1,
|
||||||
|
"opacity_min": 0.1,
|
||||||
|
"sync": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"value": 2,
|
||||||
|
"random": true,
|
||||||
|
"anim": {
|
||||||
|
"enable": false,
|
||||||
|
"speed": 40,
|
||||||
|
"size_min": 0.1,
|
||||||
|
"sync": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"line_linked": {
|
||||||
|
"enable": true,
|
||||||
|
"distance": 150,
|
||||||
|
"color": "#ffffff",
|
||||||
|
"opacity": 0.4,
|
||||||
|
"width": 1.5
|
||||||
|
},
|
||||||
|
"move": {
|
||||||
|
"enable": true,
|
||||||
|
"speed": 3,
|
||||||
|
"direction": "none",
|
||||||
|
"random": true,
|
||||||
|
"straight": false,
|
||||||
|
"out_mode": "out",
|
||||||
|
"bounce": false,
|
||||||
|
"attract": {
|
||||||
|
"enable": true,
|
||||||
|
"rotateX": 600,
|
||||||
|
"rotateY": 1200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"interactivity": {
|
||||||
|
"detect_on": "window",
|
||||||
|
"events": {
|
||||||
|
"onhover": {
|
||||||
|
"enable": false,
|
||||||
|
"mode": "repulse"
|
||||||
|
},
|
||||||
|
"onclick": {
|
||||||
|
"enable": true,
|
||||||
|
"mode": "push"
|
||||||
|
},
|
||||||
|
"resize": true
|
||||||
|
},
|
||||||
|
"modes": {
|
||||||
|
"grab": {
|
||||||
|
"distance": 400,
|
||||||
|
"line_linked": {
|
||||||
|
"opacity": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bubble": {
|
||||||
|
"distance": 400,
|
||||||
|
"size": 40,
|
||||||
|
"duration": 2,
|
||||||
|
"opacity": 8,
|
||||||
|
"speed": 3
|
||||||
|
},
|
||||||
|
"repulse": {
|
||||||
|
"distance": 200,
|
||||||
|
"duration": 0.4
|
||||||
|
},
|
||||||
|
"push": {
|
||||||
|
"particles_nb": 3
|
||||||
|
},
|
||||||
|
"remove": {
|
||||||
|
"particles_nb": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"retina_detect": true
|
||||||
|
});
|
||||||
|
var update = function() {
|
||||||
|
requestAnimationFrame(update);
|
||||||
|
};
|
||||||
|
requestAnimationFrame(update);;
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
/* -----------------------------------------------
|
||||||
|
/* Author : Vincent Garreau - vincentgarreau.com
|
||||||
|
/* MIT license: http://opensource.org/licenses/MIT
|
||||||
|
/* Demo / Generator : vincentgarreau.com/particles.js
|
||||||
|
/* GitHub : github.com/VincentGarreau/particles.js
|
||||||
|
/* How to use? : Check the GitHub README
|
||||||
|
/* v2.0.0
|
||||||
|
/* ----------------------------------------------- */
|
||||||
|
function hexToRgb(e){var a=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;e=e.replace(a,function(e,a,t,i){return a+a+t+t+i+i});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function clamp(e,a,t){return Math.min(Math.max(e,a),t)}function isInArray(e,a){return a.indexOf(e)>-1}var pJS=function(e,a){var t=document.querySelector("#"+e+" > .particles-js-canvas-el");this.pJS={canvas:{el:t,w:t.offsetWidth,h:t.offsetHeight},particles:{number:{value:400,density:{enable:!0,value_area:800}},color:{value:"#fff"},shape:{type:"circle",stroke:{width:0,color:"#ff0000"},polygon:{nb_sides:5},image:{src:"",width:100,height:100}},opacity:{value:1,random:!1,anim:{enable:!1,speed:2,opacity_min:0,sync:!1}},size:{value:20,random:!1,anim:{enable:!1,speed:20,size_min:0,sync:!1}},line_linked:{enable:!0,distance:100,color:"#fff",opacity:1,width:1},move:{enable:!0,speed:2,direction:"none",random:!1,straight:!1,out_mode:"out",bounce:!1,attract:{enable:!1,rotateX:3e3,rotateY:3e3}},array:[]},interactivity:{detect_on:"canvas",events:{onhover:{enable:!0,mode:"grab"},onclick:{enable:!0,mode:"push"},resize:!0},modes:{grab:{distance:100,line_linked:{opacity:1}},bubble:{distance:200,size:80,duration:.4},repulse:{distance:200,duration:.4},push:{particles_nb:4},remove:{particles_nb:2}},mouse:{}},retina_detect:!1,fn:{interact:{},modes:{},vendors:{}},tmp:{}};var i=this.pJS;a&&Object.deepExtend(i,a),i.tmp.obj={size_value:i.particles.size.value,size_anim_speed:i.particles.size.anim.speed,move_speed:i.particles.move.speed,line_linked_distance:i.particles.line_linked.distance,line_linked_width:i.particles.line_linked.width,mode_grab_distance:i.interactivity.modes.grab.distance,mode_bubble_distance:i.interactivity.modes.bubble.distance,mode_bubble_size:i.interactivity.modes.bubble.size,mode_repulse_distance:i.interactivity.modes.repulse.distance},i.fn.retinaInit=function(){i.retina_detect&&window.devicePixelRatio>1?(i.canvas.pxratio=window.devicePixelRatio,i.tmp.retina=!0):(i.canvas.pxratio=1,i.tmp.retina=!1),i.canvas.w=i.canvas.el.offsetWidth*i.canvas.pxratio,i.canvas.h=i.canvas.el.offsetHeight*i.canvas.pxratio,i.particles.size.value=i.tmp.obj.size_value*i.canvas.pxratio,i.particles.size.anim.speed=i.tmp.obj.size_anim_speed*i.canvas.pxratio,i.particles.move.speed=i.tmp.obj.move_speed*i.canvas.pxratio,i.particles.line_linked.distance=i.tmp.obj.line_linked_distance*i.canvas.pxratio,i.interactivity.modes.grab.distance=i.tmp.obj.mode_grab_distance*i.canvas.pxratio,i.interactivity.modes.bubble.distance=i.tmp.obj.mode_bubble_distance*i.canvas.pxratio,i.particles.line_linked.width=i.tmp.obj.line_linked_width*i.canvas.pxratio,i.interactivity.modes.bubble.size=i.tmp.obj.mode_bubble_size*i.canvas.pxratio,i.interactivity.modes.repulse.distance=i.tmp.obj.mode_repulse_distance*i.canvas.pxratio},i.fn.canvasInit=function(){i.canvas.ctx=i.canvas.el.getContext("2d")},i.fn.canvasSize=function(){i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i&&i.interactivity.events.resize&&window.addEventListener("resize",function(){i.canvas.w=i.canvas.el.offsetWidth,i.canvas.h=i.canvas.el.offsetHeight,i.tmp.retina&&(i.canvas.w*=i.canvas.pxratio,i.canvas.h*=i.canvas.pxratio),i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i.particles.move.enable||(i.fn.particlesEmpty(),i.fn.particlesCreate(),i.fn.particlesDraw(),i.fn.vendors.densityAutoParticles()),i.fn.vendors.densityAutoParticles()})},i.fn.canvasPaint=function(){i.canvas.ctx.fillRect(0,0,i.canvas.w,i.canvas.h)},i.fn.canvasClear=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h)},i.fn.particle=function(e,a,t){if(this.radius=(i.particles.size.random?Math.random():1)*i.particles.size.value,i.particles.size.anim.enable&&(this.size_status=!1,this.vs=i.particles.size.anim.speed/100,i.particles.size.anim.sync||(this.vs=this.vs*Math.random())),this.x=t?t.x:Math.random()*i.canvas.w,this.y=t?t.y:Math.random()*i.canvas.h,this.x>i.canvas.w-2*this.radius?this.x=this.x-this.radius:this.x<2*this.radius&&(this.x=this.x+this.radius),this.y>i.canvas.h-2*this.radius?this.y=this.y-this.radius:this.y<2*this.radius&&(this.y=this.y+this.radius),i.particles.move.bounce&&i.fn.vendors.checkOverlap(this,t),this.color={},"object"==typeof e.value)if(e.value instanceof Array){var s=e.value[Math.floor(Math.random()*i.particles.color.value.length)];this.color.rgb=hexToRgb(s)}else void 0!=e.value.r&&void 0!=e.value.g&&void 0!=e.value.b&&(this.color.rgb={r:e.value.r,g:e.value.g,b:e.value.b}),void 0!=e.value.h&&void 0!=e.value.s&&void 0!=e.value.l&&(this.color.hsl={h:e.value.h,s:e.value.s,l:e.value.l});else"random"==e.value?this.color.rgb={r:Math.floor(256*Math.random())+0,g:Math.floor(256*Math.random())+0,b:Math.floor(256*Math.random())+0}:"string"==typeof e.value&&(this.color=e,this.color.rgb=hexToRgb(this.color.value));this.opacity=(i.particles.opacity.random?Math.random():1)*i.particles.opacity.value,i.particles.opacity.anim.enable&&(this.opacity_status=!1,Line truncated
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
URL="file:///assets/data/index.html"
|
||||||
|
|
||||||
|
# List of Chromium Command Line Switches
|
||||||
|
# https://peter.sh/experiments/chromium-command-line-switches/
|
||||||
|
COMMAND="chromium-browser \
|
||||||
|
--kiosk \
|
||||||
|
--bwsi \
|
||||||
|
--overscroll-history-navigation=1 \
|
||||||
|
--incognito \
|
||||||
|
--disable-infobars \
|
||||||
|
--disable-translate \
|
||||||
|
--no-default-browser-check \
|
||||||
|
--no-first-run \
|
||||||
|
--disable-translate-new-ux \
|
||||||
|
--num-raster-threads=4 \
|
||||||
|
--enable-zero-copy \
|
||||||
|
--noerrdialogs \
|
||||||
|
--class=TooloopKiosk \
|
||||||
|
$URL"
|
||||||
|
|
||||||
|
if [ $EUID == 0 ]; then
|
||||||
|
pkill chromium
|
||||||
|
sleep 0.1
|
||||||
|
su tooloop -c "$COMMAND" &
|
||||||
|
else
|
||||||
|
pkill chromium
|
||||||
|
sleep 0.1
|
||||||
|
$COMMAND &
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
IDLETIME=60
|
||||||
|
RESET_COMMAND="/bin/bash /assets/presentation/reset-kiosk.sh"
|
||||||
|
|
||||||
|
$RESET_COMMAND
|
||||||
|
xidlerun -t $IDLETIME -c "$RESET_COMMAND" &
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
pkill xidlerun &
|
||||||
|
pkill chromium &
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "Simple Kiosk",
|
||||||
|
"description": "A simple kiosk browser based using chromium.",
|
||||||
|
"media": [],
|
||||||
|
"version": "1.0",
|
||||||
|
"last_updated": "2017-12-21",
|
||||||
|
"license": "Public domain",
|
||||||
|
"category": "Examples",
|
||||||
|
"tags": ["example"],
|
||||||
|
"developer": "vollstock",
|
||||||
|
"homepage": "http://www.vollstock.de/",
|
||||||
|
"compatibility": {
|
||||||
|
"s": "True",
|
||||||
|
"m": "True",
|
||||||
|
"l": "True",
|
||||||
|
"xl": "True"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from flask import Flask, jsonify, request, abort
|
||||||
|
from os import chown
|
||||||
|
from pwd import getpwnam
|
||||||
|
from grp import getgrnam
|
||||||
|
|
||||||
|
class InstalledApp(object):
|
||||||
|
|
||||||
|
def __init__(self, flask):
|
||||||
|
super(InstalledApp, self).__init__()
|
||||||
|
|
||||||
|
# default homepage
|
||||||
|
self.homepage = 'file:///assets/data/index.html';
|
||||||
|
|
||||||
|
# connect flask routes to tooloop api calls
|
||||||
|
self.add_routes(flask)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def add_routes(self, flask):
|
||||||
|
|
||||||
|
@flask.route('/simple-kiosk/change-homepage', methods=['POST'])
|
||||||
|
def change_homepage():
|
||||||
|
if not request.form or not 'homepage' in request.form:
|
||||||
|
abort(400)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.homepage = request.form['homepage'];
|
||||||
|
|
||||||
|
file = open('/assets/presentation/reset-kiosk.sh','w')
|
||||||
|
|
||||||
|
file.write('#!/bin/bash\n')
|
||||||
|
file.write('\n')
|
||||||
|
file.write('URL="'+self.homepage+'"\n')
|
||||||
|
file.write('\n')
|
||||||
|
file.write('# List of Chromium Command Line Switches\n')
|
||||||
|
file.write('# https://peter.sh/experiments/chromium-command-line-switches/\n')
|
||||||
|
file.write('COMMAND="chromium-browser \\\n')
|
||||||
|
file.write('--kiosk \\\n')
|
||||||
|
file.write('--bwsi \\\n')
|
||||||
|
file.write('--overscroll-history-navigation=1 \\\n')
|
||||||
|
file.write('--incognito \\\n')
|
||||||
|
file.write('--disable-infobars \\\n')
|
||||||
|
file.write('--disable-translate \\\n')
|
||||||
|
file.write('--no-default-browser-check \\\n')
|
||||||
|
file.write('--no-first-run \\\n')
|
||||||
|
file.write('--disable-translate-new-ux \\\n')
|
||||||
|
file.write('--num-raster-threads=4 \\\n')
|
||||||
|
file.write('--enable-zero-copy \\\n')
|
||||||
|
file.write('--noerrdialogs \\\n')
|
||||||
|
file.write('--class=TooloopKiosk \\\n')
|
||||||
|
file.write('$URL"\n')
|
||||||
|
file.write('\n')
|
||||||
|
file.write('if [ $EUID == 0 ]; then\n')
|
||||||
|
file.write(' pkill chromium\n')
|
||||||
|
file.write(' sleep 0.1\n')
|
||||||
|
file.write(' su tooloop -c "$COMMAND" &\n')
|
||||||
|
file.write('else\n')
|
||||||
|
file.write(' pkill chromium\n')
|
||||||
|
file.write(' sleep 0.1\n')
|
||||||
|
file.write(' $COMMAND &\n')
|
||||||
|
file.write('fi\n')
|
||||||
|
file.write('\n')
|
||||||
|
file.write('exit 0\n')
|
||||||
|
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
uid = getpwnam('tooloop').pw_uid
|
||||||
|
gid = getgrnam('tooloop').gr_gid
|
||||||
|
chown('/assets/presentation/reset-kiosk.sh', uid, gid)
|
||||||
|
|
||||||
|
return jsonify({'message':'homepage changed'})
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
abort(500)
|
||||||
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,43 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<table class="settings-table">
|
||||||
|
<tr><td colspan="2"><h2>{{installed_app.name}}</h2></td></tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="label-column" style="vertical-align: top; padding-top: 1.1em;">Homepage</td>
|
||||||
|
<td class="value-column">
|
||||||
|
<form id="homepage-form">
|
||||||
|
<input type="text" id="homepage-input" value="{{app_controller.homepage}}">
|
||||||
|
<button type="submit">Save</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block page_footer_scripts %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$('#homepage-form').on('submit', function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var feedback = attachFeedback(event.target);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: "POST",
|
||||||
|
data: { "homepage":$('#homepage-input').val() },
|
||||||
|
url: "/simple-kiosk/change-homepage"
|
||||||
|
}).done(function( data ) {
|
||||||
|
displayConfirmFeedback(feedback, 'Saved');
|
||||||
|
$.ajax( {url:"/tooloop/api/v1.0/presentation/reset"} );
|
||||||
|
}).error(function( jqXHR, textStatus, errorThrown ) {
|
||||||
|
displayErrorFeedback(feedback, errorThrown);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Package: tooloop-processing-example
|
||||||
|
Version: 0.9.0
|
||||||
|
Maintainer: vollstock <daniel@vollstock.de>
|
||||||
|
Homepage: https://www.vollstock.de
|
||||||
|
Architecture: all
|
||||||
|
Section: tooloop/presentation
|
||||||
|
Pre-Depends: tooloop-processing (= 3.4.0)
|
||||||
|
Description: Processing Example
|
||||||
|
This is a just a simple example of how to bundle processing sketches
|
||||||
|
in a .deb bundle that runs on Tooloop OS.
|
||||||
|
**Flocking** by Daniel Shiffman. https://processing.org/examples/flocking.html
|
||||||
@@ -0,0 +1,249 @@
|
|||||||
|
Flock flock;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
fullScreen();
|
||||||
|
//size(640, 480);
|
||||||
|
flock = new Flock();
|
||||||
|
// Add an initial set of boids into the system
|
||||||
|
for (int i = 0; i < 150; i++) {
|
||||||
|
flock.addBoid(new Boid(width/2,height/2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw() {
|
||||||
|
background(50);
|
||||||
|
flock.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a new boid into the System
|
||||||
|
void mousePressed() {
|
||||||
|
flock.addBoid(new Boid(mouseX,mouseY));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// The Flock (a list of Boid objects)
|
||||||
|
|
||||||
|
class Flock {
|
||||||
|
ArrayList<Boid> boids; // An ArrayList for all the boids
|
||||||
|
|
||||||
|
Flock() {
|
||||||
|
boids = new ArrayList<Boid>(); // Initialize the ArrayList
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() {
|
||||||
|
for (Boid b : boids) {
|
||||||
|
b.run(boids); // Passing the entire list of boids to each boid individually
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addBoid(Boid b) {
|
||||||
|
boids.add(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// The Boid class
|
||||||
|
|
||||||
|
class Boid {
|
||||||
|
|
||||||
|
PVector position;
|
||||||
|
PVector velocity;
|
||||||
|
PVector acceleration;
|
||||||
|
float r;
|
||||||
|
float maxforce; // Maximum steering force
|
||||||
|
float maxspeed; // Maximum speed
|
||||||
|
|
||||||
|
Boid(float x, float y) {
|
||||||
|
acceleration = new PVector(0, 0);
|
||||||
|
|
||||||
|
// This is a new PVector method not yet implemented in JS
|
||||||
|
// velocity = PVector.random2D();
|
||||||
|
|
||||||
|
// Leaving the code temporarily this way so that this example runs in JS
|
||||||
|
float angle = random(TWO_PI);
|
||||||
|
velocity = new PVector(cos(angle), sin(angle));
|
||||||
|
|
||||||
|
position = new PVector(x, y);
|
||||||
|
r = 2.0;
|
||||||
|
maxspeed = 2;
|
||||||
|
maxforce = 0.03;
|
||||||
|
}
|
||||||
|
|
||||||
|
void run(ArrayList<Boid> boids) {
|
||||||
|
flock(boids);
|
||||||
|
update();
|
||||||
|
borders();
|
||||||
|
render();
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyForce(PVector force) {
|
||||||
|
// We could add mass here if we want A = F / M
|
||||||
|
acceleration.add(force);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We accumulate a new acceleration each time based on three rules
|
||||||
|
void flock(ArrayList<Boid> boids) {
|
||||||
|
PVector sep = separate(boids); // Separation
|
||||||
|
PVector ali = align(boids); // Alignment
|
||||||
|
PVector coh = cohesion(boids); // Cohesion
|
||||||
|
// Arbitrarily weight these forces
|
||||||
|
sep.mult(1.5);
|
||||||
|
ali.mult(1.0);
|
||||||
|
coh.mult(1.0);
|
||||||
|
// Add the force vectors to acceleration
|
||||||
|
applyForce(sep);
|
||||||
|
applyForce(ali);
|
||||||
|
applyForce(coh);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method to update position
|
||||||
|
void update() {
|
||||||
|
// Update velocity
|
||||||
|
velocity.add(acceleration);
|
||||||
|
// Limit speed
|
||||||
|
velocity.limit(maxspeed);
|
||||||
|
position.add(velocity);
|
||||||
|
// Reset accelertion to 0 each cycle
|
||||||
|
acceleration.mult(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// A method that calculates and applies a steering force towards a target
|
||||||
|
// STEER = DESIRED MINUS VELOCITY
|
||||||
|
PVector seek(PVector target) {
|
||||||
|
PVector desired = PVector.sub(target, position); // A vector pointing from the position to the target
|
||||||
|
// Scale to maximum speed
|
||||||
|
desired.normalize();
|
||||||
|
desired.mult(maxspeed);
|
||||||
|
|
||||||
|
// Above two lines of code below could be condensed with new PVector setMag() method
|
||||||
|
// Not using this method until Processing.js catches up
|
||||||
|
// desired.setMag(maxspeed);
|
||||||
|
|
||||||
|
// Steering = Desired minus Velocity
|
||||||
|
PVector steer = PVector.sub(desired, velocity);
|
||||||
|
steer.limit(maxforce); // Limit to maximum steering force
|
||||||
|
return steer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void render() {
|
||||||
|
// Draw a triangle rotated in the direction of velocity
|
||||||
|
float theta = velocity.heading2D() + radians(90);
|
||||||
|
// heading2D() above is now heading() but leaving old syntax until Processing.js catches up
|
||||||
|
|
||||||
|
fill(200, 100);
|
||||||
|
stroke(255);
|
||||||
|
pushMatrix();
|
||||||
|
translate(position.x, position.y);
|
||||||
|
rotate(theta);
|
||||||
|
beginShape(TRIANGLES);
|
||||||
|
vertex(0, -r*2);
|
||||||
|
vertex(-r, r*2);
|
||||||
|
vertex(r, r*2);
|
||||||
|
endShape();
|
||||||
|
popMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wraparound
|
||||||
|
void borders() {
|
||||||
|
if (position.x < -r) position.x = width+r;
|
||||||
|
if (position.y < -r) position.y = height+r;
|
||||||
|
if (position.x > width+r) position.x = -r;
|
||||||
|
if (position.y > height+r) position.y = -r;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Separation
|
||||||
|
// Method checks for nearby boids and steers away
|
||||||
|
PVector separate (ArrayList<Boid> boids) {
|
||||||
|
float desiredseparation = 25.0f;
|
||||||
|
PVector steer = new PVector(0, 0, 0);
|
||||||
|
int count = 0;
|
||||||
|
// For every boid in the system, check if it's too close
|
||||||
|
for (Boid other : boids) {
|
||||||
|
float d = PVector.dist(position, other.position);
|
||||||
|
// If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself)
|
||||||
|
if ((d > 0) && (d < desiredseparation)) {
|
||||||
|
// Calculate vector pointing away from neighbor
|
||||||
|
PVector diff = PVector.sub(position, other.position);
|
||||||
|
diff.normalize();
|
||||||
|
diff.div(d); // Weight by distance
|
||||||
|
steer.add(diff);
|
||||||
|
count++; // Keep track of how many
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Average -- divide by how many
|
||||||
|
if (count > 0) {
|
||||||
|
steer.div((float)count);
|
||||||
|
}
|
||||||
|
|
||||||
|
// As long as the vector is greater than 0
|
||||||
|
if (steer.mag() > 0) {
|
||||||
|
// First two lines of code below could be condensed with new PVector setMag() method
|
||||||
|
// Not using this method until Processing.js catches up
|
||||||
|
// steer.setMag(maxspeed);
|
||||||
|
|
||||||
|
// Implement Reynolds: Steering = Desired - Velocity
|
||||||
|
steer.normalize();
|
||||||
|
steer.mult(maxspeed);
|
||||||
|
steer.sub(velocity);
|
||||||
|
steer.limit(maxforce);
|
||||||
|
}
|
||||||
|
return steer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alignment
|
||||||
|
// For every nearby boid in the system, calculate the average velocity
|
||||||
|
PVector align (ArrayList<Boid> boids) {
|
||||||
|
float neighbordist = 50;
|
||||||
|
PVector sum = new PVector(0, 0);
|
||||||
|
int count = 0;
|
||||||
|
for (Boid other : boids) {
|
||||||
|
float d = PVector.dist(position, other.position);
|
||||||
|
if ((d > 0) && (d < neighbordist)) {
|
||||||
|
sum.add(other.velocity);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count > 0) {
|
||||||
|
sum.div((float)count);
|
||||||
|
// First two lines of code below could be condensed with new PVector setMag() method
|
||||||
|
// Not using this method until Processing.js catches up
|
||||||
|
// sum.setMag(maxspeed);
|
||||||
|
|
||||||
|
// Implement Reynolds: Steering = Desired - Velocity
|
||||||
|
sum.normalize();
|
||||||
|
sum.mult(maxspeed);
|
||||||
|
PVector steer = PVector.sub(sum, velocity);
|
||||||
|
steer.limit(maxforce);
|
||||||
|
return steer;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new PVector(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cohesion
|
||||||
|
// For the average position (i.e. center) of all nearby boids, calculate steering vector towards that position
|
||||||
|
PVector cohesion (ArrayList<Boid> boids) {
|
||||||
|
float neighbordist = 50;
|
||||||
|
PVector sum = new PVector(0, 0); // Start with empty vector to accumulate all positions
|
||||||
|
int count = 0;
|
||||||
|
for (Boid other : boids) {
|
||||||
|
float d = PVector.dist(position, other.position);
|
||||||
|
if ((d > 0) && (d < neighbordist)) {
|
||||||
|
sum.add(other.position); // Add position
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count > 0) {
|
||||||
|
sum.div(count);
|
||||||
|
return seek(sum); // Steer towards the position
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new PVector(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
/assets/addons/processing-3.4.0/processing-java --sketch=/assets/presentation/Flocking --present &
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
pkill java
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Package: tooloop-transparent-cursor
|
||||||
|
Version: 0.9.0
|
||||||
|
Maintainer: vollstock
|
||||||
|
Homepage: https://www.vollstock.de
|
||||||
|
Bugs: https://github.com/vollstock/xcursor-transparent-cursor
|
||||||
|
Section: tooloop/addon
|
||||||
|
Architecture: all
|
||||||
|
Description: Transparent mouse cursor
|
||||||
|
Install it if you want to hide the mouse cursor completely
|
||||||
|
e. g. on touch displays.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit immediately if a command exits with a non-zero status.
|
||||||
|
set -e
|
||||||
|
# restart openbox for immediate effect
|
||||||
|
openbox --restart
|
||||||
|
# Exit cleanly
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit immediately if a command exits with a non-zero status.
|
||||||
|
set -e
|
||||||
|
# restart openbox for immediate effect
|
||||||
|
openbox --restart
|
||||||
|
# Exit cleanly
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# move them to the repository
|
||||||
|
mv *.deb /assets/packages
|
||||||
|
|
||||||
|
# update apt
|
||||||
|
/opt/tooloop/scripts/tooloop-update-packages
|
||||||
|
|
||||||
|
#echo " "
|
||||||
|
#echo "Available packages:"
|
||||||
|
apt list tooloop*
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Package: tooloop-video-player
|
||||||
|
Version: 0.9.0
|
||||||
|
Maintainer: vollstock
|
||||||
|
Homepage: https://www.vollstock.de
|
||||||
|
Bugs: https://github.com/vollstock/Tooloop-Examples
|
||||||
|
Section: tooloop/presentation
|
||||||
|
Architecture: all
|
||||||
|
Depends: mplayer
|
||||||
|
Description: Video Player
|
||||||
|
The tooloop video player is using mplayer to loop over all videos it find in `/assets/data`.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Super simpler video player
|
||||||
|
|
||||||
|
The super simple video player is an example of how to use the Tooloop media
|
||||||
|
server and provide apps for it.
|
||||||
|
|
||||||
|
It's in the public domain.
|
||||||
|
|
||||||
|
|
||||||
|
# MPlayer
|
||||||
|
|
||||||
|
[MPlayer](http://www.mplayerhq.hu) is available under the [GNU General Public
|
||||||
|
License version 2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
|
||||||
|
It is not available under any other licensing terms, not even for substantial
|
||||||
|
amounts of money. If you have questions about the GNU GPL, consult the GPL FAQ.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# Super simple video player
|
||||||
|
|
||||||
|
In this example we are using [mplayer](http://mplayerhq.hu) to play and loop a list of videos in fullscreen.
|
||||||
|
|
||||||
|
## Customizing
|
||||||
|
|
||||||
|
Check out the start script if you want to fiddle with some mplayer options. [Here's the docs](http://www.mplayerhq.hu/design7/documentation.html).
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
mplayer -fs -zoom /assets/data/Tooloop\ Greeter\ Intro.mp4 /assets/data/Tooloop\ Greeter\ Loop.mp4 -loop 0 &
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# here comes everything, you need to stop the running presentation
|
||||||
|
# basically kill or stop everything you started in `start-presentation.sh`
|
||||||
|
|
||||||
|
kill $(pidof mplayer)
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "Simple Video Player",
|
||||||
|
"description": "Uses [mplayer](http://mplayerhq.hu) to play and loop a list of videos in fullscreen.",
|
||||||
|
"media": [],
|
||||||
|
"version": "1.0",
|
||||||
|
"last_updated": "2018-02-13",
|
||||||
|
"license": "Public domain",
|
||||||
|
"category": "Examples",
|
||||||
|
"tags": ["example"],
|
||||||
|
"developer": "vollstock",
|
||||||
|
"homepage": "http://www.vollstock.de/",
|
||||||
|
"compatibility": {
|
||||||
|
"s": "False",
|
||||||
|
"m": "True",
|
||||||
|
"l": "True",
|
||||||
|
"xl": "True"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
apt update
|
||||||
|
apt -y install mplayer
|
||||||
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# remove all files we have copied to data folder
|
||||||
|
rm /assets/data/tooloop-greeter*
|
||||||
|
|
||||||
|
# we have installed it, we should remove it also
|
||||||
|
apt -y purge mplayer
|
||||||