first
This commit is contained in:
14
BingWallpaper@sonichy/README.md
Executable file
14
BingWallpaper@sonichy/README.md
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
# BingWallpaper_GNOME
|
||||||
|
Change wallpaper of GNOME with Bing wallpaper on one click.
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
### V1.0 (2025-04-26)
|
||||||
|
Get Bing wallpaper API, parse image url, download image, set GNOME wallpaper.
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
[guide](https://gjs.guide/extensions/development/creating.html)
|
||||||
|
[Soup](https://libsoup.gnome.org/libsoup-3.0/index.html)
|
||||||
|
[bing-wallpaper-gnome-extension](https://github.com/neffo/bing-wallpaper-gnome-extension)
|
||||||
|
|
||||||
|
## Debug
|
||||||
|
dbus-run-session -- gnome-shell --nested --wayland
|
||||||
81
BingWallpaper@sonichy/bing-symbolic.svg
Normal file
81
BingWallpaper@sonichy/bing-symbolic.svg
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="128"
|
||||||
|
height="128"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="bing.svg"
|
||||||
|
inkscape:export-filename="/home/giulio/Scaricati/bing.svg.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.28574218"
|
||||||
|
inkscape:cx="360.85355"
|
||||||
|
inkscape:cy="487.41923"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
inkscape:window-width="1307"
|
||||||
|
inkscape:window-height="704"
|
||||||
|
inkscape:window-x="59"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid2996"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
originx="226.45871"
|
||||||
|
originy="5.9950575"
|
||||||
|
spacingx="1.0666667"
|
||||||
|
spacingy="1.0666667" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(226.45871,-1000.5147)">
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
|
||||||
|
d="m -207.22508,1000.5147 25.56889,8.995 0,90.0025 36.01496,-20.7906 -17.65737,-8.2848 -11.13975,-27.7264 56.74602,19.9359 0,28.9836 -63.94928,36.8848 -25.58347,-14.2309 z"
|
||||||
|
id="path2998"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccccccc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.4 KiB |
79
BingWallpaper@sonichy/extension.js
Executable file
79
BingWallpaper@sonichy/extension.js
Executable file
@@ -0,0 +1,79 @@
|
|||||||
|
import GLib from "gi://GLib";
|
||||||
|
import Gio from 'gi://Gio';
|
||||||
|
import St from 'gi://St';
|
||||||
|
import Soup from 'gi://Soup';
|
||||||
|
|
||||||
|
import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||||
|
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||||
|
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||||
|
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||||
|
|
||||||
|
export var schema = 'org.gnome.desktop.background';
|
||||||
|
export var imagePath = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES) + '/BingWallpaper';
|
||||||
|
|
||||||
|
export default class BingWallpaperExtension extends Extension {
|
||||||
|
enable() {
|
||||||
|
this._indicator = new PanelMenu.Button(0.0, this.metadata.name, false);
|
||||||
|
|
||||||
|
let gicon = Gio.icon_new_for_string(this.dir.get_path() + '/bing-symbolic.svg');
|
||||||
|
const icon = new St.Icon({
|
||||||
|
gicon: gicon,
|
||||||
|
style_class: 'system-status-icon'
|
||||||
|
});
|
||||||
|
this._indicator.add_child(icon);
|
||||||
|
//this._indicator.connect('pressed', () => this.getWallpaper());
|
||||||
|
|
||||||
|
Main.panel.addToStatusArea(this.uuid, this._indicator);
|
||||||
|
|
||||||
|
const menu_browse = new PopupMenu.PopupImageMenuItem('Browse', 'folder-directory-symbolic', {});
|
||||||
|
menu_browse.connect('activate', () => {});
|
||||||
|
this._indicator.menu.addMenuItem(menu_browse);
|
||||||
|
|
||||||
|
this.menu_update = new PopupMenu.PopupImageMenuItem('Update', 'info-symbolic', {});
|
||||||
|
this.menu_update.connect('activate', () => this.getWallpaper());
|
||||||
|
this._indicator.menu.addMenuItem(this.menu_update);
|
||||||
|
}
|
||||||
|
|
||||||
|
disable() {
|
||||||
|
this._indicator?.destroy();
|
||||||
|
this._indicator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
getWallpaper() {
|
||||||
|
console.log('BingWallpaper menu pressed!');
|
||||||
|
let gsettings = new Gio.Settings({ schema: schema });
|
||||||
|
//let uri = gsettings.get_string('picture-uri');
|
||||||
|
//console.log(schema + ': ' + uri);
|
||||||
|
var url = 'http://cn.bing.com/HPImageArchive.aspx';
|
||||||
|
let params = { format: 'js', idx: '0' , n: '1' } ;
|
||||||
|
let httpSession = new Soup.Session();
|
||||||
|
let request = Soup.Message.new_from_encoded_form('GET', url, Soup.form_encode_hash(params));
|
||||||
|
httpSession.send_and_read_async(request, GLib.PRIORITY_DEFAULT, null, (httpSession, message) => {
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
var data = decoder.decode(httpSession.send_and_read_finish(message).get_data());
|
||||||
|
console.log(data);
|
||||||
|
var json = JSON.parse(data);
|
||||||
|
let imgUrl = "http://www.bing.com" + json.images[0].url;
|
||||||
|
var filename = json.images[0].enddate + '_' + json.images[0].urlbase.replace('/th?id=OHR.', '') + '.jpg';
|
||||||
|
this.menu_update.label.text = json.images[0].copyright;
|
||||||
|
//console.log(imgUrl);
|
||||||
|
//console.log(filename);
|
||||||
|
var filepath = imagePath + '/' + filename;
|
||||||
|
//console.log(filepath);
|
||||||
|
let file = Gio.file_new_for_path(filepath);
|
||||||
|
let request = Soup.Message.new('GET', imgUrl);
|
||||||
|
httpSession.send_and_read_async(request, GLib.PRIORITY_DEFAULT, null, (httpSession, message) => {
|
||||||
|
data = httpSession.send_and_read_finish(message).get_data();
|
||||||
|
file.replace_contents_bytes_async(data, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null, (file, res) => {
|
||||||
|
let uri = 'file://' + filepath;
|
||||||
|
//console.log(uri);
|
||||||
|
gsettings.set_string('picture-uri', uri);
|
||||||
|
gsettings.set_string('picture-uri-dark', uri);
|
||||||
|
Gio.Settings.sync();
|
||||||
|
gsettings.apply();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
BingWallpaper@sonichy/metadata.json
Executable file
9
BingWallpaper@sonichy/metadata.json
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"uuid": "BingWallpaper@sonichy",
|
||||||
|
"name": "Bing Wallpaper",
|
||||||
|
"description": "Change wallpaper of GNOME with Bing wallpaper on one click.",
|
||||||
|
"author": "sonichy",
|
||||||
|
"version": "1.0",
|
||||||
|
"shell-version": [ "45", "46", "47", "48" ],
|
||||||
|
"url": "https://github.com/sonichy/GNOME_extension"
|
||||||
|
}
|
||||||
14
CMUD@sonichy/README.md
Executable file
14
CMUD@sonichy/README.md
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
# CMUD_GNOME
|
||||||
|
Display uptime, cpu, memory, upload, download on GNOME taskbar.
|
||||||
|

|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
### V1.0 (2025-04-22)
|
||||||
|
Display uptime, cpu, memory, upload, download on GNOME taskbar.
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
[guide](https://gjs.guide/extensions/development/creating.html)
|
||||||
|
[Cinnamon_Applet](https://github.com/sonichy/Cinnamon_Applet)
|
||||||
|
|
||||||
|
## Debug
|
||||||
|
dbus-run-session -- gnome-shell --nested --wayland
|
||||||
210
CMUD@sonichy/extension.js
Executable file
210
CMUD@sonichy/extension.js
Executable file
@@ -0,0 +1,210 @@
|
|||||||
|
import GLib from "gi://GLib";
|
||||||
|
import Gio from "gi://Gio";
|
||||||
|
import St from 'gi://St';
|
||||||
|
import Clutter from "gi://Clutter";
|
||||||
|
|
||||||
|
import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||||
|
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||||
|
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||||
|
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||||
|
|
||||||
|
var db0 = 0, ub0 = 0, tt0 = 0, idle0 = 0, mp, cp;
|
||||||
|
|
||||||
|
export default class CMUDExtension extends Extension {
|
||||||
|
|
||||||
|
enable() {
|
||||||
|
// Create a panel button
|
||||||
|
this._indicator = new PanelMenu.Button(0.0, this.metadata.name, false);
|
||||||
|
var box = new St.BoxLayout();
|
||||||
|
this._indicator.add_child(box);
|
||||||
|
|
||||||
|
var area_mem = new St.DrawingArea();
|
||||||
|
area_mem.width = 3;
|
||||||
|
area_mem.height = this._indicator.height;
|
||||||
|
area_mem.connect('repaint', this.onRepaint_mem);
|
||||||
|
box.add_child(area_mem);
|
||||||
|
|
||||||
|
var label = new St.Label({ text: '↑ 0KB/s\n↓ 0KB/s', y_align: Clutter.ActorAlign.CENTER });
|
||||||
|
label.set_style('text-align:center; font-family:Noto Mono');
|
||||||
|
box.add_child(label);
|
||||||
|
|
||||||
|
var area_cpu = new St.DrawingArea();
|
||||||
|
area_cpu.width = 3;
|
||||||
|
area_cpu.height = this._indicator.height;
|
||||||
|
area_cpu.connect('repaint', this.onRepaint_cpu);
|
||||||
|
box.add_child(area_cpu);
|
||||||
|
|
||||||
|
// Add the indicator to the panel
|
||||||
|
Main.panel.addToStatusArea(this.uuid, this._indicator);
|
||||||
|
|
||||||
|
const menuItem = new PopupMenu.PopupMenuItem('');
|
||||||
|
this._indicator.menu.addMenuItem(menuItem);
|
||||||
|
|
||||||
|
this._timeout = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1, () => {
|
||||||
|
var net = this.net();
|
||||||
|
label.set_text('↑' + this.B2G(net.ubs) + '/s\n↓' + this.B2G(net.dbs) + '/s');
|
||||||
|
this.mem();
|
||||||
|
area_mem.queue_repaint();
|
||||||
|
this.cpu();
|
||||||
|
area_cpu.queue_repaint();
|
||||||
|
var s = 'Uptime: ' + this.uptime() + '\nCPU: ' + cp + '%\nMem: ' + this.mem() + '\nUp: ' + this.B2G(net.ub) + '\nDown: ' + this.B2G(net.db);
|
||||||
|
menuItem.label.text = s;
|
||||||
|
// Run as loop, not once.
|
||||||
|
return GLib.SOURCE_CONTINUE;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
disable() {
|
||||||
|
if (this._timeout) {
|
||||||
|
GLib.source_remove(this._timeout);
|
||||||
|
this._timeout = null;
|
||||||
|
}
|
||||||
|
this._indicator?.destroy();
|
||||||
|
this._indicator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
uptime() {
|
||||||
|
const file = Gio.File.new_for_path('/proc/uptime');
|
||||||
|
const [, contents, etag] = file.load_contents(null);
|
||||||
|
var t = contents.toString().split(' ');
|
||||||
|
var tt = Number(t[0]);
|
||||||
|
var d = 0;
|
||||||
|
if (tt > 86400) {
|
||||||
|
d = tt / 86400;
|
||||||
|
tt -= d * 86400;
|
||||||
|
}
|
||||||
|
var ds = "";
|
||||||
|
if (d > 0)
|
||||||
|
ds = d + "day";
|
||||||
|
var h = ~~(tt/3600);
|
||||||
|
if (h < 10)
|
||||||
|
h = '0' + h;
|
||||||
|
var m = ~~(tt%3600/60);
|
||||||
|
if (m < 10)
|
||||||
|
m = '0' + m;
|
||||||
|
var s = ~~(tt%3600%60);
|
||||||
|
if (s < 10)
|
||||||
|
s = '0' + s;
|
||||||
|
var hms = ds + h + ':' + m + ':' + s;
|
||||||
|
return hms;
|
||||||
|
}
|
||||||
|
|
||||||
|
net() {
|
||||||
|
const file = Gio.File.new_for_path('/proc/net/dev');
|
||||||
|
const [, contents, etag] = file.load_contents(null);
|
||||||
|
var l = contents.toString().trim().split('\n');
|
||||||
|
var db = 0, ub = 0;
|
||||||
|
for (var i=2; i<l.length; i++) {
|
||||||
|
var la = l[i].trim().split(/\s+/);
|
||||||
|
db += Number(la[1]);
|
||||||
|
ub += Number(la[9]);
|
||||||
|
}
|
||||||
|
var dbs = db - db0;
|
||||||
|
var ubs = ub - ub0;
|
||||||
|
db0 = db;
|
||||||
|
ub0 = ub;
|
||||||
|
return {db, ub, dbs, ubs};
|
||||||
|
}
|
||||||
|
|
||||||
|
mem() {
|
||||||
|
const file = Gio.File.new_for_path('/proc/meminfo');
|
||||||
|
const [, contents, etag] = file.load_contents(null);
|
||||||
|
var s = contents.toString().split('\n');
|
||||||
|
var MT = s[0].split(/\s+/);
|
||||||
|
var MA = s[2].split(/\s+/);
|
||||||
|
var mt = Number(MT[1]);
|
||||||
|
var ma = Number(MA[1]);
|
||||||
|
var mu = mt - ma;
|
||||||
|
mp = ~~(mu / mt * 100);
|
||||||
|
var m = this.B2G(mu*1024) + ' / '+ this.B2G(mt*1024) + ' = ' + mp + '%';
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu() {
|
||||||
|
const file = Gio.File.new_for_path('/proc/stat');
|
||||||
|
const [, contents, etag] = file.load_contents(null);
|
||||||
|
var s = contents.toString().split('\n');
|
||||||
|
var ca = s[0].split(/\s+/);
|
||||||
|
var tt = 0;
|
||||||
|
for (var i=1; i<ca.length; i++) {
|
||||||
|
tt += Number(ca[i]);
|
||||||
|
}
|
||||||
|
var idle = Number(ca[4]);
|
||||||
|
cp = ~~(((tt - tt0) - (idle - idle0)) * 100 / (tt - tt0));
|
||||||
|
tt0 = tt;
|
||||||
|
idle0 = idle;
|
||||||
|
}
|
||||||
|
|
||||||
|
B2G(b) {
|
||||||
|
var s = '';
|
||||||
|
if (b > 999999999) {
|
||||||
|
b = b / (1024 * 1024 * 1024);
|
||||||
|
if (b >= 100) {
|
||||||
|
s = ' ' + b.toFixed(0) + 'GB';
|
||||||
|
} else if (b >= 10) {
|
||||||
|
s = b.toFixed(1) + 'GB';
|
||||||
|
} else {
|
||||||
|
s = b.toFixed(2) + 'GB';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (b > 999999) {
|
||||||
|
b = b / (1024 * 1024);
|
||||||
|
if (b >= 100) {
|
||||||
|
s = ' ' + b.toFixed(0) + 'MB';
|
||||||
|
} else if (b >= 10) {
|
||||||
|
s = b.toFixed(1) + 'MB';
|
||||||
|
} else {
|
||||||
|
s = b.toFixed(2) + 'MB';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (b > 999) {
|
||||||
|
b = b / 1024;
|
||||||
|
if (b >= 100) {
|
||||||
|
s = ' ' + b.toFixed(0) + 'KB';
|
||||||
|
} else if (b >= 10) {
|
||||||
|
s = ' ' + b.toFixed(0) + 'KB';
|
||||||
|
} else {
|
||||||
|
s = ' ' + b.toFixed(0) + 'KB';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (b >= 100) {
|
||||||
|
s = ' ' + b + ' B';
|
||||||
|
} else if (b >= 10) {
|
||||||
|
s = ' ' + b + ' B';
|
||||||
|
} else {
|
||||||
|
s = ' ' + b + ' B';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
onRepaint_mem(area) {
|
||||||
|
let ctx = area.get_context();
|
||||||
|
ctx.setLineWidth(3);
|
||||||
|
if (mp >= 90)
|
||||||
|
ctx.setSourceRGBA(1, 0, 0, 1);
|
||||||
|
else
|
||||||
|
ctx.setSourceRGBA(1, 1, 1, 1);
|
||||||
|
ctx.moveTo(0, area.height);
|
||||||
|
ctx.lineTo(0, area.height * (100 - mp) / 100);
|
||||||
|
ctx.stroke();
|
||||||
|
ctx.$dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
onRepaint_cpu(area) {
|
||||||
|
let ctx = area.get_context();
|
||||||
|
ctx.setLineWidth(3);
|
||||||
|
if (cp >= 90)
|
||||||
|
ctx.setSourceRGBA(1, 0, 0, 1);
|
||||||
|
else
|
||||||
|
ctx.setSourceRGBA(1, 1, 1, 1);
|
||||||
|
ctx.moveTo(0, area.height);
|
||||||
|
ctx.lineTo(0, area.height * (100 - cp) / 100);
|
||||||
|
ctx.stroke();
|
||||||
|
ctx.$dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
CMUD@sonichy/metadata.json
Executable file
9
CMUD@sonichy/metadata.json
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"uuid": "CMUD@sonichy",
|
||||||
|
"name": "CMUD",
|
||||||
|
"description": "Display uptime, cpu, memory, upload, download on GNOME taskbar.",
|
||||||
|
"author": "sonichy",
|
||||||
|
"version": "1.0",
|
||||||
|
"shell-version": [ "45", "46", "47", "48" ],
|
||||||
|
"url": "https://github.com/sonichy/Cinnamon_Applet"
|
||||||
|
}
|
||||||
BIN
CMUD@sonichy/preview.png
Normal file
BIN
CMUD@sonichy/preview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 76 KiB |
5
README.md
Executable file
5
README.md
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
## Reference
|
||||||
|
[guide](https://gjs.guide/extensions/development/creating.html)
|
||||||
|
|
||||||
|
## Debug
|
||||||
|
dbus-run-session -- gnome-shell --nested --wayland
|
||||||
13
datetime@sonichy/README.md
Executable file
13
datetime@sonichy/README.md
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
# Datetime_GNOME
|
||||||
|
Display date and time on GNOME taskbar.
|
||||||
|

|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
### V1.0 (2025-04-22)
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
[guide](https://gjs.guide/extensions/development/creating.html)
|
||||||
|
[Cinnamon_Applet](https://github.com/sonichy/Cinnamon_Applet)
|
||||||
|
|
||||||
|
## Debug
|
||||||
|
dbus-run-session -- gnome-shell --nested --wayland
|
||||||
53
datetime@sonichy/extension.js
Executable file
53
datetime@sonichy/extension.js
Executable file
@@ -0,0 +1,53 @@
|
|||||||
|
import GLib from "gi://GLib";
|
||||||
|
import St from 'gi://St';
|
||||||
|
|
||||||
|
import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||||
|
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||||
|
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||||
|
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||||
|
|
||||||
|
export default class DatetimeExtension extends Extension {
|
||||||
|
enable() {
|
||||||
|
// Create a panel button
|
||||||
|
this._indicator = new PanelMenu.Button(0.0, this.metadata.name, false);
|
||||||
|
|
||||||
|
var label = new St.Label({ text: '00:00\n1/1 一' });
|
||||||
|
label.set_style('text-align:center');
|
||||||
|
this._indicator.add_child(label);
|
||||||
|
|
||||||
|
// Add the indicator to the panel
|
||||||
|
Main.panel.addToStatusArea(this.uuid, this._indicator);
|
||||||
|
|
||||||
|
const menuItem = new PopupMenu.PopupMenuItem('');
|
||||||
|
this._indicator.menu.addMenuItem(menuItem);
|
||||||
|
|
||||||
|
this._timeout = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1, () => {
|
||||||
|
var date = new Date();
|
||||||
|
var h = date.getHours();
|
||||||
|
if (h < 10)
|
||||||
|
h = "0" + h;
|
||||||
|
var m = date.getMinutes();
|
||||||
|
if (m < 10)
|
||||||
|
m = "0" + m;
|
||||||
|
var day = date.getDay();
|
||||||
|
var weekday = ["日", "一", "二", "三", "四", "五", "六"];
|
||||||
|
var weekday1 = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
|
||||||
|
const text = h + ' : ' + m + '\n' + (date.getMonth() + 1) + '/' + date.getDate() + ' ' + weekday[day];
|
||||||
|
label.set_text(text);
|
||||||
|
menuItem.label.text = date.toLocaleString() + ' ' + weekday1[day];
|
||||||
|
// Run as loop, not once.
|
||||||
|
return GLib.SOURCE_CONTINUE;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
disable() {
|
||||||
|
if (this._timeout) {
|
||||||
|
GLib.source_remove(this._timeout);
|
||||||
|
this._timeout = null;
|
||||||
|
}
|
||||||
|
this._indicator?.destroy();
|
||||||
|
this._indicator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
datetime@sonichy/metadata.json
Executable file
9
datetime@sonichy/metadata.json
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"uuid": "datetime@sonichy",
|
||||||
|
"name": "datetime",
|
||||||
|
"description": "Display date and time on GNOME taskbar",
|
||||||
|
"author": "sonichy",
|
||||||
|
"version": "1.0",
|
||||||
|
"shell-version": [ "45", "46", "47", "48" ],
|
||||||
|
"url": "https://github.com/sonichy/Cinnamon_Applet"
|
||||||
|
}
|
||||||
BIN
datetime@sonichy/preview.png
Normal file
BIN
datetime@sonichy/preview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
Reference in New Issue
Block a user