summaryrefslogtreecommitdiff
path: root/notifd
diff options
context:
space:
mode:
authorAylur <[email protected]>2024-09-01 14:17:36 +0200
committerAylur <[email protected]>2024-09-01 14:17:36 +0200
commit3e3f045d650a839d21f7b649da7aa5c19bd2e38b (patch)
tree9a974eb0d38932d474940288c662bd1f01ea3088 /notifd
parent408faee16911ccfaa3e7dad69f9938fd4a696704 (diff)
monorepo structuring
Diffstat (limited to 'notifd')
-rw-r--r--notifd/LICENSE503
-rw-r--r--notifd/README.md7
-rw-r--r--notifd/flake.lock27
-rw-r--r--notifd/flake.nix54
-rw-r--r--notifd/meson.build19
-rw-r--r--notifd/meson_options.txt11
-rw-r--r--notifd/src/cli.vala115
-rw-r--r--notifd/src/config.vala.in6
-rw-r--r--notifd/src/daemon.vala255
-rw-r--r--notifd/src/meson.build79
-rw-r--r--notifd/src/notifd.vala140
-rw-r--r--notifd/src/notification.vala160
-rw-r--r--notifd/src/proxy.vala129
-rw-r--r--notifd/src/signals.md35
-rw-r--r--notifd/version1
15 files changed, 0 insertions, 1541 deletions
diff --git a/notifd/LICENSE b/notifd/LICENSE
deleted file mode 100644
index 67cd97b..0000000
--- a/notifd/LICENSE
+++ /dev/null
@@ -1,503 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-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 and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, 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 library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete 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 distribute a copy of this License along with the
-Library.
-
- 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 Library or any portion
-of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-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 Library, 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 Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you 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.
-
- If distribution of 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 satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be 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.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library 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.
-
- 9. 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 Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-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 with
-this License.
-
- 11. 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 Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library 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 Library.
-
-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.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library 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.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser 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 Library
-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 Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-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
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. 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 LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. 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.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
diff --git a/notifd/README.md b/notifd/README.md
deleted file mode 100644
index da93a6a..0000000
--- a/notifd/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# notifd
-
-A notification daemon library and cli tool
-
-## TODO
-
-- docs
diff --git a/notifd/flake.lock b/notifd/flake.lock
deleted file mode 100644
index 13f566b..0000000
--- a/notifd/flake.lock
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "nodes": {
- "nixpkgs": {
- "locked": {
- "lastModified": 1716137900,
- "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=",
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1",
- "type": "github"
- },
- "original": {
- "owner": "nixos",
- "ref": "nixos-unstable",
- "repo": "nixpkgs",
- "type": "github"
- }
- },
- "root": {
- "inputs": {
- "nixpkgs": "nixpkgs"
- }
- }
- },
- "root": "root",
- "version": 7
-}
diff --git a/notifd/flake.nix b/notifd/flake.nix
deleted file mode 100644
index b4e7a45..0000000
--- a/notifd/flake.nix
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- description = "Notification daemon library and cli tool";
-
- inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
-
- outputs = {
- self,
- nixpkgs,
- }: let
- version = builtins.replaceStrings ["\n"] [""] (builtins.readFile ./version);
- system = "x86_64-linux";
- pkgs = import nixpkgs {inherit system;};
-
- nativeBuildInputs = with pkgs; [
- gobject-introspection
- meson
- pkg-config
- ninja
- vala
- ];
-
- buildInputs = with pkgs; [
- glib
- gdk-pixbuf
- json-glib
- ];
- in {
- packages.${system} = rec {
- default = notifd;
- notifd = pkgs.stdenv.mkDerivation {
- inherit nativeBuildInputs buildInputs;
- pname = "astal-notifd";
- version = version;
- src = ./.;
- outputs = ["out" "dev"];
- };
- };
-
- devShells.${system} = {
- default = pkgs.mkShell {
- inherit nativeBuildInputs buildInputs;
- };
- notifd = pkgs.mkShell {
- inherit nativeBuildInputs;
- buildInputs =
- buildInputs
- ++ [
- self.packages.${system}.default
- pkgs.gjs
- ];
- };
- };
- };
-}
diff --git a/notifd/meson.build b/notifd/meson.build
deleted file mode 100644
index 8fabdb4..0000000
--- a/notifd/meson.build
+++ /dev/null
@@ -1,19 +0,0 @@
-project(
- 'astal-notifd',
- 'vala',
- 'c',
- version: run_command('cat', join_paths(meson.project_source_root(), 'version')).stdout().strip(),
- meson_version: '>= 0.62.0',
- default_options: [
- 'warning_level=2',
- 'werror=false',
- 'c_std=gnu11',
- ],
-)
-
-assert(
- get_option('lib') or get_option('cli'),
- 'Either lib or cli option must be set to true.',
-)
-
-subdir('src')
diff --git a/notifd/meson_options.txt b/notifd/meson_options.txt
deleted file mode 100644
index f110242..0000000
--- a/notifd/meson_options.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-option(
- 'lib',
- type: 'boolean',
- value: true,
-)
-
-option(
- 'cli',
- type: 'boolean',
- value: true,
-)
diff --git a/notifd/src/cli.vala b/notifd/src/cli.vala
deleted file mode 100644
index afce774..0000000
--- a/notifd/src/cli.vala
+++ /dev/null
@@ -1,115 +0,0 @@
-static bool help;
-static bool version;
-static bool daemonize;
-static bool list;
-static string invoke;
-static int close_n;
-static int get_n;
-static bool toggle_dnd;
-
-const OptionEntry[] options = {
- { "version", 'v', OptionFlags.NONE, OptionArg.NONE, ref version, null, null },
- { "help", 'h', OptionFlags.NONE, OptionArg.NONE, ref help, null, null },
- { "daemonize", 'd', OptionFlags.NONE, OptionArg.NONE, ref daemonize, null, null },
- { "list", 'l', OptionFlags.NONE, OptionArg.NONE, ref list, null, null },
- { "invoke", 'i', OptionFlags.NONE, OptionArg.STRING, ref invoke, null, null },
- { "close", 'c', OptionFlags.NONE, OptionArg.INT, ref close_n, null, null },
- { "get", 'g', OptionFlags.NONE, OptionArg.INT, ref get_n, null, null },
- { "toggle-dnd", 't', OptionFlags.NONE, OptionArg.NONE, ref toggle_dnd, null, null },
- { null },
-};
-
-int main(string[] argv) {
- try {
- var opts = new OptionContext();
- opts.add_main_entries(options, null);
- opts.set_help_enabled(false);
- opts.set_ignore_unknown_options(false);
- opts.parse(ref argv);
- } catch (OptionError err) {
- printerr (err.message);
- return 1;
- }
-
- if (help) {
- print("Cli client for astal-notifd\n\n");
- print("Usage:\n");
- print(" %s [flags]\n\n", argv[0]);
- print("Flags:\n");
- print(" -h, --help Print this help and exit\n");
- print(" -v, --version Print version number and exit\n");
- print(" -l, --list Print every notification and exit\n");
- print(" -d, --daemonize Watch for new notifications\n");
- print(" -i, --invoke Invoke a notification action\n");
- print(" -c, --close Close a notification by its id\n");
- print(" -g, --get Print a notification by its id\n");
- print(" -t, --toggle-dnd Toggle do not disturb\n");
- return 0;
- }
-
- var notifd = new AstalNotifd.Notifd();
-
- if (version) {
- print(AstalNotifd.VERSION);
- return 0;
- }
-
- if (list) {
- var state = Environment.get_user_state_dir() + "/astal/notifd/notifications.json";
- if (FileUtils.test(state, FileTest.EXISTS)) {
- try {
- uint8[] json;
- File.new_for_path(state).load_contents(null, out json, null);
-
- var obj = Json.from_string((string)json);
-
- var list = obj.get_object().get_member("notifications");
- stdout.printf("%s\n", Json.to_string(list, true));
- return 0;
- } catch (Error err) {
- stderr.printf("failed to load cache: %s", err.message);
- }
- }
- stdout.printf("[]\n");
- return 0;
- }
-
- if (toggle_dnd) {
- notifd.dont_disturb = !notifd.dont_disturb;
- return 0;
- }
-
- if (daemonize) {
- notifd.notified.connect((id) => {
- stdout.printf("%s\n", notifd.get_notification_json(id));
- stdout.flush();
- });
- new MainLoop().run();
- }
-
- if (invoke != null) {
- if (!invoke.contains(":")) {
- stderr.printf("invoke format needs to be <notif-id>:<action-id>");
- return 1;
- }
-
- var split = invoke.split(":");
- var n_id = int.parse(split[0]);
- var a_id = split[1];
-
- notifd.get_notification(n_id).invoke(a_id);
- }
-
- if (close_n > 0) {
- notifd.get_notification(close_n).dismiss();
- }
-
- if (get_n > 0) {
- stdout.printf("%s", notifd.get_notification(get_n).to_json_string());
- }
-
- if (!daemonize && invoke == null && close_n == 0 && get_n == 0)
- return 1;
-
- return 0;
-}
diff --git a/notifd/src/config.vala.in b/notifd/src/config.vala.in
deleted file mode 100644
index 752c754..0000000
--- a/notifd/src/config.vala.in
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace AstalNotifd {
- public const int MAJOR_VERSION = @MAJOR_VERSION@;
- public const int MINOR_VERSION = @MINOR_VERSION@;
- public const int MICRO_VERSION = @MICRO_VERSION@;
- public const string VERSION = "@VERSION@";
-}
diff --git a/notifd/src/daemon.vala b/notifd/src/daemon.vala
deleted file mode 100644
index b8fb598..0000000
--- a/notifd/src/daemon.vala
+++ /dev/null
@@ -1,255 +0,0 @@
-[DBus (name = "org.freedesktop.Notifications")]
-internal class AstalNotifd.Daemon : Object {
- public static string name = "notifd";
- public static string vendor = "astal";
- public static string version = "0.1";
-
- private string state_file;
- private string state_directory;
- private string cache_directory;
-
- private uint n_id = 1;
- private HashTable<uint, Notification> notifs =
- new HashTable<uint, Notification>((i) => i, (a, b) => a == b);
-
- private bool _ignore_timeout;
- public bool ignore_timeout {
- get { return _ignore_timeout; }
- set {
- _ignore_timeout = value;
- write_state();
- }
- }
-
- private bool _dont_disturb;
- public bool dont_disturb {
- get { return _dont_disturb; }
- set {
- _dont_disturb = value;
- write_state();
- }
- }
-
- public signal void notified(uint id, bool replaced);
- public signal void resolved(uint id, ClosedReason reason);
- public signal void action_invoked(uint id, string action);
- public signal void prop_changed(string prop);
-
- // emitting an event from proxy doesn't seem to work
- public void emit_resolved(uint id, ClosedReason reason) { resolved(id, reason); }
- public void emit_action_invoked(uint id, string action) { action_invoked(id, action); }
-
- construct {
- cache_directory = Environment.get_user_cache_dir() + "/astal/notifd";
- state_directory = Environment.get_user_state_dir() + "/astal/notifd";
- state_file = state_directory + "/notifications.json";
-
- if (FileUtils.test(state_file, FileTest.EXISTS)) {
- try {
- uint8[] json;
- File.new_for_path(state_file).load_contents(null, out json, null);
-
- var obj = Json.from_string((string)json);
-
- var list = obj.get_object().get_array_member("notifications");
- for (var i = 0; i < list.get_length(); ++i) {
- add_notification(new Notification.from_json(list.get_object_element(i)));
- }
- n_id = list.get_length() + 1;
-
- _dont_disturb = obj.get_object().get_boolean_member("dont_disturb");
- _ignore_timeout = obj.get_object().get_boolean_member("ignore_timeout");
- } catch (Error err) {
- warning("failed to load cache: %s", err.message);
- }
- }
-
- notify.connect((prop) => prop_changed(prop.name));
-
- notified.connect(() => {
- notify_property("notifications");
- });
-
- resolved.connect((id, reason) => {
- notifs.get(id).resolved(reason);
- notifs.remove(id);
- write_state();
- notify_property("notifications");
- notification_closed(id, reason);
- });
- }
-
- public uint[] notification_ids() throws DBusError, IOError {
- var keys = notifs.get_keys();
- uint[] id = new uint[keys.length()];
- for (var i = 0; i < keys.length(); ++i)
- id[i] = keys.nth_data(i);
- return id;
- }
-
- [DBus (visible = false)]
- public List<weak Notification> notifications {
- owned get { return notifs.get_values(); }
- }
-
- [DBus (visible = false)]
- public Notification get_notification(uint id) {
- return notifs.get(id);
- }
-
- public string get_notification_json(uint id) throws DBusError, IOError {
- return notifs.get(id).to_json_string();
- }
-
- [DBus (name = "Notify")]
- public uint Notify(
- string app_name,
- uint replaces_id,
- string app_icon,
- string summary,
- string body,
- string[] actions,
- HashTable<string, Variant> hints,
- int expire_timeout
- ) throws DBusError, IOError {
- if (hints.get("image-data") != null) {
- var file = cache_image(hints.get("image-data"), app_name);
- if (file != null) {
- hints.set("image-path", new Variant.string(file));
- hints.remove("image-data");
- }
- }
-
- // deprecated hints
- hints.remove("image_data");
- hints.remove("icon_data");
-
- var id = replaces_id > 0 ? replaces_id : n_id++;
-
- var replaced = add_notification(new Notification(
- app_name, id, app_icon, summary, body, actions, hints, expire_timeout
- ));
-
- if (!ignore_timeout && expire_timeout > 0) {
- Timeout.add(expire_timeout, () => {
- resolved(id, ClosedReason.EXPIRED);
- return Source.REMOVE;
- }, Priority.DEFAULT);
- }
-
- notified(id, replaced);
-
- write_state();
- return id;
- }
-
- private bool add_notification(Notification n) {
- n.dismissed.connect(() => resolved(n.id, ClosedReason.DISMISSED_BY_USER));
- n.invoked.connect((action) => action_invoked(n.id, action));
- var replaced = notifs.contains(n.id);
- notifs.set(n.id, n);
- return replaced;
- }
-
- private void write_state() {
- var list = new Json.Builder().begin_array();
- foreach (var n in notifications) {
- list.add_value(n.to_json());
- }
- list.end_array();
-
- var obj = new Json.Builder()
- .begin_object()
- .set_member_name("notifications").add_value(list.get_root())
- .set_member_name("ignore_timeout").add_boolean_value(ignore_timeout)
- .set_member_name("dont_disturb").add_boolean_value(dont_disturb)
- .end_object();
-
- try {
- if (!FileUtils.test(state_directory, FileTest.EXISTS))
- File.new_for_path(state_directory).make_directory_with_parents(null);
-
- FileUtils.set_contents_full(state_file, Json.to_string(obj.get_root(), false));
- } catch (Error err) {
- warning("failed to cache notifications: %s", err.message);
- }
- }
-
- public signal void notification_closed(uint id, uint reason);
- public signal void activation_token(uint id, string token);
-
- public void close_notification(uint id) throws DBusError, IOError {
- resolved(id, ClosedReason.CLOSED);
- }
-
- public void get_server_information(
- out string name,
- out string vendor,
- out string version,
- out string spec_version
- ) throws DBusError, IOError {
- name = Daemon.name;
- vendor = Daemon.vendor;
- version = Daemon.version;
- spec_version = "1.2";
- }
-
- public string[] get_capabilities() throws DBusError, IOError {
- return {"action-icons", "actions", "body", "icon-static", "persistence", "sound"};
- }
-
- private string? cache_image(Variant image, string app_name) {
- int w = image.get_child_value(0).get_int32();
- int h = image.get_child_value(1).get_int32();
- int rs = image.get_child_value(2).get_int32();
- bool alpha = image.get_child_value(3).get_boolean();
- int bps = image.get_child_value(4).get_int32();
- Bytes data = image.get_child_value(6).get_data_as_bytes();
-
- if (bps != 8) {
- warning("Can not cache image from %s. %s", app_name,
- "Currently only RGB images with 8 bits per sample are supported.");
- return null;
- }
-
- var pixbuf = new Gdk.Pixbuf.from_bytes(
- data, Gdk.Colorspace.RGB, alpha, bps, w, h, rs);
-
- if (pixbuf == null)
- return null;
-
- var file_name = cache_directory + "/" + data.hash().to_string("%u.png");
-
- try {
- if (!FileUtils.test(cache_directory, FileTest.EXISTS))
- File.new_for_path(cache_directory).make_directory_with_parents(null);
-
- var output_stream = File.new_for_path(file_name)
- .replace(null, false, FileCreateFlags.NONE, null);
-
- pixbuf.save_to_streamv(output_stream, "png", null, null, null);
- output_stream.close(null);
- } catch (Error err) {
- warning("could not cache image %s", err.message);
- return null;
- }
-
- return file_name;
- }
-
- internal Daemon register(DBusConnection conn) {
- try {
- conn.register_object("/org/freedesktop/Notifications", this);
- } catch (Error err) {
- critical(err.message);
- }
- return this;
- }
-}
-
-public enum AstalNotifd.ClosedReason {
- EXPIRED = 1,
- DISMISSED_BY_USER = 2,
- CLOSED = 3,
- UNDEFINED = 4,
-}
diff --git a/notifd/src/meson.build b/notifd/src/meson.build
deleted file mode 100644
index d3efa36..0000000
--- a/notifd/src/meson.build
+++ /dev/null
@@ -1,79 +0,0 @@
-version_split = meson.project_version().split('.')
-api_version = version_split[0] + '.' + version_split[1]
-gir = 'AstalNotifd-' + api_version + '.gir'
-typelib = 'AstalNotifd-' + api_version + '.typelib'
-
-config = configure_file(
- input: 'config.vala.in',
- output: 'config.vala',
- configuration: {
- 'VERSION': meson.project_version(),
- 'MAJOR_VERSION': version_split[0],
- 'MINOR_VERSION': version_split[1],
- 'MICRO_VERSION': version_split[2],
- },
-)
-
-deps = [
- dependency('glib-2.0'),
- dependency('gobject-2.0'),
- dependency('gio-2.0'),
- dependency('json-glib-1.0'),
- dependency('gdk-pixbuf-2.0'),
-]
-
-sources = [
- config,
- 'daemon.vala',
- 'notifd.vala',
- 'notification.vala',
- 'proxy.vala',
-]
-
-if get_option('lib')
- lib = library(
- meson.project_name(),
- sources,
- dependencies: deps,
- vala_header: meson.project_name() + '.h',
- vala_vapi: meson.project_name() + '-' + api_version + '.vapi',
- vala_gir: gir,
- version: meson.project_version(),
- install: true,
- install_dir: [true, true, true, true],
- )
-
- import('pkgconfig').generate(
- lib,
- name: meson.project_name(),
- filebase: meson.project_name() + '-' + api_version,
- version: meson.project_version(),
- subdirs: meson.project_name(),
- requires: deps,
- install_dir: get_option('libdir') / 'pkgconfig',
- )
-
- custom_target(
- typelib,
- command: [
- find_program('g-ir-compiler'),
- '--output', '@OUTPUT@',
- '--shared-library', get_option('prefix') / get_option('libdir') / '@PLAINNAME@',
- meson.current_build_dir() / gir,
- ],
- input: lib,
- output: typelib,
- depends: lib,
- install: true,
- install_dir: get_option('libdir') / 'girepository-1.0',
- )
-endif
-
-if get_option('cli')
- executable(
- meson.project_name(),
- ['cli.vala', sources],
- dependencies: deps,
- install: true,
- )
-endif
diff --git a/notifd/src/notifd.vala b/notifd/src/notifd.vala
deleted file mode 100644
index c962862..0000000
--- a/notifd/src/notifd.vala
+++ /dev/null
@@ -1,140 +0,0 @@
-namespace AstalNotifd {
- public Notifd get_default() {
- return Notifd.get_default();
- }
-}
-
-public class AstalNotifd.Notifd : Object {
- private static Notifd _instance;
- public static Notifd get_default() {
- if (_instance == null)
- _instance = new Notifd();
-
- return _instance;
- }
-
- private Daemon daemon;
- private DaemonProxy proxy;
-
- public signal void active(ActiveType type);
-
- public bool ignore_timeout {
- get {
- return proxy != null ? proxy.ignore_timeout : daemon.ignore_timeout;
- }
- set {
- if (proxy != null)
- proxy.ignore_timeout = value;
- else
- daemon.ignore_timeout = value;
- }
- }
-
- public bool dont_disturb {
- get {
- return proxy != null ? proxy.dont_disturb : daemon.dont_disturb;
- }
- set {
- if (proxy != null)
- proxy.dont_disturb = value;
- else
- daemon.dont_disturb = value;
- }
- }
-
- public List<weak Notification> notifications {
- owned get { return proxy != null ? proxy.notifications : daemon.notifications; }
- }
-
- public uint[] notification_ids() throws Error {
- return proxy != null ? proxy.notification_ids() : daemon.notification_ids();
- }
-
- public Notification get_notification(uint id) {
- return proxy != null ? proxy.get_notification(id) : daemon.get_notification(id);
- }
-
- public string get_notification_json(uint id) {
- return get_notification(id).to_json_string();
- }
-
- public signal void notified(uint id, bool replaced);
- public signal void resolved(uint id, ClosedReason reason);
-
- construct {
- // hack to make it synchronous
- MainLoop? loop = null;
-
- if (!MainContext.default().is_owner()) {
- loop = new MainLoop();
- }
-
- bool done = false;
-
- Bus.own_name(
- BusType.SESSION,
- "org.freedesktop.Notifications",
- BusNameOwnerFlags.NONE,
- acquire_daemon,
- on_daemon_acquired,
- make_proxy
- );
-
- active.connect(() => {
- done = true;
- if (loop != null && loop.is_running()) {
- loop.quit();
- }
- });
-
- if (loop != null) {
- loop.run();
- } else {
- while (!done) {
- MainContext.default().iteration(false);
- }
- }
- }
-
- private void acquire_daemon(DBusConnection conn) {
- daemon = new Daemon().register(conn);
- }
-
- private void on_daemon_acquired() {
- if (proxy != null) {
- proxy.stop();
- proxy = null;
- }
- daemon.notified.connect((id, replaced) => notified(id, replaced));
- daemon.resolved.connect((id, reason) => resolved(id, reason));
- daemon.notify.connect((prop) => {
- if (get_class().find_property(prop.name) != null) {
- notify_property(prop.name);
- }
- });
- active(ActiveType.DAEMON);
- }
-
- private void make_proxy() {
- proxy = new DaemonProxy();
-
- if (proxy.start()) {
- active(ActiveType.PROXY);
- } else {
- return;
- }
-
- proxy.notified.connect((id, replaced) => notified(id, replaced));
- proxy.resolved.connect((id, reason) => resolved(id, reason));
- proxy.notify.connect((prop) => {
- if (get_class().find_property(prop.name) != null) {
- notify_property(prop.name);
- }
- });
- }
-}
-
-public enum AstalNotifd.ActiveType {
- DAEMON,
- PROXY,
-}
diff --git a/notifd/src/notification.vala b/notifd/src/notification.vala
deleted file mode 100644
index 0b4af06..0000000
--- a/notifd/src/notification.vala
+++ /dev/null
@@ -1,160 +0,0 @@
-public enum AstalNotifd.Urgency {
- LOW = 0,
- NORMAL = 1,
- CRITICAL = 2,
-}
-
-public struct AstalNotifd.Action {
- public string id;
- public string label;
-}
-
-public class AstalNotifd.Notification : Object {
- private List<Action?> _actions;
- private HashTable<string, Variant> hints;
-
- public int64 time { construct set; get; }
- public string app_name { construct set; get; }
- public string app_icon { construct set; get; }
- public string summary { construct set; get; }
- public string body { construct set; get; }
- public uint id { construct set; get; }
- public int expire_timeout { construct set; get; }
- public List<Action?> actions { get { return _actions; } }
-
- public string image { get { return get_str_hint("image-path"); } }
- public bool action_icons { get { return get_bool_hint("action-icons"); } }
- public string category { get { return get_str_hint("category"); } }
- public string desktop_entry { get { return get_str_hint("desktop-entry"); } }
- public bool resident { get { return get_bool_hint("resident"); } }
- public string sound_file { get { return get_str_hint("sound-file"); } }
- public string sound_name { get { return get_str_hint("sound-name"); } }
- public bool suppress_sound { get { return get_bool_hint("suppress-sound"); } }
- public bool transient { get { return get_bool_hint("transient"); } }
- public int x { get { return get_int_hint("x"); } }
- public int y { get { return get_int_hint("y"); } }
- public Urgency urgency { get { return get_int_hint("urgency"); } }
-
- internal Notification(
- string app_name,
- uint id,
- string app_icon,
- string summary,
- string body,
- string[] actions,
- HashTable<string, Variant> hints,
- int expire_timeout
- ) {
- Object(
- app_name: app_name,
- id: id,
- app_icon: app_icon,
- summary: summary,
- body: body,
- expire_timeout: expire_timeout,
- time: new DateTime.now_local().to_unix()
- );
-
- this.hints = hints;
- _actions = new List<Action?>();
- for (var i = 0; i < actions.length; i += 2) {
- _actions.append(Action() {
- id = actions[i],
- label = actions[i + 1]
- });
- }
- }
-
- public Variant? get_hint(string hint) {
- return hints.contains(hint) ? hints.get(hint) : null;
- }
-
- public unowned string get_str_hint(string hint) {
- return hints.contains(hint) ? hints.get(hint).get_string() : null;
- }
-
- public bool get_bool_hint(string hint) {
- return hints.contains(hint) ? hints.get(hint).get_boolean() : false;
- }
-
- public int get_int_hint(string hint) {
- return hints.contains(hint) ? hints.get(hint).get_int32() : 0;
- }
-
- public signal void resolved(ClosedReason reason);
- public signal void dismissed();
- public signal void invoked(string action);
-
- public void dismiss() { dismissed(); }
- public void invoke(string action) { invoked(action); }
-
- internal Notification.from_json(Json.Object root) throws GLib.Error {
- foreach (var key in root.get_members()) {
- var node = root.get_member(key);
- switch (key) {
- case "id": id = (uint)node.get_int(); break;
- case "time": time = node.get_int(); break;
- case "expire_timeout": expire_timeout = (int)node.get_int(); break;
- case "app_name": app_name = node.get_string(); break;
- case "app_icon": app_icon = node.get_string(); break;
- case "summary": summary = node.get_string(); break;
- case "body": body = node.get_string(); break;
- case "hints":
- hints = new HashTable<string, Variant>(str_hash, str_equal);
- var obj = node.get_object();
- foreach (var hint in obj.get_members()) {
- hints.set(hint, Json.gvariant_deserialize(obj.get_member(hint), null));
- }
- break;
- case "actions":
- _actions = new List<Action?>();
- for (var i = 0; i < node.get_array().get_length(); ++i) {
- var o = node.get_array().get_object_element(i);
- _actions.append(Action() {
- id = o.get_member("id").get_string(),
- label = o.get_member("label").get_string()
- });
- }
- break;
- default: break;
- }
- }
- }
-
- internal static Notification from_json_string(string json) throws GLib.Error {
- var parser = new Json.Parser();
- parser.load_from_data(json);
- return new Notification.from_json(parser.get_root().get_object());
- }
-
- public string to_json_string() {
- var generator = new Json.Generator();
- generator.set_root(to_json());
- return generator.to_data(null);
- }
-
- internal Json.Node to_json() {
- var acts = new Json.Builder().begin_array();
- foreach (var action in actions) {
- acts.begin_object()
- .set_member_name("id").add_string_value(action.id)
- .set_member_name("label").add_string_value(action.label)
- .end_object();
- }
- acts.end_array();
-
- return new Json.Builder()
- .begin_object()
- .set_member_name("id").add_int_value(id)
- .set_member_name("time").add_int_value(time)
- .set_member_name("expire_timeout").add_int_value(expire_timeout)
- .set_member_name("app_name").add_string_value(app_name)
- .set_member_name("app_icon").add_string_value(app_icon)
- .set_member_name("summary").add_string_value(summary)
- .set_member_name("body").add_string_value(body)
- .set_member_name("actions").add_value(acts.get_root())
- .set_member_name("hints").add_value(Json.gvariant_serialize(hints))
- .end_object()
- .get_root();
- }
-}
diff --git a/notifd/src/proxy.vala b/notifd/src/proxy.vala
deleted file mode 100644
index bedb8b9..0000000
--- a/notifd/src/proxy.vala
+++ /dev/null
@@ -1,129 +0,0 @@
-[DBus (name = "org.freedesktop.Notifications")]
-internal interface AstalNotifd.IDaemon : DBusProxy {
- public abstract bool ignore_timeout { get; set; }
- public abstract bool dont_disturb { get; set; }
-
- public abstract uint[] notification_ids() throws DBusError, IOError;
- public abstract string get_notification_json(uint id) throws DBusError, IOError;
-
- public signal void notified(uint id, bool replaced);
- public signal void resolved(uint id, ClosedReason reason);
- public signal void prop_changed(string prop);
-
- public abstract void emit_resolved(uint id, ClosedReason reason);
- public abstract void emit_action_invoked(uint id, string action);
-}
-
-internal class AstalNotifd.DaemonProxy : Object {
- private HashTable<uint, Notification> notifs =
- new HashTable<uint, Notification>((i) => i, (a, b) => a == b);
-
- public List<weak Notification> notifications {
- owned get { return notifs.get_values(); }
- }
-
- public bool ignore_timeout {
- get { return proxy.ignore_timeout; }
- set { proxy.ignore_timeout = value; }
- }
-
- public bool dont_disturb {
- get { return proxy.dont_disturb; }
- set { proxy.dont_disturb = value; }
- }
-
- public uint[] notification_ids() throws DBusError, IOError {
- return proxy.notification_ids();
- }
-
- public Notification get_notification(uint id) {
- return notifs.get(id);
- }
-
- public signal void notified(uint id, bool replaced);
- public signal void resolved(uint id, ClosedReason reason);
-
- private IDaemon proxy;
- private List<ulong> ids = new List<ulong>();
-
- public void stop() {
- if (ids.length() > 0) {
- foreach (var id in ids)
- SignalHandler.disconnect(proxy, id);
- }
- }
-
- public bool start() {
- try {
- var bus = Bus.get_sync(BusType.SESSION, null);
- var variant = bus.call_sync(
- "org.freedesktop.Notifications",
- "/org/freedesktop/Notifications",
- "org.freedesktop.Notifications",
- "GetServerInformation",
- null,
- null,
- DBusCallFlags.NONE,
- -1,
- null);
-
- var name = variant.get_child_value(0).get_string();
- var vendor = variant.get_child_value(1).get_string();
- var version = variant.get_child_value(2).get_string();
-
- var running = name == Daemon.name
- && vendor == Daemon.vendor
- && version == Daemon.version;
-
- if (running) {
- setup_proxy();
- return true;
- } else {
- critical("cannot get proxy: %s is already running", name);
- }
- } catch (Error err) {
- critical("cannot get proxy: %s", err.message);
- }
- return false;
- }
-
- private void setup_proxy() throws Error {
- proxy = Bus.get_proxy_sync(
- BusType.SESSION,
- "org.freedesktop.Notifications",
- "/org/freedesktop/Notifications"
- );
-
- foreach (var id in proxy.notification_ids())
- add_notification(id);
-
- ids.append(proxy.prop_changed.connect((prop) => {
- if (prop == "ignore-timeout" || prop == "dont-disturb")
- notify_property(prop);
- }));
-
- ids.append(proxy.notified.connect((id, replaced) => {
- add_notification(id);
- notified(id, replaced);
- notify_property("notifications");
- }));
-
- ids.append(proxy.resolved.connect((id, reason) => {
- notifs.remove(id);
- resolved(id, reason);
- notify_property("notifications");
- }));
- }
-
- private void add_notification(uint id) {
- try {
- var n = Notification.from_json_string(proxy.get_notification_json(id));
- proxy.resolved.connect((id, reason) => n.resolved(reason));
- n.dismissed.connect(() => proxy.emit_resolved(id, ClosedReason.DISMISSED_BY_USER));
- n.invoked.connect((action) => proxy.emit_action_invoked(id, action));
- notifs.set(id, n);
- } catch (Error err) {
- critical(err.message);
- }
- }
-}
diff --git a/notifd/src/signals.md b/notifd/src/signals.md
deleted file mode 100644
index cdc6688..0000000
--- a/notifd/src/signals.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Signals
-
-ignore this, I'm just dumb and can't follow where signals go or get emitted from
-
-## Notification
-
-* resolved(reason) - by daemon/proxy
-* dismissed() - by user with `.dismiss()`
-* invoked(action) - by user with `.invoke()`
-
-## Deamon
-
-non-spec, used by user
-
-* notified(id, replaced) - by outside through dbus with `.Notify()`
-* resolved(id, reason) - by `Notification.dismiss()` or outside with `.CloseNotification`
-
-spec, not used by user
-
-* notification_closed(id, reason) - sideeffect of `resolved`
-* action_invoked(id, action) - by `Notification.invoke()`
-
-## Proxy
-
-mirrors Daemon
-
-* notified(id, replaced)
-* resolved(id, reason)
-
-creates `Notification` objects through daemon's json strings
-and hooks them up to call daemon's signals and vice versa
-
-## Notifd
-
-acts as a bridge between Proxy/Daemon, everything else is internal only
diff --git a/notifd/version b/notifd/version
deleted file mode 100644
index 6e8bf73..0000000
--- a/notifd/version
+++ /dev/null
@@ -1 +0,0 @@
-0.1.0