Generated docs using doxygen and mkdocs
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,3 +3,4 @@ mop3.iso
|
|||||||
bochs-log.txt
|
bochs-log.txt
|
||||||
bochs-com1.txt
|
bochs-com1.txt
|
||||||
mop3dist.tar
|
mop3dist.tar
|
||||||
|
site/
|
||||||
|
|||||||
1
Makefile
1
Makefile
@@ -3,3 +3,4 @@ platform ?= amd64
|
|||||||
include apps.mk
|
include apps.mk
|
||||||
include kernel.mk
|
include kernel.mk
|
||||||
include dist.mk
|
include dist.mk
|
||||||
|
include docs.mk
|
||||||
|
|||||||
8
docs.mk
Normal file
8
docs.mk
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
docs:
|
||||||
|
doxygen
|
||||||
|
mkdocs build
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
doxygen
|
||||||
|
|
||||||
|
.PHONY: docs doxygen
|
||||||
1
docs/.gitignore
vendored
Normal file
1
docs/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
doxygen/
|
||||||
7
docs/index.md
Normal file
7
docs/index.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# MOP3 operating system documentation
|
||||||
|
|
||||||
|
MOP3 is a hobby OS project of mine ;).
|
||||||
|
|
||||||
|
# Kernel documentation
|
||||||
|
|
||||||
|
- [Doxygen docs](doxygen/html/index.html)
|
||||||
269
doxygen_layout.xml
Normal file
269
doxygen_layout.xml
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<doxygenlayout version="2.0">
|
||||||
|
<!-- Generated by doxygen 1.15.0 -->
|
||||||
|
<!-- Navigation index tabs for HTML output -->
|
||||||
|
<navindex>
|
||||||
|
<tab type="mainpage" visible="yes" title=""/>
|
||||||
|
<tab type="pages" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="topics" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="modules" visible="yes" title="" intro="">
|
||||||
|
<tab type="modulelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="modulemembers" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="namespaces" visible="yes" title="">
|
||||||
|
<tab type="namespacelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="namespacemembers" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="concepts" visible="yes" title="">
|
||||||
|
</tab>
|
||||||
|
<tab type="interfaces" visible="yes" title="">
|
||||||
|
<tab type="interfacelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="interfaceindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="interfacehierarchy" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="classes" visible="yes" title="">
|
||||||
|
<tab type="classlist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="hierarchy" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="classmembers" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="structs" visible="yes" title="">
|
||||||
|
<tab type="structlist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="structindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="exceptions" visible="yes" title="">
|
||||||
|
<tab type="exceptionlist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="exceptionindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="exceptionhierarchy" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="files" visible="yes" title="">
|
||||||
|
<tab type="filelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="globals" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="examples" visible="yes" title="" intro=""/>
|
||||||
|
</navindex>
|
||||||
|
|
||||||
|
<!-- Layout definition for a class page -->
|
||||||
|
<class>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_HEADERFILE"/>
|
||||||
|
<inheritancegraph visible="yes"/>
|
||||||
|
<collaborationgraph visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestedclasses visible="yes" title=""/>
|
||||||
|
<publictypes visible="yes" title=""/>
|
||||||
|
<services visible="yes" title=""/>
|
||||||
|
<interfaces visible="yes" title=""/>
|
||||||
|
<publicslots visible="yes" title=""/>
|
||||||
|
<signals visible="yes" title=""/>
|
||||||
|
<publicmethods visible="yes" title=""/>
|
||||||
|
<publicstaticmethods visible="yes" title=""/>
|
||||||
|
<publicattributes visible="yes" title=""/>
|
||||||
|
<publicstaticattributes visible="yes" title=""/>
|
||||||
|
<protectedtypes visible="yes" title=""/>
|
||||||
|
<protectedslots visible="yes" title=""/>
|
||||||
|
<protectedmethods visible="yes" title=""/>
|
||||||
|
<protectedstaticmethods visible="yes" title=""/>
|
||||||
|
<protectedattributes visible="yes" title=""/>
|
||||||
|
<protectedstaticattributes visible="yes" title=""/>
|
||||||
|
<packagetypes visible="yes" title=""/>
|
||||||
|
<packagemethods visible="yes" title=""/>
|
||||||
|
<packagestaticmethods visible="yes" title=""/>
|
||||||
|
<packageattributes visible="yes" title=""/>
|
||||||
|
<packagestaticattributes visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
<events visible="yes" title=""/>
|
||||||
|
<privatetypes visible="yes" title=""/>
|
||||||
|
<privateslots visible="yes" title=""/>
|
||||||
|
<privatemethods visible="yes" title=""/>
|
||||||
|
<privatestaticmethods visible="yes" title=""/>
|
||||||
|
<privateattributes visible="yes" title=""/>
|
||||||
|
<privatestaticattributes visible="yes" title=""/>
|
||||||
|
<friends visible="yes" title=""/>
|
||||||
|
<related visible="yes" title="" subtitle=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<services visible="yes" title=""/>
|
||||||
|
<interfaces visible="yes" title=""/>
|
||||||
|
<constructors visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<related visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
<events visible="yes" title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<allmemberslink visible="yes"/>
|
||||||
|
<usedfiles visible="$SHOW_USED_FILES"/>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</class>
|
||||||
|
|
||||||
|
<!-- Layout definition for a namespace page -->
|
||||||
|
<namespace>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestednamespaces visible="yes" title=""/>
|
||||||
|
<constantgroups visible="yes" title=""/>
|
||||||
|
<interfaces visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<concepts visible="yes" title=""/>
|
||||||
|
<structs visible="yes" title=""/>
|
||||||
|
<exceptions visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<sequences visible="yes" title=""/>
|
||||||
|
<dictionaries visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<sequences visible="yes" title=""/>
|
||||||
|
<dictionaries visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</namespace>
|
||||||
|
|
||||||
|
<!-- Layout definition for a concept page -->
|
||||||
|
<concept>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_HEADERFILE"/>
|
||||||
|
<definition visible="yes" title=""/>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</concept>
|
||||||
|
|
||||||
|
<!-- Layout definition for a file page -->
|
||||||
|
<file>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||||
|
<includegraph visible="yes"/>
|
||||||
|
<includedbygraph visible="yes"/>
|
||||||
|
<sourcelink visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<interfaces visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<structs visible="yes" title=""/>
|
||||||
|
<exceptions visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
|
<concepts visible="yes" title=""/>
|
||||||
|
<constantgroups visible="yes" title=""/>
|
||||||
|
<defines visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<sequences visible="yes" title=""/>
|
||||||
|
<dictionaries visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses visible="yes" title=""/>
|
||||||
|
<defines visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<sequences visible="yes" title=""/>
|
||||||
|
<dictionaries visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection/>
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<!-- Layout definition for a group page -->
|
||||||
|
<group>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<groupgraph visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestedgroups visible="yes" title=""/>
|
||||||
|
<modules visible="yes" title=""/>
|
||||||
|
<dirs visible="yes" title=""/>
|
||||||
|
<files visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
|
<concepts visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<defines visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<sequences visible="yes" title=""/>
|
||||||
|
<dictionaries visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<enumvalues visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<signals visible="yes" title=""/>
|
||||||
|
<publicslots visible="yes" title=""/>
|
||||||
|
<protectedslots visible="yes" title=""/>
|
||||||
|
<privateslots visible="yes" title=""/>
|
||||||
|
<events visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
<friends visible="yes" title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<pagedocs/>
|
||||||
|
<inlineclasses visible="yes" title=""/>
|
||||||
|
<defines visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<sequences visible="yes" title=""/>
|
||||||
|
<dictionaries visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<enumvalues visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<signals visible="yes" title=""/>
|
||||||
|
<publicslots visible="yes" title=""/>
|
||||||
|
<protectedslots visible="yes" title=""/>
|
||||||
|
<privateslots visible="yes" title=""/>
|
||||||
|
<events visible="yes" title=""/>
|
||||||
|
<properties visible="yes" title=""/>
|
||||||
|
<friends visible="yes" title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<!-- Layout definition for a C++20 module page -->
|
||||||
|
<module>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<exportedmodules visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<concepts visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<enums visible="yes" title=""/>
|
||||||
|
<typedefs visible="yes" title=""/>
|
||||||
|
<functions visible="yes" title=""/>
|
||||||
|
<variables visible="yes" title=""/>
|
||||||
|
<membergroups visible="yes" title=""/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
|
<memberdecl>
|
||||||
|
<files visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
</module>
|
||||||
|
|
||||||
|
<!-- Layout definition for a directory page -->
|
||||||
|
<directory>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<directorygraph visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<dirs visible="yes"/>
|
||||||
|
<files visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
|
</directory>
|
||||||
|
</doxygenlayout>
|
||||||
21
doxytheme/LICENSE
Normal file
21
doxytheme/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2023 jothepro
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
207
doxytheme/README.md
Normal file
207
doxytheme/README.md
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
# Doxygen Awesome
|
||||||
|
|
||||||
|
[](https://github.com/jothepro/doxygen-awesome-css/releases/latest)
|
||||||
|
[](https://github.com/jothepro/doxygen-awesome-css/blob/main/LICENSE)
|
||||||
|

|
||||||
|
|
||||||
|
<div class="title_screenshot">
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
**Doxygen Awesome** is a custom CSS theme for Doxygen HTML documentation with many customization options.
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
I really like how the Doxygen HTML documentation is structured, but IMHO it looks a bit outdated.
|
||||||
|
|
||||||
|
This theme is an attempt to modernize the visuals of Doxygen without changing its overall layout too much.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- 🌈 Clean, modern design
|
||||||
|
- 🚀 Highly customizable by adjusting CSS variables
|
||||||
|
- 🧩 No changes to the HTML structure of Doxygen are required
|
||||||
|
- 📱 Improved mobile usability
|
||||||
|
- 🌘 Dark mode support!
|
||||||
|
- 🥇 Works best with **Doxygen 1.9.1** - **1.9.4** and **1.9.6** - **1.14.0**
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
Some websites using this theme:
|
||||||
|
|
||||||
|
- [Documentation of this repository](https://jothepro.github.io/doxygen-awesome-css/)
|
||||||
|
- [wxWidgets](https://docs.wxwidgets.org/3.2/)
|
||||||
|
- [OpenCV 5.x](https://docs.opencv.org/5.x/)
|
||||||
|
- [Zephyr](https://docs.zephyrproject.org/latest/doxygen/html/index.html)
|
||||||
|
- [Spatial Audio Framework (SAF)](https://leomccormack.github.io/Spatial_Audio_Framework/index.html)
|
||||||
|
- [Randolf Richardson's C++ classes](https://www.randolf.ca/c++/docs/)
|
||||||
|
- [libsl3](https://a4z.github.io/libsl3/)
|
||||||
|
- [DuMu<sup>x</sup>](https://dumux.org/docs/doxygen/master/)
|
||||||
|
- [OpenRemise](https://openremise.at/)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To use the theme when generating your documentation, bring the required CSS and JS files from this repository into your project.
|
||||||
|
|
||||||
|
This can be done in several ways:
|
||||||
|
|
||||||
|
- manually copying the files
|
||||||
|
- adding the project as a Git submodule
|
||||||
|
- downloading the project with CMake FetchContent
|
||||||
|
- adding the project as an npm/xpm dependency
|
||||||
|
- installing the theme system-wide
|
||||||
|
|
||||||
|
All theme files are located in the root of this repository and start with the prefix `doxygen-awesome-`. You may not need all of them. Follow the installation instructions to determine which files are required for your setup.
|
||||||
|
|
||||||
|
### Git submodule
|
||||||
|
|
||||||
|
For projects that use Git, add the repository as a submodule and check out the desired release:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git submodule add https://github.com/jothepro/doxygen-awesome-css.git
|
||||||
|
cd doxygen-awesome-css
|
||||||
|
git checkout v2.4.1
|
||||||
|
```
|
||||||
|
|
||||||
|
### CMake with FetchContent
|
||||||
|
|
||||||
|
For projects that build with CMake, the `FetchContent` module can be used to download the repository at configuration time.
|
||||||
|
|
||||||
|
Add the following snippet to your `CMakeLists.txt`:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
include(FetchContent)
|
||||||
|
FetchContent_Declare(
|
||||||
|
doxygen-awesome-css
|
||||||
|
URL https://github.com/jothepro/doxygen-awesome-css/archive/refs/heads/main.zip
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(doxygen-awesome-css)
|
||||||
|
|
||||||
|
# Save the location the files were cloned into
|
||||||
|
# This allows us to get the path to doxygen-awesome.css
|
||||||
|
FetchContent_GetProperties(doxygen-awesome-css SOURCE_DIR AWESOME_CSS_DIR)
|
||||||
|
|
||||||
|
# Generate the Doxyfile
|
||||||
|
set(DOXYFILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in)
|
||||||
|
set(DOXYFILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
||||||
|
configure_file(${DOXYFILE_IN} ${DOXYFILE_OUT} @ONLY)
|
||||||
|
```
|
||||||
|
|
||||||
|
This downloads the latest main (but any other revision could be used) and unpacks in the build folder. The `Doxyfile.in` can reference this location in the `HTML_EXTRA_STYLESHEET` field
|
||||||
|
|
||||||
|
```text
|
||||||
|
HTML_EXTRA_STYLESHEET = @AWESOME_CSS_DIR@/doxygen-awesome.css
|
||||||
|
```
|
||||||
|
|
||||||
|
When the configure stage of CMake is run, the `Doxyfile.in` is rendered to Doxyfile and Doxygen can be run as usual.
|
||||||
|
|
||||||
|
### npm/xpm dependency
|
||||||
|
|
||||||
|
In the npm ecosystem, this project can be added as a development dependency
|
||||||
|
to your project:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd your-project
|
||||||
|
npm install https://github.com/jothepro/doxygen-awesome-css#v2.4.1 --save-dev
|
||||||
|
|
||||||
|
ls -l node_modules/@jothepro/doxygen-awesome-css
|
||||||
|
```
|
||||||
|
|
||||||
|
Similarly, in the [xPack](https://xpack.github.io) ecosystem, this project can be added
|
||||||
|
as a development dependency to an [`xpm`](https://xpack.github.io/xpm/)
|
||||||
|
managed project.
|
||||||
|
|
||||||
|
### System-wide
|
||||||
|
|
||||||
|
You can even install the theme system-wide by running `make install`.
|
||||||
|
The files will be installed to `/usr/local/share/` by default,
|
||||||
|
but you can customize the install location with `make PREFIX=/my/custom/path install`.
|
||||||
|
|
||||||
|
### Choosing a layout
|
||||||
|
|
||||||
|
There are two layout options. Choose one of them and configure Doxygen accordingly:
|
||||||
|
|
||||||
|
<div class="tabbed">
|
||||||
|
|
||||||
|
- <b class="tab-title">Base Theme</b><div class="darkmode_inverted_image">
|
||||||
|

|
||||||
|
</div>
|
||||||
|
Comes with the typical Doxygen titlebar. Optionally the treeview in the sidebar can be enabled.
|
||||||
|
|
||||||
|
Required files: `doxygen-awesome.css`
|
||||||
|
|
||||||
|
Required `Doxyfile` configuration:
|
||||||
|
```
|
||||||
|
GENERATE_TREEVIEW = YES # optional. Also works without treeview
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
FULL_SIDEBAR = NO
|
||||||
|
HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css
|
||||||
|
HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5
|
||||||
|
```
|
||||||
|
|
||||||
|
- <b class="tab-title">Sidebar-Only Theme</b><div class="darkmode_inverted_image">
|
||||||
|

|
||||||
|
</div>
|
||||||
|
Hides the top titlebar to give more space to the content. The treeview must be enabled in order for this theme to work.
|
||||||
|
|
||||||
|
Required files: `doxygen-awesome.css`, `doxygen-awesome-sidebar-only.css`
|
||||||
|
|
||||||
|
Required `Doxyfile` configuration:
|
||||||
|
```
|
||||||
|
|
||||||
|
GENERATE_TREEVIEW = YES # required!
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
FULL_SIDEBAR = NO
|
||||||
|
HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css \
|
||||||
|
doxygen-awesome-css/doxygen-awesome-sidebar-only.css
|
||||||
|
HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
@warning
|
||||||
|
- This theme is not compatible with the `FULL_SIDEBAR = YES` option provided by Doxygen!
|
||||||
|
- `HTML_COLORSTYLE` must be set to `LIGHT` since Doxygen 1.9.5!
|
||||||
|
|
||||||
|
### Further installation instructions
|
||||||
|
|
||||||
|
- [Installing extensions](docs/extensions.md)
|
||||||
|
- [Customizing the theme (colors, spacing, border-radius, ...)](docs/customization.md)
|
||||||
|
- [Tips and Tricks for further configuration](docs/tricks.md)
|
||||||
|
|
||||||
|
## Browser support
|
||||||
|
|
||||||
|
Tested with
|
||||||
|
|
||||||
|
- Chrome 140, Chrome 140 for Android, Chrome 141 for iOS
|
||||||
|
- Safari 26, Safari for iOS 26
|
||||||
|
- Firefox 143, Firefox 142 for Android, Firefox 143 for iOS
|
||||||
|
- Edge 140
|
||||||
|
- Opera One 122
|
||||||
|
|
||||||
|
|
||||||
|
The theme does not strive to be backward compatible with (significantly) older browser versions.
|
||||||
|
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
Thanks for all the bug reports and inspiring feedback on GitHub!
|
||||||
|
|
||||||
|
Special thanks to all the contributors:
|
||||||
|
<br><br>
|
||||||
|
<a href="https://github.com/jothepro/doxygen-awesome-css/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=jothepro/doxygen-awesome-css" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="section_buttons">
|
||||||
|
|
||||||
|
| Read Next |
|
||||||
|
|---------------------------------:|
|
||||||
|
| [Extensions](docs/extensions.md) |
|
||||||
|
|
||||||
|
</div>
|
||||||
66
doxytheme/doxygen-awesome-fragment-copy-button.js
Normal file
66
doxytheme/doxygen-awesome-fragment-copy-button.js
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
Copyright (c) 2022 - 2025 jothepro
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DoxygenAwesomeFragmentCopyButton extends HTMLElement {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.onclick=this.copyContent
|
||||||
|
}
|
||||||
|
static title = "Copy to clipboard"
|
||||||
|
static copyIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M23.04,10.322c0,-2.582 -2.096,-4.678 -4.678,-4.678l-6.918,-0c-2.582,-0 -4.678,2.096 -4.678,4.678c0,-0 0,8.04 0,8.04c0,2.582 2.096,4.678 4.678,4.678c0,-0 6.918,-0 6.918,-0c2.582,-0 4.678,-2.096 4.678,-4.678c0,-0 0,-8.04 0,-8.04Zm-2.438,-0l-0,8.04c-0,1.236 -1.004,2.24 -2.24,2.24l-6.918,-0c-1.236,-0 -2.239,-1.004 -2.239,-2.24l-0,-8.04c-0,-1.236 1.003,-2.24 2.239,-2.24c0,0 6.918,0 6.918,0c1.236,0 2.24,1.004 2.24,2.24Z"/><path d="M5.327,16.748c-0,0.358 -0.291,0.648 -0.649,0.648c0,0 0,0 0,0c-2.582,0 -4.678,-2.096 -4.678,-4.678c0,0 0,-8.04 0,-8.04c0,-2.582 2.096,-4.678 4.678,-4.678l6.918,0c2.168,0 3.994,1.478 4.523,3.481c0.038,0.149 0.005,0.306 -0.09,0.428c-0.094,0.121 -0.239,0.191 -0.392,0.191c-0.451,0.005 -1.057,0.005 -1.457,0.005c-0.238,0 -0.455,-0.14 -0.553,-0.357c-0.348,-0.773 -1.128,-1.31 -2.031,-1.31c-0,0 -6.918,0 -6.918,0c-1.236,0 -2.24,1.004 -2.24,2.24l0,8.04c0,1.236 1.004,2.24 2.24,2.24l0,-0c0.358,-0 0.649,0.29 0.649,0.648c-0,0.353 -0,0.789 -0,1.142Z" style="fill-opacity:0.6;"/></svg>`
|
||||||
|
static successIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M8.084,16.111c-0.09,0.09 -0.212,0.141 -0.34,0.141c-0.127,-0 -0.249,-0.051 -0.339,-0.141c-0.746,-0.746 -2.538,-2.538 -3.525,-3.525c-0.375,-0.375 -0.983,-0.375 -1.357,0c-0.178,0.178 -0.369,0.369 -0.547,0.547c-0.375,0.375 -0.375,0.982 -0,1.357c1.135,1.135 3.422,3.422 4.75,4.751c0.27,0.27 0.637,0.421 1.018,0.421c0.382,0 0.749,-0.151 1.019,-0.421c2.731,-2.732 10.166,-10.167 12.454,-12.455c0.375,-0.375 0.375,-0.982 -0,-1.357c-0.178,-0.178 -0.369,-0.369 -0.547,-0.547c-0.375,-0.375 -0.982,-0.375 -1.357,0c-2.273,2.273 -9.567,9.567 -11.229,11.229Z"/></svg>`
|
||||||
|
static successDuration = 980
|
||||||
|
static init() {
|
||||||
|
$(function() {
|
||||||
|
$(document).ready(function() {
|
||||||
|
if(navigator.clipboard) {
|
||||||
|
const fragments = document.getElementsByClassName("fragment")
|
||||||
|
for(const fragment of fragments) {
|
||||||
|
const fragmentWrapper = document.createElement("div")
|
||||||
|
fragmentWrapper.className = "doxygen-awesome-fragment-wrapper"
|
||||||
|
const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button")
|
||||||
|
fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
|
||||||
|
fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title
|
||||||
|
|
||||||
|
fragment.parentNode.replaceChild(fragmentWrapper, fragment)
|
||||||
|
fragmentWrapper.appendChild(fragment)
|
||||||
|
fragmentWrapper.appendChild(fragmentCopyButton)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
copyContent() {
|
||||||
|
const content = this.previousSibling.cloneNode(true)
|
||||||
|
// filter out line number from file listings
|
||||||
|
content.querySelectorAll(".lineno, .ttc").forEach((node) => {
|
||||||
|
node.remove()
|
||||||
|
})
|
||||||
|
let textContent = content.textContent
|
||||||
|
// remove trailing newlines that appear in file listings
|
||||||
|
let numberOfTrailingNewlines = 0
|
||||||
|
while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') {
|
||||||
|
numberOfTrailingNewlines++;
|
||||||
|
}
|
||||||
|
textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines)
|
||||||
|
navigator.clipboard.writeText(textContent);
|
||||||
|
this.classList.add("success")
|
||||||
|
this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon
|
||||||
|
window.setTimeout(() => {
|
||||||
|
this.classList.remove("success")
|
||||||
|
this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
|
||||||
|
}, DoxygenAwesomeFragmentCopyButton.successDuration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton)
|
||||||
72
doxytheme/doxygen-awesome-interactive-toc.js
Normal file
72
doxytheme/doxygen-awesome-interactive-toc.js
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
Copyright (c) 2022 - 2025 jothepro
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DoxygenAwesomeInteractiveToc {
|
||||||
|
static topOffset = 38
|
||||||
|
static hideMobileMenu = true
|
||||||
|
static headers = []
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
window.addEventListener("load", () => {
|
||||||
|
let toc = document.querySelector(".contents > .toc")
|
||||||
|
if(toc) {
|
||||||
|
toc.classList.add("interactive")
|
||||||
|
if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) {
|
||||||
|
toc.classList.add("open")
|
||||||
|
}
|
||||||
|
document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => {
|
||||||
|
if(toc.classList.contains("open")) {
|
||||||
|
toc.classList.remove("open")
|
||||||
|
} else {
|
||||||
|
toc.classList.add("open")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
document.querySelectorAll(".contents > .toc > ul a").forEach((node) => {
|
||||||
|
let id = node.getAttribute("href").substring(1)
|
||||||
|
DoxygenAwesomeInteractiveToc.headers.push({
|
||||||
|
node: node,
|
||||||
|
headerNode: document.getElementById(id)
|
||||||
|
})
|
||||||
|
|
||||||
|
document.getElementById("doc-content")?.addEventListener("scroll",this.throttle(DoxygenAwesomeInteractiveToc.update, 100))
|
||||||
|
})
|
||||||
|
DoxygenAwesomeInteractiveToc.update()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static update() {
|
||||||
|
let active = DoxygenAwesomeInteractiveToc.headers[0]?.node
|
||||||
|
DoxygenAwesomeInteractiveToc.headers.forEach((header) => {
|
||||||
|
let position = header.headerNode.getBoundingClientRect().top
|
||||||
|
header.node.classList.remove("active")
|
||||||
|
header.node.classList.remove("aboveActive")
|
||||||
|
if(position < DoxygenAwesomeInteractiveToc.topOffset) {
|
||||||
|
active = header.node
|
||||||
|
active?.classList.add("aboveActive")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
active?.classList.add("active")
|
||||||
|
active?.classList.remove("aboveActive")
|
||||||
|
}
|
||||||
|
|
||||||
|
static throttle(func, delay) {
|
||||||
|
let lastCall = 0;
|
||||||
|
return function (...args) {
|
||||||
|
const now = new Date().getTime();
|
||||||
|
if (now - lastCall < delay) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lastCall = now;
|
||||||
|
return setTimeout(() => {func(...args)}, delay);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
32
doxytheme/doxygen-awesome-paragraph-link.js
Normal file
32
doxytheme/doxygen-awesome-paragraph-link.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
Copyright (c) 2022 - 2025 jothepro
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DoxygenAwesomeParagraphLink {
|
||||||
|
// Icon from https://fonts.google.com/icons
|
||||||
|
// Licensed under the Apache 2.0 license:
|
||||||
|
// https://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
static icon = `<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z"/></svg>`
|
||||||
|
static title = "Permanent Link"
|
||||||
|
static init() {
|
||||||
|
$(function() {
|
||||||
|
$(document).ready(function() {
|
||||||
|
document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => {
|
||||||
|
let anchorlink = document.createElement("a")
|
||||||
|
anchorlink.setAttribute("href", `#${node.getAttribute("id")}`)
|
||||||
|
anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title)
|
||||||
|
anchorlink.classList.add("anchorlink")
|
||||||
|
node.classList.add("anchor")
|
||||||
|
anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon
|
||||||
|
node.parentElement.appendChild(anchorlink)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
20
doxytheme/doxygen-awesome-sidebar-only-darkmode-toggle.css
Normal file
20
doxytheme/doxygen-awesome-sidebar-only-darkmode-toggle.css
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2025 jothepro
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
|
||||||
|
#MSearchBox {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchField {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height));
|
||||||
|
}
|
||||||
|
}
|
||||||
105
doxytheme/doxygen-awesome-sidebar-only.css
Normal file
105
doxytheme/doxygen-awesome-sidebar-only.css
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2025 jothepro
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
html {
|
||||||
|
/* side nav width. MUST be = `TREEVIEW_WIDTH`.
|
||||||
|
* Make sure it is wide enough to contain the page title (logo + title + version)
|
||||||
|
*/
|
||||||
|
--side-nav-fixed-width: 335px;
|
||||||
|
--menu-display: none;
|
||||||
|
|
||||||
|
--top-height: 120px;
|
||||||
|
--toc-sticky-top: -25px;
|
||||||
|
--toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#projectname {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
html {
|
||||||
|
--searchbar-background: var(--page-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#side-nav {
|
||||||
|
min-width: var(--side-nav-fixed-width);
|
||||||
|
max-width: var(--side-nav-fixed-width);
|
||||||
|
top: var(--top-height);
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-tree, #side-nav {
|
||||||
|
height: calc(100vh - var(--top-height)) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top {
|
||||||
|
display: block;
|
||||||
|
border-bottom: none;
|
||||||
|
height: var(--top-height);
|
||||||
|
margin-bottom: calc(0px - var(--top-height));
|
||||||
|
max-width: var(--side-nav-fixed-width);
|
||||||
|
overflow: hidden;
|
||||||
|
background: var(--side-nav-background);
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-nav {
|
||||||
|
float: left;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-resizable-handle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-resizable-e {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-path {
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
left: calc(var(--side-nav-fixed-width) + 1px);
|
||||||
|
bottom: 0;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#doc-content {
|
||||||
|
height: calc(100vh - 31px) !important;
|
||||||
|
padding-bottom: calc(3 * var(--spacing-large));
|
||||||
|
padding-top: calc(var(--top-height) - 80px);
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-left: var(--side-nav-fixed-width) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchBox {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchField {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchResultsWindow {
|
||||||
|
left: var(--spacing-medium) !important;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-sync {
|
||||||
|
bottom: 4px;
|
||||||
|
right: auto;
|
||||||
|
left: 300px;
|
||||||
|
width: 35px;
|
||||||
|
top: auto !important;
|
||||||
|
user-select: none;
|
||||||
|
position: fixed
|
||||||
|
}
|
||||||
|
}
|
||||||
71
doxytheme/doxygen-awesome-tabs.js
Normal file
71
doxytheme/doxygen-awesome-tabs.js
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
Copyright (c) 2023 - 2025 jothepro
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DoxygenAwesomeTabs {
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
window.addEventListener("load", () => {
|
||||||
|
document.querySelectorAll(".tabbed:not(:empty)").forEach((tabbed, tabbedIndex) => {
|
||||||
|
let tabLinkList = []
|
||||||
|
tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => {
|
||||||
|
tab.id = "tab_" + tabbedIndex + "_" + tabIndex
|
||||||
|
let header = tab.querySelector(".tab-title")
|
||||||
|
let tabLink = document.createElement("button")
|
||||||
|
tabLink.classList.add("tab-button")
|
||||||
|
tabLink.appendChild(header)
|
||||||
|
header.title = header.textContent
|
||||||
|
tabLink.addEventListener("click", () => {
|
||||||
|
tabbed.querySelectorAll(":scope > ul > li").forEach((tab) => {
|
||||||
|
tab.classList.remove("selected")
|
||||||
|
})
|
||||||
|
tabLinkList.forEach((tabLink) => {
|
||||||
|
tabLink.classList.remove("active")
|
||||||
|
})
|
||||||
|
tab.classList.add("selected")
|
||||||
|
tabLink.classList.add("active")
|
||||||
|
})
|
||||||
|
tabLinkList.push(tabLink)
|
||||||
|
if(tabIndex == 0) {
|
||||||
|
tab.classList.add("selected")
|
||||||
|
tabLink.classList.add("active")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
let tabsOverview = document.createElement("div")
|
||||||
|
tabsOverview.classList.add("tabs-overview")
|
||||||
|
let tabsOverviewContainer = document.createElement("div")
|
||||||
|
tabsOverviewContainer.classList.add("tabs-overview-container")
|
||||||
|
tabLinkList.forEach((tabLink) => {
|
||||||
|
tabsOverview.appendChild(tabLink)
|
||||||
|
})
|
||||||
|
tabsOverviewContainer.appendChild(tabsOverview)
|
||||||
|
tabbed.before(tabsOverviewContainer)
|
||||||
|
|
||||||
|
function resize() {
|
||||||
|
let maxTabHeight = 0
|
||||||
|
tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => {
|
||||||
|
let visibility = tab.style.display
|
||||||
|
tab.style.display = "block"
|
||||||
|
maxTabHeight = Math.max(tab.offsetHeight, maxTabHeight)
|
||||||
|
tab.style.display = visibility
|
||||||
|
})
|
||||||
|
tabbed.style.height = `${maxTabHeight + 10}px`
|
||||||
|
}
|
||||||
|
|
||||||
|
resize()
|
||||||
|
new ResizeObserver(resize).observe(tabbed)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static resize(tabbed) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
3020
doxytheme/doxygen-awesome.css
Normal file
3020
doxytheme/doxygen-awesome.css
Normal file
File diff suppressed because it is too large
Load Diff
138
doxythemedoxygen-awesome-darkmode-toggle.js
Normal file
138
doxythemedoxygen-awesome-darkmode-toggle.js
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2025 jothepro
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DoxygenAwesomeDarkModeToggle extends HTMLElement {
|
||||||
|
// SVG icons from https://fonts.google.com/icons
|
||||||
|
// Licensed under the Apache 2.0 license:
|
||||||
|
// https://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`
|
||||||
|
static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`
|
||||||
|
static title = "Toggle Light/Dark Mode"
|
||||||
|
|
||||||
|
static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
|
||||||
|
static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
|
||||||
|
|
||||||
|
static _staticConstructor = function() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference)
|
||||||
|
// Update the color scheme when the browsers preference changes
|
||||||
|
// without user interaction on the website.
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||||
|
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
|
||||||
|
})
|
||||||
|
// Update the color scheme when the tab is made visible again.
|
||||||
|
// It is possible that the appearance was changed in another tab
|
||||||
|
// while this tab was in the background.
|
||||||
|
document.addEventListener("visibilitychange", visibilityState => {
|
||||||
|
if (document.visibilityState === 'visible') {
|
||||||
|
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}()
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
$(function() {
|
||||||
|
$(document).ready(function() {
|
||||||
|
const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
|
||||||
|
toggleButton.title = DoxygenAwesomeDarkModeToggle.title
|
||||||
|
toggleButton.updateIcon()
|
||||||
|
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||||
|
toggleButton.updateIcon()
|
||||||
|
})
|
||||||
|
document.addEventListener("visibilitychange", visibilityState => {
|
||||||
|
if (document.visibilityState === 'visible') {
|
||||||
|
toggleButton.updateIcon()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
|
||||||
|
})
|
||||||
|
$(window).resize(function(){
|
||||||
|
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.onclick=this.toggleDarkMode
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns `true` for dark-mode, `false` for light-mode system preference
|
||||||
|
*/
|
||||||
|
static get systemPreference() {
|
||||||
|
return window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns `true` for dark-mode, `false` for light-mode user preference
|
||||||
|
*/
|
||||||
|
static get userPreference() {
|
||||||
|
return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
|
||||||
|
(DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
|
||||||
|
}
|
||||||
|
|
||||||
|
static set userPreference(userPreference) {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
|
||||||
|
if(!userPreference) {
|
||||||
|
if(DoxygenAwesomeDarkModeToggle.systemPreference) {
|
||||||
|
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
|
||||||
|
} else {
|
||||||
|
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
|
||||||
|
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
|
||||||
|
} else {
|
||||||
|
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
static enableDarkMode(enable) {
|
||||||
|
if(enable) {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = true
|
||||||
|
document.documentElement.classList.add("dark-mode")
|
||||||
|
document.documentElement.classList.remove("light-mode")
|
||||||
|
} else {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = false
|
||||||
|
document.documentElement.classList.remove("dark-mode")
|
||||||
|
document.documentElement.classList.add("light-mode")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static onSystemPreferenceChanged() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference
|
||||||
|
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
static onUserPreferenceChanged() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleDarkMode() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference
|
||||||
|
this.updateIcon()
|
||||||
|
}
|
||||||
|
|
||||||
|
updateIcon() {
|
||||||
|
if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
|
||||||
|
this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
|
||||||
|
} else {
|
||||||
|
this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);
|
||||||
@@ -15,35 +15,51 @@
|
|||||||
#define IOAPICS_MAX 24
|
#define IOAPICS_MAX 24
|
||||||
#define INTERRUPT_SRC_OVERRIDES_MAX 24
|
#define INTERRUPT_SRC_OVERRIDES_MAX 24
|
||||||
|
|
||||||
#define LAPIC_ID 0x20 /* ID */
|
/// ID of Local APIC
|
||||||
#define LAPIC_EOI 0xB0 /* End of interrupt */
|
#define LAPIC_ID 0x20
|
||||||
#define LAPIC_SIVR 0xF0 /* Spurious interrupt vector register */
|
/// End of interrupt register
|
||||||
#define LAPIC_ICR 0x300 /* Interrupt command register */
|
#define LAPIC_EOI 0xB0
|
||||||
#define LAPIC_LVTTR 0x320 /* LVT timer register */
|
/// Spurious interrupt vector register
|
||||||
#define LAPIC_TIMICT 0x380 /* Initial count register */
|
#define LAPIC_SIVR 0xF0
|
||||||
#define LAPIC_TIMCCT 0x390 /* Current count register */
|
/// Interrupt command register
|
||||||
#define LAPIC_DCR 0x3E0 /* Divide config register */
|
#define LAPIC_ICR 0x300
|
||||||
|
/// LVT timer register
|
||||||
|
#define LAPIC_LVTTR 0x320
|
||||||
|
/// Timer initial count register
|
||||||
|
#define LAPIC_TIMICT 0x380
|
||||||
|
/// Timer current count register
|
||||||
|
#define LAPIC_TIMCCT 0x390
|
||||||
|
/// Divide config register
|
||||||
|
#define LAPIC_DCR 0x3E0
|
||||||
|
|
||||||
|
/// Table of IOAPICS
|
||||||
static struct acpi_madt_ioapic apics[IOAPICS_MAX];
|
static struct acpi_madt_ioapic apics[IOAPICS_MAX];
|
||||||
/* clang-format off */
|
/* clang-format off */
|
||||||
|
/// Table of interrupt source overrides
|
||||||
static struct acpi_madt_interrupt_source_override intr_src_overrides[INTERRUPT_SRC_OVERRIDES_MAX];
|
static struct acpi_madt_interrupt_source_override intr_src_overrides[INTERRUPT_SRC_OVERRIDES_MAX];
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
/// Count of actual IOAPIC entries
|
||||||
static size_t ioapic_entries = 0;
|
static size_t ioapic_entries = 0;
|
||||||
|
/// Count of actual interrupt source overrides
|
||||||
static size_t intr_src_override_entries = 0;
|
static size_t intr_src_override_entries = 0;
|
||||||
|
/// Local APIC MMIO base address. It comes from MSR_APIC_BASE
|
||||||
static uintptr_t lapic_mmio_base = 0;
|
static uintptr_t lapic_mmio_base = 0;
|
||||||
|
|
||||||
extern void amd64_spin (void);
|
extern void amd64_spin (void);
|
||||||
|
|
||||||
|
/// Read IOAPIC
|
||||||
static uint32_t amd64_ioapic_read (uintptr_t vaddr, uint32_t reg) {
|
static uint32_t amd64_ioapic_read (uintptr_t vaddr, uint32_t reg) {
|
||||||
*(volatile uint32_t*)vaddr = reg;
|
*(volatile uint32_t*)vaddr = reg;
|
||||||
return *(volatile uint32_t*)(vaddr + 0x10);
|
return *(volatile uint32_t*)(vaddr + 0x10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Write IOAPIC
|
||||||
static void amd64_ioapic_write (uintptr_t vaddr, uint32_t reg, uint32_t value) {
|
static void amd64_ioapic_write (uintptr_t vaddr, uint32_t reg, uint32_t value) {
|
||||||
*(volatile uint32_t*)vaddr = reg;
|
*(volatile uint32_t*)vaddr = reg;
|
||||||
*(volatile uint32_t*)(vaddr + 0x10) = value;
|
*(volatile uint32_t*)(vaddr + 0x10) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Find an IOAPIC corresposting to provided IRQ
|
||||||
static struct acpi_madt_ioapic* amd64_ioapic_find (uint8_t irq) {
|
static struct acpi_madt_ioapic* amd64_ioapic_find (uint8_t irq) {
|
||||||
struct acpi_madt_ioapic* apic = NULL;
|
struct acpi_madt_ioapic* apic = NULL;
|
||||||
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
||||||
@@ -60,6 +76,22 @@ static struct acpi_madt_ioapic* amd64_ioapic_find (uint8_t irq) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Route IRQ to an IDT entry of a given Local APIC.
|
||||||
|
*
|
||||||
|
* @param vec
|
||||||
|
* Interrupt vector number, which will be delivered to the CPU
|
||||||
|
*
|
||||||
|
* @param irq
|
||||||
|
* Legacy IRQ number to be routed. Can be changed by an interrupt source override
|
||||||
|
* into a different GSI.
|
||||||
|
*
|
||||||
|
* @param flags
|
||||||
|
* IOAPIC redirection flags.
|
||||||
|
*
|
||||||
|
* @param lapic_id
|
||||||
|
* Local APIC that will receive the interrupt.
|
||||||
|
*/
|
||||||
void amd64_ioapic_route_irq (uint8_t vec, uint8_t irq, uint64_t flags, uint64_t lapic_id) {
|
void amd64_ioapic_route_irq (uint8_t vec, uint8_t irq, uint64_t flags, uint64_t lapic_id) {
|
||||||
struct acpi_madt_ioapic* apic = NULL;
|
struct acpi_madt_ioapic* apic = NULL;
|
||||||
struct acpi_madt_interrupt_source_override* override;
|
struct acpi_madt_interrupt_source_override* override;
|
||||||
@@ -101,6 +133,7 @@ void amd64_ioapic_route_irq (uint8_t vec, uint8_t irq, uint64_t flags, uint64_t
|
|||||||
(uint32_t)(calc_flags >> 32));
|
(uint32_t)(calc_flags >> 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Mask a given IRQ
|
||||||
void amd64_ioapic_mask (uint8_t irq) {
|
void amd64_ioapic_mask (uint8_t irq) {
|
||||||
struct acpi_madt_ioapic* apic;
|
struct acpi_madt_ioapic* apic;
|
||||||
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
||||||
@@ -117,6 +150,7 @@ void amd64_ioapic_mask (uint8_t irq) {
|
|||||||
value | (1 << 16));
|
value | (1 << 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Unmask a given IRQ
|
||||||
void amd64_ioapic_unmask (uint8_t irq) {
|
void amd64_ioapic_unmask (uint8_t irq) {
|
||||||
struct acpi_madt_ioapic* apic;
|
struct acpi_madt_ioapic* apic;
|
||||||
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
||||||
@@ -133,6 +167,7 @@ void amd64_ioapic_unmask (uint8_t irq) {
|
|||||||
value & ~(1 << 16));
|
value & ~(1 << 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Find and initialize the IOAPIC
|
||||||
void amd64_ioapic_init (void) {
|
void amd64_ioapic_init (void) {
|
||||||
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
||||||
|
|
||||||
@@ -170,22 +205,36 @@ void amd64_ioapic_init (void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get MMIO base of Local APIC
|
||||||
static uintptr_t amd64_lapic_base (void) { return lapic_mmio_base; }
|
static uintptr_t amd64_lapic_base (void) { return lapic_mmio_base; }
|
||||||
|
|
||||||
|
/// Write Local APIC
|
||||||
static void amd64_lapic_write (uint32_t reg, uint32_t value) {
|
static void amd64_lapic_write (uint32_t reg, uint32_t value) {
|
||||||
*(volatile uint32_t*)(amd64_lapic_base () + reg) = value;
|
*(volatile uint32_t*)(amd64_lapic_base () + reg) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Read Local APIC
|
||||||
static uint32_t amd64_lapic_read (uint32_t reg) {
|
static uint32_t amd64_lapic_read (uint32_t reg) {
|
||||||
return *(volatile uint32_t*)(amd64_lapic_base () + reg);
|
return *(volatile uint32_t*)(amd64_lapic_base () + reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get ID of Local APIC
|
||||||
uint32_t amd64_lapic_id (void) { return amd64_lapic_read (LAPIC_ID) >> 24; }
|
uint32_t amd64_lapic_id (void) { return amd64_lapic_read (LAPIC_ID) >> 24; }
|
||||||
|
|
||||||
|
/// Send End of interrupt command to Local APIC
|
||||||
void amd64_lapic_eoi (void) { amd64_lapic_write (LAPIC_EOI, 0); }
|
void amd64_lapic_eoi (void) { amd64_lapic_write (LAPIC_EOI, 0); }
|
||||||
|
|
||||||
|
/// Set initial counter value in Local APIC timer
|
||||||
void amd64_lapic_tick (uint32_t tick) { amd64_lapic_write (LAPIC_TIMICT, tick); }
|
void amd64_lapic_tick (uint32_t tick) { amd64_lapic_write (LAPIC_TIMICT, tick); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Calibrate Local APIC to send interrupts in a set interval.
|
||||||
|
*
|
||||||
|
* @param us
|
||||||
|
* Period length in microseconds
|
||||||
|
*
|
||||||
|
* @return amount of ticsk in a given period
|
||||||
|
*/
|
||||||
static uint32_t amd64_lapic_calibrate (uint32_t us) {
|
static uint32_t amd64_lapic_calibrate (uint32_t us) {
|
||||||
amd64_lapic_write (LAPIC_DCR, 0x03);
|
amd64_lapic_write (LAPIC_DCR, 0x03);
|
||||||
|
|
||||||
@@ -200,6 +249,13 @@ static uint32_t amd64_lapic_calibrate (uint32_t us) {
|
|||||||
return ticks;
|
return ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts a Local APIC, configures LVT timer to
|
||||||
|
* send interrupts at \ref SCHED_PREEMPT_TIMER.
|
||||||
|
*
|
||||||
|
* @param ticks
|
||||||
|
* Initial tick count
|
||||||
|
*/
|
||||||
static void amd64_lapic_start (uint32_t ticks) {
|
static void amd64_lapic_start (uint32_t ticks) {
|
||||||
amd64_lapic_write (LAPIC_DCR, 0x03);
|
amd64_lapic_write (LAPIC_DCR, 0x03);
|
||||||
|
|
||||||
@@ -208,6 +264,10 @@ static void amd64_lapic_start (uint32_t ticks) {
|
|||||||
amd64_lapic_write (LAPIC_TIMICT, ticks);
|
amd64_lapic_write (LAPIC_TIMICT, ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize Local APIC, configure to send timer interrupts
|
||||||
|
* at a given period. See \ref amd64_lapic_calibrate and \ref amd64_lapic_start.
|
||||||
|
*/
|
||||||
uint64_t amd64_lapic_init (uint32_t us) {
|
uint64_t amd64_lapic_init (uint32_t us) {
|
||||||
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
||||||
|
|
||||||
@@ -228,6 +288,15 @@ uint64_t amd64_lapic_init (uint32_t us) {
|
|||||||
return ticks;
|
return ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send an IPI to a given Local APIC. This till invoke an IDT stub located at vec.
|
||||||
|
*
|
||||||
|
* @param lapic_id
|
||||||
|
* Target Local APIC
|
||||||
|
*
|
||||||
|
* @param vec
|
||||||
|
* Interrupt vector/IDT stub, which will be invoked by the IPI.
|
||||||
|
*/
|
||||||
void amd64_lapic_ipi (uint8_t lapic_id, uint8_t vec) {
|
void amd64_lapic_ipi (uint8_t lapic_id, uint8_t vec) {
|
||||||
amd64_lapic_write (LAPIC_ICR + 0x10, (lapic_id << 24));
|
amd64_lapic_write (LAPIC_ICR + 0x10, (lapic_id << 24));
|
||||||
amd64_lapic_write (LAPIC_ICR, vec);
|
amd64_lapic_write (LAPIC_ICR, vec);
|
||||||
|
|||||||
1
mkdocs.yml
Normal file
1
mkdocs.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
site_name: MOP3 documentation
|
||||||
Reference in New Issue
Block a user