From 44e38afa013debee2dc3a617c5abc5ec90af1819 Mon Sep 17 00:00:00 2001 From: RobertAlexanderH Date: Wed, 19 Aug 2026 16:57:14 -0700 Subject: [PATCH 1/4] Color Timer Clock: initial submission --- .../LICENSE | 352 ++++++ .../README.md | 37 + .../cardActions.js | 682 +++++++++++ .../desklet.js | 1077 +++++++++++++++++ .../icon.png | Bin 0 -> 11340 bytes .../metadata.json | 8 + ...color-timer-clock-desklet@curbsoftware.pot | 306 +++++ .../settings-schema.json | 232 ++++ .../stylesheet.css | 119 ++ .../info.json | 1 + .../screenshot.png | Bin 0 -> 61036 bytes 11 files changed, 2814 insertions(+) create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/README.md create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/icon.png create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/info.json create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/screenshot.png diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE b/cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE new file mode 100644 index 000000000..87a4d7b50 --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE @@ -0,0 +1,352 @@ +World Clock Desklet is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation, either version 2 of the License, or (at your +option) any later version. + +Copyright (C) 2026 CurbSoftware + +World Clock Desklet is derived from TimeAndDate@nightflame, which is +distributed under the GNU General Public License version 2. + +The complete text of the GNU General Public License version 2 follows. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/README.md b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md new file mode 100644 index 000000000..d01c1a79a --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md @@ -0,0 +1,37 @@ +# Color Timer Clock + +A Cinnamon desklet with three cards — **Clock**, **Timer** and **Chronometer** — whose background colors follow a schedule you define. Each card's color ramps between (time, color) stops: the clock by time of day wrapping over midnight, the timer by time remaining, the chronometer by time elapsed. + +![Color Timer Clock desklet](screenshot.png) + +## Features + +- Up to three side-by-side cards; show or hide each one +- Per-card color schedules with smooth (interpolated) or stepped transitions +- Clock card with an optional IANA timezone +- Timer with on-card play/pause, reset and ±60 s buttons; survives restarts and expires correctly even after downtime +- Chronometer with pause/resume; the accumulated time survives restarts, and an optional hundredths display (20 updates/s while running) +- Text and border colors adapt to the card background for readability (WCAG contrast ratio) +- Tooltips on every card control +- One-click "Reset all schedules to defaults" + +## Configuration + +Right-click the desklet → **Configure…** + +- **Color schedules** — a list of (time, color) stops per card. Colors are hex (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`) or a name (`red`, `blue`, …). Duplicate times keep the last row; invalid rows are dropped with a log line +- **Smooth color transitions** — blend gradually between stops, or hold each color and jump at the next stop +- **Timer minutes / seconds** — the default duration the timer restarts from +- **Show hundredths of a second** — adds a `.ss` fraction to the chronometer while it runs +- **Time / date format** — `strftime` patterns for the clock card +- **Maximum font sizes, card spacing, desklet width / height** — cards shrink text to fit + +## Notes + +Colors interpolate piecewise-linearly in RGB, so a red→blue ramp passes through purple. The clock schedule wraps over midnight; timer and chronometer schedules hold the last stop's color beyond it. Cards share the desklet width and each needs about 130 px — when the width cannot fit them all, the chronometer and then the timer hide automatically (a note is logged) and return when the desklet is widened. + +UUID: `cinnamon-color-timer-clock-desklet@curbsoftware` + +## License + +GNU General Public License v2.0 or later. See [LICENSE](LICENSE). diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js new file mode 100644 index 000000000..d240b7538 --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js @@ -0,0 +1,682 @@ +/* global imports */ +/** + * cardActions.js + * + * Pure colour-schedule engine and card-layout helpers for the Color Timer + * Clock desklet. Deliberately contains no St/Clutter widgets so the module + * can be exercised by a headless test harness (libst.so cannot be loaded + * outside the Cinnamon process). + * + * computeCardInnerSize / computeFittedFontSizes are copied from the World + * Clock desklet's clockActions.js (tile renamed to card). Cinnamon gives + * xlets no way to import across xlet boundaries, so the maths is duplicated + * here rather than shared. + */ + +var DAY_SECONDS = 86400; + +/* Backing a translucent card colour is composited over for the luma + * estimate: the desklet card default background. Keep in sync with + * stylesheet.css (.ctc-card fallback background). */ +var LUMA_BACKING = [34, 34, 34]; + +/* Colour used when a user colour cannot be parsed; matches the stylesheet + * card fallback so a bad row reads as "themed default", never a blank. */ +var FALLBACK_COLOR = [0, 0, 0, 0.25]; + +/* Named colours accepted besides hex. Anything CSS-standard keeps the + * values unsurprising. */ +var NAMED_COLORS = { + black: "#000000", + white: "#ffffff", + red: "#ff0000", + orange: "#ffa500", + yellow: "#ffff00", + lime: "#00ff00", + green: "#008000", + teal: "#008080", + cyan: "#00ffff", + blue: "#0000ff", + purple: "#800080", + magenta: "#ff00ff", + grey: "#808080" +}; + +/* ------------------------------------------------------------------ * + * Colour parsing and formatting + * ------------------------------------------------------------------ */ + +function _channel(v) { + let n = Math.round(Number(v)); + if (!Number.isFinite(n)) + n = 0; + return Math.max(0, Math.min(255, n)); +} + +function _hex2(n) { + let h = n.toString(16); + return h.length === 1 ? "0" + h : h; +} + +/** + * parseColor: + * @str: "#rgb", "#rgba", "#rrggbb" or "#rrggbbaa" (either case), or one of + * the NAMED_COLORS names (either case). rgba()/hsl() strings are not + * accepted. + * + * Returns (object): { ok: true, rgba: [r, g, b, a] } with a in 0..1, or + * { ok: false } for anything else. + */ +function parseColor(str) { + if (typeof str !== "string") + return { ok: false }; + + let s = str.trim().toLowerCase(); + if (!s) + return { ok: false }; + + if (s[0] !== "#") { + let hex = NAMED_COLORS[s]; + if (hex) + return parseColor(hex); + return { ok: false }; + } + + let body = s.slice(1); + if (body.length !== 3 && body.length !== 4 && + body.length !== 6 && body.length !== 8) + return { ok: false }; + if (!/^[0-9a-f]+$/.test(body)) + return { ok: false }; + + let r, g, b, a = 255; + if (body.length === 3 || body.length === 4) { + r = parseInt(body[0] + body[0], 16); + g = parseInt(body[1] + body[1], 16); + b = parseInt(body[2] + body[2], 16); + if (body.length === 4) + a = parseInt(body[3] + body[3], 16); + } else { + r = parseInt(body[0] + body[1], 16); + g = parseInt(body[2] + body[3], 16); + b = parseInt(body[4] + body[5], 16); + if (body.length === 8) + a = parseInt(body[6] + body[7], 16); + } + + return { ok: true, rgba: [r, g, b, a / 255] }; +} + +/** + * rgbaToCss: + * @rgba (array): [r, g, b, a] with a in 0..1 + * + * Returns (string): "rgba(r, g, b, a)" with the alpha formatted to two + * decimals, ready for a St set_style() call. + */ +function rgbaToCss(rgba) { + let c = Array.isArray(rgba) ? rgba : FALLBACK_COLOR; + let a = Number(c[3]); + if (!Number.isFinite(a)) + a = 1; + a = Math.max(0, Math.min(1, a)); + return "rgba(" + _channel(c[0]) + ", " + _channel(c[1]) + ", " + + _channel(c[2]) + ", " + a.toFixed(2) + ")"; +} + +/** + * rgbaToKey: + * @rgba (array): [r, g, b, a] with a in 0..1 + * + * Returns (string): "#rrggbbaa" (lowercase) — a canonical key for change + * detection, so a colour that round-trips identically does not trigger a + * restyle. + */ +function rgbaToKey(rgba) { + let c = Array.isArray(rgba) ? rgba : FALLBACK_COLOR; + let a = Number(c[3]); + if (!Number.isFinite(a)) + a = 1; + a = Math.round(Math.max(0, Math.min(1, a)) * 255); + return "#" + _hex2(_channel(c[0])) + _hex2(_channel(c[1])) + + _hex2(_channel(c[2])) + _hex2(a); +} + +/* ------------------------------------------------------------------ * + * Schedule normalisation + * ------------------------------------------------------------------ */ + +/** + * _rowSeconds: + * + * Reads the position in seconds from a raw settings row. Rows use the + * settings-schema list column ids: clock rows store hour/minute, timer + * rows store remaining, chronometer rows store elapsed. A bare t key is + * accepted for hand-built schedules. + * + * Returns (number): the row time, or NaN when none applies. + */ +function _rowSeconds(row) { + if (!row || typeof row !== "object") + return NaN; + if (row.hour !== undefined || row.minute !== undefined) { + let h = parseInt(row.hour, 10); + let m = parseInt(row.minute, 10); + return (Number.isFinite(h) ? h : 0) * 3600 + + (Number.isFinite(m) ? m : 0) * 60; + } + if (row.remaining !== undefined) + return parseInt(row.remaining, 10); + if (row.elapsed !== undefined) + return parseInt(row.elapsed, 10); + return parseInt(row.t, 10); +} + +/** + * normalizeSchedule: + * @rows (array): raw schedule rows; non-arrays yield an empty schedule + * @maxT (number): upper clamp for the row time (DAY_SECONDS for clocks) + * + * Parses each row time, clamps it into [0, @maxT], drops rows whose colour + * does not parse (counting them), sorts ascending and, when two rows share + * a time, keeps the later row. + * + * Returns (object): { stops: [{t, rgba}], dropped }. + */ +function normalizeSchedule(rows, maxT) { + if (!Array.isArray(rows)) + return { stops: [], dropped: 0 }; + + let limit = Number.isFinite(maxT) && maxT >= 0 ? maxT : Infinity; + let tagged = []; + let dropped = 0; + + for (let i = 0; i < rows.length; i++) { + let t = _rowSeconds(rows[i]); + if (!Number.isFinite(t)) { + dropped++; + continue; + } + let parsed = parseColor(rows[i] && rows[i].color); + if (!parsed.ok) { + dropped++; + continue; + } + tagged.push({ + t: Math.max(0, Math.min(limit, Math.round(t))), + rgba: parsed.rgba, + i: i + }); + } + + /* Sort by time, then input order, so equal times keep the later row + * regardless of engine sort stability. */ + tagged.sort(function (a, b) { + return a.t - b.t || a.i - b.i; + }); + + let stops = []; + for (let i = 0; i < tagged.length; i++) { + if (i + 1 < tagged.length && tagged[i + 1].t === tagged[i].t) + continue; /* equal time: the later row wins */ + stops.push({ t: tagged[i].t, rgba: tagged[i].rgba }); + } + + return { stops: stops, dropped: dropped }; +} + +/* ------------------------------------------------------------------ * + * Schedule evaluation + * ------------------------------------------------------------------ */ + +/** + * evaluate: + * @stops (array): normalised stops [{t, rgba}], sorted by t ascending + * @t (number): query position in seconds + * @opts (object): { wrap, smooth }. wrap treats the schedule as circular + * over one day (clocks); smooth interpolates per channel including + * alpha, otherwise each stop's colour holds until the next stop and + * jumps there. + * + * Outside the first/last stop the nearer stop holds (non-wrap); in wrap + * mode the schedule always ramps across midnight. A query exactly at a + * stop returns that stop's colour in both modes. + * + * Returns (array): a fresh [r, g, b, a], or null when there are no stops. + */ +function evaluate(stops, t, opts) { + opts = opts || {}; + + let list = []; + if (Array.isArray(stops)) { + for (let i = 0; i < stops.length; i++) { + let s = stops[i]; + if (s && Number.isFinite(s.t) && Array.isArray(s.rgba)) + list.push({ t: s.t, rgba: s.rgba }); + } + } + if (list.length === 0) + return null; + list.sort(function (a, b) { return a.t - b.t; }); + + let q = Number(t); + if (!Number.isFinite(q)) + q = 0; + if (opts.wrap) + q = ((q % DAY_SECONDS) + DAY_SECONDS) % DAY_SECONDS; + + if (list.length === 1) + return list[0].rgba.slice(); + + /* Index of the newest stop at or before q; -1 when q precedes the + * first stop (in wrap mode that segment wraps back to the last). */ + let idx = -1; + for (let i = 0; i < list.length; i++) { + if (list[i].t <= q) + idx = i; + else + break; + } + + let from, to, fromT, toT; + if (idx === -1) { + if (!opts.wrap) + return list[0].rgba.slice(); + from = list[list.length - 1]; + to = list[0]; + fromT = from.t - DAY_SECONDS; + toT = to.t; + } else if (idx === list.length - 1) { + if (!opts.wrap) + return list[idx].rgba.slice(); + from = list[idx]; + to = list[0]; + fromT = from.t; + toT = to.t + DAY_SECONDS; + } else { + from = list[idx]; + to = list[idx + 1]; + fromT = from.t; + toT = to.t; + } + + if (!opts.smooth) + return from.rgba.slice(); + + let span = toT - fromT; + if (!(span > 0)) + return from.rgba.slice(); + let frac = (q - fromT) / span; + frac = Math.max(0, Math.min(1, frac)); + return lerpRgba(from.rgba, to.rgba, frac); +} + +/** + * lerpRgba: + * @c1 (array): [r, g, b, a] start colour + * @c2 (array): [r, g, b, a] end colour + * @f (number): fraction in [0, 1] + * + * Returns (array): per-channel interpolation; channels are rounded to + * ints, the alpha stays continuous. + */ +function lerpRgba(c1, c2, f) { + let x = Array.isArray(c1) ? c1 : FALLBACK_COLOR; + let y = Array.isArray(c2) ? c2 : FALLBACK_COLOR; + let k = Number(f); + if (!Number.isFinite(k)) + k = 0; + k = Math.max(0, Math.min(1, k)); + return [ + Math.round(x[0] + (y[0] - x[0]) * k), + Math.round(x[1] + (y[1] - x[1]) * k), + Math.round(x[2] + (y[2] - x[2]) * k), + x[3] + (y[3] - x[3]) * k + ]; +} + +/* ------------------------------------------------------------------ * + * Readability + * ------------------------------------------------------------------ */ + +/** + * luma: + * @rgba (array): [r, g, b, a] card background colour + * + * Returns (number): perceived brightness in 0..1. Translucent colours + * (alpha byte < 200) are first composited over the dark card backing, + * because that is what the eye actually sees. + */ +function luma(rgba) { + let c = Array.isArray(rgba) ? rgba : FALLBACK_COLOR; + let a = Number(c[3]); + if (!Number.isFinite(a)) + a = 1; + a = Math.max(0, Math.min(1, a)); + let r = _channel(c[0]), g = _channel(c[1]), b = _channel(c[2]); + if (a * 255 < 200) { + r = r * a + LUMA_BACKING[0] * (1 - a); + g = g * a + LUMA_BACKING[1] * (1 - a); + b = b * a + LUMA_BACKING[2] * (1 - a); + } + return (0.299 * r + 0.587 * g + 0.114 * b) / 255; +} + +/* fg is chosen by real WCAG contrast ratio, not a luma threshold: on + * mid-tone schedules (green #43a047, teal #00897b) white text measures + * 3.3:1 / 4.3:1 and must lose to the dark candidate. */ +var FG_WHITE = [255, 255, 255, 0.95]; +var FG_DARK = [17, 17, 17, 0.92]; +var AA_RATIO = 4.5; + +function _compositeOver(fg, bg) { + let a = Math.max(0, Math.min(1, Number(fg[3]) || 0)); + return [ + fg[0] * a + bg[0] * (1 - a), + fg[1] * a + bg[1] * (1 - a), + fg[2] * a + bg[2] * (1 - a) + ]; +} + +/* The colour the eye sees: translucent schedules composited over the dark + * card backing, same rule as luma(). */ +function _effectiveBg(rgba) { + let c = Array.isArray(rgba) ? rgba : FALLBACK_COLOR; + let a = Number(c[3]); + if (!Number.isFinite(a)) + a = 1; + a = Math.max(0, Math.min(1, a)); + let base = [_channel(c[0]), _channel(c[1]), _channel(c[2])]; + if (a * 255 < 200) + return _compositeOver([base[0], base[1], base[2], a], LUMA_BACKING); + return base; +} + +/* WCAG 2.x relative luminance of an opaque [r, g, b]. */ +function _relLuma(rgb) { + function lin(v) { + v = v / 255; + return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); + } + return 0.2126 * lin(rgb[0]) + 0.7152 * lin(rgb[1]) + 0.0722 * lin(rgb[2]); +} + +function _contrastRatio(l1, l2) { + let hi = Math.max(l1, l2); + let lo = Math.min(l1, l2); + return (hi + 0.05) / (lo + 0.05); +} + +/** + * contrastColors: + * @rgba (array): [r, g, b, a] card background colour + * + * Returns (object): { fg, border }. fg is whichever of the softened + * white/near-black candidates measures the higher WCAG contrast ratio + * against the background as actually composited; when mid-tone colours + * leave both below AA (4.5:1) the solid extreme wins instead. border + * reuses the background hue at low alpha so card edges read on any colour. + */ +function contrastColors(rgba) { + let c = Array.isArray(rgba) ? rgba : FALLBACK_COLOR; + let bg = _effectiveBg(c); + let bgL = _relLuma(bg); + let rWhite = _contrastRatio(bgL, _relLuma(_compositeOver(FG_WHITE, bg))); + let rDark = _contrastRatio(bgL, _relLuma(_compositeOver(FG_DARK, bg))); + let fg = rDark > rWhite ? FG_DARK : FG_WHITE; + if (Math.max(rWhite, rDark) < AA_RATIO) { + /* AA rescue: mid tones (e.g. teal) fail 4.5:1 with either softened + * candidate; fall back to whichever solid extreme reads better. */ + let rSolidB = _contrastRatio(bgL, 0); + let rSolidW = _contrastRatio(bgL, 1); + fg = rSolidB > rSolidW ? [0, 0, 0, 1] : [255, 255, 255, 1]; + } + return { + fg: fg, + border: [_channel(c[0]), _channel(c[1]), _channel(c[2]), 0.3] + }; +} + +/* ------------------------------------------------------------------ * + * Default schedules (must match the settings-schema list column ids) + * ------------------------------------------------------------------ */ + +var DEFAULT_CLOCK_SCHEDULE = [ + { hour: 6, minute: 0, color: "#f4433c" }, + { hour: 12, minute: 0, color: "#9c27b0" }, + { hour: 18, minute: 0, color: "#3949ab" } +]; + +var DEFAULT_TIMER_SCHEDULE = [ + { remaining: 60, color: "#43a047" }, + { remaining: 30, color: "#fdd835" }, + { remaining: 0, color: "#e53935" } +]; + +var DEFAULT_CHRONO_SCHEDULE = [ + { elapsed: 0, color: "#00897b" }, + { elapsed: 1800, color: "#f4511e" } +]; + +/* ------------------------------------------------------------------ * + * Card text fitting (copied from clockActions.js, tile renamed to card) + * ------------------------------------------------------------------ */ + +/** + * Chrome subtracted when turning desklet width/height into a card's inner + * text box. Keep in sync with stylesheet.css + * (.ctc-container padding, card padding/border). + */ +var CARD_LAYOUT = { + containerPad: 4, + tileBorder: 2, + padX: 6, + padY: 4, + lineGap: 2, + minPt: 4, + ptToPx: 4 / 3, + lineHeight: 1.25, + /* Digits+colons average nearer 0.55em than 0.72em; the per-card metric + * refine in desklet.js shrinks any estimate that proves too bold. */ + timeEm: 0.62, + dateEm: 0.58, + labelEm: 0.56, + addMaxPt: 16, + /* A card cannot shrink below its control pill; fitKinds() hides cards + * rather than let the grid overflow the container below this. */ + minCardWidth: 120 +}; + +/** + * fitKinds: + * @kinds (array): visible card kinds from the settings checkboxes, in + * build order (clock, timer, chrono) + * @width (number): desklet width setting (px) + * @spacing (number): card spacing setting (px, used as per-card margin) + * + * Returns (array): the kinds that fit. Cards drop from the end - the + * chronometer first, then the timer - because the clock is the anchor; + * one card always survives so the desklet never renders empty. Widening + * restores the hidden cards on the next rebuild; the settings checkboxes + * remain the source of truth. + */ +function fitKinds(kinds, width, spacing) { + let list = Array.isArray(kinds) ? kinds.slice() : []; + let w = Number(width); + if (!Number.isFinite(w) || w <= 0) + w = 840; + let gap = Number(spacing); + if (!Number.isFinite(gap) || gap < 0) + gap = 0; + const min = CARD_LAYOUT.minCardWidth + 2 * gap; + while (list.length > 1 && + list.length * min + 2 * CARD_LAYOUT.containerPad > w) + list.pop(); + return list; +} + +function _toPositiveInt(value, fallback) { + let n = parseInt(value, 10); + if (!Number.isFinite(n) || n < 1) + return fallback; + return n; +} + +function _finite(value, fallback) { + let n = Number(value); + if (!Number.isFinite(n)) + return fallback; + return n; +} + +function _roundPt(n) { + if (!Number.isFinite(n) || n < 1) + return 1; + return Math.round(n * 10) / 10; +} + +/** + * computeCardInnerSize: + * @deskletWidth (number): main container width in px + * @deskletHeight (number): main container height in px + * @rows (int): grid rows + * @cols (int): grid columns + * @cardSpacing (number): per-side card margin in px + * @opts (object): optional overrides for CARD_LAYOUT chrome + * + * Returns (object): { width, height } of the text box inside one card. + */ +function computeCardInnerSize(deskletWidth, deskletHeight, rows, cols, cardSpacing, opts) { + opts = opts || {}; + let pad = CARD_LAYOUT.containerPad; + if (opts.containerPad != null) + pad = Math.max(0, _finite(opts.containerPad, pad)); + let border = CARD_LAYOUT.tileBorder; + if (opts.tileBorder != null) + border = Math.max(0, _finite(opts.tileBorder, border)); + let padX = CARD_LAYOUT.padX; + if (opts.padX != null) + padX = Math.max(0, _finite(opts.padX, padX)); + let padY = CARD_LAYOUT.padY; + if (opts.padY != null) + padY = Math.max(0, _finite(opts.padY, padY)); + + let r = _toPositiveInt(rows, 1); + let c = _toPositiveInt(cols, 1); + let spacing = Math.max(0, _finite(cardSpacing, 0)); + let tableW = Math.max(0, _finite(deskletWidth, 200) - 2 * pad); + let tableH = Math.max(0, _finite(deskletHeight, 200) - 2 * pad); + let cellW = tableW / c; + let cellH = tableH / r; + + return { + width: Math.max(0, cellW - 2 * spacing - 2 * border - 2 * padX), + height: Math.max(0, cellH - 2 * spacing - 2 * border - 2 * padY) + }; +} + +function _textWidthPx(text, sizePt, ptToPx, em) { + let n = String(text || "").length; + if (n === 0) + return 0; + return n * sizePt * ptToPx * em; +} + +function _maxPtForWidth(text, innerW, ptToPx, em, cap) { + let n = String(text || "").length; + if (n === 0) + return cap; + if (!(innerW > 0) || !(ptToPx > 0) || !(em > 0)) + return 1; + let pt = innerW / (n * ptToPx * em); + if (!Number.isFinite(pt) || pt <= 0) + return 1; + return Math.min(cap, pt); +} + +/** + * computeFittedFontSizes: + * @innerWidth (number): card text box width in px + * @innerHeight (number): card text box height in px + * @texts (object): { time, date, label } sample strings + * @maxSizes (object): { time, date, timezone } caps in pt + * @opts (object): optional CARD_LAYOUT overrides + * + * Settings sizes are caps. Time and date shrink to fit; a long label + * ellipsizes instead of shrinking the card. Hierarchy is + * time >= date >= timezone. + * + * Returns (object): { time, date, timezone, add, ellipsizeLabel } + */ +function computeFittedFontSizes(innerWidth, innerHeight, texts, maxSizes, opts) { + opts = opts || {}; + texts = texts || {}; + maxSizes = maxSizes || {}; + + let ptToPx = _finite(opts.ptToPx, CARD_LAYOUT.ptToPx); + if (!(ptToPx > 0)) + ptToPx = CARD_LAYOUT.ptToPx; + let lineHeight = _finite(opts.lineHeight, CARD_LAYOUT.lineHeight); + if (!(lineHeight > 0)) + lineHeight = CARD_LAYOUT.lineHeight; + let lineGap = Math.max(0, _finite(opts.lineGap, CARD_LAYOUT.lineGap)); + let timeEm = _finite(opts.timeEm, CARD_LAYOUT.timeEm); + let dateEm = _finite(opts.dateEm, CARD_LAYOUT.dateEm); + let labelEm = _finite(opts.labelEm, CARD_LAYOUT.labelEm); + let addMax = _finite(opts.addMaxPt, CARD_LAYOUT.addMaxPt); + + let maxTime = _finite(maxSizes.time, 40); + let maxDate = _finite(maxSizes.date, 15); + let maxTz = _finite(maxSizes.timezone, 12); + if (maxTime < 1) + maxTime = 1; + if (maxDate < 1) + maxDate = 1; + if (maxTz < 1) + maxTz = 1; + + let innerW = Math.max(0, _finite(innerWidth, 0)); + let innerH = Math.max(0, _finite(innerHeight, 0)); + let timeText = texts.time || ""; + let dateText = texts.date || ""; + let labelText = texts.label || ""; + + let add = addMax; + if (innerH > 0) + add = Math.min(add, (innerH * 0.55) / ptToPx); + if (innerW > 0) + add = Math.min(add, (innerW * 0.7) / ptToPx); + + let time = _maxPtForWidth(timeText, innerW, ptToPx, timeEm, maxTime); + let date = _maxPtForWidth(dateText, innerW, ptToPx, dateEm, maxDate); + let timezone = Math.min(maxTz, time, date); + + let neededH = (time + date + timezone) * ptToPx * lineHeight + 2 * lineGap; + if (innerH > 0 && neededH > innerH) { + let avail = Math.max(0, innerH - 2 * lineGap); + let base = (time + date + timezone) * ptToPx * lineHeight; + if (base > 0) { + let scale = avail / base; + time *= scale; + date *= scale; + timezone *= scale; + } + } + + time = Math.min(time, _maxPtForWidth(timeText, innerW, ptToPx, timeEm, maxTime)); + date = Math.min(date, _maxPtForWidth(dateText, innerW, ptToPx, dateEm, maxDate)); + if (date > time) + date = time; + if (timezone > date) + timezone = date; + + let ellipsizeLabel = _textWidthPx(labelText, timezone, ptToPx, labelEm) > innerW && innerW > 0; + + return { + time: _roundPt(time), + date: _roundPt(date), + timezone: _roundPt(timezone), + add: _roundPt(add), + ellipsizeLabel: !!ellipsizeLabel + }; +} diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js new file mode 100644 index 000000000..54303006d --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js @@ -0,0 +1,1077 @@ +/* global imports, global */ +const Desklet = imports.ui.desklet; +const St = imports.gi.St; +const Settings = imports.ui.settings; +const Mainloop = imports.mainloop; +const Tooltips = imports.ui.tooltips; +const Gettext = imports.gettext; +const GLib = imports.gi.GLib; +const Pango = imports.gi.Pango; + +const uuid = "cinnamon-color-timer-clock-desklet@curbsoftware"; + +Gettext.bindtextdomain(uuid, GLib.get_user_data_dir() + "/locale"); + +function _(str) { + return Gettext.dgettext(uuid, str); +} + +/* Xlet-local module. Cinnamon exposes a desklet's own directory through + * imports.ui.deskletManager.desklets[uuid]; resolved lazily in _init() so a + * load-order problem surfaces as a logged error instead of a load failure. */ +let CardActions = null; + +function _loadModules() { + if (CardActions) + return true; + try { + const dir = imports.ui.deskletManager.desklets[uuid]; + CardActions = dir.cardActions; + return !!CardActions; + } catch (e) { + global.logError(uuid + " could not load helper modules: " + e); + return false; + } +} + +const DEFAULT_TIME_FORMAT = "%H:%M:%S"; +const DEFAULT_DATE_FORMAT = "%A, %e %B"; + +/* Literal _() call sites so cinnamon-xlet-makepot extracts each title; + * the values are translated once here, not at every use. */ +const CARD_TITLES = { + clock: _("Clock"), + timer: _("Timer"), + chrono: _("Chronometer") +}; + +const TIMER_PHASES = ["stopped", "paused", "running", "expired"]; +const CHRONO_PHASES = ["stopped", "paused", "running"]; + +function _pad2(n) { + return n < 10 ? "0" + n : "" + n; +} + +/** + * _formatDuration: + * @ms (number): duration in milliseconds + * @ceil (boolean): round up (countdown display: 00:00 only when really done) + * instead of down (elapsed display) + * @hundredths (boolean): append a ".cc" fraction (elapsed display only; a + * countdown rounding up cannot show a stable fraction) + * + * Returns (string): "mm:ss", "mm:ss.cc", or "h:mm:ss(.cc)" past an hour. + */ +function _formatDuration(ms, ceil, hundredths) { + const total = Math.max(0, Number(ms) || 0); + const secs = ceil ? Math.ceil(total / 1000) : Math.floor(total / 1000); + const h = Math.floor(secs / 3600); + const m = Math.floor((secs % 3600) / 60); + const s = secs % 60; + let out = h > 0 ? h + ":" + _pad2(m) + ":" + _pad2(s) : _pad2(m) + ":" + _pad2(s); + if (hundredths && !ceil) + out += "." + _pad2(Math.floor((total % 1000) / 10)); + return out; +} + +function CardWidget(kind, desklet) { + this._init(kind, desklet); +} + +CardWidget.prototype = { + _init: function (kind, desklet) { + this.desklet = desklet; + this.kind = kind; + + this.actor = new St.BoxLayout({ + style_class: "ctc-card", + vertical: true + }); + + this._title = new St.Label({ + style_class: "ctc-card-title", + text: CARD_TITLES[kind] || kind + }); + this._value = new St.Label({ style_class: "ctc-card-value" }); + this._sub = new St.Label({ style_class: "ctc-card-sub" }); + + try { + this._title.clutter_text.ellipsize = Pango.EllipsizeMode.END; + this._title.clutter_text.line_wrap = false; + this._value.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._value.clutter_text.line_wrap = false; + this._sub.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; + this._sub.clutter_text.line_wrap = false; + } catch (e) {} + + /* Labels live in an expanding body box: the text block centers in + * the space above the controls, and the controls pill anchors to + * the card bottom. The clock card carries a ghost pill (same + * height, invisible, inert) so all cards share one baseline grid. */ + this._body = new St.BoxLayout({ + vertical: true, + style_class: "ctc-card-body" + }); + this._body.add(this._title, { x_fill: false, x_align: St.Align.MIDDLE }); + this._body.add(this._value, { x_fill: false, x_align: St.Align.MIDDLE }); + this._body.add(this._sub, { x_fill: false, x_align: St.Align.MIDDLE }); + this.actor.add(this._body, { + expand: true, + x_fill: true, + y_fill: false, + x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE + }); + + this._buildControls(); + if (kind === "clock") + this._ghostControls(); + + /* The card's whole inline style (margin + colours + transition) is + * owned here, so every part must go through one string; a separate + * set_style anywhere on the actor would clobber the rest. */ + this._margin = 0; + this._styleKey = null; + this._expired = false; + this._lastRgba = null; + this._lastSmooth = false; + this._fitLen = undefined; + }, + + _buildControls: function () { + /* Fixed dark pill so the white symbolic icons stay legible whatever + * colour the schedule paints the card. Plain St.Buttons on the card + * itself - no PopupMenu, so no grab/teardown bug class and no need + * to defer the handlers. Tooltips self-destroy with their button. */ + this._controls = new St.BoxLayout({ style_class: "ctc-card-controls" }); + this._ctlButtons = []; + + this._playButton = this._ctlButton("media-playback-start", "toggle", false, _("Start")); + this._controls.add(this._playButton); + + this._controls.add(this._ctlButton("view-refresh", "reset", false, _("Reset"))); + + if (this.kind === "timer") { + this._minusButton = this._ctlButton("list-remove", "minus", true, _("-1 minute")); + this._plusButton = this._ctlButton("list-add", "plus", true, _("+1 minute")); + this._controls.add(this._minusButton); + this._controls.add(this._plusButton); + } + + this.actor.add(this._controls, { x_fill: false, x_align: St.Align.MIDDLE }); + }, + + /* Reserve, don't show: the ghost keeps the clock card's geometry + * identical to the timer/chrono cards (same pill height in any theme + * or @media variant) without offering any controls. */ + _ghostControls: function () { + this._controls.set_opacity(0); + this._controls.reactive = false; + for (let i = 0; i < this._ctlButtons.length; i++) { + this._ctlButtons[i].reactive = false; + this._ctlButtons[i].can_focus = false; + } + }, + + _ctlButton: function (iconName, action, small, tipText) { + const icon = new St.Icon({ + icon_name: iconName, + icon_type: St.IconType.SYMBOLIC, + icon_size: 16 + }); + const button = new St.Button({ + style_class: small ? "ctc-ctl ctc-ctl-small" : "ctc-ctl", + can_focus: true + }); + this._ctlButtons.push(button); + button.set_child(icon); + button.connect("clicked", () => { + this.desklet._onControl(this.kind, action); + }); + if (tipText) { + const tip = new Tooltips.Tooltip(button, tipText); + if (iconName === "media-playback-start") + this._playTooltip = tip; + } + if (iconName === "media-playback-start") + this._playIcon = icon; + return button; + }, + + /* Margin is part of the inline style the card owns, so changing it just + * invalidates the style cache; the next _applyColors writes both. */ + setSpacing: function (px) { + this._margin = Math.max(0, Math.round(px) || 0); + this._styleKey = null; + }, + + setPlaying: function (isRunning) { + if (this._playIcon) + this._playIcon.icon_name = isRunning + ? "media-playback-pause" + : "media-playback-start"; + if (this._playTooltip && this._playTooltip.set_text) + this._playTooltip.set_text(isRunning ? _("Pause") : _("Start")); + }, + + /* The +/-60 s buttons exist only on the timer card and are reachable + * only while stopped; paused keeps a frozen remainingMs and expired + * needs a reset first. They stay mounted but dim and inert, so the + * pill keeps one width in every state. */ + setAdjustVisible: function (visible) { + if (!this._minusButton || !this._plusButton) + return; + const buttons = [this._minusButton, this._plusButton]; + for (let i = 0; i < buttons.length; i++) { + buttons[i].reactive = visible; + buttons[i].can_focus = visible; + if (visible) + buttons[i].remove_style_pseudo_class("dim"); + else + buttons[i].add_style_pseudo_class("dim"); + } + }, + + /* Expiry joins the inline style (a high-contrast ring in the fg colour) + * so the state punch lands on the same tick it is detected. */ + setExpired: function (on) { + on = !!on; + if (on === this._expired) + return; + this._expired = on; + this._styleKey = null; + if (on) + this.actor.add_style_pseudo_class("expired"); + else + this.actor.remove_style_pseudo_class("expired"); + this._applyColors(this._lastRgba, this._lastSmooth); + }, + + /** + * update: + * @now (Date): for the clock card, already converted to the card's + * timezone; otherwise the plain current time + * @rgba (array): [r, g, b, a] from evaluate(), or null when the card has + * no schedule stops (stylesheet default colours then apply) + * @smooth (boolean): animate towards this colour over 1000 ms + */ + update: function (now, rgba, smooth) { + if (this.kind === "clock") + this._updateClock(now); + else if (this.kind === "timer") + this._updateTimer(now); + else + this._updateChrono(now); + this._applyColors(rgba, smooth); + }, + + _updateClock: function (displayDate) { + try { + const timeFormat = this.desklet.timeFormat || DEFAULT_TIME_FORMAT; + const dateFormat = this.desklet.dateFormat || DEFAULT_DATE_FORMAT; + this._value.set_text(displayDate.toLocaleFormat(timeFormat)); + this._sub.set_text(displayDate.toLocaleFormat(dateFormat)); + } catch (e) { + global.logError(uuid + " could not format clock: " + e); + this._value.set_text(""); + this._sub.set_text(""); + } + }, + + _updateTimer: function (now) { + const phase = this.desklet._timer.phase; + if (phase === "expired") { + this._title.set_text(_("Time is up")); + this._value.set_text("00:00"); + this._sub.set_text(""); + return; + } + this._title.set_text(_("Timer")); + this._value.set_text(_formatDuration( + this.desklet._timerRemainingMs(now.getTime()), true)); + this._sub.set_text( + phase === "stopped" ? _("Ready") : + phase === "paused" ? _("Paused") : ""); + }, + + _updateChrono: function (now) { + this._value.set_text(_formatDuration( + this.desklet._chronoElapsedMs(now.getTime()), false, + this.desklet.chronoMilliseconds)); + this._sub.set_text(""); + }, + + /* One cached set_style per colour change: the 1 s tick samples a linear + * ramp exactly, and the CSS transition smooths the staircasing between + * samples. A key of colour+smooth+margin+expired skips no-op restyles. */ + _applyColors: function (rgba, smooth) { + this._lastRgba = rgba; + this._lastSmooth = !!smooth; + const key = (rgba ? CardActions.rgbaToKey(rgba) : "default") + "/" + + (smooth ? "1" : "0") + "/" + this._margin + "/" + + (this._expired ? "x" : "n"); + if (key === this._styleKey) + return; + this._styleKey = key; + + const margin = this._margin > 0 ? "margin: " + this._margin + "px; " : ""; + if (!rgba) { + this.actor.set_style(margin); + return; + } + + const contrast = CardActions.contrastColors(rgba); + const border = this._expired + ? [contrast.fg[0], contrast.fg[1], contrast.fg[2], 0.9] + : contrast.border; + this.actor.set_style(margin + + "background-color: " + CardActions.rgbaToCss(rgba) + ";" + + "color: " + CardActions.rgbaToCss(contrast.fg) + ";" + + "border-color: " + CardActions.rgbaToCss(border) + ";" + + "transition-duration: " + (smooth ? 1000 : 0) + "ms;"); + }, + + /* Font sizes are recomputed on card rebuild / setting changes, not on the + * 1s tick. Settings values are caps; the card shrinks text to fit. */ + applyFittedSizes: function (inner, samples) { + if (!CardActions || !CardActions.computeFittedFontSizes) + return; + + inner = inner || {}; + samples = samples || {}; + const box = { + width: Math.max(0, Number(inner.width) || 0), + height: Math.max(0, Number(inner.height) || 0) + }; + if (box.width < 1 || box.height < 1) + return; + + const texts = { + time: samples.value || this._value.get_text() || "23:59:59", + date: samples.sub || this._sub.get_text() || "Wednesday, 31 December", + label: this._title.get_text() || "" + }; + /* Length the fit was sized for; a later value with more characters + * (timer/chrono crossing an hour) triggers a refit. */ + this._fitLen = texts.time.length; + const maxSizes = { + time: Number(this.desklet.timeSize) || 48, + date: Number(this.desklet.dateSize) || 13, + timezone: Number(this.desklet.labelSize) || 11 + }; + + const sizes = CardActions.computeFittedFontSizes(box.width, box.height, texts, maxSizes); + this._setFontSizes(sizes); + this._constrainTitleWidth(box.width); + this._refineWithMetrics(box, sizes); + }, + + _setFontSizes: function (sizes) { + this._value.set_style("font-size: " + sizes.time + "pt;"); + this._sub.set_style("font-size: " + sizes.date + "pt;"); + this._title.set_style("font-size: " + sizes.timezone + "pt;"); + }, + + _constrainTitleWidth: function (width) { + try { + this._title.set_width(Math.max(1, Math.floor(width))); + } catch (e) {} + }, + + _refineWithMetrics: function (inner, sizes) { + /* Skip until the card is on the stage: querying preferred size on an + * unmapped actor returns -1 and floods St-CRITICAL warnings. */ + if (!this.actor || !this.actor.get_stage()) + return; + try { + const gap = (CardActions && CardActions.CARD_LAYOUT) + ? CardActions.CARD_LAYOUT.lineGap : 2; + for (let i = 0; i < 8; i++) { + const valueW = this._value.get_preferred_width(-1)[1]; + const subW = this._sub.get_preferred_width(-1)[1]; + const valueH = this._value.get_preferred_height(-1)[1]; + const subH = this._sub.get_preferred_height(-1)[1]; + const titleH = this._title.get_preferred_height(-1)[1]; + const pillH = this._controls + ? this._controls.get_preferred_height(-1)[1] : 0; + const totalH = valueH + subH + titleH + pillH + 2 * gap; + const wide = valueW > inner.width + 1 || subW > inner.width + 1; + const tall = totalH > inner.height + 1; + if (!wide && !tall) + return; + sizes.time = Math.max(1, sizes.time * 0.88); + sizes.date = Math.max(1, Math.min(sizes.date * 0.88, sizes.time)); + sizes.timezone = Math.max(1, Math.min(sizes.timezone * 0.88, sizes.date)); + this._setFontSizes(sizes); + } + } catch (e) { + global.logError(uuid + " font metric refine failed: " + e); + } + } +}; + +function MyDesklet(metadata, deskletId) { + this._init(metadata, deskletId); +} + +MyDesklet.prototype = { + __proto__: Desklet.Desklet.prototype, + + _init: function (metadata, deskletId) { + Desklet.Desklet.prototype._init.call(this, metadata, deskletId); + + _loadModules(); + + this.settings = new Settings.DeskletSettings(this, this.metadata["uuid"], deskletId); + this.settings.bind("show-clock", "showClock", this.on_setting_changed); + this.settings.bind("show-timer", "showTimer", this.on_setting_changed); + this.settings.bind("show-chronometer", "showChronometer", this.on_setting_changed); + this.settings.bind("clock-timezone", "clockTimezone", this.on_setting_changed); + this.settings.bind("clock-schedule", "clockSchedule", this.on_setting_changed); + this.settings.bind("clock-smooth", "clockSmooth", this.on_setting_changed); + this.settings.bind("timer-minutes", "timerMinutes", this.on_setting_changed); + this.settings.bind("timer-seconds", "timerSeconds", this.on_setting_changed); + this.settings.bind("timer-schedule", "timerSchedule", this.on_setting_changed); + this.settings.bind("timer-smooth", "timerSmooth", this.on_setting_changed); + this.settings.bind("chrono-schedule", "chronoSchedule", this.on_setting_changed); + this.settings.bind("chrono-smooth", "chronoSmooth", this.on_setting_changed); + this.settings.bind("chrono-milliseconds", "chronoMilliseconds", this.on_setting_changed); + this.settings.bind("time-format", "timeFormat", this.on_setting_changed); + this.settings.bind("date-format", "dateFormat", this.on_setting_changed); + this.settings.bind("time-size", "timeSize", this.on_setting_changed); + this.settings.bind("date-size", "dateSize", this.on_setting_changed); + this.settings.bind("label-size", "labelSize", this.on_setting_changed); + this.settings.bind("card-spacing", "cardSpacing", this.on_setting_changed); + this.settings.bind("width", "width", this.on_setting_changed); + this.settings.bind("height", "height", this.on_setting_changed); + /* Persisted state stores; written via setValue on transitions only, + * never rebound through a callback. */ + this.settings.bind("timer-state", "timerState"); + this.settings.bind("chrono-state", "chronoState"); + + this._cards = []; + this._schedules = { clock: null, timer: null, chrono: null }; + this._scheduleRows = null; + this._lastBadTimezone = null; + this._timeout = null; + this._fastTimeout = null; + this._rebuildTimeout = null; + this._fitId = null; + this._cardInner = null; + this._widthSamples = null; + + this.mainContainer = new St.BoxLayout({ + vertical: true, + style_class: "ctc-container" + }); + this.mainContainer.set_width(this.width || 840); + this.mainContainer.set_height(this.height || 260); + + this.setContent(this.mainContainer); + this.setHeader(_("Color Timer Clock")); + + this._restoreState(); + this._rebuildCards(); + this._scheduleUpdate(); + + /* Desklet.destroy() emits 'destroy' immediately but defers + * on_desklet_removed() until a 500ms fade-out completes. Without this + * hook our timeout keeps firing against a tearing-down desklet for + * half a second. _cleanup() is idempotent. */ + this._destroyId = this.connect("destroy", this._cleanup.bind(this)); + }, + + on_desklet_removed: function () { + this._cleanup(); + }, + + _cleanup: function () { + if (this._cleanedUp) + return; + this._cleanedUp = true; + + if (this._timeout) { + Mainloop.source_remove(this._timeout); + this._timeout = null; + } + if (this._fastTimeout) { + Mainloop.source_remove(this._fastTimeout); + this._fastTimeout = null; + } + if (this._rebuildTimeout) { + Mainloop.source_remove(this._rebuildTimeout); + this._rebuildTimeout = null; + } + if (this._fitId) { + Mainloop.source_remove(this._fitId); + this._fitId = null; + } + + this._cards = []; + + if (this.settings) { + this.settings.finalize(); + this.settings = null; + } + + if (this._destroyId) { + this.disconnect(this._destroyId); + this._destroyId = 0; + } + }, + + on_setting_changed: function () { + try { + this.mainContainer.set_width(this.width); + this.mainContainer.set_height(this.height); + } catch (e) { + global.logError(uuid + " setting change failed: " + e); + } + if (this._cleanedUp) + return; + + /* A stopped timer always shows the settings duration, so spinbutton + * edits apply without a reset. */ + if (this._timer && this._timer.phase === "stopped") { + const duration = this._timerDurationFromSettings(); + if (duration !== this._timer.durationSec) { + this._timer.durationSec = duration; + this._persistTimer(); + } + } + + /* Settings-window edits arrive through the bind callbacks, so the + * bound properties are fresh; in-process setValue bypasses them and + * updates _scheduleRows itself. A timezone edit gets a fresh + * chance to log if it is still invalid. */ + this._scheduleRows = null; + this._lastBadTimezone = null; + + if (this._rebuildTimeout) { + Mainloop.source_remove(this._rebuildTimeout); + this._rebuildTimeout = null; + } + this._rebuildTimeout = Mainloop.timeout_add(100, () => { + this._rebuildTimeout = null; + this._rebuildCards(); + return false; + }); + }, + + /* ------------------------------------------------------------------ * + * Card construction + * ------------------------------------------------------------------ */ + + _visibleKinds: function () { + const kinds = []; + if (this.showClock) + kinds.push("clock"); + if (this.showTimer) + kinds.push("timer"); + if (this.showChronometer) + kinds.push("chrono"); + return kinds; + }, + + _rebuildCards: function () { + try { + if (!_loadModules()) + return; + + this._refreshSchedules(); + this.mainContainer.destroy_all_children(); + this._cards = []; + + const wanted = this._visibleKinds(); + const kinds = CardActions + ? CardActions.fitKinds(wanted, this.width, this.cardSpacing) + : wanted; + if (kinds.length < wanted.length) + global.log(uuid + ": width " + (Number(this.width) || 840) + + "px is too small for " + wanted.length + " cards; hiding " + + wanted.slice(kinds.length).join(", ")); + const table = new St.Table({ + homogeneous: true, + reactive: true, + style_class: "ctc-grid" + }); + this.mainContainer.add(table, { + expand: true, + x_expand: true, + y_expand: true, + x_fill: true, + y_fill: true + }); + + for (let i = 0; i < kinds.length; i++) { + const widget = new CardWidget(kinds[i], this); + widget.setSpacing(this.cardSpacing); + table.add(widget.actor, { + row: 0, + col: i, + x_expand: true, + y_expand: true, + x_fill: true, + y_fill: true + }); + this._cards.push(widget); + } + + this._updateAll(); + this._widthSamples = this._formatWidthSamples(); + this._cardInner = this._computeCardInnerSize(kinds.length); + this._scheduleFit(); + } catch (e) { + global.logError(uuid + " card rebuild failed: " + e); + } + }, + + /* Normalised once per settings change (rebuild), never on the 1s tick. */ + _refreshSchedules: function () { + if (!CardActions) + return; + const rows = this._scheduleRows || { + clock: this.clockSchedule, + timer: this.timerSchedule, + chrono: this.chronoSchedule + }; + this._schedules = {}; + for (const kind of ["clock", "timer", "chrono"]) { + const result = CardActions.normalizeSchedule( + rows[kind], CardActions.DAY_SECONDS); + if (result.dropped > 0) + global.log(uuid + ": dropped " + result.dropped + + " " + kind + " schedule row(s) with an unparsable time or colour"); + this._schedules[kind] = result.stops; + } + }, + + /* reset-schedules settings button callback. setValue does not fire the + * bind callbacks in-process, so _scheduleRows is refreshed by hand and + * the cards repainted immediately. */ + resetSchedules: function () { + if (this._cleanedUp || !this.settings || !CardActions) + return; + try { + this._scheduleRows = { + clock: CardActions.DEFAULT_CLOCK_SCHEDULE, + timer: CardActions.DEFAULT_TIMER_SCHEDULE, + chrono: CardActions.DEFAULT_CHRONO_SCHEDULE + }; + this.settings.setValue("clock-schedule", CardActions.DEFAULT_CLOCK_SCHEDULE); + this.settings.setValue("timer-schedule", CardActions.DEFAULT_TIMER_SCHEDULE); + this.settings.setValue("chrono-schedule", CardActions.DEFAULT_CHRONO_SCHEDULE); + this._refreshSchedules(); + this._updateAll(); + } catch (e) { + global.logError(uuid + " schedule reset failed: " + e); + } + }, + + /* ------------------------------------------------------------------ * + * Timer / chronometer state machines + * ------------------------------------------------------------------ */ + + _timerDurationFromSettings: function () { + const mins = Number(this.timerMinutes) || 0; + const secs = Number(this.timerSeconds) || 0; + return Math.max(1, Math.min(86400, Math.round(mins * 60 + secs))); + }, + + _isValidTimerState: function (s) { + return !!(s && typeof s === "object" && + TIMER_PHASES.indexOf(s.phase) !== -1 && + Number.isFinite(s.durationSec) && + Number.isFinite(s.endMs) && + Number.isFinite(s.remainingMs)); + }, + + _isValidChronoState: function (s) { + return !!(s && typeof s === "object" && + CHRONO_PHASES.indexOf(s.phase) !== -1 && + Number.isFinite(s.startMs) && + Number.isFinite(s.accumMs)); + }, + + /* Validates the persisted state and maps a restart-during-run to the + * correct phase: a timer whose endMs has passed becomes expired, a + * chronometer keeps running on its wall-clock startMs. */ + _restoreState: function () { + const now = Date.now(); + + let t = this._isValidTimerState(this.timerState) + ? { + phase: this.timerState.phase, + durationSec: Math.max(1, Math.min(86400, Math.round(this.timerState.durationSec))), + endMs: this.timerState.endMs, + remainingMs: Math.max(0, this.timerState.remainingMs) + } + : { phase: "stopped", durationSec: this._timerDurationFromSettings(), endMs: 0, remainingMs: 0 }; + if (t.phase === "stopped") + t.durationSec = this._timerDurationFromSettings(); + if (t.phase === "running" && t.endMs <= now) + t.phase = "expired"; + this._timer = t; + this._persistTimer(); + + let c = this._isValidChronoState(this.chronoState) + ? { + phase: this.chronoState.phase, + startMs: this.chronoState.startMs, + accumMs: Math.max(0, this.chronoState.accumMs) + } + : { phase: "stopped", startMs: 0, accumMs: 0 }; + this._chrono = c; + this._persistChrono(); + }, + + _persistTimer: function () { + if (this.settings && this._timer) + this.settings.setValue("timer-state", { + phase: this._timer.phase, + durationSec: this._timer.durationSec, + endMs: this._timer.endMs, + remainingMs: this._timer.remainingMs + }); + }, + + _persistChrono: function () { + if (this.settings && this._chrono) + this.settings.setValue("chrono-state", { + phase: this._chrono.phase, + startMs: this._chrono.startMs, + accumMs: this._chrono.accumMs + }); + }, + + _timerRemainingMs: function (nowMs) { + const t = this._timer; + if (t.phase === "running") + return Math.max(0, t.endMs - nowMs); + if (t.phase === "paused") + return Math.max(0, t.remainingMs); + if (t.phase === "stopped") + return t.durationSec * 1000; + return 0; + }, + + _chronoElapsedMs: function (nowMs) { + const c = this._chrono; + if (c.phase === "running") + return c.accumMs + (nowMs - c.startMs); + if (c.phase === "paused") + return c.accumMs; + return 0; + }, + + /* Plain handlers, no deferral: these are on-card St.Buttons, not menu + * items, so no grab is released after the click. */ + _onControl: function (kind, action) { + try { + if (this._cleanedUp) + return; + if (kind === "timer") + this._timerControl(action); + else if (kind === "chrono") + this._chronoControl(action); + this._updateAll(); + } catch (e) { + global.logError(uuid + " control failed: " + e); + } + }, + + _timerControl: function (action) { + const now = Date.now(); + const t = this._timer; + + if (action === "toggle") { + if (t.phase === "running") { + t.remainingMs = Math.max(0, t.endMs - now); + /* A pause click landing after endMs - but before the next + * tick notices - must not strand the timer at 00:00/Paused: + * _updateAll only expires a running timer. */ + t.phase = t.remainingMs > 0 ? "paused" : "expired"; + } else { + /* Stopped and expired both restart from the full duration; + * paused resumes its frozen remainingMs. */ + const fromStopped = t.phase === "stopped" || t.phase === "expired"; + t.remainingMs = fromStopped + ? t.durationSec * 1000 + : Math.max(0, t.remainingMs); + t.phase = "running"; + t.endMs = now + t.remainingMs; + } + } else if (action === "reset") { + t.phase = "stopped"; + t.durationSec = this._timerDurationFromSettings(); + t.endMs = 0; + t.remainingMs = 0; + } else if (action === "minus" || action === "plus") { + if (t.phase !== "stopped") + return; + const delta = action === "plus" ? 60 : -60; + t.durationSec = Math.max(1, Math.min(86400, t.durationSec + delta)); + } else { + return; + } + + this._persistTimer(); + }, + + _chronoControl: function (action) { + const now = Date.now(); + const c = this._chrono; + + if (action === "toggle") { + if (c.phase === "running") { + /* Pause folds the running stretch into accumMs. */ + c.accumMs += now - c.startMs; + c.phase = "paused"; + } else { + if (c.phase === "stopped") + c.accumMs = 0; + /* Resume resets startMs and keeps the accumulated total. */ + c.startMs = now; + c.phase = "running"; + } + } else if (action === "reset") { + c.phase = "stopped"; + c.startMs = 0; + c.accumMs = 0; + } else { + return; + } + + this._persistChrono(); + }, + + /* ------------------------------------------------------------------ * + * Per-second update + * ------------------------------------------------------------------ */ + + /* Date whose wall-clock fields are the card timezone's local time + * (world-clock conversion pattern); the desklet's own time when the + * timezone entry is empty or invalid. */ + _clockNow: function (now) { + const timezoneName = (this.clockTimezone || "").trim(); + if (timezoneName) { + try { + return new Date(now.toLocaleString("en-US", { timeZone: timezoneName })); + } catch (e) { + /* This runs on every 1 s tick: one typo must not flood + * ~/.xsession-errors, so log once per distinct bad value. */ + if (this._lastBadTimezone !== timezoneName) { + this._lastBadTimezone = timezoneName; + global.logError(uuid + " invalid timezone: " + timezoneName + ": " + e); + } + } + } + return now; + }, + + _smoothFor: function (kind) { + if (kind === "clock") + return !!this.clockSmooth; + if (kind === "timer") + return !!this.timerSmooth; + return !!this.chronoSmooth; + }, + + _updateAll: function () { + if (this._cleanedUp || !CardActions) + return; + + const now = new Date(); + const nowMs = now.getTime(); + + /* Expiry is a state transition and is persisted the moment it is + * detected. */ + if (this._timer.phase === "running" && this._timer.endMs <= nowMs) { + this._timer.phase = "expired"; + this._persistTimer(); + } + + const clockNow = this._clockNow(now); + + for (let i = 0; i < this._cards.length; i++) { + const widget = this._cards[i]; + const smooth = this._smoothFor(widget.kind); + let pos, rgba; + + if (widget.kind === "clock") { + pos = clockNow.getHours() * 3600 + + clockNow.getMinutes() * 60 + + clockNow.getSeconds(); + rgba = CardActions.evaluate(this._schedules.clock, pos, { + wrap: true, + smooth: smooth + }); + widget.update(clockNow, rgba, smooth); + } else if (widget.kind === "timer") { + pos = this._timerRemainingMs(nowMs) / 1000; + rgba = CardActions.evaluate(this._schedules.timer, pos, { + smooth: smooth + }); + widget.update(now, rgba, smooth); + } else { + pos = this._chronoElapsedMs(nowMs) / 1000; + rgba = CardActions.evaluate(this._schedules.chrono, pos, { + smooth: smooth + }); + widget.update(now, rgba, smooth); + } + } + + /* Refit when a value crosses a digit-count boundary (e.g. a + * chronometer reaching 1:00:00): the fitted size was computed for a + * shorter string and would now overflow. */ + for (let i = 0; i < this._cards.length; i++) { + const widget = this._cards[i]; + if (widget._fitLen !== undefined && + (widget._value.get_text() || "").length !== widget._fitLen) { + this._scheduleFit(); + break; + } + } + + this._syncControlStates(); + }, + + _syncControlStates: function () { + for (let i = 0; i < this._cards.length; i++) { + const widget = this._cards[i]; + if (widget.kind === "timer") { + widget.setPlaying(this._timer.phase === "running"); + widget.setAdjustVisible(this._timer.phase === "stopped"); + widget.setExpired(this._timer.phase === "expired"); + } else if (widget.kind === "chrono") { + widget.setPlaying(this._chrono.phase === "running"); + widget.setExpired(false); + } + } + this._syncFastTick(); + }, + + /* Hundredths need a faster cadence than the 1 s tick can show. Arm the + * fast timer only while the chronometer is actually running with the + * setting on, so an idle desklet costs nothing extra. */ + _syncFastTick: function () { + let want = false; + if (!this._cleanedUp && this.chronoMilliseconds && this._chrono && + this._chrono.phase === "running") { + for (let i = 0; i < this._cards.length; i++) { + if (this._cards[i].kind === "chrono") { + want = true; + break; + } + } + } + if (want && !this._fastTimeout) { + this._fastTimeout = Mainloop.timeout_add(50, this._onFastTick.bind(this)); + } else if (!want && this._fastTimeout) { + Mainloop.source_remove(this._fastTimeout); + this._fastTimeout = null; + } + }, + + _onFastTick: function () { + if (this._cleanedUp) { + this._fastTimeout = null; + return false; + } + for (let i = 0; i < this._cards.length; i++) { + if (this._cards[i].kind === "chrono") { + this._cards[i]._updateChrono(new Date()); + break; + } + } + return true; + }, + + _scheduleUpdate: function () { + if (this._timeout) { + Mainloop.source_remove(this._timeout); + this._timeout = null; + } + this._timeout = Mainloop.timeout_add_seconds(1, this._onTick.bind(this)); + }, + + _onTick: function () { + if (this._cleanedUp) + return false; + this._updateAll(); + return true; + }, + + /* ------------------------------------------------------------------ * + * Font fitting + * ------------------------------------------------------------------ */ + + _computeCardInnerSize: function (cols) { + if (!CardActions || !CardActions.computeCardInnerSize) + return { width: 80, height: 80 }; + return CardActions.computeCardInnerSize( + this.width || 840, this.height || 260, 1, cols, this.cardSpacing); + }, + + _formatWidthSamples: function () { + const dateFormat = this.dateFormat || DEFAULT_DATE_FORMAT; + const dates = [ + new Date(2023, 11, 27, 23, 59, 59), + new Date(2023, 8, 20, 12, 0, 0), + new Date() + ]; + let sub = ""; + for (let i = 0; i < dates.length; i++) { + try { + const d = dates[i].toLocaleFormat(dateFormat); + if (String(d).length > sub.length) + sub = d; + } catch (e) {} + } + let value = ""; + for (let i = 0; i < this._cards.length; i++) { + const v = this._cards[i]._value.get_text(); + if (v && v.length > value.length) + value = v; + } + return { + value: value || "23:59:59", + sub: sub || "Wednesday, 31 December" + }; + }, + + _scheduleFit: function () { + if (this._fitId) { + Mainloop.source_remove(this._fitId); + this._fitId = null; + } + this._fitId = Mainloop.timeout_add(0, () => { + this._fitId = null; + if (this._cleanedUp) + return false; + this._fitAllCards(this._cardInner); + return false; + }); + }, + + _fitAllCards: function (inner) { + inner = inner || this._cardInner; + const samples = this._widthSamples || this._formatWidthSamples(); + this._widthSamples = samples; + if (!inner) + return; + for (let i = 0; i < this._cards.length; i++) { + /* Each card fits its own value: a 5-char "05:00" must not be + * sized down for the clock card's 8-character worst case. */ + this._cards[i].applyFittedSizes(inner, { + value: this._cards[i]._value.get_text() || samples.value, + sub: samples.sub + }); + } + } +}; + +function main(metadata, deskletId) { + return new MyDesklet(metadata, deskletId); +} diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/icon.png b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d8fce057b423583e3b33b8ea153322698f46a278 GIT binary patch literal 11340 zcmV-SEVI*zP) zd$?U?edj;F_g(vbt~r-nNKObuG>F_3M#pyIB^4@6OFM-z&M4KfElic6R_s{Y5t+76 zACXquI@;+}v|2#1t$iFu1+k=FRE7 zT5>^IstX8BLc2xYH)CUC{UV~O`cth9(tF^&ua1w8R~9+NBoD_DXoybV{FLwwqOV@P zx|q-B&xxYw6(VxJh>UsfSBc2#4qy9Z$E=8KSJguza=)s6%X|O5@$vD4E$3KbCh(oQ zXr~yUjqn>cZp_tcwM#_g3gEROGA7czl&Yetv>y9uMtUz6xkr=0zlg{`8e{(7&Ye4- zN#3@^Oz^xlLMJF-NeI7T!-kbn6kRJK|IrxpB53>&RaKY#KxuiLLKB)iP*oKX0~ljs zOX|IUMnt~gocr+j`1lW#&ou7+@#6UsApjyEJ2p1}|y!TPcy~p|8r?5Db zSlWYx5%vRruzUCJKTqC2E^Tl;3}8sOa^1RhHyUH!2cW7ET?$=(%8{DWlo37~MbUrV zw{PDh$H4^8l~@MwV`F23!0pDEOT72K<-Jqr9#mDGwKh=I$DMQkX?%SAJ2cJmG2yu| zKr8XTY>c_cITwmZ<~a`h6gmi1jS?o9a?V}yT$$il8Q>K0mp7b#Mxi`o`I z*Q{AHM3eZ@DdI0H*d*#2wAOxk?b@{$6BGYg>3b{;U;qt*;0|kTD*3_l9PlZ09!6Ci zFldbV!iEhSRuV@JN2T#m-%N@UF7fuaL{W4~?JsXwRgH`>qt3ZcCC83x=8whzcH6dX z(b(A77Guo+@ZP&q#6KwzIOif`%+HODjr|Y6U3uk|_DClmi8}<4v(G*|n4O({$Xa_= z67KzkgnGi^iL=FyowP_ZgU%T9k|&>h@=;pyH?24lK@H$%XJ>D))}G~@i;i;cGKL^x znvaCvRUN8+!NaAWKoHD=&zxisK#egO@BN=W+lh-FTfKVqP$rXkR73_<^+@L~Gb9x? z1;ydj;eCXn4PqJz$OgsuSo2p&lzxi{=Q!c_LqBrZ!1AoMozdfVui1Dp3We5k@S52{2+3MqA#@AR;*DejoTJ z7O`;)rCI>iu3eiq#{5u3HfSvV%TE1^n55KP$NLCt3*>Vn^p(z}w=_miel___4_TAL ziXeDIJ(dVGN{H_p3}8?K3>gs&9-BNnU!xYyGgF&nfB7l)&W$r!ounL9Fd}432Gh_C z%MuDWRXu;to;^QefiJL7vJJ80@EQ?0BS|hSE8@q5_qb>tF#);UDhB$`W1#;f6tXMG z+B~8TGz1NaTm_FJiL|R|(pIA=K7Q8t+2K$hGlSrzpc(FjQhXHyjqO=(XE+o}Pq z`uH;~=UIG%Y2stC1_?w6M93P8x`>JD1V5O1m?vg;GgY4@XEFrF;&s`uffo_uy?->9 z%bmA<`}R65rl8#q0$sUsWhs}-JtiV+67_$AoxiyCz`HWW=II%D8G|FQqEJ|iQIGm6 zMx#c%ahqySh#j{jH*LO62-^6+!2sHJjx^3~KF7UpzTrdUj3q0E+4>9*PCd%^4nE3M zI7h)|F(S)_5mZFfd;f3t?Ah~OTFgMJdKZ9fHoFN}xh#k;2K9B+mnp6IH>`QV?=U)c zHJSVxTvR4Jd+hd?svA27hr0Bqj8xk2~Fi}av~{99v;)if|ZAxNY?nj@QE!{~KzVq=;IA8-XPH$BIGKQI2Y? z%JuV>^{?VTt@{~rHbcdQ*b~PDlH_vES-W;^fmr|AwSzEniA&bc*>pF?{dK!F0V zuDhw<_%cy+h!w+I7+v#bR6~4JCeC6u2PYb<`dEKSgCV3rx+OsMU!NZLo`Bt*r*dAifAjreaq`KLTEQmfe4`wvB1{TE@XAC zhriwT09mmFV(3!VKvdO>NWpu*7I=h37yx680%12sl#B~dysxu*&6^k;-h%g46rbeo z!MDUBX-d)~2@}Llm`_Qsu~9HKhZRsaPr33m)!Nh4Y7@*?pTYSG)%rA%s}eiL8fzC3 z`f@7>Ou%4ni2iIJL-`?AYU=dBqtFXA0c9 z_q&v%kgT!YVgdk+F>Ul+EXmVF$ydCuvS!WItQgut7|noy!88ajkcfXeZ6L&2fb%s}JtPGo5qp>lR-hctpujGD3_%D?hMr6hrgfxzJW-zHL%Y9C%|+cX2R_LKv{eRA5Ca&Z=n!jH zzlo9I%cw`wV4C*cFTw;V19$-SsIeGZAS&-r1p-ug1A*VndTzqzMx= z?S38QdT&pbwdki~Vee$d5Iui!N#8w|02_0^zZ?8_%9 zymTN&)3ZrJEF@A?=~Z9gXH16XpxFNU-;s2Jpke8gQ(Kfqt_-o|`X zp=1KQdW@#dU{mrNmBqwV1OhWrl`BWipRH2ct zP3M&xjhi=vpod!dNp|h{Ln`x+V}m|ogVBAdKN8}W8&A<@nTu+C_{p#F^@BSY2(k$i zB*ZrY&f&|I7AA=M5JGi~W^!D+W>aGHy2AoX&H#eJxf-SXde*GCH16a{k~}G)Thpp& z`qMob+e4-N1iN>Ah$x)F+Tya1`Xj-sk`ap)!{6+CfUh2Wf`K3lc!I#-=H|&3vW&j; zY<#(bZDE28P0FSgR43^q@)20nPfyq-T zZ)ex858-_kV{@F)3iUA}&P57&6Y$A>5AsjbPcoRvQJXl(icK4M`JcXri*NoN2F_ZK zuQZv!pacR{AM(bL(;3d>sQaZi1xv~RA_nKmjP$;oq0)JAS5IR1jkeqRhSR4WBU!@m z5WDvLFPy7jBnv0N(K}wG^~h2t&qsIM$Jh2f&N*-XC0_AozenH3^+;ej_dVCd6-gH* zO{+06BJVgYljjY?V^qCMy`&|>5;8#Cs%>q7(^kA5#Wkg!cA^6<4v|4r*}eBK38QJO z&BukElL#V$4FV2LPqA**DlYt=*KyX{--s>bQLp$YqUX%@ob!8chguCI&0fR+sJJ?> zA6&%?3O!WREvb|)*>{TwkuNjSa}m9{F}$laynay{4q)mBh{mB+V2eC;;P053e*|la zCxzN?g|!w{WpZ+oOD?^XuiWz$F2DS8ymN>usK*2W>KyfF4iIDl#3vzR(r2jZDH+2r ztyq(ofu+*|OOyzTr9Wd!oHnopd>H?TmZDC|2#tKddNM(Y$(e8S^ufCcY!7;b^$kP> zV+_tMFXqT(GR(}(kjZ5D;0Hg*+ursz0Gx9eV^FV%wUqZh&0~N35vIQVJ#qtmah{{4 ziYNjV7xLP^VgB*pQ|zeClM~BQw2>@{28i?K6$bK~V(Hgf(nLvn=ts&3ij@Et&9e8v z=NGNkH3n=9VHh$!J>6i06Afbw)>@u<<{8dA?>z3h>n`5*wzuKEZ)6Td1hIxEzHm1` z__cR4^SvKYSTT@D{o%C(RnLI6{9OMqRqruNR+U*2C`JO-^ly$+xGHUS-?W&3^!$v; z^Yp>HDc8oaW^uc3tz~w0mQ9;Baou&-F+V>~wOSMa@}>;@%hhx zp7YN?ALm>;EemTcho%qlmf!ewe&aX)D?vRZ+mlCJ*g|yQ_Bs%#_>e7qD>yBiU$Tf` z2^hfOe4SEu4TJd?;(cuU(PY*w(q{XODuLvftM1~d>3a!mX;HhM-pqVH&&@aA%#AnR z$Y($MSyrxG$>iiD*4nNvJu4yvLBQ116r-b~+FF5W$%`xv$*37AOfC{(c(+VNFjE5 zXz})r>5>D^5q4!`zEZlOifL3!wolZ!37sktJQe*t6$CCci+v{ty?*C z=nzp9VeQga)LI?AOE0~Yd+xc1%P+qi=UihQ@qQ?8FQ zG51{pQ*7AGRs=!7#KZ)bUw%2)U3VQ(6p_p2aLzG0I?6{s`ceMkFaCmDF2~Hw%#xaf zAPAV9oh6DQKKQ{8a@%dUF*-WhaP++QSZmq2b0@$2%fHNxH{M9GSfp4iQV&B4*78_o zj&ICN&}S{EYY^SGnE?n8sy^bvQV(b33)Ggt40MDFbOioU6(M1;>(b2Qka{KMKvt`Q`zVVH3FgiMl_nve;O;xZ0Uzs_8*N8y0 zjp)tkZLt zO`b&&^}Mpw+gPBYljy7lP({Qtm^%Z~GN{s)_-Xb01IaU8d6>CyZ&D{X{Kq-x=W zjW^!dQ1uHPy~{4UjN5LzjsE_Af*?3zp2CVS>m6S?G)Z1a)-7l?0SlZ#^}HybXV3;j zdiX5I=YtM1fS`D?riZ@ly2SoVi&|@jf9bQuFkRgqd;LfGRU$&QTIHsjZer`!t?b;n zvmy1Z5|OI>D2mv;c{6w2br)}Z;~SZto+gT-=cEnN?>}(h0B?B18@T)KyV<;XbAza< zqo=Cvj^6O_VdGi|Rmh6rp~@_wj|f^)!3)E|lmSl51e~7BQCIC~X0T%nAP7z)@^%Gz z+mHGv_V%^i2~3|Y@l2qp%8#*RIhtluRjjoP4-fO@FMpXWTefi9ZMQWfyH(OssddgV zFfhPJKl)K_z4caldwV%}@E}1DJgYVcf`CJZ4w1{{_|S(w#K%7Nu|*xdAO7%%Tz1)I z+;r1T6bc23#o}Qqe=&HJyciy@R@hamP?WThw7GUc>$G&#Q#8Vv*=)=J9aI4wH36y- zz1cN!_{RcO)oKdV6G(j2M4LuYP{ne@8H^NuVs3A8fz_4 z6tziRtAqH9zxa!M@rz&N(n~L8Vq&7fPz$$dX?652zW8E3|M}1J*0;X3O`=nuN$xfPf`nKHNv7)#s$rQdQpH-_LEg-Nt2?UB&?x#pT{xc>UT z^caKdpd;APjEP_<*%gRto3y9TDc>3de8g;hZ{j8%AEGFtSd5cLH{Em-_uhLiH{X17 zo8+bhOdUk$94~v>%ed#BdzhV_C7;i;efxI4{`If3b?eqPTc4T=?>+B-|NHsKM?OL( zlVNCR=$LH%(V#$9gz;2UZ1^k}*uX&h-d%i~%$$02#7L0qF2^ zr12+?86scixk~>+q$+=8WQ68~ElozsbPBK-}l>Jc*ye0Q27C)Ds{?=n)AkC>epGF&yk*8N5S` z)C>W8gV9Apz-9-KV$~43c`DH)#snRybBAF_e}6xM46 zr5_G^wB-X3R6{~7KQ9xo5UI3}jEr!{9e41$*S(Hy+qNy52ucZ^_7tQ}q^h!S-#)Ir z_S!Z_uTxUrHU^-kFz+21()RIYIM`eaCw=W3!m>;mAf3sR#{Y7J2N*RSC4P!DTpSu2 zV*mdA{K~KV3h#ga`w7FaA@N81tTBdnzx&;M{No>I<;s=M%h5X)2#{$@{G^q^c7{kR zg`LI{FhKf{MKwX|drOJ5V%XEu!_7C}%$wi*=3@@my!Z6=^*w7wuM>#d{k5kf9RO6YRA%+8%V34)+w_WoJNxu}?Q z2c4}3BG|P2`z()S@%Bz$eo>@^RaHLqsZTZX1g(;-s)S*PF@`UF=}SEF$RiXAg(a7M zhzVd-@G5BA!yNVy47S6((ZO1Pq3$bG{WJ!f99vKgO#A{>N5S;c7p%f*eaQ_%6h-v) z_3`OXf12BGznyG0+eq}J$)0RB%lE(kect=t_tMkTv*gk*K&Z-aVA+t%Q`1;1JnhNg zbSWHzVcNknp(7CKK-?6gLktjCs6wq$bu(COBNuSwh`?aGyaiDvli|01>$mv82R^{l zPe0vg8kw7$<1?T63|qHu<>0}CWHO8QCUhE}I2n||;I*|>mNv^Zy#phLd9UnuE?Moo zGw5(85F%e`DEEb#z;x8{Y8wHA!D;N#`@3TD(yX4fmOuKVKjIUg_yjM0@rwz9fE_z_ z@YrLIQ7V-v7K>f6{iz06m&r0M+yhK1*b~E7+#Vu#SWk}rCPLoiHLa99>YVmDxS_- z%#P{b)UMCF395b;t0q|>sXeighJdJ}X!=;4J&VZKSn6re%LxKhRoR%$^TKR_vX7nU z=GvpF_a8?Ch@q;=W3?I?k$4f!4xyv{00v9d&v7W+M8x^FzED-NB3#-tM5v(Bk_cAQ!VH2_$cf>xT8*cpkW2@2 z0MPN4u-FfHs`dzxR@>BiBL~pX1aU>M-;A(6cOH@cbeI8yQ1PA@XG>h1?`O^{qD__G zy38~QBN#P&qdZ55c6|P0hZ#T#B+FDZ&b*t#62wZZRsGYF?$CH8u(NV6$CBx&YFn-l zfeM~Wdxj{P43Q?PK9PK{&Fr5i-ukwx@ZHKB8KhIre*+!w2e4QwewKZ;ACZw9XnU1Q z;?t5=aYLjv)@06NZT4*HTJ36HpxY3j?mg>*Jg@H=W!A^b;Dc=u{>O_@<_cB zw~cjJNIE|`6c90NuYL=kbOtRXd}D*=#PYZ z{3a7LqXDl%4$ED$2buQKk}Mmy1PtKGNREkU7YD;VWQbSzYA1Zt1XwlHwan?+mvC0@ zvJhZ5;;#7U{+*WwRYV>##@Uz5g2jgv?h7hcZ`G8aHr0x~r6TMLpyZ7YVVa%u4`^qC<- z>OTQdfe_*Oy`ghhZHqAj5IcS;`yaOLR1yJv^3dKT?@L(1yBlkPSwF!Ks$U^1`L-sJ zR(}ARH3Fw~`pqC$l&%3h9>dQ&lFb1o_u5Z2h(T+OH;lcLj?4g zEZfRce4{e8q|y&d$^fwz$VrI@D_`b7^dwnw%~Elk@NP0gq7^KLny;|lZsO9y)r4A0 z+9XacCa?&TzQ!AR&tPlMnaubIgFTGsO8S4S2@HmL@A>f5&aPxemsr2XKdG)Y{&oIy z1Y#TN9~SooAZCK9&T&!pwOn3!3pK5tR7{Xc{#89^^4|x~XI?$3iHF}t^rqx{6(WUx zljYMhURXjN<@H$t&Tios3U8sN z6&!9^M+fPa@)N$wRXu0&JA)T6@6&B9%@HLZ1P2r);L-X#pFFgi9+O#;xc~4mcLi~c z;H%}oWzy{dzKF7SaWRLqfg?%pk`{ED zCLvVll`MaD@Nw>|9;8Q>*70i}f0v+m@={`V^a$I^chV!hafovS;>U9gnA1A1%&+AyhF{0a^QST8>y2NOW3>^lmv?VHUv3|Vr?HI{lpM=bFn5r=$@GczlAQ}20fDXdS9g#;3J?#KHT zljJfyUP%^u)I{<t@(GW&sg;myB*2|gvTJBxk@BW3aNB1!9c44sOB!?mHu2Pk9VT6sk_25<{V7`0^IhFNTrh-MBQFKEmfp#jc>$Hg z9JEFTDfvtr1H{%9@qoi36iptlb@uvQJm9{|&S)ol{XWWCj$73*1QH}pTk3+g!zCmL z)!`Fa%n`6Q7-C~)grCWs$+_9p^q7E()`b<`jx&NyRCG2D^IEHhi@r{y>sYmxbru7x zwQD&eIGuX7%6|VeyZkQp`n~M;`#InbQq>w|tx(e_R?+GABJ`Oe87!kgKPzoNrw7Aq z%#5-j7^YXUs6O31v<;)$5>lhm|=5kc@E9*eNX4w4n2&*aI9A;1$65fU<^ z)p+SPA&ER<4UsB(P5-K(l4>voN&EXeL#Duk^=EkR?=m({+iw$Z%xAE{I- zVX;`8hGavFE_7vhJeB~D@P*nZn9(U-o&7~nN2K+(q>pKl{xphi?VyJ=x{eimojP@O zu_{(2PZp6Z13`%Z5J_4uB`(TFT1O=D^xKD0yj(cmL zW3PLHU&_6eK^aQ=0t}|H+h|%$NMpw4YiX=am;4Wj#g7RWhln1pp1SyCJ;SvBwsoaW zX)sZ9szyrSR=H@A{MPqXP!U2rCCT8_^P%bc`OMs-m zoc_}90CZCWv?5Iw&FKuEtbK?(YJbU`9-<^Y@%!SMu3N(oAW68i4*A%J|Ex3ab>Vrb zacI7d#~x4RE=dj$Zk_o7@0j=!57iGaU~O{#f0ijw78-9Yx8UkQl!)=0uo9LhG@9Rwcoatlp=2{Sjrd+|oWCzW!~?ax2tpw#>YO;z zH{eCYsOoEX@811Yk{kdWPFw@%x^?URueJ8)eY{-839r4T^9kzI2sLEPZs4WC#atL% z$cP!n5fM^JzMFJvpw@j%+Pc;Jr>9tOI8eXzQVU^JNW17<2+Cs z$D@=aZiPQlwtfLp2k@y(CbMbBjva?+CMeq(VDsk9!M1JNqIK)m{i?P0R_B}(krU1U zDOwq!rgcWl2rsgmxFB;rFR&XaNET2Wbwa{MhzG>0Z%UdxTEGAaqr?-heS>LYW{6kr z2t>$>O$tFFyP^Ypz4jOn)OPbkIDrvaZiELwRU>O{;GFx^o;`cseC3r_+B@&Ov*8FX z)BpnL#*G_C>h=1=A~KYkk8Te7*^tgJiU_G{l?)ly*ww5zW1JmqVqLI?71B>$0*u7| zf@+8tM;r`Bm=A2e>XwD-9~LL91>CxI>;8|m_P;piA`v-poAVw8sYcKw=@TXC-CpTo)Q+;+ zj520dGirtyFg*;I9t_ZLiiu{>Bq-B(uU@TC(;78uOt@*L{46`&GmJ+Q>~&Kd^m9Zw z0t`9HU>l!amV^iJ#u#zV{dmuwJ?Fv#&zZ#;zyP{_{rVTG>VrUrW<_?{qPZDuT+|6Q zBuZM!4Tgf`$VrZzWLRm2@U-s2saP>g`B@J6IUJr@UrE9`kHwM^OOULC8XJmbOY~Ma zV~lmq{py}Qdp^km>4zf|)dFs8Z0r-pn5&nw7B~`G86x%zG$E%FX~e>xuEa~RS&5U$ z0jBXiN+-Jux(1&(e~;yIx%0Mf-yT9s#w@{+7$DUGD^>Mj5$V_FRF;z#%}W2`(8Kw*|X>NaoQ9PHk``yiyQ*4c>dlGDr@c!lF=;#7`7Ouh_eH@3(mt26(o7zXGy*_wFg+Dpj3I5<}fx z+w~NV1xhUaMpb_!A^x+{>R1Xs9%IT=-Me@H6>+b} zv(o5TD}D|L#>dCM)4~MyluxiM-~bjO{xQ+!xs-e(+L_=fYi)X=lihJXDWR&7h*%ME z$3uL0?o-1ez>bfPe@9hc>b?K6F(x2(7EhUk?!g1zS{tb9SpR5vK152}igfMTwdWXP zJ|H4LpKivKsHb!#m{T}@#7#$FB?jL6ABxDkckSBs#pImhB0h9RN?WzT&lzKGP}SEY znW(fKDP8!lHJyA)LmZAY5vgfgUh+tHJ^g`*e7IC9efr^tAFk6PgvWcqP7$GPAR9Jp zIM;jsChz_0jWK7Z6HOLu-FhmQ&<+74-Om^r_iG%uM^$g%vuDp&X-fKWOZ~!&b`ojg zA*HfiyLRn`*4kI9>dyk3fK@i6fg%oqN?8%k*^gBh3_PtyeSsm-Bp5si&SQFL*mmy?2c8 zDVEv}r!&3NCd5;r;<3TfIOFNd2Nyw(%6YgZ~eX3gS)rtZeE4 O0000name +#. desklet.js:471 +msgid "Color Timer Clock" +msgstr "" + +#. metadata.json->description +msgid "" +"Clock, countdown timer and chronometer cards whose background colors follow " +"a schedule" +msgstr "" + +#. settings-schema.json->cards->description +msgid "Cards" +msgstr "" + +#. settings-schema.json->show-clock->description +msgid "Show clock card" +msgstr "" + +#. settings-schema.json->show-timer->description +msgid "Show timer card" +msgstr "" + +#. settings-schema.json->show-chronometer->description +msgid "Show chronometer card" +msgstr "" + +#. settings-schema.json->clock->description +msgid "Clock card" +msgstr "" + +#. settings-schema.json->clock-timezone->description +msgid "Timezone" +msgstr "" + +#. settings-schema.json->clock-timezone->tooltip +msgid "" +"IANA timezone name for the clock card, for example Europe/Berlin. Leave " +"empty to use local time." +msgstr "" + +#. settings-schema.json->clock-schedule->description +#. settings-schema.json->timer-schedule->description +#. settings-schema.json->chrono-schedule->description +msgid "Color schedule" +msgstr "" + +#. settings-schema.json->clock-schedule->tooltip +msgid "" +"Card background color at a given time of day, interpolated between stops and " +"wrapping over midnight. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a " +"name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, " +"purple, magenta, grey." +msgstr "" + +#. settings-schema.json->clock-schedule->columns->title +msgid "Hour" +msgstr "" + +#. settings-schema.json->clock-schedule->columns->title +msgid "Minute" +msgstr "" + +#. settings-schema.json->clock-schedule->columns->title +#. settings-schema.json->timer-schedule->columns->title +#. settings-schema.json->chrono-schedule->columns->title +msgid "Color" +msgstr "" + +#. settings-schema.json->clock-smooth->description +#. settings-schema.json->timer-smooth->description +#. settings-schema.json->chrono-smooth->description +msgid "Smooth color transitions" +msgstr "" + +#. settings-schema.json->clock-smooth->tooltip +#. settings-schema.json->timer-smooth->tooltip +#. settings-schema.json->chrono-smooth->tooltip +msgid "" +"Blend gradually between schedule stops. When disabled, each color holds " +"until the next stop and then jumps." +msgstr "" + +#. settings-schema.json->timer->description +msgid "Timer card" +msgstr "" + +#. settings-schema.json->timer-minutes->units +msgid "min" +msgstr "" + +#. settings-schema.json->timer-minutes->description +msgid "Timer minutes" +msgstr "" + +#. settings-schema.json->timer-minutes->tooltip +msgid "" +"Default timer duration. The +/- buttons on the card adjust it by one minute " +"while the timer is stopped." +msgstr "" + +#. settings-schema.json->timer-seconds->units +msgid "s" +msgstr "" + +#. settings-schema.json->timer-seconds->description +msgid "Timer seconds" +msgstr "" + +#. settings-schema.json->timer-schedule->tooltip +msgid "" +"Card background color at a given remaining time, interpolated between stops " +"and holding the last stop's color beyond it. Colors: hex (#rgb, #rgba, " +"#rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, " +"green, teal, cyan, blue, purple, magenta, grey." +msgstr "" + +#. settings-schema.json->timer-schedule->columns->title +msgid "Remaining seconds" +msgstr "" + +#. settings-schema.json->chrono->description +msgid "Chronometer card" +msgstr "" + +#. settings-schema.json->chrono-schedule->tooltip +msgid "" +"Card background color at a given elapsed time, interpolated between stops " +"and holding the last stop's color beyond it. Colors: hex (#rgb, #rgba, " +"#rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, " +"green, teal, cyan, blue, purple, magenta, grey." +msgstr "" + +#. settings-schema.json->chrono-schedule->columns->title +msgid "Elapsed seconds" +msgstr "" + +#. settings-schema.json->chrono-milliseconds->description +msgid "Show hundredths of a second" +msgstr "" + +#. settings-schema.json->chrono-milliseconds->tooltip +msgid "" +"Adds a .ss fraction to the chronometer. The card updates 20 times per second " +"while it runs; paused it freezes the fraction, stopped it reads 00:00.00." +msgstr "" + +#. settings-schema.json->display->description +msgid "Display" +msgstr "" + +#. settings-schema.json->time-format->description +msgid "Time format (strftime)" +msgstr "" + +#. settings-schema.json->time-format->tooltip +msgid "Clock card time. Example: %H:%M:%S" +msgstr "" + +#. settings-schema.json->date-format->description +msgid "Date format (strftime)" +msgstr "" + +#. settings-schema.json->date-format->tooltip +msgid "Clock card date. Example: %A, %e %B" +msgstr "" + +#. settings-schema.json->time-size->units +#. settings-schema.json->date-size->units +#. settings-schema.json->label-size->units +msgid "pt" +msgstr "" + +#. settings-schema.json->time-size->description +msgid "Maximum time font size" +msgstr "" + +#. settings-schema.json->time-size->tooltip +msgid "Cards scale down from this size so the time stays inside the card" +msgstr "" + +#. settings-schema.json->date-size->description +msgid "Maximum date font size" +msgstr "" + +#. settings-schema.json->date-size->tooltip +msgid "Cards scale down from this size so the date stays inside the card" +msgstr "" + +#. settings-schema.json->label-size->description +msgid "Maximum card title font size" +msgstr "" + +#. settings-schema.json->label-size->tooltip +msgid "" +"Cards scale down from this size. Long titles ellipsize rather than " +"overflowing" +msgstr "" + +#. settings-schema.json->card-spacing->units +#. settings-schema.json->width->units +#. settings-schema.json->height->units +msgid "px" +msgstr "" + +#. settings-schema.json->card-spacing->description +msgid "Card spacing" +msgstr "" + +#. settings-schema.json->width->description +msgid "Desklet width" +msgstr "" + +#. settings-schema.json->width->tooltip +msgid "" +"Cards share the width. Each card needs about 130 px; when the width cannot " +"fit them all, the chronometer and then the timer hide automatically and come " +"back when you widen the desklet" +msgstr "" + +#. settings-schema.json->height->description +msgid "Desklet height" +msgstr "" + +#. settings-schema.json->reset-schedules->description +msgid "Reset all schedules to defaults" +msgstr "" + +#. settings-schema.json->reset-schedules->tooltip +msgid "" +"Restores the clock, timer and chronometer color schedules to their default " +"stops" +msgstr "" + +#. settings-schema.json->timer-state->description +#. settings-schema.json->timer-state->tooltip +msgid "Do not change: persisted timer state" +msgstr "" + +#. settings-schema.json->chrono-state->description +#. settings-schema.json->chrono-state->tooltip +msgid "Do not change: persisted chronometer state" +msgstr "" diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json new file mode 100644 index 000000000..bfd766e2c --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json @@ -0,0 +1,232 @@ +{ + "cards": { + "type": "header", + "description": "Cards" + }, + "show-clock": { + "type": "checkbox", + "default": true, + "description": "Show clock card" + }, + "show-timer": { + "type": "checkbox", + "default": true, + "description": "Show timer card" + }, + "show-chronometer": { + "type": "checkbox", + "default": true, + "description": "Show chronometer card" + }, + + "clock": { + "type": "header", + "description": "Clock card" + }, + "clock-timezone": { + "type": "entry", + "default": "", + "description": "Timezone", + "tooltip": "IANA timezone name for the clock card, for example Europe/Berlin. Leave empty to use local time.", + "dependency": "show-clock" + }, + "clock-schedule": { + "type": "list", + "description": "Color schedule", + "tooltip": "Card background color at a given time of day, interpolated between stops and wrapping over midnight. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, purple, magenta, grey.", + "columns": [ + {"id": "hour", "title": "Hour", "type": "integer", "min": 0, "max": 23, "default": 0}, + {"id": "minute", "title": "Minute", "type": "integer", "min": 0, "max": 59, "default": 0}, + {"id": "color", "title": "Color", "type": "string"} + ], + "default": [ + {"hour": 6, "color": "#f4433c"}, + {"hour": 12, "color": "#9c27b0"}, + {"hour": 18, "color": "#3949ab"} + ], + "dependency": "show-clock" + }, + "clock-smooth": { + "type": "checkbox", + "default": true, + "description": "Smooth color transitions", + "tooltip": "Blend gradually between schedule stops. When disabled, each color holds until the next stop and then jumps.", + "dependency": "show-clock" + }, + + "timer": { + "type": "header", + "description": "Timer card" + }, + "timer-minutes": { + "type": "spinbutton", + "default": 5, + "min": 0, + "max": 600, + "step": 1, + "units": "min", + "description": "Timer minutes", + "tooltip": "Default timer duration. The +/- buttons on the card adjust it by one minute while the timer is stopped.", + "dependency": "show-timer" + }, + "timer-seconds": { + "type": "spinbutton", + "default": 0, + "min": 0, + "max": 59, + "step": 1, + "units": "s", + "description": "Timer seconds", + "dependency": "show-timer" + }, + "timer-schedule": { + "type": "list", + "description": "Color schedule", + "tooltip": "Card background color at a given remaining time, interpolated between stops and holding the last stop's color beyond it. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, purple, magenta, grey.", + "columns": [ + {"id": "remaining", "title": "Remaining seconds", "type": "integer", "min": 0, "max": 86400, "default": 0}, + {"id": "color", "title": "Color", "type": "string"} + ], + "default": [ + {"remaining": 60, "color": "#43a047"}, + {"remaining": 30, "color": "#fdd835"}, + {"remaining": 0, "color": "#e53935"} + ], + "dependency": "show-timer" + }, + "timer-smooth": { + "type": "checkbox", + "default": true, + "description": "Smooth color transitions", + "tooltip": "Blend gradually between schedule stops. When disabled, each color holds until the next stop and then jumps.", + "dependency": "show-timer" + }, + + "chrono": { + "type": "header", + "description": "Chronometer card" + }, + "chrono-schedule": { + "type": "list", + "description": "Color schedule", + "tooltip": "Card background color at a given elapsed time, interpolated between stops and holding the last stop's color beyond it. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, purple, magenta, grey.", + "columns": [ + {"id": "elapsed", "title": "Elapsed seconds", "type": "integer", "min": 0, "max": 86400, "default": 0}, + {"id": "color", "title": "Color", "type": "string"} + ], + "default": [ + {"elapsed": 0, "color": "#00897b"}, + {"elapsed": 1800, "color": "#f4511e"} + ], + "dependency": "show-chronometer" + }, + "chrono-smooth": { + "type": "checkbox", + "default": true, + "description": "Smooth color transitions", + "tooltip": "Blend gradually between schedule stops. When disabled, each color holds until the next stop and then jumps.", + "dependency": "show-chronometer" + }, + "chrono-milliseconds": { + "type": "checkbox", + "default": false, + "description": "Show hundredths of a second", + "tooltip": "Adds a .ss fraction to the chronometer. The card updates 20 times per second while it runs; paused it freezes the fraction, stopped it reads 00:00.00.", + "dependency": "show-chronometer" + }, + + "display": { + "type": "header", + "description": "Display" + }, + "time-format": { + "type": "entry", + "default": "%H:%M:%S", + "description": "Time format (strftime)", + "tooltip": "Clock card time. Example: %H:%M:%S" + }, + "date-format": { + "type": "entry", + "default": "%A, %e %B", + "description": "Date format (strftime)", + "tooltip": "Clock card date. Example: %A, %e %B" + }, + "time-size": { + "type": "spinbutton", + "default": 48, + "min": 6, + "max": 72, + "step": 1, + "units": "pt", + "description": "Maximum time font size", + "tooltip": "Cards scale down from this size so the time stays inside the card" + }, + "date-size": { + "type": "spinbutton", + "default": 13, + "min": 6, + "max": 72, + "step": 1, + "units": "pt", + "description": "Maximum date font size", + "tooltip": "Cards scale down from this size so the date stays inside the card" + }, + "label-size": { + "type": "spinbutton", + "default": 11, + "min": 6, + "max": 72, + "step": 1, + "units": "pt", + "description": "Maximum card title font size", + "tooltip": "Cards scale down from this size. Long titles ellipsize rather than overflowing" + }, + "card-spacing": { + "type": "spinbutton", + "default": 6, + "min": 0, + "max": 24, + "step": 1, + "units": "px", + "description": "Card spacing" + }, + "width": { + "type": "spinbutton", + "default": 840, + "min": 200, + "max": 2000, + "step": 20, + "units": "px", + "description": "Desklet width", + "tooltip": "Cards share the width. Each card needs about 130 px; when the width cannot fit them all, the chronometer and then the timer hide automatically and come back when you widen the desklet" + }, + "height": { + "type": "spinbutton", + "default": 260, + "min": 120, + "max": 2000, + "step": 20, + "units": "px", + "description": "Desklet height" + }, + + "reset-schedules": { + "type": "button", + "description": "Reset all schedules to defaults", + "tooltip": "Restores the clock, timer and chronometer color schedules to their default stops", + "callback": "resetSchedules" + }, + + "timer-state": { + "type": "generic", + "default": {"phase": "stopped", "durationSec": 300, "endMs": 0, "remainingMs": 0}, + "description": "Do not change: persisted timer state", + "tooltip": "Do not change: persisted timer state" + }, + "chrono-state": { + "type": "generic", + "default": {"phase": "stopped", "startMs": 0, "accumMs": 0}, + "description": "Do not change: persisted chronometer state", + "tooltip": "Do not change: persisted chronometer state" + } +} diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css new file mode 100644 index 000000000..cdb93c248 --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css @@ -0,0 +1,119 @@ +.ctc-container { + /* Thin (4px) backing ring: it separates the cards from the desktop + * without outweighing the 12px gaps between them. Keep in sync with + * CARD_LAYOUT.containerPad in cardActions.js. */ + padding: 4px; + border-radius: 12px; + background-color: rgba(0, 0, 0, 0.35); +} + +.ctc-grid { + /* St.Table doesn't support CSS spacing directly; spacing handled via card margins */ +} + +/* Card chrome is a dark-backed fallback only: once a schedule provides a + * colour, desklet.js owns background-color/color/border-color and the + * transition-duration through one cached inline style. St ignores + * transition-property entirely (a duration alone crossfades the whole node + * paint), so none is declared; the inline duration is what switches between + * 1000ms ramps and 0ms steps. */ +.ctc-card { + background-color: rgba(0, 0, 0, 0.25); + border: 1px solid rgba(255, 255, 255, 0.25); + border-radius: 8px; + padding: 4px 6px; + color: white; + /* A single lit top edge: one inset shadow is all St parses, and a + * drop shadow would vanish against the dark desktop. Not owned by + * the inline colour style, so it survives the per-tick set_style. */ + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); +} + +.ctc-card:expired { + border-width: 2px; +} + +/* Expiry punch: the border colour flips to the fg colour from desklet.js + * (see setExpired) and the title emphasizes. */ +.ctc-card:expired .ctc-card-title { + font-weight: 700; +} + +.ctc-card-body { + spacing: 2px; +} + +.ctc-card-title { + color: inherit; + font-weight: 600; + text-align: center; +} + +.ctc-card-value { + font-weight: bold; + text-align: center; + color: inherit; +} + +.ctc-card-sub { + margin-top: 2px; + text-align: center; + color: inherit; +} + +/* Controls pill is a FIXED dark chip, independent of the schedule colour, + * so the white symbolic icons stay legible on any card background. */ +.ctc-card-controls { + background-color: rgba(0, 0, 0, 0.35); + border-radius: 12px; + padding: 3px; + margin-top: 8px; + spacing: 4px; +} + +.ctc-ctl { + border-radius: 9px; + padding: 4px 8px; + color: white; + transition-duration: 150ms; +} + +.ctc-ctl:hover { + background-color: rgba(255, 255, 255, 0.18); +} + +.ctc-ctl:focus { + background-color: rgba(255, 255, 255, 0.28); +} + +/* Inert +/- buttons while the timer runs: visible, unambiguous, but clearly + * not clickable - and the pill keeps one width in every state. */ +.ctc-ctl:dim { + color: rgba(255, 255, 255, 0.4); +} + +/* Same horizontal padding as .ctc-ctl so all glyph centers in the row + * sit on one rhythm; only the height is slimmer. */ +.ctc-ctl-small { + padding: 2px 8px; +} + +@media (max-width: 240px) { + .ctc-card { + border-radius: 6px; + padding: 2px 4px; + } + .ctc-card-value { + font-weight: 600; + } + .ctc-card-controls { + padding: 2px; + margin-top: 2px; + } + .ctc-ctl { + padding: 2px 4px; + } + .ctc-ctl-small { + padding: 2px 4px; + } +} diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/info.json b/cinnamon-color-timer-clock-desklet@curbsoftware/info.json new file mode 100644 index 000000000..530cf3154 --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/info.json @@ -0,0 +1 @@ +{ "author": "RobertAlexanderH" } diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/screenshot.png b/cinnamon-color-timer-clock-desklet@curbsoftware/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5ab16a88a2eb5a7c7abe890a9a827bbc5237a8 GIT binary patch literal 61036 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 D+lR)j literal 0 HcmV?d00001 From dccab43839ca0c317860723514dd1f477877dd14 Mon Sep 17 00:00:00 2001 From: RobertAlexanderH Date: Thu, 20 Aug 2026 10:42:42 -0700 Subject: [PATCH 2/4] Color Timer Clock: add notifications, next-color swatch, per-card refresh, timezone widget Co-Authored-By: Claude Fable 5 --- .../README.md | 34 +- .../cardActions.js | 154 +++++- .../desklet.js | 440 ++++++++++++++++-- .../metadata.json | 2 +- ...color-timer-clock-desklet@curbsoftware.pot | 80 +++- .../settings-schema.json | 24 +- .../stylesheet.css | 25 +- .../timezoneWidget.py | 287 ++++++++++++ 8 files changed, 949 insertions(+), 97 deletions(-) create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/timezoneWidget.py diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/README.md b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md index d01c1a79a..8aff3e984 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/README.md +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md @@ -1,34 +1,52 @@ # Color Timer Clock -A Cinnamon desklet with three cards — **Clock**, **Timer** and **Chronometer** — whose background colors follow a schedule you define. Each card's color ramps between (time, color) stops: the clock by time of day wrapping over midnight, the timer by time remaining, the chronometer by time elapsed. +A Cinnamon desklet with three cards (**Clock**, **Timer** and **Chronometer**) whose background colors follow a schedule you define. Each card's color ramps between (time, color) stops: the clock by time of day wrapping over midnight, the timer by time remaining, the chronometer by time elapsed. ![Color Timer Clock desklet](screenshot.png) +## Why this exists + +The color is not decoration. It's the signal. Each card has a job: + +- The **clock** shows when AI providers run their low-traffic discounts. Set the color stops to match the window, and you know at a glance when it's cheap to run. +- The **timer** counts down to credit resets, so I know when my API credits come back. +- The **chronometer** runs sprints. Most of the work happens in the last stretch before a deadline, so the color tells me where I am in the sprint: green for the first half hour, amber sliding to red over the next hour and a half, blue once two hours are up. Blue means take a break. + +One glance tells me the state of things. That's the whole idea. + ## Features - Up to three side-by-side cards; show or hide each one - Per-card color schedules with smooth (interpolated) or stepped transitions - Clock card with an optional IANA timezone - Timer with on-card play/pause, reset and ±60 s buttons; survives restarts and expires correctly even after downtime +- Optional desktop notification when the timer finishes +- Optional notifications when the clock or chronometer reaches a schedule stop - Chronometer with pause/resume; the accumulated time survives restarts, and an optional hundredths display (20 updates/s while running) - Text and border colors adapt to the card background for readability (WCAG contrast ratio) - Tooltips on every card control +- A per-card refresh button to reload settings without interrupting a running timer or chronometer +- A next-colour swatch on each card that previews the upcoming schedule colour - One-click "Reset all schedules to defaults" ## Configuration Right-click the desklet → **Configure…** -- **Color schedules** — a list of (time, color) stops per card. Colors are hex (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`) or a name (`red`, `blue`, …). Duplicate times keep the last row; invalid rows are dropped with a log line -- **Smooth color transitions** — blend gradually between stops, or hold each color and jump at the next stop -- **Timer minutes / seconds** — the default duration the timer restarts from -- **Show hundredths of a second** — adds a `.ss` fraction to the chronometer while it runs -- **Time / date format** — `strftime` patterns for the clock card -- **Maximum font sizes, card spacing, desklet width / height** — cards shrink text to fit +- **Color schedules**: a list of (time, color) stops per card. Colors are hex (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`) or a name (`red`, `blue`, …). Duplicate times keep the last row; invalid rows are dropped with a log line +- **Smooth color transitions**: blend gradually between stops, or hold each color and jump at the next stop +- **Show a notification when the timer finishes**: pops a desktop notification when the countdown reaches zero +- **Notify (per schedule row)**: tick a clock or chronometer schedule row's Notify checkbox to pop a notification when that time is reached +- **Timer minutes / seconds**: the default duration the timer restarts from +- **Refresh (per card)**: the small button in each card's top-right corner reloads that card's settings without restarting a running timer or chronometer +- **Next-colour swatch (per card)**: the small circle in each card's bottom-right corner previews the next schedule colour and snaps to it at the breakpoint +- **Show hundredths of a second**: adds a `.ss` fraction to the chronometer while it runs +- **Time / date format**: `strftime` patterns for the clock card +- **Maximum font sizes, card spacing, desklet width / height**: cards shrink text to fit ## Notes -Colors interpolate piecewise-linearly in RGB, so a red→blue ramp passes through purple. The clock schedule wraps over midnight; timer and chronometer schedules hold the last stop's color beyond it. Cards share the desklet width and each needs about 130 px — when the width cannot fit them all, the chronometer and then the timer hide automatically (a note is logged) and return when the desklet is widened. +Colors interpolate piecewise-linearly in RGB, so a red→blue ramp passes through purple. The clock schedule wraps over midnight; timer and chronometer schedules hold the last stop's color beyond it. Cards share the desklet width and each needs about 130 px. When the width cannot fit them all, the chronometer and then the timer hide automatically (a note is logged) and return when the desklet is widened. UUID: `cinnamon-color-timer-clock-desklet@curbsoftware` diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js index d240b7538..6ba99a9fc 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js @@ -128,7 +128,7 @@ function rgbaToCss(rgba) { * rgbaToKey: * @rgba (array): [r, g, b, a] with a in 0..1 * - * Returns (string): "#rrggbbaa" (lowercase) — a canonical key for change + * Returns (string): "#rrggbbaa" (lowercase), a canonical key for change * detection, so a colour that round-trips identically does not trigger a * restyle. */ @@ -181,7 +181,8 @@ function _rowSeconds(row) { * does not parse (counting them), sorts ascending and, when two rows share * a time, keeps the later row. * - * Returns (object): { stops: [{t, rgba}], dropped }. + * Returns (object): { stops: [{t, rgba, notify?}], dropped }. A stop carries + * notify: true only when its row's notify flag was set. */ function normalizeSchedule(rows, maxT) { if (!Array.isArray(rows)) @@ -202,11 +203,14 @@ function normalizeSchedule(rows, maxT) { dropped++; continue; } - tagged.push({ + let stop = { t: Math.max(0, Math.min(limit, Math.round(t))), rgba: parsed.rgba, i: i - }); + }; + if (rows[i] && rows[i].notify) + stop.notify = true; + tagged.push(stop); } /* Sort by time, then input order, so equal times keep the later row @@ -219,12 +223,97 @@ function normalizeSchedule(rows, maxT) { for (let i = 0; i < tagged.length; i++) { if (i + 1 < tagged.length && tagged[i + 1].t === tagged[i].t) continue; /* equal time: the later row wins */ - stops.push({ t: tagged[i].t, rgba: tagged[i].rgba }); + let stop = { t: tagged[i].t, rgba: tagged[i].rgba }; + if (tagged[i].notify) + stop.notify = true; + stops.push(stop); } return { stops: stops, dropped: dropped }; } +/** + * thresholdsCrossed: + * @prev (number): previous sampled position + * @cur (number): current sampled position + * @times (array): sorted threshold times + * @wrap (boolean): treat the position as circular (clock, rolls over at 0) + * + * Returns (array): thresholds crossed moving from @prev to @cur. A monotonic + * position crosses prev < t <= cur; a wrapped position that went backwards + * (prev > cur) crosses everything above prev and at or below cur. + */ +function thresholdsCrossed(prev, cur, times, wrap) { + let out = []; + if (!Array.isArray(times) || !Number.isFinite(prev) || !Number.isFinite(cur)) + return out; + for (let i = 0; i < times.length; i++) { + let t = Number(times[i]); + if (!Number.isFinite(t)) + continue; + let crossed = (wrap && prev > cur) + ? (t > prev || t <= cur) + : (prev < t && t <= cur); + if (crossed) + out.push(t); + } + return out; +} + +/** + * nextColor: + * @stops (array): normalised stops [{t, rgba}], any order + * @pos (number): query position in seconds + * @opts (object): { wrap, reverse }. wrap treats the position as circular + * (clock); reverse walks the schedule backwards (timer counting down). + * + * Returns (array): the colour of the next stop in the direction of travel, or + * null when there are no stops. A forward schedule returns the first stop + * above @pos (wrapping to the first past the end when @opts.wrap, else holding + * the last stop); a reverse schedule returns the first stop below @pos, + * falling back to the lowest stop at or past the end. + */ +function nextColor(stops, pos, opts) { + opts = opts || {}; + + let list = []; + if (Array.isArray(stops)) { + for (let i = 0; i < stops.length; i++) { + let s = stops[i]; + if (s && Number.isFinite(s.t) && Array.isArray(s.rgba)) + list.push({ t: s.t, rgba: s.rgba }); + } + } + if (list.length === 0) + return null; + list.sort(function (a, b) { return a.t - b.t; }); + + let q = Number(pos); + if (!Number.isFinite(q)) + q = 0; + if (opts.wrap) + q = ((q % DAY_SECONDS) + DAY_SECONDS) % DAY_SECONDS; + + if (list.length === 1) + return list[0].rgba.slice(); + + if (opts.reverse) { + for (let i = list.length - 1; i >= 0; i--) { + if (list[i].t < q) + return list[i].rgba.slice(); + } + return list[0].rgba.slice(); + } + + for (let i = 0; i < list.length; i++) { + if (list[i].t > q) + return list[i].rgba.slice(); + } + if (opts.wrap) + return list[0].rgba.slice(); + return list[list.length - 1].rgba.slice(); +} + /* ------------------------------------------------------------------ * * Schedule evaluation * ------------------------------------------------------------------ */ @@ -575,25 +664,66 @@ function computeCardInnerSize(deskletWidth, deskletHeight, rows, cols, cardSpaci }; } +function _glyphEm(ch, em) { + if (ch >= "0" && ch <= "9") + return Math.max(em, 0.72); + if (ch === ":" || ch === ".") + return 0.38; + if (ch === " " || ch === ",") + return 0.33; + return em; +} + +function _textEmUnits(text, em) { + let s = String(text || ""); + let units = 0; + for (let i = 0; i < s.length; i++) + units += _glyphEm(s[i], em); + return units; +} + function _textWidthPx(text, sizePt, ptToPx, em) { - let n = String(text || "").length; - if (n === 0) + let units = _textEmUnits(text, em); + if (units <= 0) return 0; - return n * sizePt * ptToPx * em; + return units * sizePt * ptToPx; } function _maxPtForWidth(text, innerW, ptToPx, em, cap) { - let n = String(text || "").length; - if (n === 0) + let units = _textEmUnits(text, em); + if (units <= 0) return cap; - if (!(innerW > 0) || !(ptToPx > 0) || !(em > 0)) + if (!(innerW > 0) || !(ptToPx > 0)) return 1; - let pt = innerW / (n * ptToPx * em); + let pt = innerW / (units * ptToPx); if (!Number.isFinite(pt) || pt <= 0) return 1; return Math.min(cap, pt); } +/** + * worstTimeSample: + * @format (string): strftime time format + * @extras (object): { hundredths } to append a ".99" fraction + * + * Returns (string): a wide sample used to size the time line before the + * live string is known, so enabling seconds or hundredths cannot overflow. + */ +function worstTimeSample(format, extras) { + extras = extras || {}; + let fmt = typeof format === "string" ? format : ""; + let hasSeconds = !fmt || /%[STcT]/.test(fmt); + let twelveHour = /%[IilpPr]/.test(fmt); + let sample; + if (twelveHour) + sample = hasSeconds ? "12:59:59 PM" : "12:59 PM"; + else + sample = hasSeconds ? "23:59:59" : "23:59"; + if (extras.hundredths) + sample += ".99"; + return sample; +} + /** * computeFittedFontSizes: * @innerWidth (number): card text box width in px diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js index 54303006d..180b4a95e 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js @@ -3,10 +3,12 @@ const Desklet = imports.ui.desklet; const St = imports.gi.St; const Settings = imports.ui.settings; const Mainloop = imports.mainloop; +const Main = imports.ui.main; const Tooltips = imports.ui.tooltips; const Gettext = imports.gettext; const GLib = imports.gi.GLib; const Pango = imports.gi.Pango; +const Clutter = imports.gi.Clutter; const uuid = "cinnamon-color-timer-clock-desklet@curbsoftware"; @@ -21,17 +23,56 @@ function _(str) { * load-order problem surfaces as a logged error instead of a load failure. */ let CardActions = null; -function _loadModules() { +function _loadModules(deskletPath) { if (CardActions) return true; - try { - const dir = imports.ui.deskletManager.desklets[uuid]; - CardActions = dir.cardActions; - return !!CardActions; - } catch (e) { - global.logError(uuid + " could not load helper modules: " + e); - return false; + const dirs = []; + try { dirs.push(imports.ui.deskletManager.desklets[uuid]); } catch (e) {} + try { dirs.push(imports.desklets[uuid]); } catch (e) {} + for (let i = 0; i < dirs.length; i++) { + if (dirs[i] && dirs[i].cardActions) { + CardActions = dirs[i].cardActions; + return true; + } + } + if (deskletPath) { + try { + imports.searchPath.unshift(deskletPath); + CardActions = imports.cardActions; + if (CardActions) + return true; + } catch (e) { + global.logError(uuid + " could not import cardActions from " + deskletPath + ": " + e); + } } + global.logError(uuid + " could not load helper modules"); + return false; +} + +function _formatStrftime(date, fmt, tzName) { + if (!fmt) + return ""; + try { + let tz; + if (tzName && String(tzName).trim()) + tz = GLib.TimeZone.new(String(tzName).trim()); + else + tz = GLib.TimeZone.new_local(); + let dt = GLib.DateTime.new_from_unix_utc(Math.floor(date.getTime() / 1000)); + if (tz) + dt = dt.to_timezone(tz); + let out = dt.format(fmt); + if (out) + return out; + } catch (e) {} + try { + if (date && typeof date.toLocaleFormat === "function") { + let out = date.toLocaleFormat(fmt); + if (out) + return out; + } + } catch (e2) {} + return ""; } const DEFAULT_TIME_FORMAT = "%H:%M:%S"; @@ -48,6 +89,11 @@ const CARD_TITLES = { const TIMER_PHASES = ["stopped", "paused", "running", "expired"]; const CHRONO_PHASES = ["stopped", "paused", "running"]; +/* A timer that finished while the desklet was unloaded only re-notifies when + * it expired recently; a stale expiry from hours or days ago is not worth a + * startup pop. Covers cinnamon --replace and quick reboots, skips the rest. */ +const STALE_EXPIRY_MS = 10 * 60 * 1000; + function _pad2(n) { return n < 10 ? "0" + n : "" + n; } @@ -74,6 +120,27 @@ function _formatDuration(ms, ceil, hundredths) { return out; } +function _centerLabelText(label) { + if (!label || !label.clutter_text) + return; + try { + label.clutter_text.set_line_alignment(Pango.Alignment.CENTER); + if (Clutter.ActorAlign) + label.clutter_text.x_align = Clutter.ActorAlign.CENTER; + } catch (e) {} +} + +function _actorWidth(actor) { + try { + if (!actor || !actor.get_allocation_box) + return 0; + const box = actor.get_allocation_box(); + return Math.max(0, box.x2 - box.x1); + } catch (e) { + return 0; + } +} + function CardWidget(kind, desklet) { this._init(kind, desklet); } @@ -103,16 +170,28 @@ CardWidget.prototype = { this._sub.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; this._sub.clutter_text.line_wrap = false; } catch (e) {} + _centerLabelText(this._title); + _centerLabelText(this._value); + _centerLabelText(this._sub); /* Labels live in an expanding body box: the text block centers in * the space above the controls, and the controls pill anchors to * the card bottom. The clock card carries a ghost pill (same - * height, invisible, inert) so all cards share one baseline grid. */ + * height, invisible, inert) so all cards share one baseline grid. + * Time/date stay at natural width so BoxLayout can center them; + * stretching those labels with set_width left-aligns the glyphs. */ + this._refreshButton = this._refreshCtl(); + /* Header row at the card top: the title centers in the flexible space + * and a small refresh button pins to the top-right corner. */ + this._header = new St.BoxLayout(); + this._header.add(this._title, { expand: true, x_fill: true, x_align: St.Align.MIDDLE, y_align: St.Align.START }); + this._header.add(this._refreshButton, { x_fill: false, x_align: St.Align.END, y_align: St.Align.START }); + this.actor.add(this._header, { x_fill: true, y_fill: false, x_align: St.Align.MIDDLE, y_align: St.Align.START }); + this._body = new St.BoxLayout({ vertical: true, style_class: "ctc-card-body" }); - this._body.add(this._title, { x_fill: false, x_align: St.Align.MIDDLE }); this._body.add(this._value, { x_fill: false, x_align: St.Align.MIDDLE }); this._body.add(this._sub, { x_fill: false, x_align: St.Align.MIDDLE }); this.actor.add(this._body, { @@ -123,6 +202,11 @@ CardWidget.prototype = { y_align: St.Align.MIDDLE }); + this._swatch = new St.DrawingArea(); + this._swatch.set_width(12); + this._swatch.set_height(12); + this._swatchColor = null; + this._swatch.connect("repaint", () => this._paintSwatch()); this._buildControls(); if (kind === "clock") this._ghostControls(); @@ -158,7 +242,11 @@ CardWidget.prototype = { this._controls.add(this._plusButton); } - this.actor.add(this._controls, { x_fill: false, x_align: St.Align.MIDDLE }); + /* Bottom row: controls centered, next-colour swatch at bottom-right. */ + const bottom = new St.BoxLayout({ style_class: "ctc-card-bottom" }); + bottom.add(this._controls, { expand: true, x_fill: false, x_align: St.Align.MIDDLE }); + bottom.add(this._swatch, { x_fill: false, x_align: St.Align.END, y_align: St.Align.MIDDLE }); + this.actor.add(bottom, { x_fill: true, y_fill: false, x_align: St.Align.MIDDLE, y_align: St.Align.END }); }, /* Reserve, don't show: the ghost keeps the clock card's geometry @@ -188,6 +276,18 @@ CardWidget.prototype = { button.connect("clicked", () => { this.desklet._onControl(this.kind, action); }); + button.connect("button-press-event", () => { + if (this.desklet._draggable) + this.desklet._draggable.inhibit = true; + return Clutter.EVENT_PROPAGATE; + }); + button.connect("button-release-event", () => { + if (this.desklet._draggable) { + this.desklet._draggable.inhibit = false; + this.desklet._draggable.fakeRelease(); + } + return Clutter.EVENT_PROPAGATE; + }); if (tipText) { const tip = new Tooltips.Tooltip(button, tipText); if (iconName === "media-playback-start") @@ -198,6 +298,38 @@ CardWidget.prototype = { return button; }, + /* Small top-right refresh button: reloads this card's settings in place + * without rebuilding the desklet, so a running timer keeps ticking. */ + _refreshCtl: function () { + const icon = new St.Icon({ + icon_name: "view-refresh", + icon_type: St.IconType.SYMBOLIC, + icon_size: 14 + }); + const button = new St.Button({ + style_class: "ctc-refresh", + can_focus: true + }); + button.set_child(icon); + button.connect("clicked", () => { + this.desklet._onRefresh(); + }); + button.connect("button-press-event", () => { + if (this.desklet._draggable) + this.desklet._draggable.inhibit = true; + return Clutter.EVENT_PROPAGATE; + }); + button.connect("button-release-event", () => { + if (this.desklet._draggable) { + this.desklet._draggable.inhibit = false; + this.desklet._draggable.fakeRelease(); + } + return Clutter.EVENT_PROPAGATE; + }); + new Tooltips.Tooltip(button, _("Refresh")); + return button; + }, + /* Margin is part of the inline style the card owns, so changing it just * invalidates the style cache; the next _applyColors writes both. */ setSpacing: function (px) { @@ -254,8 +386,10 @@ CardWidget.prototype = { * @rgba (array): [r, g, b, a] from evaluate(), or null when the card has * no schedule stops (stylesheet default colours then apply) * @smooth (boolean): animate towards this colour over 1000 ms + * @nextRgba (array): the next stop's colour for the solid preview swatch, + * or null when there is no schedule */ - update: function (now, rgba, smooth) { + update: function (now, rgba, smooth, nextRgba) { if (this.kind === "clock") this._updateClock(now); else if (this.kind === "timer") @@ -263,14 +397,60 @@ CardWidget.prototype = { else this._updateChrono(now); this._applyColors(rgba, smooth); + this._updateSwatch(nextRgba); + }, + + /* Solid next-colour preview: the swatch repaints in one flat fill, so it + * snaps to each stop's colour at the breakpoint instead of fading. */ + _updateSwatch: function (nextRgba) { + if (!this._swatch) + return; + if (!nextRgba) { + this._swatch.hide(); + return; + } + this._swatch.show(); + this._swatchColor = nextRgba; + this._swatch.queue_repaint(); + }, + + /* Draw the swatch circle directly (a St.DrawingArea paints only what this + * callback draws, so the size and fill do not depend on CSS background). */ + _paintSwatch: function () { + const area = this._swatch; + const cr = area.get_context(); + if (!cr) + return; + const [w, h] = area.get_surface_size(); + const r = Math.min(w, h) / 2 - 0.5; + const cx = w / 2; + const cy = h / 2; + + cr.setSourceRGBA(0, 0, 0, 0); + cr.rectangle(0, 0, w, h); + cr.fill(); + + const c = this._swatchColor; + if (c) { + cr.setSourceRGBA(c[0] / 255, c[1] / 255, c[2] / 255, c[3]); + cr.arc(cx, cy, r, 0, 2 * Math.PI); + cr.fill(); + cr.setSourceRGBA(1, 1, 1, 0.35); + cr.setLineWidth(1); + cr.arc(cx, cy, r, 0, 2 * Math.PI); + cr.stroke(); + } + + cr.$dispose(); }, _updateClock: function (displayDate) { try { const timeFormat = this.desklet.timeFormat || DEFAULT_TIME_FORMAT; const dateFormat = this.desklet.dateFormat || DEFAULT_DATE_FORMAT; - this._value.set_text(displayDate.toLocaleFormat(timeFormat)); - this._sub.set_text(displayDate.toLocaleFormat(dateFormat)); + const tz = this.desklet.clockTimezone; + this._value.set_text(_formatStrftime(displayDate, timeFormat, tz)); + this._sub.set_text(_formatStrftime(displayDate, dateFormat, tz)); } catch (e) { global.logError(uuid + " could not format clock: " + e); this._value.set_text(""); @@ -374,7 +554,12 @@ CardWidget.prototype = { _constrainTitleWidth: function (width) { try { - this._title.set_width(Math.max(1, Math.floor(width))); + let w = _actorWidth(this._header); + if (!(w > 1)) + w = width; + w -= _actorWidth(this._refreshButton); + if (w > 1) + this._title.set_width(Math.max(1, Math.floor(w))); } catch (e) {} }, @@ -420,19 +605,21 @@ MyDesklet.prototype = { _init: function (metadata, deskletId) { Desklet.Desklet.prototype._init.call(this, metadata, deskletId); - _loadModules(); + _loadModules(metadata.path); + this._settingWatchIds = []; this.settings = new Settings.DeskletSettings(this, this.metadata["uuid"], deskletId); this.settings.bind("show-clock", "showClock", this.on_setting_changed); this.settings.bind("show-timer", "showTimer", this.on_setting_changed); this.settings.bind("show-chronometer", "showChronometer", this.on_setting_changed); - this.settings.bind("clock-timezone", "clockTimezone", this.on_setting_changed); + this._watchStringSetting("clock-timezone", "clockTimezone", this.on_setting_changed); this.settings.bind("clock-schedule", "clockSchedule", this.on_setting_changed); this.settings.bind("clock-smooth", "clockSmooth", this.on_setting_changed); this.settings.bind("timer-minutes", "timerMinutes", this.on_setting_changed); this.settings.bind("timer-seconds", "timerSeconds", this.on_setting_changed); this.settings.bind("timer-schedule", "timerSchedule", this.on_setting_changed); this.settings.bind("timer-smooth", "timerSmooth", this.on_setting_changed); + this.settings.bind("timer-notify", "timerNotify", this.on_setting_changed); this.settings.bind("chrono-schedule", "chronoSchedule", this.on_setting_changed); this.settings.bind("chrono-smooth", "chronoSmooth", this.on_setting_changed); this.settings.bind("chrono-milliseconds", "chronoMilliseconds", this.on_setting_changed); @@ -451,12 +638,17 @@ MyDesklet.prototype = { this._cards = []; this._schedules = { clock: null, timer: null, chrono: null }; + this._notifyTimes = {}; + this._lastPos = { clock: null, chrono: null }; this._scheduleRows = null; this._lastBadTimezone = null; this._timeout = null; this._fastTimeout = null; this._rebuildTimeout = null; this._fitId = null; + this._fitRetryId = null; + this._allocW = -1; + this._allocH = -1; this._cardInner = null; this._widthSamples = null; @@ -506,10 +698,20 @@ MyDesklet.prototype = { Mainloop.source_remove(this._fitId); this._fitId = null; } + if (this._fitRetryId) { + Mainloop.source_remove(this._fitRetryId); + this._fitRetryId = null; + } this._cards = []; if (this.settings) { + if (this._settingWatchIds) { + for (let i = 0; i < this._settingWatchIds.length; i++) { + try { this.settings.disconnect(this._settingWatchIds[i]); } catch (e) {} + } + this._settingWatchIds = []; + } this.settings.finalize(); this.settings = null; } @@ -520,6 +722,20 @@ MyDesklet.prototype = { } }, + _watchStringSetting: function (key, prop, callback) { + this[prop] = this.settings ? this.settings.getValue(key) : ""; + if (this.settings && this.settings.connect) { + const id = this.settings.connect("changed::" + key, () => { + this[prop] = this.settings.getValue(key); + if (callback) + callback.call(this); + }); + if (!this._settingWatchIds) + this._settingWatchIds = []; + this._settingWatchIds.push(id); + } + }, + on_setting_changed: function () { try { this.mainContainer.set_width(this.width); @@ -575,7 +791,7 @@ MyDesklet.prototype = { _rebuildCards: function () { try { - if (!_loadModules()) + if (!_loadModules(this.metadata && this.metadata.path)) return; this._refreshSchedules(); @@ -590,9 +806,14 @@ MyDesklet.prototype = { global.log(uuid + ": width " + (Number(this.width) || 840) + "px is too small for " + wanted.length + " cards; hiding " + wanted.slice(kinds.length).join(", ")); + /* Leave the table and cards non-reactive so the desklet actor + * receives the pointer grab. Cinnamon's DND then sees mouse-up + * and actually drops. A reactive child that forwards press + * (and a stage captured-event hook) left the grab stuck, so + * every desklet followed the cursor. Control St.Buttons stay + * reactive and inhibit drag while they are clicked. */ const table = new St.Table({ homogeneous: true, - reactive: true, style_class: "ctc-grid" }); this.mainContainer.add(table, { @@ -636,6 +857,7 @@ MyDesklet.prototype = { chrono: this.chronoSchedule }; this._schedules = {}; + this._notifyTimes = {}; for (const kind of ["clock", "timer", "chrono"]) { const result = CardActions.normalizeSchedule( rows[kind], CardActions.DAY_SECONDS); @@ -643,7 +865,11 @@ MyDesklet.prototype = { global.log(uuid + ": dropped " + result.dropped + " " + kind + " schedule row(s) with an unparsable time or colour"); this._schedules[kind] = result.stops; + this._notifyTimes[kind] = result.stops + .filter(s => s.notify) + .map(s => s.t); } + this._lastPos = { clock: null, chrono: null }; }, /* reset-schedules settings button callback. setValue does not fire the @@ -668,6 +894,23 @@ MyDesklet.prototype = { } }, + /* Per-card refresh button: re-reads schedules and re-fits the existing + * cards in place, so changed settings show up without tearing down the + * widgets and interrupting a running timer or chronometer. */ + _onRefresh: function () { + if (this._cleanedUp || !CardActions) + return; + try { + this._refreshSchedules(); + this._widthSamples = this._formatWidthSamples(); + this._cardInner = this._computeCardInnerSize(this._cards.length); + this._fitAllCards(this._cardInner); + this._updateAll(); + } catch (e) { + global.logError(uuid + " refresh failed: " + e); + } + }, + /* ------------------------------------------------------------------ * * Timer / chronometer state machines * ------------------------------------------------------------------ */ @@ -709,8 +952,11 @@ MyDesklet.prototype = { : { phase: "stopped", durationSec: this._timerDurationFromSettings(), endMs: 0, remainingMs: 0 }; if (t.phase === "stopped") t.durationSec = this._timerDurationFromSettings(); - if (t.phase === "running" && t.endMs <= now) + if (t.phase === "running" && t.endMs <= now) { t.phase = "expired"; + if (now - t.endMs <= STALE_EXPIRY_MS) + this._notifyTimerExpired(); + } this._timer = t; this._persistTimer(); @@ -735,6 +981,49 @@ MyDesklet.prototype = { }); }, + /* Opt-in desktop notification on the running -> expired transition. */ + _notifyTimerExpired: function () { + if (!this.timerNotify) + return; + try { + Main.notify(_("Timer finished"), _("The timer reached zero.")); + } catch (e) { + global.logError(uuid + " notify failed: " + e); + } + }, + + /* Clock/chronometer schedule stops flagged notify fire once when the card's + * position crosses their time. The first sample after a rebuild only primes + * the previous position, so already-passed times do not fire on startup. */ + _checkNotifyCrossing: function (kind, pos) { + const times = this._notifyTimes ? this._notifyTimes[kind] : null; + if (!times || !times.length) + return; + const prev = this._lastPos ? this._lastPos[kind] : null; + this._lastPos[kind] = pos; + if (prev == null) + return; + const crossed = CardActions.thresholdsCrossed(prev, pos, times, kind === "clock"); + for (let i = 0; i < crossed.length; i++) + this._notifyCardTime(kind, crossed[i]); + }, + + _notifyCardTime: function (kind, t) { + let body; + if (kind === "clock") { + const h = Math.floor(t / 3600); + const m = Math.floor((t % 3600) / 60); + body = _("It is now %s.").format(_pad2(h) + ":" + _pad2(m)); + } else { + body = _("Reached %s.").format(_formatDuration(t * 1000, false, false)); + } + try { + Main.notify(CARD_TITLES[kind], body); + } catch (e) { + global.logError(uuid + " notify failed: " + e); + } + }, + _persistChrono: function () { if (this.settings && this._chrono) this.settings.setValue("chrono-state", { @@ -791,6 +1080,8 @@ MyDesklet.prototype = { * tick notices - must not strand the timer at 00:00/Paused: * _updateAll only expires a running timer. */ t.phase = t.remainingMs > 0 ? "paused" : "expired"; + if (t.phase === "expired") + this._notifyTimerExpired(); } else { /* Stopped and expired both restart from the full duration; * paused resumes its frozen remainingMs. */ @@ -852,21 +1143,31 @@ MyDesklet.prototype = { /* Date whose wall-clock fields are the card timezone's local time * (world-clock conversion pattern); the desklet's own time when the * timezone entry is empty or invalid. */ - _clockNow: function (now) { + _clockWallParts: function (now) { const timezoneName = (this.clockTimezone || "").trim(); - if (timezoneName) { - try { - return new Date(now.toLocaleString("en-US", { timeZone: timezoneName })); - } catch (e) { - /* This runs on every 1 s tick: one typo must not flood - * ~/.xsession-errors, so log once per distinct bad value. */ - if (this._lastBadTimezone !== timezoneName) { - this._lastBadTimezone = timezoneName; - global.logError(uuid + " invalid timezone: " + timezoneName + ": " + e); - } + try { + const tz = timezoneName + ? GLib.TimeZone.new(timezoneName) + : GLib.TimeZone.new_local(); + const dt = GLib.DateTime.new_from_unix_utc( + Math.floor(now.getTime() / 1000) + ).to_timezone(tz); + return { + hours: dt.get_hour(), + minutes: dt.get_minute(), + seconds: dt.get_second() + }; + } catch (e) { + if (timezoneName && this._lastBadTimezone !== timezoneName) { + this._lastBadTimezone = timezoneName; + global.logError(uuid + " invalid timezone: " + timezoneName + ": " + e); } + return { + hours: now.getHours(), + minutes: now.getMinutes(), + seconds: now.getSeconds() + }; } - return now; }, _smoothFor: function (kind) { @@ -881,6 +1182,7 @@ MyDesklet.prototype = { if (this._cleanedUp || !CardActions) return; + try { const now = new Date(); const nowMs = now.getTime(); @@ -889,37 +1191,48 @@ MyDesklet.prototype = { if (this._timer.phase === "running" && this._timer.endMs <= nowMs) { this._timer.phase = "expired"; this._persistTimer(); + this._notifyTimerExpired(); } - const clockNow = this._clockNow(now); + const clockParts = this._clockWallParts(now); for (let i = 0; i < this._cards.length; i++) { const widget = this._cards[i]; const smooth = this._smoothFor(widget.kind); - let pos, rgba; + let pos, rgba, nextRgba; if (widget.kind === "clock") { - pos = clockNow.getHours() * 3600 + - clockNow.getMinutes() * 60 + - clockNow.getSeconds(); + pos = clockParts.hours * 3600 + + clockParts.minutes * 60 + + clockParts.seconds; rgba = CardActions.evaluate(this._schedules.clock, pos, { wrap: true, smooth: smooth }); - widget.update(clockNow, rgba, smooth); + nextRgba = CardActions.nextColor + ? CardActions.nextColor(this._schedules.clock, pos, { wrap: true }) + : null; + widget.update(now, rgba, smooth, nextRgba); } else if (widget.kind === "timer") { pos = this._timerRemainingMs(nowMs) / 1000; rgba = CardActions.evaluate(this._schedules.timer, pos, { smooth: smooth }); - widget.update(now, rgba, smooth); + nextRgba = CardActions.nextColor + ? CardActions.nextColor(this._schedules.timer, pos, { reverse: true }) + : null; + widget.update(now, rgba, smooth, nextRgba); } else { pos = this._chronoElapsedMs(nowMs) / 1000; rgba = CardActions.evaluate(this._schedules.chrono, pos, { smooth: smooth }); - widget.update(now, rgba, smooth); + nextRgba = CardActions.nextColor + ? CardActions.nextColor(this._schedules.chrono, pos, {}) + : null; + widget.update(now, rgba, smooth, nextRgba); } + this._checkNotifyCrossing(widget.kind, pos); } /* Refit when a value crosses a digit-count boundary (e.g. a @@ -935,6 +1248,9 @@ MyDesklet.prototype = { } this._syncControlStates(); + } catch (e) { + global.logError(uuid + " update failed: " + e); + } }, _syncControlStates: function () { @@ -999,7 +1315,11 @@ MyDesklet.prototype = { _onTick: function () { if (this._cleanedUp) return false; - this._updateAll(); + try { + this._updateAll(); + } catch (e) { + global.logError(uuid + " tick failed: " + e); + } return true; }, @@ -1015,6 +1335,7 @@ MyDesklet.prototype = { }, _formatWidthSamples: function () { + const timeFormat = this.timeFormat || DEFAULT_TIME_FORMAT; const dateFormat = this.dateFormat || DEFAULT_DATE_FORMAT; const dates = [ new Date(2023, 11, 27, 23, 59, 59), @@ -1024,12 +1345,16 @@ MyDesklet.prototype = { let sub = ""; for (let i = 0; i < dates.length; i++) { try { - const d = dates[i].toLocaleFormat(dateFormat); + const d = _formatStrftime(dates[i], dateFormat, this.clockTimezone); if (String(d).length > sub.length) sub = d; } catch (e) {} } - let value = ""; + const clockSample = CardActions && CardActions.worstTimeSample + ? CardActions.worstTimeSample(timeFormat) + : "23:59:59"; + const chronoSample = this.chronoMilliseconds ? "99:59:59.99" : "99:59:59"; + let value = clockSample.length >= chronoSample.length ? clockSample : chronoSample; for (let i = 0; i < this._cards.length; i++) { const v = this._cards[i]._value.get_text(); if (v && v.length > value.length) @@ -1037,6 +1362,9 @@ MyDesklet.prototype = { } return { value: value || "23:59:59", + clock: clockSample, + chrono: chronoSample, + timer: "99:59:59", sub: sub || "Wednesday, 31 December" }; }, @@ -1051,6 +1379,15 @@ MyDesklet.prototype = { if (this._cleanedUp) return false; this._fitAllCards(this._cardInner); + if (this._fitRetryId) + Mainloop.source_remove(this._fitRetryId); + this._fitRetryId = Mainloop.timeout_add(80, () => { + this._fitRetryId = null; + if (this._cleanedUp) + return false; + this._fitAllCards(this._cardInner); + return false; + }); return false; }); }, @@ -1062,10 +1399,19 @@ MyDesklet.prototype = { if (!inner) return; for (let i = 0; i < this._cards.length; i++) { - /* Each card fits its own value: a 5-char "05:00" must not be - * sized down for the clock card's 8-character worst case. */ - this._cards[i].applyFittedSizes(inner, { - value: this._cards[i]._value.get_text() || samples.value, + const widget = this._cards[i]; + let sampleValue = samples.value; + if (widget.kind === "clock" && samples.clock) + sampleValue = samples.clock; + else if (widget.kind === "chrono" && samples.chrono) + sampleValue = samples.chrono; + else if (widget.kind === "timer" && samples.timer) + sampleValue = samples.timer; + const live = widget._value.get_text() || ""; + if (live.length > sampleValue.length) + sampleValue = live; + widget.applyFittedSizes(inner, { + value: sampleValue, sub: samples.sub }); } diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json index f3f593694..808d35005 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json @@ -2,7 +2,7 @@ "uuid": "cinnamon-color-timer-clock-desklet@curbsoftware", "name": "Color Timer Clock", "description": "Clock, countdown timer and chronometer cards whose background colors follow a schedule", - "version": "1.0.0", + "version": "1.4.0", "prevent-decorations": false, "max-instances": 1 } diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot index 7ddf78407..9bf2b1189 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot @@ -1,14 +1,14 @@ # COLOR TIMER CLOCK # This file is put in the public domain. -# RobertAlexanderH, 2017 +# RobertAlexanderH, 2026 # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: cinnamon-color-timer-clock-desklet@curbsoftware 1.0.0\n" +"Project-Id-Version: cinnamon-color-timer-clock-desklet@curbsoftware 1.4.0\n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2026-08-19 16:56-0700\n" +"POT-Creation-Date: 2026-08-20 10:41-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -17,55 +17,77 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#. desklet.js:43 +#. desklet.js:84 msgid "Clock" msgstr "" -#. desklet.js:44 desklet.js:289 +#. desklet.js:85 desklet.js:469 msgid "Timer" msgstr "" -#. desklet.js:45 +#. desklet.js:86 msgid "Chronometer" msgstr "" -#. desklet.js:149 desklet.js:214 +#. desklet.js:233 desklet.js:346 msgid "Start" msgstr "" -#. desklet.js:152 +#. desklet.js:236 msgid "Reset" msgstr "" -#. desklet.js:155 +#. desklet.js:239 msgid "-1 minute" msgstr "" -#. desklet.js:156 +#. desklet.js:240 msgid "+1 minute" msgstr "" -#. desklet.js:214 +#. desklet.js:329 +msgid "Refresh" +msgstr "" + +#. desklet.js:346 msgid "Pause" msgstr "" -#. desklet.js:284 +#. desklet.js:464 msgid "Time is up" msgstr "" -#. desklet.js:293 +#. desklet.js:473 msgid "Ready" msgstr "" -#. desklet.js:294 +#. desklet.js:474 msgid "Paused" msgstr "" #. metadata.json->name -#. desklet.js:471 +#. desklet.js:663 msgid "Color Timer Clock" msgstr "" +#. desklet.js:989 +msgid "Timer finished" +msgstr "" + +#. desklet.js:989 +msgid "The timer reached zero." +msgstr "" + +#. desklet.js:1016 +#, javascript-format +msgid "It is now %s." +msgstr "" + +#. desklet.js:1018 +#, javascript-format +msgid "Reached %s." +msgstr "" + #. metadata.json->description msgid "" "Clock, countdown timer and chronometer cards whose background colors follow " @@ -98,8 +120,7 @@ msgstr "" #. settings-schema.json->clock-timezone->tooltip msgid "" -"IANA timezone name for the clock card, for example Europe/Berlin. Leave " -"empty to use local time." +"Search for a city or region, or pick Local to use this computer's timezone." msgstr "" #. settings-schema.json->clock-schedule->description @@ -111,8 +132,9 @@ msgstr "" #. settings-schema.json->clock-schedule->tooltip msgid "" "Card background color at a given time of day, interpolated between stops and " -"wrapping over midnight. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a " -"name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, " +"wrapping over midnight. Tick Notify to pop a desktop notification when the " +"clock reaches that time. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or " +"a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, " "purple, magenta, grey." msgstr "" @@ -130,6 +152,11 @@ msgstr "" msgid "Color" msgstr "" +#. settings-schema.json->clock-schedule->columns->title +#. settings-schema.json->chrono-schedule->columns->title +msgid "Notify" +msgstr "" + #. settings-schema.json->clock-smooth->description #. settings-schema.json->timer-smooth->description #. settings-schema.json->chrono-smooth->description @@ -182,6 +209,14 @@ msgstr "" msgid "Remaining seconds" msgstr "" +#. settings-schema.json->timer-notify->description +msgid "Show a notification when the timer finishes" +msgstr "" + +#. settings-schema.json->timer-notify->tooltip +msgid "Pops a desktop notification when the countdown reaches zero." +msgstr "" + #. settings-schema.json->chrono->description msgid "Chronometer card" msgstr "" @@ -189,9 +224,10 @@ msgstr "" #. settings-schema.json->chrono-schedule->tooltip msgid "" "Card background color at a given elapsed time, interpolated between stops " -"and holding the last stop's color beyond it. Colors: hex (#rgb, #rgba, " -"#rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, " -"green, teal, cyan, blue, purple, magenta, grey." +"and holding the last stop's color beyond it. Tick Notify to pop a desktop " +"notification when the chronometer reaches that elapsed time. Colors: hex " +"(#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, " +"yellow, lime, green, teal, cyan, blue, purple, magenta, grey." msgstr "" #. settings-schema.json->chrono-schedule->columns->title diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json index bfd766e2c..f0e7c67f2 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json @@ -24,20 +24,24 @@ "description": "Clock card" }, "clock-timezone": { - "type": "entry", + "type": "custom", + "file": "timezoneWidget.py", + "widget": "TimezoneChooser", "default": "", "description": "Timezone", - "tooltip": "IANA timezone name for the clock card, for example Europe/Berlin. Leave empty to use local time.", + "tooltip": "Search for a city or region, or pick Local to use this computer's timezone.", + "empty-label": "Local (system timezone)", "dependency": "show-clock" }, "clock-schedule": { "type": "list", "description": "Color schedule", - "tooltip": "Card background color at a given time of day, interpolated between stops and wrapping over midnight. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, purple, magenta, grey.", + "tooltip": "Card background color at a given time of day, interpolated between stops and wrapping over midnight. Tick Notify to pop a desktop notification when the clock reaches that time. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, purple, magenta, grey.", "columns": [ {"id": "hour", "title": "Hour", "type": "integer", "min": 0, "max": 23, "default": 0}, {"id": "minute", "title": "Minute", "type": "integer", "min": 0, "max": 59, "default": 0}, - {"id": "color", "title": "Color", "type": "string"} + {"id": "color", "title": "Color", "type": "string"}, + {"id": "notify", "title": "Notify", "type": "boolean", "default": false} ], "default": [ {"hour": 6, "color": "#f4433c"}, @@ -101,6 +105,13 @@ "tooltip": "Blend gradually between schedule stops. When disabled, each color holds until the next stop and then jumps.", "dependency": "show-timer" }, + "timer-notify": { + "type": "checkbox", + "default": false, + "description": "Show a notification when the timer finishes", + "tooltip": "Pops a desktop notification when the countdown reaches zero.", + "dependency": "show-timer" + }, "chrono": { "type": "header", @@ -109,10 +120,11 @@ "chrono-schedule": { "type": "list", "description": "Color schedule", - "tooltip": "Card background color at a given elapsed time, interpolated between stops and holding the last stop's color beyond it. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, purple, magenta, grey.", + "tooltip": "Card background color at a given elapsed time, interpolated between stops and holding the last stop's color beyond it. Tick Notify to pop a desktop notification when the chronometer reaches that elapsed time. Colors: hex (#rgb, #rgba, #rrggbb or #rrggbbaa) or a name: black, white, red, orange, yellow, lime, green, teal, cyan, blue, purple, magenta, grey.", "columns": [ {"id": "elapsed", "title": "Elapsed seconds", "type": "integer", "min": 0, "max": 86400, "default": 0}, - {"id": "color", "title": "Color", "type": "string"} + {"id": "color", "title": "Color", "type": "string"}, + {"id": "notify", "title": "Notify", "type": "boolean", "default": false} ], "default": [ {"elapsed": 0, "color": "#00897b"}, diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css index cdb93c248..2358b30cf 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css @@ -67,10 +67,14 @@ background-color: rgba(0, 0, 0, 0.35); border-radius: 12px; padding: 3px; - margin-top: 8px; spacing: 4px; } +.ctc-card-bottom { + margin-top: 8px; + spacing: 6px; +} + .ctc-ctl { border-radius: 9px; padding: 4px 8px; @@ -98,6 +102,23 @@ padding: 2px 8px; } +/* Small top-right refresh button. Inherits the card fg colour so it stays + * legible on any schedule; the hover/focus chip mirrors .ctc-ctl. */ +.ctc-refresh { + border-radius: 6px; + padding: 2px; + color: inherit; + transition-duration: 150ms; +} + +.ctc-refresh:hover { + background-color: rgba(255, 255, 255, 0.18); +} + +.ctc-refresh:focus { + background-color: rgba(255, 255, 255, 0.28); +} + @media (max-width: 240px) { .ctc-card { border-radius: 6px; @@ -108,6 +129,8 @@ } .ctc-card-controls { padding: 2px; + } + .ctc-card-bottom { margin-top: 2px; } .ctc-ctl { diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/timezoneWidget.py b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/timezoneWidget.py new file mode 100644 index 000000000..6bdc761c3 --- /dev/null +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/timezoneWidget.py @@ -0,0 +1,287 @@ +#!/usr/bin/python3 +"""Filterable timezone chooser for Color Timer Clock settings. + +Cinnamon xlet-settings loads this via settings-schema.json: + type=custom, file=timezoneWidget.py, widget=TimezoneChooser +""" + +import os + +import gi +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, GLib + +from xapp.SettingsWidgets import SettingsWidget, SettingsLabel + +FALLBACK_ZONES = [ + "UTC", + "America/New_York", + "America/Chicago", + "America/Denver", + "America/Los_Angeles", + "America/Anchorage", + "America/Honolulu", + "America/Toronto", + "America/Mexico_City", + "America/Sao_Paulo", + "America/Argentina/Buenos_Aires", + "Europe/London", + "Europe/Paris", + "Europe/Berlin", + "Europe/Madrid", + "Europe/Rome", + "Europe/Moscow", + "Africa/Cairo", + "Africa/Johannesburg", + "Asia/Dubai", + "Asia/Kolkata", + "Asia/Shanghai", + "Asia/Singapore", + "Asia/Tokyo", + "Asia/Seoul", + "Australia/Sydney", + "Pacific/Auckland", +] + + +def _display_name(tz): + if not tz: + return "Local" + parts = str(tz).split("/") + return parts[-1].replace("_", " ") + + +def timezone_label(tz, empty_label="Local (system timezone)"): + if not tz: + return empty_label + pretty = _display_name(tz) + if pretty == tz: + return tz + return "%s (%s)" % (pretty, tz) + + +def list_iana_timezones(): + zones = [] + try: + from zoneinfo import available_timezones + zones = [ + z for z in available_timezones() + if z and z not in ("localtime",) + and not z.startswith("SystemV/") + and not z.startswith("Etc/") + ] + except Exception: + zones = [] + + if not zones: + zone_tab = "/usr/share/zoneinfo/zone.tab" + if os.path.isfile(zone_tab): + try: + with open(zone_tab, "r", encoding="utf-8", errors="replace") as handle: + for line in handle: + line = line.strip() + if not line or line.startswith("#"): + continue + parts = line.split("\t") + if len(parts) >= 3: + zones.append(parts[2]) + except OSError: + zones = [] + + if not zones: + zones = list(FALLBACK_ZONES) + + seen = set() + out = [] + for zone in sorted(zones): + if zone in seen: + continue + seen.add(zone) + out.append(zone) + if "UTC" not in seen: + out.insert(0, "UTC") + return out + + +def filter_timezones(zones, query): + if not query: + return list(zones) + q = query.strip().lower() + if not q: + return list(zones) + hits = [] + for tz in zones: + blob = " ".join([ + str(tz), + str(tz).replace("_", " "), + _display_name(tz), + timezone_label(tz), + ]).lower() + if q in blob: + hits.append(tz) + return hits + + +class TimezoneChooser(SettingsWidget): + """Searchable timezone list bound to a string settings key. + + Empty string means the desklet should use the system local timezone. + Extra schema keys: + empty-label - row text for the empty/local option + """ + + bind_dir = None + + def __init__(self, info, key, settings): + super(TimezoneChooser, self).__init__() + self.set_orientation(Gtk.Orientation.VERTICAL) + self.set_spacing(8) + self.fill_row() + + self.settings = settings + self.key = key + self._saving = False + self.empty_label = info.get("empty-label", "Local (system timezone)") + self._zones = [""] + list_iana_timezones() + + header = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=12) + self.label = SettingsLabel(info.get("description", "Timezone")) + header.pack_start(self.label, False, False, 0) + self.pack_start(header, False, False, 0) + + self.search = Gtk.SearchEntry() + self.search.set_placeholder_text("Search city or region") + self.search.connect("search-changed", self._on_query_changed) + self.search.connect("activate", self._on_search_activate) + self.pack_start(self.search, False, False, 0) + + self.store = Gtk.ListStore(str, str) + self.tree = Gtk.TreeView(model=self.store) + self.tree.set_headers_visible(False) + self.tree.set_search_column(-1) + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn("Timezone", renderer, text=1) + self.tree.append_column(column) + self.tree.get_selection().connect("changed", self._on_selection_changed) + + scroll = Gtk.ScrolledWindow() + scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + scroll.set_min_content_height(180) + scroll.set_shadow_type(Gtk.ShadowType.IN) + scroll.add(self.tree) + self.pack_start(scroll, True, True, 0) + + self.selected = Gtk.Label(xalign=0) + self.selected.set_line_wrap(True) + self.selected.get_style_context().add_class("dim-label") + self.pack_start(self.selected, False, False, 0) + + if info.get("tooltip"): + self.set_tooltip_text(info["tooltip"]) + self.search.set_tooltip_text(info["tooltip"]) + + self._rebuild_list("") + try: + self.settings.listen(self.key, self._on_setting) + except Exception: + pass + self._load_from_settings() + + def _on_setting(self, *args): + if self._saving: + return + self._load_from_settings() + + def _load_from_settings(self): + try: + value = self.settings.get_value(self.key) + except Exception: + value = "" + if value is None: + value = "" + value = str(value).strip() + if value.lower() == "local": + value = "" + self._select_timezone(value, write=False) + + def _visible_zones(self, query): + empty = [""] + zones = [z for z in self._zones if z] + return empty + filter_timezones(zones, query) + + def _rebuild_list(self, query, keep_tz=None): + selection = self.tree.get_selection() + self._updating = True + try: + self.store.clear() + for tz in self._visible_zones(query): + self.store.append([tz, timezone_label(tz, self.empty_label)]) + finally: + self._updating = False + if keep_tz is not None: + self._select_timezone(keep_tz, write=False) + + def _on_query_changed(self, *args): + current = self._current_value() + self._rebuild_list(self.search.get_text(), keep_tz=current) + + def _on_search_activate(self, *args): + if len(self.store) > 0: + self.tree.set_cursor(Gtk.TreePath.new_first()) + tz = self.store[0][0] + self._select_timezone(tz, write=True) + + def _on_selection_changed(self, selection): + if getattr(self, "_updating", False): + return + model, row = selection.get_selected() + if row is None: + return + self._select_timezone(model[row][0], write=True) + + def _current_value(self): + try: + value = self.settings.get_value(self.key) + except Exception: + value = "" + value = "" if value is None else str(value).strip() + if value.lower() == "local": + return "" + return value + + def _select_timezone(self, tz, write=True): + tz = "" if tz is None else str(tz).strip() + if tz.lower() == "local": + tz = "" + self._updating = True + try: + found = False + for i, row in enumerate(self.store): + if row[0] == tz: + self.tree.get_selection().select_iter(row.iter) + self.tree.scroll_to_cell(Gtk.TreePath.new_from_indices([i])) + found = True + break + if not found and tz: + self.store.prepend([tz, timezone_label(tz, self.empty_label)]) + self.tree.get_selection().select_iter(self.store.get_iter_first()) + finally: + self._updating = False + + self.selected.set_text("Selected: %s" % timezone_label(tz, self.empty_label)) + if write: + self._write(tz) + + def _write(self, tz): + current = self._current_value() + if tz == current: + return + self._saving = True + try: + self.settings.set_value(self.key, tz) + finally: + GLib.idle_add(self._clear_saving) + + def _clear_saving(self): + self._saving = False + return False From 353dadfd4768ced2b2991e295cc88592218c3796 Mon Sep 17 00:00:00 2001 From: RobertAlexanderH Date: Wed, 26 Aug 2026 18:08:15 -0700 Subject: [PATCH 3/4] Color Timer Clock: update --- .../LICENSE | 6 +- .../README.md | 25 +- .../cardActions.js | 87 ++-- .../desklet.js | 432 +++++++++++------- .../metadata.json | 2 +- ...color-timer-clock-desklet@curbsoftware.pot | 84 +++- .../settings-schema.json | 7 +- .../stylesheet.css | 129 ++++-- .../screenshot.png | Bin 61036 -> 24013 bytes .../screenshots/color-timer-clock-config.webp | Bin 0 -> 165114 bytes .../color-timer-clock-desklet.webp | Bin 0 -> 111364 bytes 11 files changed, 501 insertions(+), 271 deletions(-) create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/screenshots/color-timer-clock-config.webp create mode 100644 cinnamon-color-timer-clock-desklet@curbsoftware/screenshots/color-timer-clock-desklet.webp diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE b/cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE index 87a4d7b50..d8ae41ca1 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/LICENSE @@ -1,12 +1,12 @@ -World Clock Desklet is free software: you can redistribute it and/or modify it +Color Timer Clock Desklet is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. Copyright (C) 2026 CurbSoftware -World Clock Desklet is derived from TimeAndDate@nightflame, which is -distributed under the GNU General Public License version 2. +Its responsive sizing helpers are derived from World Clock Desklet and remain +under the GNU General Public License version 2 or later. The complete text of the GNU General Public License version 2 follows. diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/README.md b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md index 8aff3e984..f3194a26c 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/README.md +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md @@ -2,7 +2,11 @@ A Cinnamon desklet with three cards (**Clock**, **Timer** and **Chronometer**) whose background colors follow a schedule you define. Each card's color ramps between (time, color) stops: the clock by time of day wrapping over midnight, the timer by time remaining, the chronometer by time elapsed. -![Color Timer Clock desklet](screenshot.png) +![Color Timer Clock desklet](screenshots/color-timer-clock-desklet.webp) + +The settings window: + +![Color Timer Clock settings](screenshots/color-timer-clock-config.webp) ## Why this exists @@ -16,7 +20,7 @@ One glance tells me the state of things. That's the whole idea. ## Features -- Up to three side-by-side cards; show or hide each one +- Up to three responsive cards. Narrow widths wrap cards onto centered rows and add enough height instead of hiding or clipping cards - Per-card color schedules with smooth (interpolated) or stepped transitions - Clock card with an optional IANA timezone - Timer with on-card play/pause, reset and ±60 s buttons; survives restarts and expires correctly even after downtime @@ -24,29 +28,30 @@ One glance tells me the state of things. That's the whole idea. - Optional notifications when the clock or chronometer reaches a schedule stop - Chronometer with pause/resume; the accumulated time survives restarts, and an optional hundredths display (20 updates/s while running) - Text and border colors adapt to the card background for readability (WCAG contrast ratio) -- Tooltips on every card control -- A per-card refresh button to reload settings without interrupting a running timer or chronometer -- A next-colour swatch on each card that previews the upcoming schedule colour +- Keyboard focus, pressed states, accessible names and tooltips on every card control +- One **Reload color schedules** desklet menu action that does not interrupt a running timer or chronometer +- A labelled **Next** preview chip on each card, with a 20 px double-ring colour sample and the upcoming stop details in its tooltip +- A clear setup message when every card is disabled - One-click "Reset all schedules to defaults" ## Configuration -Right-click the desklet → **Configure…** +Right-click the desklet and choose **Configure**. -- **Color schedules**: a list of (time, color) stops per card. Colors are hex (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`) or a name (`red`, `blue`, …). Duplicate times keep the last row; invalid rows are dropped with a log line +- **Color schedules**: a list of (time, color) stops per card. Colors are hex (`#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`) or a name such as `red` or `blue`. Duplicate times keep the last row; invalid rows are dropped with a log line - **Smooth color transitions**: blend gradually between stops, or hold each color and jump at the next stop - **Show a notification when the timer finishes**: pops a desktop notification when the countdown reaches zero - **Notify (per schedule row)**: tick a clock or chronometer schedule row's Notify checkbox to pop a notification when that time is reached - **Timer minutes / seconds**: the default duration the timer restarts from -- **Refresh (per card)**: the small button in each card's top-right corner reloads that card's settings without restarting a running timer or chronometer -- **Next-colour swatch (per card)**: the small circle in each card's bottom-right corner previews the next schedule colour and snaps to it at the breakpoint +- **Reload color schedules**: the desklet menu action reloads all three schedules without restarting a running timer or chronometer +- **Next colour (per card)**: the labelled footer chip previews the next schedule colour. Hover its colour sample for the stop time and exact colour value - **Show hundredths of a second**: adds a `.ss` fraction to the chronometer while it runs - **Time / date format**: `strftime` patterns for the clock card - **Maximum font sizes, card spacing, desklet width / height**: cards shrink text to fit ## Notes -Colors interpolate piecewise-linearly in RGB, so a red→blue ramp passes through purple. The clock schedule wraps over midnight; timer and chronometer schedules hold the last stop's color beyond it. Cards share the desklet width and each needs about 130 px. When the width cannot fit them all, the chronometer and then the timer hide automatically (a note is logged) and return when the desklet is widened. +Colors interpolate piecewise-linearly in RGB, so a red to blue ramp passes through purple. The clock schedule wraps over midnight; timer and chronometer schedules hold the last stop's color beyond it. Cards share the desklet width and wrap onto more rows when each card would otherwise become too narrow. Enabled cards never disappear because of desklet width. UUID: `cinnamon-color-timer-clock-desklet@curbsoftware` diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js index 6ba99a9fc..4a71f8a9b 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/cardActions.js @@ -261,19 +261,17 @@ function thresholdsCrossed(prev, cur, times, wrap) { } /** - * nextColor: + * nextStop: * @stops (array): normalised stops [{t, rgba}], any order * @pos (number): query position in seconds * @opts (object): { wrap, reverse }. wrap treats the position as circular * (clock); reverse walks the schedule backwards (timer counting down). * - * Returns (array): the colour of the next stop in the direction of travel, or - * null when there are no stops. A forward schedule returns the first stop - * above @pos (wrapping to the first past the end when @opts.wrap, else holding - * the last stop); a reverse schedule returns the first stop below @pos, - * falling back to the lowest stop at or past the end. + * Returns (object): a fresh {t, rgba} for the next stop in the direction of + * travel, or null when no stop remains. Wrapped schedules always have a next + * stop. This gives the desklet both the preview colour and its schedule time. */ -function nextColor(stops, pos, opts) { +function nextStop(stops, pos, opts) { opts = opts || {}; let list = []; @@ -294,24 +292,27 @@ function nextColor(stops, pos, opts) { if (opts.wrap) q = ((q % DAY_SECONDS) + DAY_SECONDS) % DAY_SECONDS; - if (list.length === 1) - return list[0].rgba.slice(); - if (opts.reverse) { for (let i = list.length - 1; i >= 0; i--) { if (list[i].t < q) - return list[i].rgba.slice(); + return { t: list[i].t, rgba: list[i].rgba.slice() }; } - return list[0].rgba.slice(); + return null; } for (let i = 0; i < list.length; i++) { if (list[i].t > q) - return list[i].rgba.slice(); + return { t: list[i].t, rgba: list[i].rgba.slice() }; } if (opts.wrap) - return list[0].rgba.slice(); - return list[list.length - 1].rgba.slice(); + return { t: list[0].t, rgba: list[0].rgba.slice() }; + return null; +} + +/* Compatibility helper for callers that only need the preview colour. */ +function nextColor(stops, pos, opts) { + let stop = nextStop(stops, pos, opts); + return stop ? stop.rgba : null; } /* ------------------------------------------------------------------ * @@ -571,37 +572,59 @@ var CARD_LAYOUT = { dateEm: 0.58, labelEm: 0.56, addMaxPt: 16, - /* A card cannot shrink below its control pill; fitKinds() hides cards - * rather than let the grid overflow the container below this. */ - minCardWidth: 120 + /* Timer controls and the labelled next-colour chip share one footer. */ + minCardWidth: 250, + /* Title, value, subtitle and control row need this much card height. */ + minCardHeight: 124 }; /** - * fitKinds: - * @kinds (array): visible card kinds from the settings checkboxes, in - * build order (clock, timer, chrono) + * computeResponsiveGrid: + * @cardCount (number): count of enabled cards * @width (number): desklet width setting (px) * @spacing (number): card spacing setting (px, used as per-card margin) * - * Returns (array): the kinds that fit. Cards drop from the end - the - * chronometer first, then the timer - because the clock is the anchor; - * one card always survives so the desklet never renders empty. Widening - * restores the hidden cards on the next rebuild; the settings checkboxes - * remain the source of truth. + * Returns (object): { rows, cols }. Every enabled card gets a cell. Narrow + * widths reduce the column count and add rows instead of hiding cards. */ -function fitKinds(kinds, width, spacing) { - let list = Array.isArray(kinds) ? kinds.slice() : []; +function computeResponsiveGrid(cardCount, width, spacing) { + let count = parseInt(cardCount, 10); + if (!Number.isFinite(count) || count < 1) + return { rows: 0, cols: 0 }; let w = Number(width); if (!Number.isFinite(w) || w <= 0) w = 840; let gap = Number(spacing); if (!Number.isFinite(gap) || gap < 0) gap = 0; + const available = Math.max(1, w - 2 * CARD_LAYOUT.containerPad); const min = CARD_LAYOUT.minCardWidth + 2 * gap; - while (list.length > 1 && - list.length * min + 2 * CARD_LAYOUT.containerPad > w) - list.pop(); - return list; + const cols = Math.max(1, Math.min(count, Math.floor(available / min))); + return { rows: Math.ceil(count / cols), cols: cols }; +} + +/** + * computeResponsiveHeight: + * @rows (number): responsive row count + * @height (number): configured desklet height + * @spacing (number): per-card margin + * + * Returns (number): configured height or safe row-dependent minimum, + * whichever is larger. + */ +function computeResponsiveHeight(rows, height, spacing) { + let count = parseInt(rows, 10); + if (!Number.isFinite(count) || count < 1) + count = 1; + let base = Number(height); + if (!Number.isFinite(base) || base <= 0) + base = 260; + let gap = Number(spacing); + if (!Number.isFinite(gap) || gap < 0) + gap = 0; + const safe = count * (CARD_LAYOUT.minCardHeight + 2 * gap) + + 2 * CARD_LAYOUT.containerPad; + return Math.max(base, safe); } function _toPositiveInt(value, fallback) { diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js index 180b4a95e..4e939216c 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/desklet.js @@ -130,15 +130,56 @@ function _centerLabelText(label) { } catch (e) {} } -function _actorWidth(actor) { - try { - if (!actor || !actor.get_allocation_box) - return 0; - const box = actor.get_allocation_box(); - return Math.max(0, box.x2 - box.x1); - } catch (e) { - return 0; +/* ReloadXlet refreshes desklet.js but GJS can retain an older imported + * cardActions module. Keep small fallbacks here so a helper cache never + * disables responsive layout or next-stop metadata until Cinnamon restarts. */ +function _responsiveGrid(cardCount, width, spacing) { + if (CardActions && typeof CardActions.computeResponsiveGrid === "function" && + CardActions.CARD_LAYOUT && CardActions.CARD_LAYOUT.minCardWidth >= 250) + return CardActions.computeResponsiveGrid(cardCount, width, spacing); + const count = Math.max(1, parseInt(cardCount, 10) || 1); + const deskletWidth = Number(width) > 0 ? Number(width) : 840; + const gap = Math.max(0, Number(spacing) || 0); + const available = Math.max(1, deskletWidth - 8); + const cols = Math.max(1, Math.min(count, Math.floor(available / (250 + 2 * gap)))); + return { rows: Math.ceil(count / cols), cols: cols }; +} + +function _responsiveHeight(rows, height, spacing) { + if (CardActions && typeof CardActions.computeResponsiveHeight === "function") + return CardActions.computeResponsiveHeight(rows, height, spacing); + const count = Math.max(1, parseInt(rows, 10) || 1); + const base = Number(height) > 0 ? Number(height) : 260; + const gap = Math.max(0, Number(spacing) || 0); + return Math.max(base, count * (124 + 2 * gap) + 8); +} + +function _nextScheduleStop(stops, pos, opts) { + if (CardActions && typeof CardActions.nextStop === "function") + return CardActions.nextStop(stops, pos, opts); + opts = opts || {}; + const list = Array.isArray(stops) ? stops.filter(function (stop) { + return stop && Number.isFinite(stop.t) && Array.isArray(stop.rgba); + }).slice().sort(function (a, b) { return a.t - b.t; }) : []; + if (list.length === 0) + return null; + let q = Number(pos); + if (!Number.isFinite(q)) + q = 0; + if (opts.wrap) + q = ((q % 86400) + 86400) % 86400; + if (opts.reverse) { + for (let i = list.length - 1; i >= 0; i--) { + if (list[i].t < q) + return { t: list[i].t, rgba: list[i].rgba.slice() }; + } + return null; + } + for (let i = 0; i < list.length; i++) { + if (list[i].t > q) + return { t: list[i].t, rgba: list[i].rgba.slice() }; } + return opts.wrap ? { t: list[0].t, rgba: list[0].rgba.slice() } : null; } function CardWidget(kind, desklet) { @@ -174,27 +215,28 @@ CardWidget.prototype = { _centerLabelText(this._value); _centerLabelText(this._sub); - /* Labels live in an expanding body box: the text block centers in - * the space above the controls, and the controls pill anchors to - * the card bottom. The clock card carries a ghost pill (same - * height, invisible, inert) so all cards share one baseline grid. - * Time/date stay at natural width so BoxLayout can center them; - * stretching those labels with set_width left-aligns the glyphs. */ - this._refreshButton = this._refreshCtl(); - /* Header row at the card top: the title centers in the flexible space - * and a small refresh button pins to the top-right corner. */ - this._header = new St.BoxLayout(); - this._header.add(this._title, { expand: true, x_fill: true, x_align: St.Align.MIDDLE, y_align: St.Align.START }); - this._header.add(this._refreshButton, { x_fill: false, x_align: St.Align.END, y_align: St.Align.START }); - this.actor.add(this._header, { x_fill: true, y_fill: false, x_align: St.Align.MIDDLE, y_align: St.Align.START }); - + /* Keep title, value and subtitle as one centered reading group. This + * avoids a title stranded at the top and a large empty pocket below + * the value on taller cards. The footer remains anchored at bottom. */ + this._content = new St.BoxLayout({ + vertical: true, + style_class: "ctc-card-content" + }); + this._content.add(this._title, { + x_fill: true, + x_align: St.Align.MIDDLE + }); this._body = new St.BoxLayout({ vertical: true, style_class: "ctc-card-body" }); this._body.add(this._value, { x_fill: false, x_align: St.Align.MIDDLE }); this._body.add(this._sub, { x_fill: false, x_align: St.Align.MIDDLE }); - this.actor.add(this._body, { + this._content.add(this._body, { + x_fill: true, + x_align: St.Align.MIDDLE + }); + this.actor.add(this._content, { expand: true, x_fill: true, y_fill: false, @@ -202,14 +244,33 @@ CardWidget.prototype = { y_align: St.Align.MIDDLE }); - this._swatch = new St.DrawingArea(); - this._swatch.set_width(12); - this._swatch.set_height(12); + this._swatch = new St.DrawingArea({ reactive: true }); + this._swatch.set_width(20); + this._swatch.set_height(20); this._swatchColor = null; this._swatch.connect("repaint", () => this._paintSwatch()); + this._swatchTooltip = new Tooltips.Tooltip(this._swatch, ""); + this._nextLabel = new St.Label({ + text: _("Next"), + style_class: "ctc-next-label", + reactive: false + }); + this._nextPreview = new St.BoxLayout({ + style_class: "ctc-next-preview", + reactive: false + }); + this._nextPreview.add(this._nextLabel, { + x_fill: false, + x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE + }); + this._nextPreview.add(this._swatch, { + x_fill: false, + y_fill: false, + x_align: St.Align.END, + y_align: St.Align.MIDDLE + }); this._buildControls(); - if (kind === "clock") - this._ghostControls(); /* The card's whole inline style (margin + colours + transition) is * owned here, so every part must go through one string; a separate @@ -227,40 +288,42 @@ CardWidget.prototype = { * colour the schedule paints the card. Plain St.Buttons on the card * itself - no PopupMenu, so no grab/teardown bug class and no need * to defer the handlers. Tooltips self-destroy with their button. */ - this._controls = new St.BoxLayout({ style_class: "ctc-card-controls" }); this._ctlButtons = []; - this._playButton = this._ctlButton("media-playback-start", "toggle", false, _("Start")); - this._controls.add(this._playButton); + if (this.kind === "clock") { + this._controls = new St.Bin({ + style_class: "ctc-card-controls-spacer", + reactive: false, + can_focus: false + }); + } else { + this._controls = new St.BoxLayout({ style_class: "ctc-card-controls" }); + + this._playButton = this._ctlButton("media-playback-start", "toggle", false, _("Start")); + this._controls.add(this._playButton); - this._controls.add(this._ctlButton("view-refresh", "reset", false, _("Reset"))); + this._controls.add(this._ctlButton("view-refresh", "reset", false, _("Reset"))); - if (this.kind === "timer") { - this._minusButton = this._ctlButton("list-remove", "minus", true, _("-1 minute")); - this._plusButton = this._ctlButton("list-add", "plus", true, _("+1 minute")); - this._controls.add(this._minusButton); - this._controls.add(this._plusButton); + if (this.kind === "timer") { + this._minusButton = this._ctlButton("list-remove", "minus", true, _("-1 minute")); + this._plusButton = this._ctlButton("list-add", "plus", true, _("+1 minute")); + this._controls.add(this._minusButton); + this._controls.add(this._plusButton); + } } - /* Bottom row: controls centered, next-colour swatch at bottom-right. */ + /* Every card shares one intentional footer: controls stay centered + * and the labelled next-colour chip always lands at bottom-right. */ const bottom = new St.BoxLayout({ style_class: "ctc-card-bottom" }); bottom.add(this._controls, { expand: true, x_fill: false, x_align: St.Align.MIDDLE }); - bottom.add(this._swatch, { x_fill: false, x_align: St.Align.END, y_align: St.Align.MIDDLE }); + bottom.add(this._nextPreview, { + x_fill: false, + x_align: St.Align.END, + y_align: St.Align.MIDDLE + }); this.actor.add(bottom, { x_fill: true, y_fill: false, x_align: St.Align.MIDDLE, y_align: St.Align.END }); }, - /* Reserve, don't show: the ghost keeps the clock card's geometry - * identical to the timer/chrono cards (same pill height in any theme - * or @media variant) without offering any controls. */ - _ghostControls: function () { - this._controls.set_opacity(0); - this._controls.reactive = false; - for (let i = 0; i < this._ctlButtons.length; i++) { - this._ctlButtons[i].reactive = false; - this._ctlButtons[i].can_focus = false; - } - }, - _ctlButton: function (iconName, action, small, tipText) { const icon = new St.Icon({ icon_name: iconName, @@ -276,18 +339,8 @@ CardWidget.prototype = { button.connect("clicked", () => { this.desklet._onControl(this.kind, action); }); - button.connect("button-press-event", () => { - if (this.desklet._draggable) - this.desklet._draggable.inhibit = true; - return Clutter.EVENT_PROPAGATE; - }); - button.connect("button-release-event", () => { - if (this.desklet._draggable) { - this.desklet._draggable.inhibit = false; - this.desklet._draggable.fakeRelease(); - } - return Clutter.EVENT_PROPAGATE; - }); + if (tipText && button.set_accessible_name) + button.set_accessible_name(tipText); if (tipText) { const tip = new Tooltips.Tooltip(button, tipText); if (iconName === "media-playback-start") @@ -298,38 +351,6 @@ CardWidget.prototype = { return button; }, - /* Small top-right refresh button: reloads this card's settings in place - * without rebuilding the desklet, so a running timer keeps ticking. */ - _refreshCtl: function () { - const icon = new St.Icon({ - icon_name: "view-refresh", - icon_type: St.IconType.SYMBOLIC, - icon_size: 14 - }); - const button = new St.Button({ - style_class: "ctc-refresh", - can_focus: true - }); - button.set_child(icon); - button.connect("clicked", () => { - this.desklet._onRefresh(); - }); - button.connect("button-press-event", () => { - if (this.desklet._draggable) - this.desklet._draggable.inhibit = true; - return Clutter.EVENT_PROPAGATE; - }); - button.connect("button-release-event", () => { - if (this.desklet._draggable) { - this.desklet._draggable.inhibit = false; - this.desklet._draggable.fakeRelease(); - } - return Clutter.EVENT_PROPAGATE; - }); - new Tooltips.Tooltip(button, _("Refresh")); - return button; - }, - /* Margin is part of the inline style the card owns, so changing it just * invalidates the style cache; the next _applyColors writes both. */ setSpacing: function (px) { @@ -344,6 +365,8 @@ CardWidget.prototype = { : "media-playback-start"; if (this._playTooltip && this._playTooltip.set_text) this._playTooltip.set_text(isRunning ? _("Pause") : _("Start")); + if (this._playButton && this._playButton.set_accessible_name) + this._playButton.set_accessible_name(isRunning ? _("Pause") : _("Start")); }, /* The +/-60 s buttons exist only on the timer card and are reachable @@ -386,10 +409,10 @@ CardWidget.prototype = { * @rgba (array): [r, g, b, a] from evaluate(), or null when the card has * no schedule stops (stylesheet default colours then apply) * @smooth (boolean): animate towards this colour over 1000 ms - * @nextRgba (array): the next stop's colour for the solid preview swatch, - * or null when there is no schedule + * @nextStop (object): the next {t, rgba} schedule stop, or null when no + * stop remains in the direction of travel */ - update: function (now, rgba, smooth, nextRgba) { + update: function (now, rgba, smooth, nextStop) { if (this.kind === "clock") this._updateClock(now); else if (this.kind === "timer") @@ -397,20 +420,37 @@ CardWidget.prototype = { else this._updateChrono(now); this._applyColors(rgba, smooth); - this._updateSwatch(nextRgba); + this._updateSwatch(nextStop); }, - /* Solid next-colour preview: the swatch repaints in one flat fill, so it - * snaps to each stop's colour at the breakpoint instead of fading. */ - _updateSwatch: function (nextRgba) { + /* Solid next-colour preview. Tooltip identifies exact stop and colour. */ + _updateSwatch: function (nextStop) { if (!this._swatch) return; - if (!nextRgba) { - this._swatch.hide(); + if (!nextStop || !Array.isArray(nextStop.rgba)) { + this._nextPreview.hide(); return; } + this._nextPreview.show(); this._swatch.show(); - this._swatchColor = nextRgba; + this._swatchColor = nextStop.rgba; + const color = CardActions.rgbaToKey(nextStop.rgba); + let text; + if (this.kind === "clock") { + const h = Math.floor(nextStop.t / 3600); + const m = Math.floor((nextStop.t % 3600) / 60); + text = _("Next color at %s: %s").format(_pad2(h) + ":" + _pad2(m), color); + } else if (this.kind === "timer") { + text = _("Next color at %s remaining: %s").format( + _formatDuration(nextStop.t * 1000, false, false), color); + } else { + text = _("Next color at %s elapsed: %s").format( + _formatDuration(nextStop.t * 1000, false, false), color); + } + if (this._swatchTooltip && this._swatchTooltip.set_text) + this._swatchTooltip.set_text(text); + if (this._swatch.set_accessible_name) + this._swatch.set_accessible_name(text); this._swatch.queue_repaint(); }, @@ -422,7 +462,7 @@ CardWidget.prototype = { if (!cr) return; const [w, h] = area.get_surface_size(); - const r = Math.min(w, h) / 2 - 0.5; + const r = Math.min(w, h) / 2 - 1; const cx = w / 2; const cy = h / 2; @@ -433,12 +473,19 @@ CardWidget.prototype = { const c = this._swatchColor; if (c) { cr.setSourceRGBA(c[0] / 255, c[1] / 255, c[2] / 255, c[3]); - cr.arc(cx, cy, r, 0, 2 * Math.PI); + cr.arc(cx, cy, Math.max(1, r - 2.5), 0, 2 * Math.PI); cr.fill(); - cr.setSourceRGBA(1, 1, 1, 0.35); - cr.setLineWidth(1); + + /* A dark outer ring and bright inner ring keep the chip crisp on + * both pale and dark schedule colours. */ + cr.setSourceRGBA(0, 0, 0, 0.78); + cr.setLineWidth(2); cr.arc(cx, cy, r, 0, 2 * Math.PI); cr.stroke(); + cr.setSourceRGBA(1, 1, 1, 0.88); + cr.setLineWidth(1.5); + cr.arc(cx, cy, Math.max(1, r - 2), 0, 2 * Math.PI); + cr.stroke(); } cr.$dispose(); @@ -535,7 +582,7 @@ CardWidget.prototype = { * (timer/chrono crossing an hour) triggers a refit. */ this._fitLen = texts.time.length; const maxSizes = { - time: Number(this.desklet.timeSize) || 48, + time: Number(this.desklet.timeSize) || 44, date: Number(this.desklet.dateSize) || 13, timezone: Number(this.desklet.labelSize) || 11 }; @@ -554,12 +601,8 @@ CardWidget.prototype = { _constrainTitleWidth: function (width) { try { - let w = _actorWidth(this._header); - if (!(w > 1)) - w = width; - w -= _actorWidth(this._refreshButton); - if (w > 1) - this._title.set_width(Math.max(1, Math.floor(w))); + if (width > 1) + this._title.set_width(Math.max(1, Math.floor(width))); } catch (e) {} }, @@ -650,6 +693,8 @@ MyDesklet.prototype = { this._allocW = -1; this._allocH = -1; this._cardInner = null; + this._gridDims = null; + this._layoutHeight = this.height || 260; this._widthSamples = null; this.mainContainer = new St.BoxLayout({ @@ -661,6 +706,7 @@ MyDesklet.prototype = { this.setContent(this.mainContainer); this.setHeader(_("Color Timer Clock")); + this._menu.addAction(_("Reload color schedules"), this._reloadSchedules.bind(this)); this._restoreState(); this._rebuildCards(); @@ -796,27 +842,36 @@ MyDesklet.prototype = { this._refreshSchedules(); this.mainContainer.destroy_all_children(); + this.mainContainer.remove_style_class_name("ctc-compact"); + this.mainContainer.remove_style_class_name("ctc-empty-container"); this._cards = []; - const wanted = this._visibleKinds(); - const kinds = CardActions - ? CardActions.fitKinds(wanted, this.width, this.cardSpacing) - : wanted; - if (kinds.length < wanted.length) - global.log(uuid + ": width " + (Number(this.width) || 840) + - "px is too small for " + wanted.length + " cards; hiding " + - wanted.slice(kinds.length).join(", ")); - /* Leave the table and cards non-reactive so the desklet actor - * receives the pointer grab. Cinnamon's DND then sees mouse-up - * and actually drops. A reactive child that forwards press - * (and a stage captured-event hook) left the grab stuck, so - * every desklet followed the cursor. Control St.Buttons stay - * reactive and inhibit drag while they are clicked. */ - const table = new St.Table({ - homogeneous: true, + const kinds = this._visibleKinds(); + if (kinds.length === 0) { + this._layoutHeight = Math.max(Number(this.height) || 260, 150); + this.mainContainer.set_height(this._layoutHeight); + this._showEmptyState(); + this._gridDims = { rows: 0, cols: 0 }; + this._cardInner = null; + this._widthSamples = null; + return; + } + + const dims = _responsiveGrid(kinds.length, this.width, this.cardSpacing); + this._gridDims = dims; + this._layoutHeight = _responsiveHeight(dims.rows, this.height, this.cardSpacing); + this.mainContainer.set_height(this._layoutHeight); + if (dims.rows > 1) + this.mainContainer.add_style_class_name("ctc-compact"); + + /* Card surfaces stay non-reactive so Cinnamon owns desklet DND. + * St.Button controls consume clicks through normal event flow. + * Never change private draggable state or synthesize release. */ + const grid = new St.BoxLayout({ + vertical: true, style_class: "ctc-grid" }); - this.mainContainer.add(table, { + this.mainContainer.add(grid, { expand: true, x_expand: true, y_expand: true, @@ -824,12 +879,40 @@ MyDesklet.prototype = { y_fill: true }); + const rowTables = []; + const availableWidth = Math.max(1, (Number(this.width) || 840) - 8); + for (let row = 0; row < dims.rows; row++) { + const rowStart = row * dims.cols; + const rowCount = Math.min(dims.cols, kinds.length - rowStart); + const rowTable = new St.Table({ + homogeneous: true, + style_class: "ctc-grid-row" + }); + rowTable.set_width(Math.floor(availableWidth * rowCount / dims.cols)); + const rowHost = new St.Bin({ + x_fill: false, + y_fill: true, + x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE + }); + rowHost.set_child(rowTable); + grid.add(rowHost, { + expand: true, + x_fill: true, + y_fill: true, + x_align: St.Align.MIDDLE + }); + rowTables.push(rowTable); + } + for (let i = 0; i < kinds.length; i++) { const widget = new CardWidget(kinds[i], this); widget.setSpacing(this.cardSpacing); - table.add(widget.actor, { + const row = Math.floor(i / dims.cols); + const indexInRow = i % dims.cols; + rowTables[row].add(widget.actor, { row: 0, - col: i, + col: indexInRow, x_expand: true, y_expand: true, x_fill: true, @@ -840,13 +923,49 @@ MyDesklet.prototype = { this._updateAll(); this._widthSamples = this._formatWidthSamples(); - this._cardInner = this._computeCardInnerSize(kinds.length); + this._cardInner = this._computeCardInnerSize(dims); this._scheduleFit(); } catch (e) { global.logError(uuid + " card rebuild failed: " + e); } }, + _showEmptyState: function () { + this.mainContainer.add_style_class_name("ctc-empty-container"); + const empty = new St.BoxLayout({ + vertical: true, + style_class: "ctc-empty" + }); + const icon = new St.Icon({ + icon_name: "preferences-system-symbolic", + icon_type: St.IconType.SYMBOLIC, + icon_size: 32, + style_class: "ctc-empty-icon" + }); + const title = new St.Label({ + text: _("No cards enabled"), + style_class: "ctc-empty-title" + }); + const help = new St.Label({ + text: _("Right-click and choose Configure to show a card."), + style_class: "ctc-empty-help" + }); + _centerLabelText(title); + _centerLabelText(help); + empty.add(icon, { x_fill: false, x_align: St.Align.MIDDLE }); + empty.add(title, { x_fill: true, x_align: St.Align.MIDDLE }); + empty.add(help, { x_fill: true, x_align: St.Align.MIDDLE }); + if (empty.set_accessible_name) + empty.set_accessible_name(_("No cards enabled. Open Configure to show a card.")); + this.mainContainer.add(empty, { + expand: true, + x_fill: false, + y_fill: false, + x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE + }); + }, + /* Normalised once per settings change (rebuild), never on the 1s tick. */ _refreshSchedules: function () { if (!CardActions) @@ -894,20 +1013,21 @@ MyDesklet.prototype = { } }, - /* Per-card refresh button: re-reads schedules and re-fits the existing - * cards in place, so changed settings show up without tearing down the - * widgets and interrupting a running timer or chronometer. */ - _onRefresh: function () { + /* Context-menu action: re-read all schedules without replacing widgets or + * interrupting a running timer or chronometer. */ + _reloadSchedules: function () { if (this._cleanedUp || !CardActions) return; try { this._refreshSchedules(); this._widthSamples = this._formatWidthSamples(); - this._cardInner = this._computeCardInnerSize(this._cards.length); - this._fitAllCards(this._cardInner); + if (this._cards.length > 0) { + this._cardInner = this._computeCardInnerSize(this._gridDims); + this._fitAllCards(this._cardInner); + } this._updateAll(); } catch (e) { - global.logError(uuid + " refresh failed: " + e); + global.logError(uuid + " schedule reload failed: " + e); } }, @@ -1199,7 +1319,7 @@ MyDesklet.prototype = { for (let i = 0; i < this._cards.length; i++) { const widget = this._cards[i]; const smooth = this._smoothFor(widget.kind); - let pos, rgba, nextRgba; + let pos, rgba, nextStop; if (widget.kind === "clock") { pos = clockParts.hours * 3600 + @@ -1209,28 +1329,22 @@ MyDesklet.prototype = { wrap: true, smooth: smooth }); - nextRgba = CardActions.nextColor - ? CardActions.nextColor(this._schedules.clock, pos, { wrap: true }) - : null; - widget.update(now, rgba, smooth, nextRgba); + nextStop = _nextScheduleStop(this._schedules.clock, pos, { wrap: true }); + widget.update(now, rgba, smooth, nextStop); } else if (widget.kind === "timer") { pos = this._timerRemainingMs(nowMs) / 1000; rgba = CardActions.evaluate(this._schedules.timer, pos, { smooth: smooth }); - nextRgba = CardActions.nextColor - ? CardActions.nextColor(this._schedules.timer, pos, { reverse: true }) - : null; - widget.update(now, rgba, smooth, nextRgba); + nextStop = _nextScheduleStop(this._schedules.timer, pos, { reverse: true }); + widget.update(now, rgba, smooth, nextStop); } else { pos = this._chronoElapsedMs(nowMs) / 1000; rgba = CardActions.evaluate(this._schedules.chrono, pos, { smooth: smooth }); - nextRgba = CardActions.nextColor - ? CardActions.nextColor(this._schedules.chrono, pos, {}) - : null; - widget.update(now, rgba, smooth, nextRgba); + nextStop = _nextScheduleStop(this._schedules.chrono, pos, {}); + widget.update(now, rgba, smooth, nextStop); } this._checkNotifyCrossing(widget.kind, pos); } @@ -1327,11 +1441,13 @@ MyDesklet.prototype = { * Font fitting * ------------------------------------------------------------------ */ - _computeCardInnerSize: function (cols) { + _computeCardInnerSize: function (dims) { if (!CardActions || !CardActions.computeCardInnerSize) return { width: 80, height: 80 }; + dims = dims || { rows: 1, cols: Math.max(1, this._cards.length) }; return CardActions.computeCardInnerSize( - this.width || 840, this.height || 260, 1, cols, this.cardSpacing); + this.width || 840, this._layoutHeight || this.height || 260, + Math.max(1, dims.rows), Math.max(1, dims.cols), this.cardSpacing); }, _formatWidthSamples: function () { diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json index 808d35005..870075cce 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/metadata.json @@ -2,7 +2,7 @@ "uuid": "cinnamon-color-timer-clock-desklet@curbsoftware", "name": "Color Timer Clock", "description": "Clock, countdown timer and chronometer cards whose background colors follow a schedule", - "version": "1.4.0", + "version": "1.6.0", "prevent-decorations": false, "max-instances": 1 } diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot index 9bf2b1189..3241d0170 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/po/cinnamon-color-timer-clock-desklet@curbsoftware.pot @@ -1,14 +1,14 @@ # COLOR TIMER CLOCK # This file is put in the public domain. -# RobertAlexanderH, 2026 +# RobertAlexanderH, 2017 # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: cinnamon-color-timer-clock-desklet@curbsoftware 1.4.0\n" +"Project-Id-Version: cinnamon-color-timer-clock-desklet@curbsoftware 1.6.0\n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2026-08-20 10:41-0700\n" +"POT-Creation-Date: 2026-08-26 18:07-0700\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -21,7 +21,7 @@ msgstr "" msgid "Clock" msgstr "" -#. desklet.js:85 desklet.js:469 +#. desklet.js:85 desklet.js:516 msgid "Timer" msgstr "" @@ -29,61 +29,92 @@ msgstr "" msgid "Chronometer" msgstr "" -#. desklet.js:233 desklet.js:346 +#. desklet.js:254 +msgid "Next" +msgstr "" + +#. desklet.js:302 desklet.js:367 desklet.js:369 msgid "Start" msgstr "" -#. desklet.js:236 +#. desklet.js:305 msgid "Reset" msgstr "" -#. desklet.js:239 +#. desklet.js:308 msgid "-1 minute" msgstr "" -#. desklet.js:240 +#. desklet.js:309 msgid "+1 minute" msgstr "" -#. desklet.js:329 -msgid "Refresh" +#. desklet.js:367 desklet.js:369 +msgid "Pause" msgstr "" -#. desklet.js:346 -msgid "Pause" +#. desklet.js:442 +#, javascript-format +msgid "Next color at %s: %s" +msgstr "" + +#. desklet.js:444 +#, javascript-format +msgid "Next color at %s remaining: %s" +msgstr "" + +#. desklet.js:447 +#, javascript-format +msgid "Next color at %s elapsed: %s" msgstr "" -#. desklet.js:464 +#. desklet.js:511 msgid "Time is up" msgstr "" -#. desklet.js:473 +#. desklet.js:520 msgid "Ready" msgstr "" -#. desklet.js:474 +#. desklet.js:521 msgid "Paused" msgstr "" #. metadata.json->name -#. desklet.js:663 +#. desklet.js:708 msgid "Color Timer Clock" msgstr "" -#. desklet.js:989 +#. desklet.js:709 +msgid "Reload color schedules" +msgstr "" + +#. desklet.js:946 +msgid "No cards enabled" +msgstr "" + +#. desklet.js:950 +msgid "Right-click and choose Configure to show a card." +msgstr "" + +#. desklet.js:959 +msgid "No cards enabled. Open Configure to show a card." +msgstr "" + +#. desklet.js:1109 msgid "Timer finished" msgstr "" -#. desklet.js:989 +#. desklet.js:1109 msgid "The timer reached zero." msgstr "" -#. desklet.js:1016 +#. desklet.js:1136 #, javascript-format msgid "It is now %s." msgstr "" -#. desklet.js:1018 +#. desklet.js:1138 #, javascript-format msgid "Reached %s." msgstr "" @@ -312,13 +343,18 @@ msgstr "" #. settings-schema.json->width->tooltip msgid "" -"Cards share the width. Each card needs about 130 px; when the width cannot " -"fit them all, the chronometer and then the timer hide automatically and come " -"back when you widen the desklet" +"Cards share the width and wrap onto more rows when needed. Every enabled " +"card stays visible" msgstr "" #. settings-schema.json->height->description -msgid "Desklet height" +msgid "Minimum desklet height" +msgstr "" + +#. settings-schema.json->height->tooltip +msgid "" +"Wrapped layouts grow taller when needed so card text and controls do not " +"overlap" msgstr "" #. settings-schema.json->reset-schedules->description diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json index f0e7c67f2..df2c9771f 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/settings-schema.json @@ -165,7 +165,7 @@ }, "time-size": { "type": "spinbutton", - "default": 48, + "default": 44, "min": 6, "max": 72, "step": 1, @@ -210,7 +210,7 @@ "step": 20, "units": "px", "description": "Desklet width", - "tooltip": "Cards share the width. Each card needs about 130 px; when the width cannot fit them all, the chronometer and then the timer hide automatically and come back when you widen the desklet" + "tooltip": "Cards share the width and wrap onto more rows when needed. Every enabled card stays visible" }, "height": { "type": "spinbutton", @@ -219,7 +219,8 @@ "max": 2000, "step": 20, "units": "px", - "description": "Desklet height" + "description": "Minimum desklet height", + "tooltip": "Wrapped layouts grow taller when needed so card text and controls do not overlap" }, "reset-schedules": { diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css index 2358b30cf..7850b6e1b 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware/stylesheet.css @@ -43,6 +43,10 @@ spacing: 2px; } +.ctc-card-content { + spacing: 6px; +} + .ctc-card-title { color: inherit; font-weight: 600; @@ -64,20 +68,50 @@ /* Controls pill is a FIXED dark chip, independent of the schedule colour, * so the white symbolic icons stay legible on any card background. */ .ctc-card-controls { - background-color: rgba(0, 0, 0, 0.35); + background-color: rgba(10, 14, 18, 0.74); + border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 12px; - padding: 3px; - spacing: 4px; + padding: 3px 1px; + spacing: 2px; +} + +.ctc-card-controls-spacer { + min-width: 72px; + min-height: 36px; } .ctc-card-bottom { - margin-top: 8px; - spacing: 6px; + min-height: 38px; + margin-top: 5px; + padding: 3px 1px; + spacing: 2px; + border-radius: 14px; + border: 1px solid rgba(255, 255, 255, 0.13); + background-color: rgba(10, 14, 18, 0.24); +} + +.ctc-next-preview { + spacing: 2px; + padding: 2px; + border-radius: 11px; + border: 1px solid rgba(255, 255, 255, 0.24); + background-color: rgba(10, 14, 18, 0.78); + color: white; +} + +.ctc-next-label { + min-width: 25px; + color: inherit; + font-size: 8.5pt; + font-weight: 600; } .ctc-ctl { border-radius: 9px; - padding: 4px 8px; + border: 1px solid transparent; + min-width: 28px; + min-height: 28px; + padding: 0 4px; color: white; transition-duration: 150ms; } @@ -88,55 +122,70 @@ .ctc-ctl:focus { background-color: rgba(255, 255, 255, 0.28); + border-color: rgba(255, 255, 255, 0.9); +} + +.ctc-ctl:active { + background-color: rgba(255, 255, 255, 0.38); } /* Inert +/- buttons while the timer runs: visible, unambiguous, but clearly * not clickable - and the pill keeps one width in every state. */ .ctc-ctl:dim { - color: rgba(255, 255, 255, 0.4); + color: rgba(255, 255, 255, 0.52); } -/* Same horizontal padding as .ctc-ctl so all glyph centers in the row - * sit on one rhythm; only the height is slimmer. */ .ctc-ctl-small { - padding: 2px 8px; + padding: 0 3px; +} + +.ctc-empty-container { + min-width: 260px; + min-height: 150px; +} + +.ctc-empty { + spacing: 8px; + padding: 20px 24px; + color: rgba(255, 255, 255, 0.92); } -/* Small top-right refresh button. Inherits the card fg colour so it stays - * legible on any schedule; the hover/focus chip mirrors .ctc-ctl. */ -.ctc-refresh { +.ctc-empty-icon { + color: rgba(255, 255, 255, 0.72); +} + +.ctc-empty-title { + font-size: 15pt; + font-weight: 600; + text-align: center; +} + +.ctc-empty-help { + color: rgba(255, 255, 255, 0.72); + text-align: center; +} + +/* Cinnamon's St theme parser does not implement CSS media queries. Code + * applies this class whenever cards wrap onto more than one row. */ +.ctc-compact .ctc-card { border-radius: 6px; - padding: 2px; - color: inherit; - transition-duration: 150ms; + padding: 3px 5px; } -.ctc-refresh:hover { - background-color: rgba(255, 255, 255, 0.18); +.ctc-compact .ctc-card-controls { + padding: 2px 1px; } -.ctc-refresh:focus { - background-color: rgba(255, 255, 255, 0.28); +.ctc-compact .ctc-card-bottom { + min-height: 36px; + margin-top: 2px; + padding: 2px; +} + +.ctc-compact .ctc-card-content { + spacing: 3px; } -@media (max-width: 240px) { - .ctc-card { - border-radius: 6px; - padding: 2px 4px; - } - .ctc-card-value { - font-weight: 600; - } - .ctc-card-controls { - padding: 2px; - } - .ctc-card-bottom { - margin-top: 2px; - } - .ctc-ctl { - padding: 2px 4px; - } - .ctc-ctl-small { - padding: 2px 4px; - } +.ctc-compact .ctc-next-preview { + padding: 1px 3px; } diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/screenshot.png b/cinnamon-color-timer-clock-desklet@curbsoftware/screenshot.png index 9b5ab16a88a2eb5a7c7abe890a9a827bbc5237a8..c985b37fe8256ee79ffbced37fface3f24a9997b 100644 GIT binary patch literal 24013 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 literal 61036 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 D+lR)j diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/screenshots/color-timer-clock-config.webp b/cinnamon-color-timer-clock-desklet@curbsoftware/screenshots/color-timer-clock-config.webp new file mode 100644 index 0000000000000000000000000000000000000000..af37d2823fe6a3f0f021ecce4e760cfca5bf5bd3 GIT binary patch literal 165114 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 literal 0 HcmV?d00001 diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/screenshots/color-timer-clock-desklet.webp b/cinnamon-color-timer-clock-desklet@curbsoftware/screenshots/color-timer-clock-desklet.webp new file mode 100644 index 0000000000000000000000000000000000000000..79a74aea1744753f760a0df7a92b8b510f8b2dc8 GIT binary patch literal 111364 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�SvZUS_VFnD&XNBrfQV%j1Aym+L!+*ldtgA& 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

Y1V=;w;rbkygXN(zhj$uHCm>F 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 literal 0 HcmV?d00001 From d37f2734beed6708c68322922941fe75d38301f4 Mon Sep 17 00:00:00 2001 From: RobertAlexanderH Date: Wed, 26 Aug 2026 18:57:42 -0700 Subject: [PATCH 4/4] Color Timer Clock: update --- .../README.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/cinnamon-color-timer-clock-desklet@curbsoftware/README.md b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md index f3194a26c..479f71aa8 100644 --- a/cinnamon-color-timer-clock-desklet@curbsoftware/README.md +++ b/cinnamon-color-timer-clock-desklet@curbsoftware/README.md @@ -49,6 +49,39 @@ Right-click the desklet and choose **Configure**. - **Time / date format**: `strftime` patterns for the clock card - **Maximum font sizes, card spacing, desklet width / height**: cards shrink text to fit +## Manual install + +No root needed. Everything installs into your home directory. + +From a release package: + +```bash +curl -fLO https://github.com/CurbSoftware/cinnamon-color-timer-clock-desklet/releases/latest/download/cinnamon-color-timer-clock-desklet.zip +unzip cinnamon-color-timer-clock-desklet.zip +rm -rf ~/.local/share/cinnamon/desklets/cinnamon-color-timer-clock-desklet@curbsoftware +cp -r cinnamon-color-timer-clock-desklet@curbsoftware/files/cinnamon-color-timer-clock-desklet@curbsoftware \ + ~/.local/share/cinnamon/desklets/cinnamon-color-timer-clock-desklet@curbsoftware +``` + +Or straight from git: + +```bash +git clone https://github.com/CurbSoftware/cinnamon-color-timer-clock-desklet.git +cd cinnamon-color-timer-clock-desklet +rm -rf ~/.local/share/cinnamon/desklets/cinnamon-color-timer-clock-desklet@curbsoftware +cp -r files/cinnamon-color-timer-clock-desklet@curbsoftware \ + ~/.local/share/cinnamon/desklets/cinnamon-color-timer-clock-desklet@curbsoftware +``` + +The `rm -rf` before the copy is the upgrade path: old files are removed so +nothing deleted upstream lingers, then the copy brings the new tree in. Your +settings and running timer state are stored separately in +`~/.config/cinnamon/spices/cinnamon-color-timer-clock-desklet@curbsoftware/` +and survive reinstalls. + +Restart Cinnamon (**Alt-F2**, type `r`, Enter) and add the desklet from +Cinnamon Settings. + ## Notes Colors interpolate piecewise-linearly in RGB, so a red to blue ramp passes through purple. The clock schedule wraps over midnight; timer and chronometer schedules hold the last stop's color beyond it. Cards share the desklet width and wrap onto more rows when each card would otherwise become too narrow. Enabled cards never disappear because of desklet width.