Compare commits

...

122 Commits

Author SHA1 Message Date
aaaz
fcbdd00bce update clock at the beginning of seconds 2017-07-08 16:24:45 -05:00
o9000
491a56db10 Clock: Update correctly after suspend 2017-07-02 23:19:24 +02:00
o9000
cbe31981b3 Executor: fallback to old style tooltips if stderr is empty 2017-06-27 12:42:51 +02:00
o9000
dafe9824e3 Update changelog 2017-06-27 12:32:23 +02:00
o9000
b931066573 Executor: truncate very long tooltips 2017-06-27 12:27:50 +02:00
o9000
f45e107207 Executor: if no user tooltip is set, display stderr output 2017-06-27 12:24:52 +02:00
o9000
ece3bc4d85 Add some new themes, remove redundant ones 2017-06-27 11:04:12 +02:00
o9000
4b9ee685ac Update timers correctly after suspend 2017-06-27 00:53:17 +02:00
o9000
cfc43685a4 ChangeLog is in the same directory of get_version.sh, get it from there 2017-06-26 22:46:17 +02:00
o9000
d05d5f594b Revert change to ubuntu script 2017-06-26 22:36:42 +02:00
o9000
425036adc9 Get version script: allow running without path parameter 2017-06-26 22:34:48 +02:00
o9000
cb174592be Merge branch 'version' into 'master'
Fix finding Version

See merge request !26
2017-06-26 20:29:57 +00:00
Chris Mayo
7a350a5e83 Fix finding ChangeLog when building
Keep the first optional argument of get_version.sh as "--strict" and
make the second the PROJECT_SOURCE_DIR plus trailing slash from
CMakeLists.txt
2017-06-26 19:23:58 +01:00
Chris Mayo
afadf3ea3f Revert "Use double quoting in get_version.sh"
Fixed symptom not the underlying problem.

This reverts commit e39a841f6e.
2017-06-26 19:23:58 +01:00
o9000
c8ccf053ff tint2conf: fix segfault in corner case 2017-06-26 11:08:31 +02:00
o9000
2f74250634 Add some new themes, remove redundant ones 2017-06-26 11:01:07 +02:00
o9000
ad7faaab81 Make get_version.sh work in the current dir instead of build 2017-06-26 10:23:50 +02:00
o9000
e39a841f6e Use double quoting in get_version.sh 2017-06-26 10:19:08 +02:00
o9000
fc7c6afa81 Updated man page 2017-06-25 13:02:07 +02:00
o9000
51bc9d1569 Updated translation files 2017-06-22 22:11:06 +02:00
o9000
747bbd7c7b Update changelog 2017-06-22 20:43:13 +02:00
o9000
521ffbfaaf Remove primary_monitor_first and add primary as a possible monitor value (issue #614) 2017-06-22 19:57:23 +02:00
o9000
cd33e5b274 Battery: better Unknown state handling 2017-06-22 19:03:05 +02:00
o9000
201ea843a0 Battery: new config option battery_full_cmd (fixes issue #585) 2017-06-20 20:38:26 +02:00
o9000
dee210ceec Updated French translation 2017-06-20 20:25:07 +02:00
o9000
ea0e52c5a2 Battery format fixes 2017-06-20 18:58:22 +02:00
o9000
b5578ff5bc battery: Do not redefine strncat with different semantics 2017-06-20 16:18:28 +02:00
o9000
f9ad3cb029 Merge battery format from https://gitlab.com/berkley4/tint2 (issue #229) 2017-06-20 13:15:41 +02:00
o9000
30c24c59ed Hide executor if output is empty (issue #648) 2017-06-20 13:01:09 +02:00
o9000
6f05c9d327 Hide executor if output is empty (issue #648) 2017-06-20 12:57:35 +02:00
o9000
30429b88b3 Merge battery format from https://gitlab.com/berkley4/tint2 (issue #229) 2017-06-20 12:36:04 +02:00
o9000
394be61a65 Collapse executor if output is empty (fixes issue #648) 2017-06-20 11:38:37 +02:00
o9000
d55f6d7baa taskbar_hide_different_desktop 2017-06-20 05:06:37 +02:00
o9000
2dfcab170d Update packaging 2017-06-11 13:30:27 +02:00
o9000
59b2094ad1 Update packaging 2017-06-11 11:28:04 +02:00
o9000
8046600a55 Release 0.14.6 2017-06-11 11:15:36 +02:00
o9000
17a655b52a Update changelog 2017-06-11 11:14:57 +02:00
o9000
75b8587216 Update changelog 2017-06-05 17:07:04 +02:00
o9000
7c87ab88bc Reexecute on SIGUSR2 2017-06-05 16:56:40 +02:00
o9000
b87470a284 Update packaging script 2017-06-05 16:21:14 +02:00
o9000
948bf10bad Refactor text rendering 2017-06-05 16:12:51 +02:00
o9000
59c3761455 Refactor text rendering 2017-06-05 16:12:51 +02:00
o9000
b50f5ecf3e executor: do not output last line if it is not terminated by newline 2017-06-02 20:10:41 +02:00
o9000
be9c492406 Update changelog 2017-05-31 23:13:55 +02:00
o9000
85e1a356fe Fix incorrect config warning 2017-05-31 23:06:47 +02:00
o9000
5da4c1653a Clock: take into account borders and padding when computing size 2017-05-29 23:57:38 +02:00
o9000
64edd55add Task: take into account border width when computing text height 2017-05-28 14:46:50 +02:00
o9000
bd28ee77d9 Fix task icon size limits (https://forums.bunsenlabs.org/viewtopic.php?pid=51884) 2017-05-24 21:07:47 +02:00
o9000
d10a505aa9 Release 0.14.5 2017-05-21 13:33:11 +02:00
o9000
77f744eba4 Update changelog 2017-05-21 13:32:49 +02:00
o9000
f8dde00a33 Do not pollute command line of executed processes 2017-05-20 14:48:25 +02:00
o9000
380f260027 Fix some memory leaks (issue #641) 2017-04-30 20:49:08 +02:00
o9000
6df4eb4bee Release 0.14.4 2017-04-29 13:47:21 +02:00
o9000
18fcc4952d Update release script 2017-04-29 13:47:04 +02:00
o9000
3878bd6a49 Update changelog 2017-04-29 13:44:22 +02:00
o9000
067234e9fb Unify code used to execute external programs 2017-04-29 13:42:37 +02:00
o9000
e32d2342a6 Fix regression in executor (issue #639) 2017-04-27 21:57:45 +02:00
o9000
82776df9d6 Fix crash when _NET_WM_ICON is set but empty 2017-04-27 09:04:16 +02:00
o9000
f351b6fd8e Release 0.14.3 2017-04-23 17:33:49 +02:00
o9000
a7e4cf42e2 Release script 2017-04-23 17:33:38 +02:00
o9000
a4542e907e Changelog 2017-04-23 17:30:12 +02:00
o9000
12e3fd64bb Release script 2017-04-23 17:29:03 +02:00
o9000
e5b3a2d7f2 Release 0.14.2 2017-04-23 17:07:45 +02:00
o9000
b973cafce5 Changelog 2017-04-23 17:07:42 +02:00
o9000
162de7fc2b Release script 2017-04-23 17:06:16 +02:00
o9000
b2cc11dd5e Build script 2017-04-23 17:01:07 +02:00
o9000
c53274a576 Doc script 2017-04-23 16:40:31 +02:00
o9000
3120cb9cae Update package 2017-04-23 14:45:25 +02:00
o9000
91f7384fd2 Fix compilation under ubunt 12.04 2017-04-22 22:21:13 +02:00
o9000
2e832a988f Update package 2017-04-22 22:14:45 +02:00
o9000
ae60e8f1e7 Use c99 to fix compilation on old distributions 2017-04-22 22:14:00 +02:00
o9000
e7dc61565d Use correct /etc path 2017-04-22 22:00:11 +02:00
o9000
4b53bc2a22 Update package 2017-04-22 21:46:40 +02:00
o9000
354e23da8f Update package 2017-04-22 21:24:08 +02:00
o9000
f6d121570b Update package 2017-04-22 21:12:58 +02:00
o9000
eddc29a696 Update package 2017-04-22 21:11:18 +02:00
o9000
eca3820e48 Update package 2017-04-22 21:08:59 +02:00
o9000
ef73ff9024 Update package 2017-04-22 21:08:15 +02:00
o9000
b7316ed24a Readme 2017-04-22 19:38:12 +02:00
o9000
49b41667ad tint2conf: Add mime type and full support for editing by path 2017-04-22 19:31:59 +02:00
o9000
5646dca8b7 Update changelog 2017-04-22 19:08:53 +02:00
o9000
701b57e113 Open current tint2 config automatically when started from tint2 2017-04-22 19:07:49 +02:00
o9000
affac4cfa6 Changed indentation everywhere 2017-04-13 14:07:23 +02:00
o9000
c1e5a7b172 Set indentation to use spaces instead of tabs, add auto indentation script 2017-04-13 14:06:37 +02:00
o9000
8f67884119 Turn off debugging output 2017-04-08 14:12:02 +02:00
o9000
0932cc1084 Change _NET_WM_ICON_GEOMETRY on panel shrink (issue #634) 2017-04-08 14:10:39 +02:00
o9000
e7375a186f Fix startup notification issue 2017-04-08 14:10:09 +02:00
o9000
8917a4d15b Remove _NET_WM_ICON_GEOMETRY for hidden task buttons (issue #634) 2017-04-08 13:50:49 +02:00
o9000
87ca207107 Button: prefix environment variables 2017-04-05 20:26:57 +02:00
o9000
982767ce2e Buttons: export alignment variables for menu 2017-04-02 11:18:17 +02:00
o9000
fc5385aa38 Buttons: export alignment variables for menu 2017-04-02 10:09:24 +02:00
o9000
39480f48ac Buttons: export alignment variables for menu 2017-04-01 14:04:08 +02:00
o9000
1c1ba904a4 Update doc 2017-03-26 22:04:35 +02:00
o9000
6cde7bef1e Release 0.14.1 2017-03-26 15:50:55 +02:00
o9000
b9ab0ae58e tint2conf: Fix bad code when compiling with clang 2017-03-26 15:47:16 +02:00
o9000
2c90c5640e tint2conf: Fix bad code when compiling with clang 2017-03-26 15:46:10 +02:00
o9000
cb43e76660 Release 0.14 2017-03-26 10:49:47 +02:00
o9000
0fc22b5cd6 Button: svg icon support 2017-03-26 10:39:02 +02:00
o9000
a2c5553f4f Button: make sure icon is optional 2017-03-25 15:50:32 +01:00
o9000
63dd4a3e6c Button: make sure icon is optional 2017-03-25 15:48:03 +01:00
o9000
a7fc86cfbb tint2conf: Fixes for buttons 2017-03-25 15:45:10 +01:00
o9000
d72aa2edfb Button: doc 2017-03-25 15:28:50 +01:00
o9000
54d361cf42 Button: mouse effects 2017-03-25 15:23:06 +01:00
o9000
153de1aa45 Button: bugfix 2017-03-25 15:19:57 +01:00
o9000
fc883a5dd8 Button: maximum icon size option 2017-03-25 14:53:21 +01:00
o9000
dfd735956c tint2conf: Update fr.po 2017-03-25 14:42:06 +01:00
o9000
a77b728110 tint2conf: Update po 2017-03-25 14:38:24 +01:00
o9000
5cfffd7c8e tint2conf: Update pot 2017-03-25 14:38:04 +01:00
o9000
a73c6928c3 tint2conf: Buttons 2017-03-25 14:36:40 +01:00
o9000
d5dfda296f Buttons 2017-03-25 14:17:27 +01:00
o9000
89d57f893c Revert get_version.sh 2017-03-25 12:02:20 +01:00
o9000
46371fe816 Release 0.13.3 2017-03-25 12:00:25 +01:00
o9000
bfe4873204 Fix regression (bad merge in commit 61a80b9) 2017-03-22 17:58:06 +01:00
o9000
acd1ed5768 tint2conf: Do not search for icons in all icon themes (issue #563) 2017-03-20 18:06:49 +01:00
o9000
b6a4fe03df Merge branch 'patch-4' into 'master'
Update ru.po

See merge request !25
2017-03-20 16:57:02 +00:00
Vladimir
b25ad07c30 wording tweak 2017-03-20 14:57:37 +00:00
Vladimir
ffcd53e989 Update ru.po 2017-03-20 14:51:23 +00:00
o9000
4e22e0f4e7 Release 0.13.2 2017-03-19 11:56:48 +01:00
o9000
d6a40c7523 Fix compilation under Linux 2017-03-19 11:41:51 +01:00
o9000
4ee2f4e7de Fix compilation under FreeBSD 2017-03-18 23:06:52 +01:00
o9000
1567e56a09 Update README.md 2017-03-12 17:25:28 +00:00
o9000
639ccbf16c Allow long lines in tint2conf 2017-03-12 17:41:26 +01:00
135 changed files with 29007 additions and 28081 deletions

View File

@@ -63,4 +63,4 @@ SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 4
UseTab: ForIndentation
UseTab: Never

View File

@@ -29,6 +29,7 @@ Contributors:
Oskari Rauta : separator plugin, gradients
Michael Messmore : Support for Path in .desktop files
Matthew Otnel : config option systray_name_filter
Ryan Gray, Jeff Blake (https://gitlab.com/berkley4) : battery format
Translations:
Bosnian:

View File

@@ -82,7 +82,13 @@ if( NOT IMLIB_BUILD_WITH_X )
message( FATAL_ERROR "Imlib is not built with X support" )
endif( NOT IMLIB_BUILD_WITH_X )
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_definitions( -D_POSIX_C_SOURCE=200809L -D_BSD_SOURCE -D_DEFAULT_SOURCE )
else(CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_definitions( -D_WITH_GETLINE )
endif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
include_directories( ${PROJECT_BINARY_DIR}
src
@@ -94,6 +100,7 @@ include_directories( ${PROJECT_BINARY_DIR}
src/tooltip
src/util
src/execplugin
src/button
src/freespace
src/separator
${X11_INCLUDE_DIRS}
@@ -122,6 +129,7 @@ set( SOURCES src/config.c
src/taskbar/taskbarname.c
src/tooltip/tooltip.c
src/execplugin/execplugin.c
src/button/button.c
src/freespace/freespace.c
src/separator/separator.c
src/tint2rc.c
@@ -209,7 +217,7 @@ else()
SET(ASAN_L_FLAGS "")
endif()
add_custom_target( version ALL "${PROJECT_SOURCE_DIR}/get_version.sh" "\"${PROJECT_SOURCE_DIR}\"" )
add_custom_target( version ALL "${PROJECT_SOURCE_DIR}/get_version.sh" -- "\"${PROJECT_SOURCE_DIR}/\"" )
link_directories( ${X11_LIBRARY_DIRS}
${PANGOCAIRO_LIBRARY_DIRS}
@@ -249,7 +257,7 @@ set_target_properties( tint2 PROPERTIES LINK_FLAGS "-pthread -fno-strict-aliasin
install( TARGETS tint2 DESTINATION bin )
install( FILES tint2.svg DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps )
install( FILES tint2.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications )
install( FILES themes/tint2rc DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/xdg/tint2 )
install( FILES themes/tint2rc DESTINATION /etc/xdg/tint2 )
install( FILES default_icon.png DESTINATION ${CMAKE_INSTALL_DATADIR}/tint2 )
install( FILES AUTHORS ChangeLog README.md doc/tint2.md DESTINATION ${docdir} )
install( FILES doc/manual.html doc/readme.html DESTINATION ${htmldir} )

View File

@@ -1,3 +1,61 @@
2017-06-27 master
- Fixes:
- Clock, executors and other timers fire correctly after waking up from suspend
- Enhancements:
- Taskbar: new config option taskbar_hide_different_desktop
- Battery:
- New config option bat1_format and bat2_format
- New config option battery_full_cmd
- Better "Unknown" state handling
- Executor:
- Hide if output is empty
- If no user tooltip is set, displays the script standard error as tooltip.
Tooltip is multiline, can be cleared with the VT100 clear screen sequence, in shell: (>&2 echo -en "\033[2J").
Long tooltips are truncated to 4096 characters.
- Configuration changes:
- Removed primary_monitor_first as it was conflicting with taskbar behavior; use *_monitor = primary instead.
2017-06-11 0.14.6
- Fixes:
- Take into account border width when computing text height
- Taskbar: Fix task icon size limits
- Executor: Do not output last line if it is not terminated by newline
- Enhancements:
- Re-execute tint2 on SIGUSR2.
This is useful for preserving config options and environment when updating tint2.
2017-05-21 0.14.5
- Fixes:
- Fixed a couple of memory leaks
2017-04-29 0.14.4
- Fixes:
- Fix regression in executor (issue #639)
- Fix crash when _NET_WM_ICON is set but empty (https://github.com/jmc-88/tint3/issues/21)
2017-04-23 0.14.3
- Fixes:
- Make versioning more robust when building as package
- Enhancements:
- Tint2conf: Open current tint2 config automatically when started from tint2
2017-03-26 0.14.1
- Fixes:
- Fixed tint2conf problem under FreeBSD (or generally any system using clang).
2017-03-26 0.14
- Enhancements:
- New plugin: button.
2017-03-25 0.13.3
- Fixes:
- Fixed autohide for non-bottom panels (issue #632)
- Translations updated (contributed by Vladimir)
2017-03-19 0.13.2
- Fixes:
- Fixed compilation under FreeBSD
2017-03-12 0.13.1
- Fixes:
- Fixed compilation with new glibc (issue #625)

View File

@@ -1,5 +1,5 @@
# Latest stable release: 0.13.1
Changes: https://gitlab.com/o9000/tint2/blob/0.13.1/ChangeLog
# Latest stable release: 0.14.6
Changes: https://gitlab.com/o9000/tint2/blob/0.14.6/ChangeLog
Documentation: [doc/tint2.md](doc/tint2.md)
@@ -8,7 +8,7 @@ Compile it with (after you install the [dependencies](https://gitlab.com/o9000/t
```
git clone https://gitlab.com/o9000/tint2.git
cd tint2
git checkout 0.13.1
git checkout 0.14.6
mkdir build
cd build
cmake ..
@@ -19,6 +19,8 @@ To install, run (as root):
```
make install
update-icon-caches /usr/local/share/icons/hicolor
update-mime-database /usr/local/share/mime
```
And then you can run the panel `tint2` and the configuration program `tint2conf`.
@@ -87,7 +89,7 @@ tint2 is a simple panel/taskbar made for modern X window managers. It was specif
## Demos
* 0.13.1: [Compact panel, separator, color gradients](https://gitlab.com/o9000/tint2/wikis/whats-new-0.13.1.0.gif)
* 0.12.4: [Executor](https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.4.gif)
* 0.12.3: [Mouse over effects](https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.3.gif)
* 0.12: [Distribute size between taskbars, freespace](https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.gif)
* [Compact panel, separator, color gradients](https://gitlab.com/o9000/tint2/wikis/whats-new-0.13.0.gif)
* [Executor](https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.4.gif)
* [Mouse over effects](https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.3.gif)
* [Distribute size between taskbars, freespace](https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.gif)

View File

@@ -2,6 +2,9 @@
# You can install md2man with gem install md2man. You need gem and ruby-dev.
set -e
set -x
md2man-roff tint2.md > tint2.1
cat header.html > manual.html

View File

@@ -199,7 +199,7 @@ pre {
</style>
</head>
<body>
<h1 id="tint2"><span class="md2man-title">TINT2</span><a name="tint2" href="#tint2" class="md2man-permalink" title="permalink"></a></h1><h2 id="name">NAME<a name="name" href="#name" class="md2man-permalink" title="permalink"></a></h2><p>tint2 - lightweight panel/taskbar</p><h2 id="synopsis">SYNOPSIS<a name="synopsis" href="#synopsis" class="md2man-permalink" title="permalink"></a></h2><p><code>tint2 [-c path_to_config_file]</code></p><h2 id="description">DESCRIPTION<a name="description" href="#description" class="md2man-permalink" title="permalink"></a></h2><p>tint2 is a simple panel/taskbar made for modern X window managers.
<h1 id="tint2"><span class="md2man-title">TINT2</span><a name="tint2" href="#tint2" class="md2man-permalink" title="permalink"></a></h1><h2 id="name">NAME<a name="name" href="#name" class="md2man-permalink" title="permalink"></a></h2><p>tint2 - lightweight panel/taskbar</p><h2 id="description">DESCRIPTION<a name="description" href="#description" class="md2man-permalink" title="permalink"></a></h2><p>tint2 is a simple panel/taskbar made for modern X window managers.
It was specifically made for Openbox but it should also work with other window managers (GNOME, KDE, XFCE etc.).</p><p>Features:</p>
<ul>
<li>Panel with taskbar, system tray, clock and launcher icons;</li>
@@ -214,7 +214,7 @@ It was specifically made for Openbox but it should also work with other window m
<li>Follow the freedesktop.org specifications;</li>
<li>Make certain workflows, such as multi-desktop and multi-monitor, easy to use.</li>
</ul>
<h2 id="options">OPTIONS<a name="options" href="#options" class="md2man-permalink" title="permalink"></a></h2><dl><dt><code>-c path_to_config_file</code></dt><dd>Specifies which configuration file to use instead of the default.</dd></dl><h2 id="configuration">CONFIGURATION<a name="configuration" href="#configuration" class="md2man-permalink" title="permalink"></a></h2><h3 id="table-of-contents">Table of contents<a name="table-of-contents" href="#table-of-contents" class="md2man-permalink" title="permalink"></a></h3>
<h2 id="synopsis">SYNOPSIS<a name="synopsis" href="#synopsis" class="md2man-permalink" title="permalink"></a></h2><p><code>tint2 [OPTION...]</code></p><h2 id="options">OPTIONS<a name="options" href="#options" class="md2man-permalink" title="permalink"></a></h2><dl><dt><code>-c path_to_config_file</code></dt><dd>Specifies which configuration file to use instead of the default.</dd></dl><dl><dt><code>-v, --version</code></dt><dd>Prints version information and exits.</dd></dl><dl><dt><code>-h, --help</code></dt><dd>Display this help and exits.</dd></dl><h2 id="configuration">CONFIGURATION<a name="configuration" href="#configuration" class="md2man-permalink" title="permalink"></a></h2><h3 id="table-of-contents">Table of contents<a name="table-of-contents" href="#table-of-contents" class="md2man-permalink" title="permalink"></a></h3>
<ul>
<li><p><a href="#introduction">Introduction</a></p></li>
<li><p><a href="#backgrounds-and-borders">Backgrounds and borders</a></p></li>
@@ -229,6 +229,7 @@ It was specifically made for Openbox but it should also work with other window m
<li><p><a href="#tooltip">Tooltip</a></p></li>
<li><p><a href="#battery">Battery</a></p></li>
<li><p><a href="#executor">Executor</a></p></li>
<li><p><a href="#button">Button</a></p></li>
<li><p><a href="#separator">Separator</a></p></li>
<li><p><a href="#example-configuration">Example configuration</a></p></li>
</ul>
@@ -359,15 +360,16 @@ gradient_id_pressed = 2
<li><code>C</code> shows the Clock</li>
<li><code>F</code> adds an extensible spacer (freespace). You can specify more than one. Has no effect if <code>T</code> is also present. <em>(since 0.12)</em></li>
<li><code>E</code> adds an executor plugin. You can specify more than one. <em>(since 0.12.4)</em></li>
<li><code>P</code> adds a push button. You can specify more than one. <em>(since 0.14)</em></li>
<li><code>:</code> adds a separator. You can specify more than one. <em>(since 0.13.0)</em></li>
</ul>
<p>For example, <code>panel_items = STC</code> will show the systray, the taskbar and the clock (from left to right).</p></li>
<li><p><code>panel_monitor = monitor (all or 1 or 2 or ...)</code> : Which monitor tint2 draws the panel on</p>
<li><p><code>panel_monitor = monitor (all or primary or 1 or 2 or ...)</code> : Which monitor tint2 draws the panel on</p>
<ul>
<li>The first monitor is <code>1</code></li>
<li>Use <code>panel_monitor = all</code> to get a separate panel per monitor</li>
</ul></li>
<li><p><code>primary_monitor_first = boolean (0 or 1)</code> : Place the primary monitor before all the other monitors in the list. <em>(since 0.12.4)</em></p></li>
<li><p><code>primary_monitor_first = boolean (0 or 1)</code> : Place the primary monitor before all the other monitors in the list. <em>(since 0.12.4; removed in 1.0, use <code>primary</code> instead)</em></p></li>
</ul>
<p><img src="images/panel_padding.jpg" alt=""></p>
<ul>
@@ -454,6 +456,7 @@ panel_size = 94% 30
<li><p><code>taskbar_active_background_id = integer</code> : Which background to use for the taskbar of the current virtual desktop.</p></li>
<li><p><code>taskbar_hide_inactive_tasks = boolean (0 or 1)</code> : If enabled, the taskbar shows only the active task. <em>(since 0.12)</em></p></li>
<li><p><code>taskbar_hide_different_monitor = boolean (0 or 1)</code> : If enabled, the taskbar shows only the tasks from the current monitor. Useful when running different tint2 instances on different monitors, each one having its own config. <em>(since 0.12)</em></p></li>
<li><p><code>taskbar_hide_different_desktop = boolean (0 or 1)</code> : If enabled, the taskbar shows only the tasks from the current desktop. Useful to make multi-desktop taskbars more compact, but still allow desktop switching with mouse click. <em>(since 1.0)</em></p></li>
<li><p><code>taskbar_always_show_all_desktop_tasks = boolean (0 or 1)</code> : Has effect only if <code>taskbar_mode = multi_desktop</code>. If enabled, tasks that appear on all desktops are shown on all taskbars. Otherwise, they are shown only on the taskbar of the current desktop. <em>(since 0.12.4)</em></p></li>
<li><p><code>taskbar_sort_order = none/title/center</code> : Specifies the sort order of the tasks on the taskbar. <em>(since 0.12)</em></p>
<ul>
@@ -521,7 +524,7 @@ panel_size = 94% 30
<li><p><code>systray_sort = ascending/descending/left2right/right2left</code> : Specifies the sorting order for the icons in the systray: in ascending/descending alphabetical order of the icon title, or always add icons to the right/left (note that with <code>left2right</code> or <code>right2left</code> the order can be different on panel restart).</p></li>
<li><p><code>systray_icon_size = max_icon_size</code> : Set the maximum system tray icon size to <code>number</code>. Set to <code>0</code> for automatic icon sizing.</p></li>
<li><p><code>systray_icon_asb = alpha (0 to 100) saturation (-100 to 100) brightness (-100 to 100)</code> : Adjust the systray icons color and transparency.</p></li>
<li><p><code>systray_monitor = integer (1, 2, ...)</code> : On which monitor to draw the systray. The first monitor is <code>1</code>. <em>(since 0.12)</em></p></li>
<li><p><code>systray_monitor = integer (1, 2, ...) or primary</code> : On which monitor to draw the systray. The first monitor is <code>1</code>. <em>(since 0.12)</em></p></li>
<li><p><code>systray_name_filter = string</code> : Regular expression to identify icon names to be hidden. For example, <code>^audacious$</code> will hide icons with the exact name <code>audacious</code>, while <code>aud</code> will hide any icons having <code>aud</code> in the name. <em>(since 0.13.1)</em></p></li>
</ul>
<h3 id="clock">Clock<a name="clock" href="#clock" class="md2man-permalink" title="permalink"></a></h3>
@@ -564,9 +567,19 @@ panel_size = 94% 30
<li><p><code>battery_hide = never/integer (0 to 100)</code> : At what battery percentage the battery item is hidden.</p></li>
<li><p><code>battery_low_status = integer</code>: At what battery percentage the low command is executed.</p></li>
<li><p><code>battery_low_cmd = notify-send &quot;battery low&quot;</code> : Command to execute when the battery is low.</p></li>
<li><p><code>battery_full_cmd = notify-send &quot;battery full&quot;</code> : Command to execute when the battery is full.</p></li>
<li><p><code>bat1_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</code></p></li>
<li><p><code>bat2_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</code></p></li>
<li><p><code>battery_font_color = color opacity (0 to 100)</code></p></li>
<li><p><code>bat1_format = FORMAT_STRING</code> : Format for battery line 1. Default: %p. <em>(since 1.0)</em> Format specification:</p>
<ul>
<li>%s: State (charging, discharging, full, unknown).</li>
<li>%m: Minutes left until completely charged/discharged (estimated).</li>
<li>%h: Hours left until completely charged/discharged (estimated).</li>
<li>%t: Time left. Shows &quot;hrs:mins&quot; when charging/discharging, or &quot;Ful\&quot; when full.</li>
<li>%p: Percentage. Includes the % sign.</li>
</ul></li>
<li><p><code>bat2_format = FORMAT_STRING</code> : Format for battery line 2. Default: %t. <em>(since 1.0)</em></p></li>
<li><p><code>battery_padding = horizontal_padding vertical_padding</code></p></li>
<li><p><code>battery_background_id = integer</code> : Which background to use for the battery.</p></li>
<li><p><code>battery_tooltip_enabled = boolean (0 or 1)</code> : Enable/disable battery tooltips. <em>(since 0.12.3)</em></p></li>
@@ -650,6 +663,24 @@ execp_command = stdbuf -oL bwm-ng -o csv -t 1000 | awk -F ';' '/total/ { printf
execp_continuous = 1
execp_interval = 1
</code></pre>
<h3 id="button">Button<a name="button" href="#button" class="md2man-permalink" title="permalink"></a></h3>
<ul>
<li><p><code>button = new</code> : Begins the configuration of a new button. Multiple such plugins are supported; just use multiple <code>P</code>s in <code>panel_items</code>. <em>(since 0.14)</em></p></li>
<li><p><code>button_icon = text</code> : Name or path of icon (or empty). <em>(since 0.14)</em></p></li>
<li><p><code>button_text = text</code> : Text to display (or empty). <em>(since 0.14)</em></p></li>
<li><p><code>button_tooltip = text</code> : The tooltip (or empty). <em>(since 0.14)</em></p></li>
<li><p><code>button_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</code> : The font used to draw the text. <em>(since 0.14)</em></p></li>
<li><p><code>button_font_color = color opacity</code> : The font color. <em>(since 0.14)</em></p></li>
<li><p><code>button_background_id = integer</code> : Which background to use. <em>(since 0.14)</em></p></li>
<li><p><code>button_centered = boolean (0 or 1)</code> : Whether to center the text. <em>(since 0.14)</em></p></li>
<li><p><code>button_padding = horizontal_padding vertical_padding spacing_between_icon_and_text</code> <em>(since 0.14)</em></p></li>
<li><p><code>button_max_icon_size = integer</code> : Sets a limit to the icon size. Otherwise, the icon will expand to the edges. <em>(since 0.14)</em></p></li>
<li><p><code>button_lclick_command = text</code> : Command to execute on left click. If not defined, <code>execp_command</code> is executed immediately, unless it is currently running. <em>(since 0.14)</em></p></li>
<li><p><code>button_mclick_command = text</code> : Command to execute on right click. If not defined, <code>execp_command</code> is executed immediately, unless it is currently running. <em>(since 0.14)</em></p></li>
<li><p><code>button_rclick_command = text</code> : Command to execute on middle click. If not defined, <code>execp_command</code> is executed immediately, unless it is currently running. <em>(since 0.14)</em></p></li>
<li><p><code>button_uwheel_command = text</code> : Command to execute on wheel scroll up. If not defined, <code>execp_command</code> is executed immediately, unless it is currently running. <em>(since 0.14)</em></p></li>
<li><p><code>button_dwheel_command = text</code> : Command to execute on wheel scroll down. If not defined, <code>execp_command</code> is executed immediately, unless it is currently running. <em>(since 0.14)</em></p></li>
</ul>
<h3 id="separator">Separator<a name="separator" href="#separator" class="md2man-permalink" title="permalink"></a></h3>
<ul>
<li><p><code>separator = new</code> : Begins the configuration of a new separator. Multiple such plugins are supported; just use multiple <code>:</code>s in <code>panel_items</code>. <em>(since 0.13.0)</em></p></li>
@@ -659,142 +690,7 @@ execp_interval = 1
<li><p><code>separator_size = integer</code> : The thickness of the separator. Does not include the border and padding. For example, if the style is <code>line</code>, this is the line thickness; if the style is <code>dots</code>, this is the dot&#39;s diameter. <em>(since 0.13.0)</em></p></li>
<li><p><code>separator_padding = side_padding cap_padding</code> : The padding to add to the sides of the separator, in pixels. <em>(since 0.13.0)</em></p></li>
</ul>
<h3 id="example-configuration">Example configuration<a name="example-configuration" href="#example-configuration" class="md2man-permalink" title="permalink"></a></h3><pre class="highlight plaintext"><code>#---------------------------------------------
## TINT2 CONFIG FILE
#---------------------------------------------
#---------------------------------------------
## BACKGROUND AND BORDER
#---------------------------------------------
rounded = 7
border_width = 2
background_color = #000000 60
border_color = #ffffff 18
rounded = 5
border_width = 0
background_color = #ffffff 40
border_color = #ffffff 50
rounded = 5
border_width = 0
background_color = #ffffff 18
border_color = #ffffff 70
#---------------------------------------------
## PANEL
#---------------------------------------------
panel_monitor = all
panel_position = bottom center
panel_size = 94% 30
panel_margin = 0 0
panel_padding = 7 0
font_shadow = 0
panel_background_id = 1
wm_menu = 0
panel_dock = 0
panel_layer = bottom
#---------------------------------------------
## TASKBAR
#---------------------------------------------
#taskbar_mode = multi_desktop
taskbar_mode = single_desktop
taskbar_padding = 2 3 2
taskbar_background_id = 0
#taskbar_active_background_id = 0
#---------------------------------------------
## TASKS
#---------------------------------------------
task_icon = 1
task_text = 1
task_maximum_size = 140 35
task_centered = 1
task_padding = 6 3
task_font = sans 7
task_font_color = #ffffff 70
task_background_id = 3
task_icon_asb = 100 0 0
## replace STATUS by 'urgent', 'active' or 'iconified'
#task_STATUS_background_id = 2
#task_STATUS_font_color = #ffffff 85
#task_STATUS_icon_asb = 100 0 0
## example:
task_active_background_id = 2
task_active_font_color = #ffffff 85
task_active_icon_asb = 100 0 0
urgent_nb_of_blink = 8
#---------------------------------------------
## SYSTRAYBAR
#---------------------------------------------
systray = 1
systray_padding = 0 4 5
systray_background_id = 0
systray_sort = left2right
systray_icon_size = 0
systray_icon_asb = 100 0 0
#---------------------------------------------
## CLOCK
#---------------------------------------------
time1_format = %H:%M
time1_font = sans 8
time2_format = %A %d %B
time2_font = sans 6
clock_font_color = #ffffff 76
clock_padding = 1 0
clock_background_id = 0
#clock_lclick_command = xclock
clock_rclick_command = orage
#clock_tooltip = %A %d %B
#time1_timezone = :US/Hawaii
#time2_timezone = :Europe/Berlin
#clock_tooltip_timezone = :/usr/share/zoneinfo/Europe/Paris
#---------------------------------------------
## BATTERY
#---------------------------------------------
battery = 0
battery_hide = 98
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #ffffff 76
battery_padding = 1 0
battery_background_id = 0
#---------------------------------------------
## TOOLTIP
#---------------------------------------------
tooltip = 0
tooltip_padding = 2 2
tooltip_show_timeout = 0.7
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font_color = #OOOOOO 80
tooltip_font = sans 10
#---------------------------------------------
## MOUSE ACTION ON TASK
#---------------------------------------------
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
#---------------------------------------------
## AUTOHIDE OPTIONS
#---------------------------------------------
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 2
autohide_height = 4
strut_policy = minimum
</code></pre>
<h2 id="author">AUTHOR<a name="author" href="#author" class="md2man-permalink" title="permalink"></a></h2><p>tint2 was written by Thierry Lorthiois <a href="mailto:lorthiois@bbsoft.fr">lorthiois@bbsoft.fr</a>.
<h3 id="example-configuration">Example configuration<a name="example-configuration" href="#example-configuration" class="md2man-permalink" title="permalink"></a></h3><p>See /etc/xdg/tint2/tint2rc.</p><h2 id="author">AUTHOR<a name="author" href="#author" class="md2man-permalink" title="permalink"></a></h2><p>tint2 was written by Thierry Lorthiois <a href="mailto:lorthiois@bbsoft.fr">lorthiois@bbsoft.fr</a>.
It is based on ttm, originally written by Pål Staurland <a href="mailto:staura@gmail.com">staura@gmail.com</a>.</p><p>This manual page was originally written by Daniel Moerner <a href="mailto:dmoerner@gmail.com">dmoerner@gmail.com</a>, for the Debian project (but may be used by others).
It was adopted from the tint2 docs.</p><h2 id="see-also">SEE ALSO<a name="see-also" href="#see-also" class="md2man-permalink" title="permalink"></a></h2><p>The main website <a href="https://gitlab.com/o9000/tint2">https://gitlab.com/o9000/tint2</a>
and the wiki page at <a href="https://gitlab.com/o9000/tint2/wikis/home">https://gitlab.com/o9000/tint2/wikis/home</a>.</p><p>This documentation is also provided in HTML and Markdown format in the system&#39;s default location

View File

@@ -199,15 +199,17 @@ pre {
</style>
</head>
<body>
<h1 id="latest-stable-release-0-13-1"><span class="md2man-title">Latest</span> <span class="md2man-section">stable</span> <span class="md2man-date">release:</span> <span class="md2man-source">0.13.1</span><a name="latest-stable-release-0-13-1" href="#latest-stable-release-0-13-1" class="md2man-permalink" title="permalink"></a></h1><p>Changes: <a href="https://gitlab.com/o9000/tint2/blob/0.13.1/ChangeLog">https://gitlab.com/o9000/tint2/blob/0.13.1/ChangeLog</a></p><p>Documentation: <a href="manual.html">manual.html</a></p><p>Compile it with (after you install the <a href="https://gitlab.com/o9000/tint2/wikis/Install#dependencies">dependencies</a>):</p><pre class="highlight plaintext"><code>git clone https://gitlab.com/o9000/tint2.git
<h1 id="latest-stable-release-0-14-6"><span class="md2man-title">Latest</span> <span class="md2man-section">stable</span> <span class="md2man-date">release:</span> <span class="md2man-source">0.14.6</span><a name="latest-stable-release-0-14-6" href="#latest-stable-release-0-14-6" class="md2man-permalink" title="permalink"></a></h1><p>Changes: <a href="https://gitlab.com/o9000/tint2/blob/0.14.6/ChangeLog">https://gitlab.com/o9000/tint2/blob/0.14.6/ChangeLog</a></p><p>Documentation: <a href="manual.html">manual.html</a></p><p>Compile it with (after you install the <a href="https://gitlab.com/o9000/tint2/wikis/Install#dependencies">dependencies</a>):</p><pre class="highlight plaintext"><code>git clone https://gitlab.com/o9000/tint2.git
cd tint2
git checkout 0.13.1
git checkout 0.14.6
mkdir build
cd build
cmake ..
make -j4
</code></pre>
<p>To install, run (as root):</p><pre class="highlight plaintext"><code>make install
update-icon-caches /usr/local/share/icons/hicolor
update-mime-database /usr/local/share/mime
</code></pre>
<p>And then you can run the panel <code>tint2</code> and the configuration program <code>tint2conf</code>.</p><p>Please report any problems to <a href="https://gitlab.com/o9000/tint2/issues">https://gitlab.com/o9000/tint2/issues</a>. Your feedback is much appreciated.</p><p>P.S. GitLab is now the official location of the tint2 project, migrated from Google Code, which is shutting down. In case you are wondering why not GitHub, BitBucket etc., we chose GitLab because it is open source, it is mature and works well, looks cool and has a very nice team.</p><h1 id="what-is-tint2">What is tint2?<a name="what-is-tint2" href="#what-is-tint2" class="md2man-permalink" title="permalink"></a></h1><p>tint2 is a simple panel/taskbar made for modern X window managers. It was specifically made for Openbox but it should also work with other window managers (GNOME, KDE, XFCE etc.). It is based on ttm <a href="https://code.google.com/p/ttm/">https://code.google.com/p/ttm/</a>.</p><h1 id="features">Features<a name="features" href="#features" class="md2man-permalink" title="permalink"></a></h1>
<ul>
@@ -256,10 +258,10 @@ make -j4
</ul>
<h1 id="screenshots">Screenshots<a name="screenshots" href="#screenshots" class="md2man-permalink" title="permalink"></a></h1><h2 id="default-config">Default config:<a name="default-config" href="#default-config" class="md2man-permalink" title="permalink"></a></h2><p><img src="https://gitlab.com/o9000/tint2/uploads/948fa74eca60864352a033580350b4c3/Screenshot_2016-01-23_14-42-57.png" alt="Screenshot_2016-01-23_14-42-57"></p><h2 id="various-configs">Various configs:<a name="various-configs" href="#various-configs" class="md2man-permalink" title="permalink"></a></h2><p><img src="https://gitlab.com/o9000/tint2/wikis/screenshot.png" alt="screenshot"></p><h2 id="demos">Demos<a name="demos" href="#demos" class="md2man-permalink" title="permalink"></a></h2>
<ul>
<li>0.13.1: <a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.13.1.0.gif">Compact panel, separator, color gradients</a></li>
<li>0.12.4: <a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.4.gif">Executor</a></li>
<li>0.12.3: <a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.3.gif">Mouse over effects</a></li>
<li>0.12: <a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.gif">Distribute size between taskbars, freespace</a></li>
<li><a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.13.0.gif">Compact panel, separator, color gradients</a></li>
<li><a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.4.gif">Executor</a></li>
<li><a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.3.gif">Mouse over effects</a></li>
<li><a href="https://gitlab.com/o9000/tint2/wikis/whats-new-0.12.gif">Distribute size between taskbars, freespace</a></li>
</ul>
</body>
</html>

View File

@@ -1,10 +1,7 @@
.TH TINT2 1 "2017\-03\-12"
.TH TINT2 1 "2017\-06\-11" 0.14.6
.SH NAME
.PP
tint2 \- lightweight panel/taskbar
.SH SYNOPSIS
.PP
\fB\fCtint2 [\-c path_to_config_file]\fR
.SH DESCRIPTION
.PP
tint2 is a simple panel/taskbar made for modern X window managers.
@@ -33,10 +30,19 @@ Follow the freedesktop.org specifications;
.IP \(bu 2
Make certain workflows, such as multi\-desktop and multi\-monitor, easy to use.
.RE
.SH SYNOPSIS
.PP
\fB\fCtint2 [OPTION...]\fR
.SH OPTIONS
.TP
\fB\fC\-c path_to_config_file\fR
Specifies which configuration file to use instead of the default.
.TP
\fB\fC\-v, \-\-version\fR
Prints version information and exits.
.TP
\fB\fC\-h, \-\-help\fR
Display this help and exits.
.SH CONFIGURATION
.SS Table of contents
.RS
@@ -67,6 +73,8 @@ Battery \[la]#battery\[ra]
.IP \(bu 2
Executor \[la]#executor\[ra]
.IP \(bu 2
Button \[la]#button\[ra]
.IP \(bu 2
Separator \[la]#separator\[ra]
.IP \(bu 2
Example configuration \[la]#example-configuration\[ra]
@@ -294,12 +302,14 @@ gradient_id_pressed = 2
.IP \(bu 2
\fB\fCE\fR adds an executor plugin. You can specify more than one. \fI(since 0.12.4)\fP
.IP \(bu 2
\fB\fCP\fR adds a push button. You can specify more than one. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fC:\fR adds a separator. You can specify more than one. \fI(since 0.13.0)\fP
.RE
.PP
For example, \fB\fCpanel_items = STC\fR will show the systray, the taskbar and the clock (from left to right).
.IP \(bu 2
\fB\fCpanel_monitor = monitor (all or 1 or 2 or ...)\fR : Which monitor tint2 draws the panel on
\fB\fCpanel_monitor = monitor (all or primary or 1 or 2 or ...)\fR : Which monitor tint2 draws the panel on
.RS
.IP \(bu 2
The first monitor is \fB\fC1\fR
@@ -307,7 +317,7 @@ The first monitor is \fB\fC1\fR
Use \fB\fCpanel_monitor = all\fR to get a separate panel per monitor
.RE
.IP \(bu 2
\fB\fCprimary_monitor_first = boolean (0 or 1)\fR : Place the primary monitor before all the other monitors in the list. \fI(since 0.12.4)\fP
\fB\fCprimary_monitor_first = boolean (0 or 1)\fR : Place the primary monitor before all the other monitors in the list. \fI(since 0.12.4; removed in 1.0, use \fB\fCprimary\fR instead)\fP
.RE
.PP
[](images/panel_padding.jpg)
@@ -451,6 +461,8 @@ You can switch between virtual desktops.
.IP \(bu 2
\fB\fCtaskbar_hide_different_monitor = boolean (0 or 1)\fR : If enabled, the taskbar shows only the tasks from the current monitor. Useful when running different tint2 instances on different monitors, each one having its own config. \fI(since 0.12)\fP
.IP \(bu 2
\fB\fCtaskbar_hide_different_desktop = boolean (0 or 1)\fR : If enabled, the taskbar shows only the tasks from the current desktop. Useful to make multi\-desktop taskbars more compact, but still allow desktop switching with mouse click. \fI(since 1.0)\fP
.IP \(bu 2
\fB\fCtaskbar_always_show_all_desktop_tasks = boolean (0 or 1)\fR : Has effect only if \fB\fCtaskbar_mode = multi_desktop\fR\&. If enabled, tasks that appear on all desktops are shown on all taskbars. Otherwise, they are shown only on the taskbar of the current desktop. \fI(since 0.12.4)\fP
.IP \(bu 2
\fB\fCtaskbar_sort_order = none/title/center\fR : Specifies the sort order of the tasks on the taskbar. \fI(since 0.12)\fP
@@ -568,7 +580,7 @@ The action semantics:
.IP \(bu 2
\fB\fCsystray_icon_asb = alpha (0 to 100) saturation (\-100 to 100) brightness (\-100 to 100)\fR : Adjust the systray icons color and transparency.
.IP \(bu 2
\fB\fCsystray_monitor = integer (1, 2, ...)\fR : On which monitor to draw the systray. The first monitor is \fB\fC1\fR\&. \fI(since 0.12)\fP
\fB\fCsystray_monitor = integer (1, 2, ...) or primary\fR : On which monitor to draw the systray. The first monitor is \fB\fC1\fR\&. \fI(since 0.12)\fP
.IP \(bu 2
\fB\fCsystray_name_filter = string\fR : Regular expression to identify icon names to be hidden. For example, \fB\fC^audacious$\fR will hide icons with the exact name \fB\fCaudacious\fR, while \fB\fCaud\fR will hide any icons having \fB\fCaud\fR in the name. \fI(since 0.13.1)\fP
.RE
@@ -641,12 +653,30 @@ To hide the clock, comment \fB\fCtime1_format\fR and \fB\fCtime2_format\fR\&.
.IP \(bu 2
\fB\fCbattery_low_cmd = notify\-send "battery low"\fR : Command to execute when the battery is low.
.IP \(bu 2
\fB\fCbattery_full_cmd = notify\-send "battery full"\fR : Command to execute when the battery is full.
.IP \(bu 2
\fB\fCbat1_font = [FAMILY\-LIST] [STYLE\-OPTIONS] [SIZE]\fR
.IP \(bu 2
\fB\fCbat2_font = [FAMILY\-LIST] [STYLE\-OPTIONS] [SIZE]\fR
.IP \(bu 2
\fB\fCbattery_font_color = color opacity (0 to 100)\fR
.IP \(bu 2
\fB\fCbat1_format = FORMAT_STRING\fR : Format for battery line 1. Default: %p. \fI(since 1.0)\fP Format specification:
.RS
.IP \(bu 2
%s: State (charging, discharging, full, unknown).
.IP \(bu 2
%m: Minutes left until completely charged/discharged (estimated).
.IP \(bu 2
%h: Hours left until completely charged/discharged (estimated).
.IP \(bu 2
%t: Time left. Shows "hrs:mins" when charging/discharging, or "Ful\[rs]" when full.
.IP \(bu 2
%p: Percentage. Includes the % sign.
.RE
.IP \(bu 2
\fB\fCbat2_format = FORMAT_STRING\fR : Format for battery line 2. Default: %t. \fI(since 1.0)\fP
.IP \(bu 2
\fB\fCbattery_padding = horizontal_padding vertical_padding\fR
.IP \(bu 2
\fB\fCbattery_background_id = integer\fR : Which background to use for the battery.
@@ -800,6 +830,39 @@ execp_continuous = 1
execp_interval = 1
.fi
.RE
.SS Button
.RS
.IP \(bu 2
\fB\fCbutton = new\fR : Begins the configuration of a new button. Multiple such plugins are supported; just use multiple \fB\fCP\fRs in \fB\fCpanel_items\fR\&. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_icon = text\fR : Name or path of icon (or empty). \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_text = text\fR : Text to display (or empty). \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_tooltip = text\fR : The tooltip (or empty). \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_font = [FAMILY\-LIST] [STYLE\-OPTIONS] [SIZE]\fR : The font used to draw the text. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_font_color = color opacity\fR : The font color. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_background_id = integer\fR : Which background to use. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_centered = boolean (0 or 1)\fR : Whether to center the text. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_padding = horizontal_padding vertical_padding spacing_between_icon_and_text\fR \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_max_icon_size = integer\fR : Sets a limit to the icon size. Otherwise, the icon will expand to the edges. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_lclick_command = text\fR : Command to execute on left click. If not defined, \fB\fCexecp_command\fR is executed immediately, unless it is currently running. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_mclick_command = text\fR : Command to execute on right click. If not defined, \fB\fCexecp_command\fR is executed immediately, unless it is currently running. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_rclick_command = text\fR : Command to execute on middle click. If not defined, \fB\fCexecp_command\fR is executed immediately, unless it is currently running. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_uwheel_command = text\fR : Command to execute on wheel scroll up. If not defined, \fB\fCexecp_command\fR is executed immediately, unless it is currently running. \fI(since 0.14)\fP
.IP \(bu 2
\fB\fCbutton_dwheel_command = text\fR : Command to execute on wheel scroll down. If not defined, \fB\fCexecp_command\fR is executed immediately, unless it is currently running. \fI(since 0.14)\fP
.RE
.SS Separator
.RS
.IP \(bu 2
@@ -817,144 +880,7 @@ execp_interval = 1
.RE
.SS Example configuration
.PP
.RS
.nf
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## TINT2 CONFIG FILE
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## BACKGROUND AND BORDER
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
rounded = 7
border_width = 2
background_color = #000000 60
border_color = #ffffff 18
rounded = 5
border_width = 0
background_color = #ffffff 40
border_color = #ffffff 50
rounded = 5
border_width = 0
background_color = #ffffff 18
border_color = #ffffff 70
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## PANEL
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
panel_monitor = all
panel_position = bottom center
panel_size = 94% 30
panel_margin = 0 0
panel_padding = 7 0
font_shadow = 0
panel_background_id = 1
wm_menu = 0
panel_dock = 0
panel_layer = bottom
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## TASKBAR
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
#taskbar_mode = multi_desktop
taskbar_mode = single_desktop
taskbar_padding = 2 3 2
taskbar_background_id = 0
#taskbar_active_background_id = 0
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## TASKS
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
task_icon = 1
task_text = 1
task_maximum_size = 140 35
task_centered = 1
task_padding = 6 3
task_font = sans 7
task_font_color = #ffffff 70
task_background_id = 3
task_icon_asb = 100 0 0
## replace STATUS by 'urgent', 'active' or 'iconified'
#task_STATUS_background_id = 2
#task_STATUS_font_color = #ffffff 85
#task_STATUS_icon_asb = 100 0 0
## example:
task_active_background_id = 2
task_active_font_color = #ffffff 85
task_active_icon_asb = 100 0 0
urgent_nb_of_blink = 8
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## SYSTRAYBAR
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
systray = 1
systray_padding = 0 4 5
systray_background_id = 0
systray_sort = left2right
systray_icon_size = 0
systray_icon_asb = 100 0 0
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## CLOCK
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
time1_format = %H:%M
time1_font = sans 8
time2_format = %A %d %B
time2_font = sans 6
clock_font_color = #ffffff 76
clock_padding = 1 0
clock_background_id = 0
#clock_lclick_command = xclock
clock_rclick_command = orage
#clock_tooltip = %A %d %B
#time1_timezone = :US/Hawaii
#time2_timezone = :Europe/Berlin
#clock_tooltip_timezone = :/usr/share/zoneinfo/Europe/Paris
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## BATTERY
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
battery = 0
battery_hide = 98
battery_low_status = 10
battery_low_cmd = notify\-send "battery low"
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #ffffff 76
battery_padding = 1 0
battery_background_id = 0
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## TOOLTIP
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
tooltip = 0
tooltip_padding = 2 2
tooltip_show_timeout = 0.7
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font_color = #OOOOOO 80
tooltip_font = sans 10
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## MOUSE ACTION ON TASK
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
## AUTOHIDE OPTIONS
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 2
autohide_height = 4
strut_policy = minimum
.fi
.RE
See /etc/xdg/tint2/tint2rc.
.SH AUTHOR
.PP
tint2 was written by Thierry Lorthiois \[la]lorthiois@bbsoft.fr\[ra]\&.

View File

@@ -1,11 +1,8 @@
# TINT2 1 "2017-03-12"
# TINT2 1 "2017-06-11" 0.14.6
## NAME
tint2 - lightweight panel/taskbar
## SYNOPSIS
`tint2 [-c path_to_config_file]`
## DESCRIPTION
tint2 is a simple panel/taskbar made for modern X window managers.
It was specifically made for Openbox but it should also work with other window managers (GNOME, KDE, XFCE etc.).
@@ -24,10 +21,20 @@ Goals:
* Follow the freedesktop.org specifications;
* Make certain workflows, such as multi-desktop and multi-monitor, easy to use.
## SYNOPSIS
`tint2 [OPTION...]`
## OPTIONS
`-c path_to_config_file`
Specifies which configuration file to use instead of the default.
`-v, --version`
Prints version information and exits.
`-h, --help`
Display this help and exits.
## CONFIGURATION
### Table of contents
@@ -58,6 +65,8 @@ Goals:
* [Executor](#executor)
* [Button](#button)
* [Separator](#separator)
* [Example configuration](#example-configuration)
@@ -244,15 +253,16 @@ gradient_id_pressed = 2
* `C` shows the Clock
* `F` adds an extensible spacer (freespace). You can specify more than one. Has no effect if `T` is also present. *(since 0.12)*
* `E` adds an executor plugin. You can specify more than one. *(since 0.12.4)*
* `P` adds a push button. You can specify more than one. *(since 0.14)*
* `:` adds a separator. You can specify more than one. *(since 0.13.0)*
For example, `panel_items = STC` will show the systray, the taskbar and the clock (from left to right).
* `panel_monitor = monitor (all or 1 or 2 or ...)` : Which monitor tint2 draws the panel on
* `panel_monitor = monitor (all or primary or 1 or 2 or ...)` : Which monitor tint2 draws the panel on
* The first monitor is `1`
* Use `panel_monitor = all` to get a separate panel per monitor
* `primary_monitor_first = boolean (0 or 1)` : Place the primary monitor before all the other monitors in the list. *(since 0.12.4)*
* `primary_monitor_first = boolean (0 or 1)` : Place the primary monitor before all the other monitors in the list. *(since 0.12.4; removed in 1.0, use `primary` instead)*
![](images/panel_padding.jpg)
@@ -360,6 +370,8 @@ panel_size = 94% 30
* `taskbar_hide_different_monitor = boolean (0 or 1)` : If enabled, the taskbar shows only the tasks from the current monitor. Useful when running different tint2 instances on different monitors, each one having its own config. *(since 0.12)*
* `taskbar_hide_different_desktop = boolean (0 or 1)` : If enabled, the taskbar shows only the tasks from the current desktop. Useful to make multi-desktop taskbars more compact, but still allow desktop switching with mouse click. *(since 1.0)*
* `taskbar_always_show_all_desktop_tasks = boolean (0 or 1)` : Has effect only if `taskbar_mode = multi_desktop`. If enabled, tasks that appear on all desktops are shown on all taskbars. Otherwise, they are shown only on the taskbar of the current desktop. *(since 0.12.4)*
* `taskbar_sort_order = none/title/center` : Specifies the sort order of the tasks on the taskbar. *(since 0.12)*
@@ -461,7 +473,7 @@ The action semantics:
* `systray_icon_asb = alpha (0 to 100) saturation (-100 to 100) brightness (-100 to 100)` : Adjust the systray icons color and transparency.
* `systray_monitor = integer (1, 2, ...)` : On which monitor to draw the systray. The first monitor is `1`. *(since 0.12)*
* `systray_monitor = integer (1, 2, ...) or primary` : On which monitor to draw the systray. The first monitor is `1`. *(since 0.12)*
* `systray_name_filter = string` : Regular expression to identify icon names to be hidden. For example, `^audacious$` will hide icons with the exact name `audacious`, while `aud` will hide any icons having `aud` in the name. *(since 0.13.1)*
@@ -524,12 +536,23 @@ The action semantics:
* `battery_low_cmd = notify-send "battery low"` : Command to execute when the battery is low.
* `battery_full_cmd = notify-send "battery full"` : Command to execute when the battery is full.
* `bat1_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]`
* `bat2_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]`
* `battery_font_color = color opacity (0 to 100)`
* `bat1_format = FORMAT_STRING` : Format for battery line 1. Default: %p. *(since 1.0)* Format specification:
* %s: State (charging, discharging, full, unknown).
* %m: Minutes left until completely charged/discharged (estimated).
* %h: Hours left until completely charged/discharged (estimated).
* %t: Time left. Shows "hrs:mins" when charging/discharging, or "Ful\" when full.
* %p: Percentage. Includes the % sign.
* `bat2_format = FORMAT_STRING` : Format for battery line 2. Default: %t. *(since 1.0)*
* `battery_padding = horizontal_padding vertical_padding`
* `battery_background_id = integer` : Which background to use for the battery.
@@ -671,6 +694,33 @@ execp_continuous = 1
execp_interval = 1
```
### Button
* `button = new` : Begins the configuration of a new button. Multiple such plugins are supported; just use multiple `P`s in `panel_items`. *(since 0.14)*
* `button_icon = text` : Name or path of icon (or empty). *(since 0.14)*
* `button_text = text` : Text to display (or empty). *(since 0.14)*
* `button_tooltip = text` : The tooltip (or empty). *(since 0.14)*
* `button_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]` : The font used to draw the text. *(since 0.14)*
* `button_font_color = color opacity` : The font color. *(since 0.14)*
* `button_background_id = integer` : Which background to use. *(since 0.14)*
* `button_centered = boolean (0 or 1)` : Whether to center the text. *(since 0.14)*
* `button_padding = horizontal_padding vertical_padding spacing_between_icon_and_text` *(since 0.14)*
* `button_max_icon_size = integer` : Sets a limit to the icon size. Otherwise, the icon will expand to the edges. *(since 0.14)*
* `button_lclick_command = text` : Command to execute on left click. If not defined, `execp_command` is executed immediately, unless it is currently running. *(since 0.14)*
* `button_mclick_command = text` : Command to execute on right click. If not defined, `execp_command` is executed immediately, unless it is currently running. *(since 0.14)*
* `button_rclick_command = text` : Command to execute on middle click. If not defined, `execp_command` is executed immediately, unless it is currently running. *(since 0.14)*
* `button_uwheel_command = text` : Command to execute on wheel scroll up. If not defined, `execp_command` is executed immediately, unless it is currently running. *(since 0.14)*
* `button_dwheel_command = text` : Command to execute on wheel scroll down. If not defined, `execp_command` is executed immediately, unless it is currently running. *(since 0.14)*
### Separator
* `separator = new` : Begins the configuration of a new separator. Multiple such plugins are supported; just use multiple `:`s in `panel_items`. *(since 0.13.0)*
@@ -687,142 +737,7 @@ execp_interval = 1
### Example configuration
```
#---------------------------------------------
## TINT2 CONFIG FILE
#---------------------------------------------
#---------------------------------------------
## BACKGROUND AND BORDER
#---------------------------------------------
rounded = 7
border_width = 2
background_color = #000000 60
border_color = #ffffff 18
rounded = 5
border_width = 0
background_color = #ffffff 40
border_color = #ffffff 50
rounded = 5
border_width = 0
background_color = #ffffff 18
border_color = #ffffff 70
#---------------------------------------------
## PANEL
#---------------------------------------------
panel_monitor = all
panel_position = bottom center
panel_size = 94% 30
panel_margin = 0 0
panel_padding = 7 0
font_shadow = 0
panel_background_id = 1
wm_menu = 0
panel_dock = 0
panel_layer = bottom
#---------------------------------------------
## TASKBAR
#---------------------------------------------
#taskbar_mode = multi_desktop
taskbar_mode = single_desktop
taskbar_padding = 2 3 2
taskbar_background_id = 0
#taskbar_active_background_id = 0
#---------------------------------------------
## TASKS
#---------------------------------------------
task_icon = 1
task_text = 1
task_maximum_size = 140 35
task_centered = 1
task_padding = 6 3
task_font = sans 7
task_font_color = #ffffff 70
task_background_id = 3
task_icon_asb = 100 0 0
## replace STATUS by 'urgent', 'active' or 'iconified'
#task_STATUS_background_id = 2
#task_STATUS_font_color = #ffffff 85
#task_STATUS_icon_asb = 100 0 0
## example:
task_active_background_id = 2
task_active_font_color = #ffffff 85
task_active_icon_asb = 100 0 0
urgent_nb_of_blink = 8
#---------------------------------------------
## SYSTRAYBAR
#---------------------------------------------
systray = 1
systray_padding = 0 4 5
systray_background_id = 0
systray_sort = left2right
systray_icon_size = 0
systray_icon_asb = 100 0 0
#---------------------------------------------
## CLOCK
#---------------------------------------------
time1_format = %H:%M
time1_font = sans 8
time2_format = %A %d %B
time2_font = sans 6
clock_font_color = #ffffff 76
clock_padding = 1 0
clock_background_id = 0
#clock_lclick_command = xclock
clock_rclick_command = orage
#clock_tooltip = %A %d %B
#time1_timezone = :US/Hawaii
#time2_timezone = :Europe/Berlin
#clock_tooltip_timezone = :/usr/share/zoneinfo/Europe/Paris
#---------------------------------------------
## BATTERY
#---------------------------------------------
battery = 0
battery_hide = 98
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #ffffff 76
battery_padding = 1 0
battery_background_id = 0
#---------------------------------------------
## TOOLTIP
#---------------------------------------------
tooltip = 0
tooltip_padding = 2 2
tooltip_show_timeout = 0.7
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font_color = #OOOOOO 80
tooltip_font = sans 10
#---------------------------------------------
## MOUSE ACTION ON TASK
#---------------------------------------------
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
#---------------------------------------------
## AUTOHIDE OPTIONS
#---------------------------------------------
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 2
autohide_height = 4
strut_policy = minimum
```
See /etc/xdg/tint2/tint2rc.
## AUTHOR
tint2 was written by Thierry Lorthiois <lorthiois@bbsoft.fr>.

3
format-code.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
find . '(' -name '*.h' -o -name '*.c' ')' -exec clang-format-3.7 -style=file -i '{}' \;

View File

@@ -1,6 +1,6 @@
#!/bin/sh
MAJOR=0.13
MAJOR=0.14
DIRTY=""
if git status 1>/dev/null 2>/dev/null
@@ -33,13 +33,15 @@ then
fi
VERSION=$(git describe --exact-match 2>/dev/null || echo "$MAJOR-git$(git show -s --pretty=format:%ci | cut -d ' ' -f 1 | tr -d '-').$(git show -s --pretty=format:%h)")$DIRTY
else
VERSION=$(head -n 1 ChangeLog | cut -d ' ' -f 2)
if [ $VERSION = "master" ]
SCRIPT_DIR=$(dirname "$0")
VERSION=$(head -n 1 "${SCRIPT_DIR}/ChangeLog" | cut -d ' ' -f 2)
if [ "$VERSION" = "master" ]
then
VERSION=$VERSION-$(head -n 1 ChangeLog | cut -d ' ' -f 1)
VERSION=$VERSION-$(head -n 1 "${SCRIPT_DIR}/ChangeLog" | cut -d ' ' -f 1)
fi
fi
VERSION=$(echo "$VERSION" | sed 's/^v//')
echo '#define VERSION_STRING "'$VERSION'"' > version.h

View File

@@ -2,24 +2,6 @@
# Usage: ./make_release.sh
# Creates a tar.gz archive of the current tree.
#
# To bump the version number for the current commit (make sure you are in HEAD!), run manually:
#
# git tag -a v0.12 -m 'Version 0.12'
#
# To generate a release for an older tagged commit, first list the tags with:
#
# git tag
#
# then checkout the tagged commit with:
#
# git checkout tags/v0.1
#
# Finally, to revert to HEAD:
#
# git checkout master
#
# See more at https://gitlab.com/o9000/tint2/wikis/Development
VERSION=$(./get_version.sh --strict)
if [ ! $? -eq 0 ]
@@ -28,21 +10,10 @@ then
exit 1
fi
DIR=tint2-$VERSION
ARCHIVE=$DIR.tar.gz
echo "Making release $DIR"
rm -rf $DIR $ARCHIVE
ARCHIVE=tint2-$VERSION.tar.gz
git checkout-index --prefix=$DIR/ -a
# Delete unneeded files
rm -f $DIR/make_release.sh
echo "echo \"#define VERSION_STRING \\\"$VERSION\\\"\" > version.h" > $DIR/get_version.sh
# Create tarball and remove the exported directory
tar -czf $ARCHIVE $DIR
rm -rf $DIR
echo "Making release tint2-$VERSION"
git archive --format=tar.gz --prefix=tint2-$VERSION/ v$VERSION >$ARCHIVE
sha1sum -b $ARCHIVE
sha256sum -b $ARCHIVE

240
new-release.py Executable file
View File

@@ -0,0 +1,240 @@
#!/usr/bin/env python2
import argparse
import datetime
import inspect
import logging
import os
import re
import subprocess
import sys
import time
ansi_brown = "\x1b[0;33;40m"
ansi_yello_bold = "\x1b[1;33;40m"
ansi_lblue = "\x1b[0;36;40m"
ansi_pinky = "\x1b[0;35;40m"
ansi_reset = "\x1b[0m"
log_ts = None
def log_time():
global log_ts
if log_ts == None:
log_ts = time.time()
ts = time.time()
delta_ms = int((ts - log_ts) * 1000)
log_ts = ts
return "{0: >6}".format(delta_ms)
def log_prefix():
line = inspect.stack()[2][2]
function = inspect.stack()[2][3]
return ansi_lblue + "{0} {1}:{2}".format(log_time(), function, line) + ansi_reset
def debug(*args):
parts = [log_prefix()]
for s in args:
parts.append(str(s))
logging.debug(" ".join(parts))
def info(*args):
parts = [log_prefix()]
for s in args:
parts.append(str(s))
logging.info(" ".join(parts))
def cmd(s):
logging.debug(log_prefix() + " Executing: " + ansi_brown + s + ansi_reset)
return s
def run(s):
proc = subprocess.Popen(cmd(s), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
ret = proc.wait()
out = proc.communicate()[0]
for line in out.split("\n"):
debug(ansi_pinky + line + ansi_reset)
debug(ansi_pinky + "Exit code: " + str(ret))
if ret != 0:
raise Exception("Command failed!")
return out
def natsorted(ls):
dre = re.compile(r'(\d+)')
return sorted(ls, key=lambda l: [int(s) if s.isdigit() else s.lower() for s in re.split(dre, l)])
def get_last_version():
tags = natsorted(run("git tag -l 'v*'").split("\n"))
return tags[-1]
def inc_version(v, major=False, minor=False, rc=False):
if "-rc" in v:
# v4.0-rc7 -> v4.0-rc8 or v4.0
if minor:
return v.split("-rc")[0]
else:
parts = v.split("-rc")
parts[-1] = str(int(parts[-1]) + 1)
return "-rc".join(parts)
else:
# v4.11 = v4, 11, 0 -> v4.11.1 or v4.12 or v.4.12-rc1 or v5.0 or v5.0-rc1
# v4.11.7 = v4, 11, 7 -> ...
parts = v.split(".")
while len(parts) < 3:
parts.append("0")
assert len(parts) == 3
if major:
parts[-3] = "v" + str(int(parts[-3].replace("v", "")) + 1)
parts[-2] = "0"
if rc:
parts[-2] += "-rc1"
parts[-1] = ""
elif minor or rc:
parts[-2] = str(int(parts[-2]) + 1)
if rc:
parts[-2] += "-rc1"
parts[-1] = ""
else:
parts[-1] = str(int(parts[-1]) + 1)
assert not rc
return ".".join([s for s in parts if s])
def assert_equal(a, b):
if a != b:
info(a, "!=", b)
assert(False)
def test_inc_version():
# auto
assert_equal(inc_version("v1.0"), "v1.0.1")
assert_equal(inc_version("v1.0.1"), "v1.0.2")
assert_equal(inc_version("v1.0.2"), "v1.0.3")
assert_equal(inc_version("v1.0.10"), "v1.0.11")
assert_equal(inc_version("v1.1.10"), "v1.1.11")
assert_equal(inc_version("v1.1.10"), "v1.1.11")
# rc
assert_equal(inc_version("v1.0", False, False, True), "v1.1-rc1")
assert_equal(inc_version("v1.0.1", False, False, True), "v1.1-rc1")
assert_equal(inc_version("v1.0.2", False, False, True), "v1.1-rc1")
assert_equal(inc_version("v1.0.10", False, False, True), "v1.1-rc1")
assert_equal(inc_version("v1.1.10", False, False, True), "v1.2-rc1")
assert_equal(inc_version("v1.1.10", False, False, True), "v1.2-rc1")
# minor
assert_equal(inc_version("v1.0", False, True, False), "v1.1")
assert_equal(inc_version("v1.0.1", False, True, False), "v1.1")
assert_equal(inc_version("v1.0.2", False, True, False), "v1.1")
assert_equal(inc_version("v1.0.10", False, True, False), "v1.1")
assert_equal(inc_version("v1.1.10", False, True, False), "v1.2")
assert_equal(inc_version("v1.1.10", False, True, False), "v1.2")
# minor rc
assert_equal(inc_version("v1.0", False, True, True), "v1.1-rc1")
assert_equal(inc_version("v1.0.1", False, True, True), "v1.1-rc1")
assert_equal(inc_version("v1.0.2", False, True, True), "v1.1-rc1")
assert_equal(inc_version("v1.0.10", False, True, True), "v1.1-rc1")
assert_equal(inc_version("v1.1.10", False, True, True), "v1.2-rc1")
assert_equal(inc_version("v1.1.10", False, True, True), "v1.2-rc1")
# major rc
assert_equal(inc_version("v1.0", True, False, True), "v2.0-rc1")
assert_equal(inc_version("v1.0.1", True, False, True), "v2.0-rc1")
assert_equal(inc_version("v1.0.2", True, False, True), "v2.0-rc1")
assert_equal(inc_version("v1.0.10", True, False, True), "v2.0-rc1")
assert_equal(inc_version("v1.1.10", True, False, True), "v2.0-rc1")
assert_equal(inc_version("v1.1.10", True, False, True), "v2.0-rc1")
# major
assert_equal(inc_version("v1.0", True), "v2.0")
assert_equal(inc_version("v1.0.1", True), "v2.0")
assert_equal(inc_version("v1.0.2", True), "v2.0")
assert_equal(inc_version("v1.0.10", True), "v2.0")
assert_equal(inc_version("v1.1.10", True), "v2.0")
assert_equal(inc_version("v1.1.10", True), "v2.0")
# rc auto
assert_equal(inc_version("v1.0-rc1"), "v1.0-rc2")
assert_equal(inc_version("v1.1-rc2"), "v1.1-rc3")
# rc minor
assert_equal(inc_version("v1.0-rc1", False, True), "v1.0")
assert_equal(inc_version("v1.1-rc2", False, True), "v1.1")
def replace_in_file(path, before, after):
with open(path, "r+") as f:
old = f.read()
new = old.replace(before, after)
f.seek(0)
f.write(new)
def update_man(path, version, date):
with open(path, "r+") as f:
lines = f.read().split("\n")
# # TINT2 1 "2017-03-26" 0.14.1
parts = lines[0].split()
parts[-2] = '"' + date + '"'
parts[-1] = version
lines[0] = " ".join(parts)
f.seek(0)
f.write("\n".join(lines))
run("cd doc ; ./generate-doc.sh")
def update_log(path, version, date):
with open(path, "r+") as f:
lines = f.read().split("\n")
f.seek(0)
assert lines[0].endswith("master")
lines[0] = date + " " + version
f.write("\n".join(lines))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("--major", action="store_true")
parser.add_argument("--minor", action="store_true")
parser.add_argument("--rc", action="store_true")
parser.add_argument("--undo", action="store_true")
args = parser.parse_args()
logging.basicConfig(format=ansi_lblue + "%(asctime)s %(pathname)s %(levelname)s" + ansi_reset + " %(message)s", level=logging.DEBUG)
test_inc_version()
# Read version from last tag and increment
old_version = get_last_version()
if args.undo:
info("Revering last commit...")
run("git tag -d %s" % old_version)
run("git tag -d %s" % old_version.replace("v", ""))
run("git reset --soft HEAD~")
run("git reset")
run("git stash")
os.system("git log -1")
sys.exit(0)
info("Old version:", old_version)
version = inc_version(old_version, args.major, args.minor, args.rc)
readable_version = version.replace("v", "")
date = datetime.datetime.now().strftime("%Y-%m-%d")
info("New version:", readable_version, version, date)
# Disallow unstaged changes in the working tree
run("git diff-files --quiet --ignore-submodules --")
# Disallow uncommitted changes in the index
run("git diff-index --cached --quiet HEAD --ignore-submodules --")
# Update version string
replace_in_file("README.md", old_version.replace("v", ""), readable_version)
update_man("doc/tint2.md", readable_version, date)
update_log("ChangeLog", readable_version, date)
run("git commit -am 'Release %s'" % readable_version)
run("git tag -a %s -m 'version %s'" % (version, readable_version))
run("git tag -a %s -m 'version %s'" % (readable_version, readable_version))
run("rm -rf tint2-%s* || true" % readable_version)
run("./make_release.sh")
run("tar -xzf tint2-%s.tar.gz" % readable_version)
run("cd tint2-%s ; mkdir build ; cd build ; cmake .. ; make" % readable_version)
assert_equal(run("./tint2-%s/build/tint2 -v" % readable_version).strip(), "tint2 version %s" % readable_version)
os.system("git log -p -1 --word-diff")

View File

@@ -1,3 +1,35 @@
tint2 (0.12.12-3) unstable; urgency=medium
* Cherry pick upstream fix for use-after-free
-- Sebastian Reichel <sre@debian.org> Sun, 29 Jan 2017 21:18:20 +0100
tint2 (0.12.12-2) unstable; urgency=medium
* Cherry pick a few upstream fixes (Closes: #849228)
-- Sebastian Reichel <sre@debian.org> Fri, 13 Jan 2017 22:01:29 +0100
tint2 (0.12.12-1) unstable; urgency=low
* New upstream release
-- Sebastian Reichel <sre@debian.org> Sun, 21 Aug 2016 22:39:16 +0200
tint2 (0.12.11-1) unstable; urgency=low
* New upstream release (Closes: #824568)
* Update Debian Standards Version to 3.9.8
-- Sebastian Reichel <sre@debian.org> Wed, 01 Jun 2016 00:48:54 +0200
tint2 (0.12.7-2) unstable; urgency=medium
* Add upstream patch to fix build on ppc
* Use https:// vcs urls
-- Sebastian Reichel <sre@debian.org> Mon, 22 Feb 2016 03:23:51 +0100
tint2 (0.12.7-1) unstable; urgency=medium
* New upstream release

View File

@@ -1,7 +1,7 @@
Source: tint2
Section: x11
Priority: optional
Maintainer: o9000 <mrovi9000@gmail.com>
Maintainer: Sebastian Reichel <sre@debian.org>
Build-Depends: cmake,
debhelper (>= 9),
libcairo2-dev,
@@ -16,14 +16,15 @@ Build-Depends: cmake,
libxinerama-dev,
libxrandr-dev
Standards-Version: 3.9.7
Vcs-Git: git://anonscm.debian.org/collab-maint/tint2.git
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/tint2.git
Vcs-Git: https://alioth.debian.org/anonscm/git/collab-maint/tint2.git
Vcs-Browser: https://anonscm.debian.org/gitweb/?p=collab-maint/tint2.git
Homepage: https://gitlab.com/o9000/tint2/
Package: tint2
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends}
${misc:Depends},
procps
Description: lightweight taskbar
Tint is a simple panel/taskbar intentionally made for openbox3, but should
also work with other window managers. The taskbar includes transparency and

View File

@@ -7,6 +7,22 @@ Copyright: 2007-2008 Pål Staurland <staura@gmail.com>
2009 Andreas Fink <andreas.fink85@googlemail.com>
2011-2015 Ovidiu M <mrovi9000@gmail.com>
License: GPL-2
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation, or (at your option) any
later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
.
On Debian systems, the full text of the GNU General Public License 2
can be found in `/usr/share/common-licenses/GPL-2'.
Files: src/battery/*
Copyright: 2009 Sebastian Reichel <sre@debian.org>
@@ -43,24 +59,3 @@ License: ISC
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Files: debian/wiki/*
Copyright: 2009-2012 Andreas Fink <andreas.fink85@googlemail.com>
License: GPL-2
License: GPL-2
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
.
On Debian systems, the full text of the GNU General Public License 2
can be found in `/usr/share/common-licenses/GPL-2'.

View File

@@ -0,0 +1,2 @@
pkill -SIGUSR2 tint2 || true

View File

@@ -11,4 +11,3 @@ override_dh_auto_install:
override_dh_installdocs:
dh_installdocs --link-doc=tint2
cp -r debian/wiki debian/tint2/usr/share/doc/tint2/html

View File

View File

@@ -4,9 +4,9 @@
/usr/share/applications/tint2.desktop
/usr/share/applications/tint2conf.desktop
/usr/share/man/man1/tint2.1
/usr/share/doc/tint2/AUTHORS
/usr/share/doc/tint2/README.md
/usr/share/doc/tint2/*
/usr/share/icons/hicolor/scalable/apps/tint2.svg
/usr/share/icons/hicolor/scalable/apps/tint2conf.svg
/usr/share/locale/*
/usr/share/tint2/*
/usr/share/mime/packages/*

View File

@@ -1,5 +1,7 @@
#!/bin/bash
# Requirements: devscripts
set -x
rm -rf tint2* 2>/dev/null || true
@@ -29,6 +31,8 @@ else
REPO="tint2-git"
fi
set -e
# Export repository contents to source directory
DIR=tint2-$VERSION
echo "Making release $DIR"
@@ -43,9 +47,9 @@ rm -f $DIR/make_release.sh
echo "echo \"#define VERSION_STRING \\\"$VERSION\\\"\" > version.h" > $DIR/get_version.sh
# Copy the debian files into the source directory
cp -r ubuntu $DIR/debian
cp -r debian $DIR/debian
for DISTRO in precise trusty wily xenial
for DISTRO in precise trusty xenial yakkety zesty artful
do
# Cleanup from previous builds
rm -rf tint2_$VERSION-*

View File

@@ -1,4 +0,0 @@
debian/wiki/3265475271_81e8ed56e0.jpg
debian/wiki/3265475337_262799ded3.jpg
debian/wiki/3266303192_476a188196.jpg
debian/wiki/3266303292_14d9b6b623.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,405 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>tint2 - Configure</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
</head>
<body class="t6">
<table class="st" width="100%" cellpadding="0" cellspacing="0" align="center" border="0">
<tbody><tr>
<td class="bevel-right" valign="top" align="right"></td>
</tr>
</tbody></table>
<div id="maincol" style="padding: 0pt 3px 3px 0pt; margin: 0pt;">
<!-- IE -->
<div id="wikipage">
<table>
<tbody><tr>
<td style="vertical-align: top; padding-left: 5px;">
<div id="wikicontent">
<div class="vt" id="wikimaincol">
<h1>tint2 - Configure</h1>
<p></p><ul><li><a href="#Background_and_border">Background and border</a></li><li><a href="#Panel">Panel</a></li><li><a href="#Launcher_SVN_Only">Launcher SVN Only</a></li><li><a href="#Taskbar_%28pager_like_capability%29">Taskbar (pager like capability)</a></li><li><a href="#Task">Task</a></li><li><a href="#System_Tray">System Tray</a></li><li><a href="#Clock">Clock</a></li><li><a href="#Tooltip">Tooltip</a></li><li><a href="#Battery">Battery</a></li><li><a href="#Mouse_action_on_task">Mouse action on task</a></li><li><a href="#Panel_autohide">Panel autohide</a></li><li><a href="#An_example_tint2rc">An example tint2rc</a></li></ul> <p></p><p>The first time you run tint2, it will create the config file in <tt>$HOME/.config/tint2/tint2rc</tt> . (this is true if you have done a clean install. running tint2 in the source directory without doing 'make install' will not create the config file.) </p><p>You can specify another file on the command line with -c option. eg. : <tt>tint2 -c $HOME/tint2.conf</tt> </p><p>When you change the config file, the command line 'killall -SIGUSR1 tint2' will force tint2 to reload it. </p><p>Configuration marked as <tt>SVN ONLY</tt> are not yet supported and could change in the next stable release. </p><h1><a name="Background_and_border"></a>Background and border<a href="#Background_and_border" class="section_anchor"></a></h1><blockquote>tint2rc config file starts with background option.
</blockquote><p> </p><ul><li><tt>rounded = number_of_pixels</tt> : How rounded the borders are </li></ul><p></p><ul><li><tt>background_color = color opacity</tt> </li><ul><li><tt>opacity = 0</tt> to get background transparency </li></ul></ul><p> </p><ul><li><tt>border_width = width</tt> </li></ul><p></p><ul><li><tt>border_color = color opacity (0 to 100)</tt> </li><ul><li><tt>opacity = 0</tt> to get border transparency </li></ul></ul><blockquote>you are free to put 1, 2, 3... background
<pre class="prettyprint"> rounded = 1
border_width = 0
background_color = #282828 100
border_color = #000000 0
rounded = 1
border_width = 0
background_color = #f6b655 90
border_color = #cccccc 40</pre>tint2 automatically identifies each background with a number (1, 2, ...).
then you can applied background on objects (panel, taskbar, task, clock, systray) with
<pre class="prettyprint"> panel_background_id = 1
taskbar_background_id = 0
task_background_id = 0
task_active_background_id = 2
systray_background_id = 0
clock_background_id = 0</pre>identifier 0 applied full transparency, identifer 1 applied the first background...
</blockquote><h1><a name="Panel"></a>Panel<a href="#Panel" class="section_anchor"></a></h1><ul><li><tt>panel_monitor = monitor (all, 1, 2, ...)</tt> Which monitor tint2 draws the panel on </li><ul><li>the first monitor is <tt>1</tt> </li><li>use <tt>panel_monitor = all</tt> to get one panel per monitor (unless it's included into another one) </li></ul></ul><p> </p><blockquote><img src="3265475271_81e8ed56e0.jpg">
</blockquote><p></p><p> </p><ul><li><tt>panel_position = vertical_position horizontal_position orientation</tt> </li><ul><li><tt>value for vertical_position : bottom, top, center</tt> </li><li><tt>value for horizontal_position : left, right, center</tt> </li><li><tt>value for orientation : horizontal, vertical</tt> </li></ul></ul> <ul><li><tt>panel_size = width height</tt> </li><ul><li><tt>width = 0</tt> to get full monitor width </li><li>Use <tt>%</tt> to adjust the panel size to monitor size. </li></ul></ul> <blockquote>Example:
<p></p><pre class="prettyprint"> #The panel's width is 94% the size of the monitor
panel_size = 94% 30</pre></blockquote><ul><li><tt>panel_items = LTSBC</tt> define the items tint2 will show and the order of those items. panel_items = STC will show the Systray, the taskbar and the clock (from left to right). SVN ONLY. </li><ul><li>L to show Launcher </li><li>T to show Taskbar </li><li>S to show Systray (also called notification area) </li><li>B to show Battery status </li><li>C to show Clock </li></ul></ul><ul><li><tt>panel_margin = horizontal_margin vertical_margin</tt> </li><ul><li><tt>horizontal_margin = 0</tt> to get full monitor width </li></ul></ul><blockquote><img src="3266303192_476a188196.jpg">
</blockquote><p> </p><ul><li><tt>panel_padding = horizontal_left_right_padding vertical_padding horizontal_spacing</tt> </li></ul><p></p><ul><li><tt>font_shadow = boolean (0 or 1)</tt> </li></ul><ul><li><tt>panel_background_id = integer</tt> : Which background to use </li></ul><ul><li><tt>wm_menu = boolean (0 or 1)</tt> : Allow tint2 to forward mouse event to your Window Manager. </li></ul><ul><li><tt>panel_dock = boolean (0 or 1)</tt> : Put tint2 into the window managers dock. For the openbox window manager I can advise to use also a modifier for the moveButton option, otherwise the mouse click is not forwarded to tint2 (in ~/.config/openbox/rc.xml). </li></ul><p> </p><ul><li><tt>panel_layer = bottom,normal,top</tt> : Puts tint2 into the bottom/normal/top layer. Default is the bottom layer, but for real transparency normal or top layer may be a nice alternative. </li></ul><p></p><ul><li><tt>strut_policy = follow_size/minimum/none</tt> : STRUTs are used by the window manager to decide the size of maximized windows. Should the 'maximized windows' follow tint2 size (follow_size) or use the minimum size (minimum), or use the screen size (none). <tt>minimum</tt> option is interresting when used with <tt>autohide_height</tt> parameter. </li></ul><h1><a name="Launcher_SVN_Only"></a>Launcher SVN Only<a href="#Launcher_SVN_Only" class="section_anchor"></a></h1><ul><li><tt>launcher_icon_theme = name_of_theme</tt> tint2 will follow the theme of your desktop when you have an XSETTINGS manager running. Otherwise, <tt>launcher_icon_theme</tt> parameter is used. </li><li><tt>launcher_padding = horizontal_left_right_padding vertical_padding horizontal_spacing</tt> </li><li><tt>launcher_background_id = integer</tt> : Which background to use </li><li><tt>launcher_icon_size = number</tt> : Set the launcher icon size to <tt>number</tt>. </li><li><tt>launcher_item_app = path_to_application</tt> : Each launcher_item_app must be a full path to a .desktop file. </li></ul><h1><a name="Taskbar_(pager_like_capability)"></a>Taskbar (pager like capability)<a href="#Taskbar_%28pager_like_capability%29" class="section_anchor"></a></h1><ul><li><tt>taskbar_mode = single_desktop or multi_desktop</tt> </li><ul><li><tt>taskbar_mode = single_desktop</tt> : Show one(1) taskbar (current desktop) </li><li><tt>taskbar_mode = multi_desktop</tt> : Pager like capability. Show one(1) taskbar per desktop </li><ul><li>You can drag-and-drop task between desktops` </li><li>And also click on an empty taskbar to switch desktops` </li></ul></ul></ul><p> </p><ul><li><tt>taskbar_padding = horizontal_left_right_padding vertical_padding horizontal_spacing</tt> </li></ul><p></p><ul><li><tt>taskbar_background_id = integer</tt> : Which background to use </li></ul><ul><li><tt>taskbar_active_background_id = integer</tt> : Which background to use for current desktop. </li></ul><blockquote><img src="3266303292_14d9b6b623.jpg">
</blockquote><ul><li><tt>taskbar_name = boolean (0 or 1)</tt> : SVN Only enabled(=1) or disabled(=0) desktop name in taskbar </li></ul><ul><li><tt>taskbar_name_padding = left_right_padding</tt> SVN Only </li></ul><ul><li><tt>taskbar_name_background_id = integer</tt> : SVN Only Which background to use </li></ul><ul><li><tt>taskbar_name_active_background_id = integer</tt> : SVN Only Which background to use for current desktop. </li></ul><ul><li><tt>taskbar_name_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</tt> SVN Only </li></ul><ul><li><tt>taskbar_name_font_color = color opacity (0 to 100)</tt> SVN Only </li></ul><ul><li><tt>taskbar_name_active_font_color = color opacity (0 to 100)</tt> </li></ul><h1><a name="Task"></a>Task<a href="#Task" class="section_anchor"></a></h1><ul><li><tt>urgent_nb_of_blink = integer</tt> : Number of blink on 'get attention' event </li></ul><ul><li><tt>task_icon = boolean (0 or 1)</tt> : Display task icon or not </li></ul><ul><li><tt>task_text = boolean (0 or 1)</tt> : Display task text or not </li></ul><ul><li><tt>task_centered = boolean (0 or 1)</tt> : Task name centered or not </li></ul><ul><li><tt>task_maximum_size = width height</tt> </li><ul><li><tt>width is used with horizontal panel. width = 0 to get full taskbar width</tt> </li><li><tt>height is used with vertical panel</tt> </li></ul></ul><p> </p><ul><li><tt>task_padding = horizontal_padding vertical_padding</tt> </li></ul><p></p><ul><li><tt>task_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</tt> </li></ul><ul><li><tt>task_font_color = color opacity (0 to 100)</tt> </li></ul><p> </p><ul><li><tt>task_icon_asb = alpha (0 to 100) saturation (-100 to 100) brightness (-100 to 100)</tt> : adjust icon's color and transparency for task. </li></ul><p></p><ul><li><tt>task_background_id = integer</tt> : Which background to use for non selected tasks </li></ul><blockquote>For the next 3 options STATUS can be <tt>active</tt> / <tt>iconified</tt> / <tt>urgent</tt>.
</blockquote><ul><li><tt>task_STATUS_font_color = color opacity (0 to 100)</tt> </li></ul><ul><li><tt>task_STATUS_icon_asb = alpha (0 to 100) saturation (-100 to 100) brightness (-100 to 100)</tt> : adjust icon's color and transparency for active task </li></ul><ul><li><tt>task_STATUS_background_id = integer</tt> : Which background to use when task is selected </li></ul><ul><li><tt>task_tooltip = boolean (0 or 1)</tt> : enabled(=1) or disabled(=0) tooltip on task </li></ul><blockquote><img src="3265475337_262799ded3.jpg">
</blockquote><h1><a name="System_Tray"></a>System Tray<a href="#System_Tray" class="section_anchor"></a></h1><ul><li><tt>systray = boolean (0 or 1)</tt> : enabled(=1) or disabled(=0) systray </li></ul><ul><li><tt>systray_padding = horizontal_left_right_padding vertical_padding horizontal_spacing</tt> </li></ul><ul><li><tt>systray_background_id = integer</tt> : Which background to use for non selected tasks </li></ul><ul><li> <tt>systray_sort = ascending/descending/left2right/right2left</tt> : Sorting order for icon's systray (if left2right or right2left the order can be different on restart) </li></ul><ul><li> <tt>systray_icon_size = max_icon_size</tt> : Set the maximum system tray icon size to <tt>number</tt>. Set to <tt>0</tt> for automatic icon size </li></ul><ul><li><tt>systray_icon_asb = alpha (0 to 100) saturation (-100 to 100) brightness (-100 to 100)</tt> : adjust icon's color and transparency for system tray icons </li></ul><h1><a name="Clock"></a>Clock<a href="#Clock" class="section_anchor"></a></h1><ul><li><tt>time1_format = %H:%M</tt> </li><ul><li>time1_format, time2_format and clock_tooltip use 'strftime' syntax. more info on parameters on <a href="http://www.manpagez.com/man/3/strftime/" rel="nofollow">http://www.manpagez.com/man/3/strftime/</a> </li><li>comment time1_format and time2_format to hide clock </li></ul></ul><p> </p><ul><li><tt>time1_timezone = :US/Hawaii</tt> </li><ul><li>time1_timezone, time2_timezone and clock_tooltip_timezone can be used to specify a timezone. If you do not specify a value the system-wide timezone is used. The timezones can usually be found in /usr/share/zoneinfo. If your timezones are in a different directory, you need to specify the absolute path, i.e. time1_timezone = :/different/zoneinfo/dir/US/Hawaii (always prepend with a ':') </li></ul></ul><p></p><ul><li><tt>time1_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</tt> </li></ul><ul><li><tt>time2_format = %A %d %B</tt> </li></ul><ul><li><tt>time2_timezone = :Europe/Berlin</tt> </li></ul><ul><li><tt>time2_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</tt> </li></ul><ul><li><tt>clock_font_color = color opacity (0 to 100)</tt> </li></ul><ul><li><tt>clock_padding = horizontal_padding vertical_padding</tt> </li></ul><ul><li><tt>clock_background_id = integer</tt> : Which background to use </li></ul><ul><li><tt>clock_tooltip = %a, %d. %b %Y : clock tooltip text</tt> </li></ul><ul><li><tt>clock_tooltip_timezone = :UTC</tt> </li></ul><ul><li><tt>clock_lclick_command = text</tt> : Which command to execute on left click </li></ul><ul><li><tt>clock_rclick_command = text</tt> : Which command to execute on right click </li></ul><h1><a name="Tooltip"></a>Tooltip<a href="#Tooltip" class="section_anchor"></a></h1><ul><li><tt>tooltip_padding = horizontal_padding vertical_padding</tt> </li></ul><ul><li><tt>tooltip_show_timeout = float</tt> : delay to show tooltip in second. Use '.' as decimal separator. </li></ul><ul><li><tt>tooltip_hide_timeout = float</tt> : delay to close tooltip in second. Use '.' as decimal separator. </li></ul><ul><li><tt>tooltip_background_id = integer</tt> : Which background to use (in fake transparency the alpha channel and rounded are not respected) </li></ul><ul><li><tt>tooltip_font_color = color opacity (0 to 100)</tt> </li></ul><ul><li><tt>tooltip_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</tt> </li></ul><h1><a name="Battery"></a>Battery<a href="#Battery" class="section_anchor"></a></h1><ul><li><tt>battery = boolean (0 or 1)</tt> : enabled(=1) or disabled(=0) battery applet </li></ul><ul><li><tt>battery_hide = never or an integer (0 to 100)</tt>: At what battery percent does the battery hide </li></ul><ul><li><tt>battery_low_status = integer</tt>: At what battery percent does the icon show battery low command </li></ul><ul><li><tt>battery_low_cmd = notify-send "battery low"</tt> :What to do when battery is low </li></ul><ul><li><tt>bat1_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</tt> </li></ul><ul><li><tt>bat2_font = [FAMILY-LIST] [STYLE-OPTIONS] [SIZE]</tt> </li></ul><ul><li><tt>battery_font_color = color opacity (0 to 100)</tt> </li></ul><ul><li><tt>battery_padding = horizontal_padding vertical_padding</tt> </li></ul><ul><li><tt>battery_background_id = integer</tt> : Which background to use </li></ul><h1><a name="Mouse_action_on_task"></a>Mouse action on task<a href="#Mouse_action_on_task" class="section_anchor"></a></h1><blockquote>Customize mouse action with : <tt>none, close, toggle, iconify, shade, toggle_iconify, maximize_restore, desktop_left, desktop_right, next_task, prev_task</tt>.
</blockquote><blockquote>Sample format:
<pre class="prettyprint"> mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify</pre></blockquote><pre class="prettyprint"> close : close the task
toggle : toggle the task
iconify : iconify the task
toggle_iconify : toggle or iconify the task
maximize_restore : maximized or minimized the task
desktop_left : send the task to the desktop on the left
desktop_right : send the task to the desktop on the right
next_task : send the focus to next task
prev_task : send the focus to previous task</pre><p>If a mouse action is set to <tt>none</tt> and <tt>wm_menu = 1</tt> is set, the mouse click is forwarded to the window manager </p><h1><a name="Panel_autohide"></a>Panel autohide<a href="#Panel_autohide" class="section_anchor"></a></h1><ul><li><tt>autohide = boolean (0 or 1)</tt> : enable(=1) or disable(=0) autohiding </li></ul><ul><li><tt>autohide_show_timeout = float</tt> : show timeout in seconds. Use '.' as decimal separator. </li></ul><ul><li><tt>autohide_hide_timeout = float</tt> : hide timeout in seconds. Use '.' as decimal separator. </li></ul><ul><li><tt>autohide_height = integer</tt> : panel height (width for vertical panels) in hidden mode </li></ul><h1><a name="An_example_tint2rc"></a>An example tint2rc<a href="#An_example_tint2rc" class="section_anchor"></a></h1><pre class="prettyprint">#---------------------------------------------
# TINT2 CONFIG FILE
#---------------------------------------------
#---------------------------------------------
# BACKGROUND AND BORDER
#---------------------------------------------
rounded = 7
border_width = 2
background_color = #000000 60
border_color = #ffffff 18
rounded = 5
border_width = 0
background_color = #ffffff 40
border_color = #ffffff 50
rounded = 5
border_width = 0
background_color = #ffffff 18
border_color = #ffffff 70
#---------------------------------------------
# PANEL
#---------------------------------------------
panel_monitor = all
panel_position = bottom center
panel_size = 94% 30
panel_margin = 0 0
panel_padding = 7 0
font_shadow = 0
panel_background_id = 1
wm_menu = 0
panel_dock = 0
panel_layer = bottom
#---------------------------------------------
# TASKBAR
#---------------------------------------------
#taskbar_mode = multi_desktop
taskbar_mode = single_desktop
taskbar_padding = 2 3 2
taskbar_background_id = 0
#taskbar_active_background_id = 0
#---------------------------------------------
# TASKS
#---------------------------------------------
task_icon = 1
task_text = 1
task_maximum_size = 140 35
task_centered = 1
task_padding = 6 3
task_font = sans 7
task_font_color = #ffffff 70
task_background_id = 3
task_icon_asb = 100 0 0
# replace STATUS by 'urgent', 'active' or 'iconfied'
#task_STATUS_background_id = 2
#task_STATUS_font_color = #ffffff 85
#task_STATUS_icon_asb = 100 0 0
# example:
task_active_background_id = 2
task_active_font_color = #ffffff 85
task_active_icon_asb = 100 0 0
urgent_nb_of_blink = 8
#---------------------------------------------
# SYSTRAYBAR
#---------------------------------------------
systray = 1
systray_padding = 0 4 5
systray_background_id = 0
systray_sort = left2right
systray_icon_size = 0
systray_icon_asb = 100 0 0
#---------------------------------------------
# CLOCK
#---------------------------------------------
time1_format = %H:%M
time1_font = sans 8
time2_format = %A %d %B
time2_font = sans 6
clock_font_color = #ffffff 76
clock_padding = 1 0
clock_background_id = 0
#clock_lclick_command = xclock
clock_rclick_command = orage
#clock_tooltip = %A %d %B
#time1_timezone = :US/Hawaii
#time2_timezone = :Europe/Berlin
#clock_tooltip_timezone = :/usr/share/zoneinfo/Europe/Paris
#---------------------------------------------
# BATTERY
#---------------------------------------------
battery = 0
battery_hide = 98
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #ffffff 76
battery_padding = 1 0
battery_background_id = 0
#---------------------------------------------
# TOOLTIP
#---------------------------------------------
tooltip = 0
tooltip_padding = 2 2
tooltip_show_timeout = 0.7
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font_color = #OOOOOO 80
tooltip_font = sans 10
#---------------------------------------------
# MOUSE ACTION ON TASK
#---------------------------------------------
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
#---------------------------------------------
# AUTOHIDE OPTIONS
#---------------------------------------------
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 2
autohide_height = 4
strut_policy = minimum</pre>
</div>
</div>
</td></tr><tr>
</tr></tbody></table>
</div>
<div id="wikicommentcol">
<div class="collapse">
<div id="commentlist">
</div>
</div>
</div>
</div>
<div class="hostedBy" style="margin-top: -20px;">
</div>
</body></html>

View File

@@ -1,217 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>tint2 - FAQ</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
</head>
<body class="t6">
<table class="st" width="100%" cellpadding="0" cellspacing="0" align="center" border="0">
<tbody><tr>
<td class="bevel-right" valign="top" align="right"></td>
</tr>
</tbody></table>
<div id="maincol" style="padding: 0pt 3px 3px 0pt; margin: 0pt;">
<!-- IE -->
<div id="wikipage">
<table>
<tbody><tr>
<td style="vertical-align: top; padding-left: 5px;">
<div id="wikicontent">
<div class="vt" id="wikimaincol">
<h1>tint2 - FAQ</h1>
<p></p><ul><li><a href="#What_is_tint2?">What is tint2?</a></li><li><a href="#Who_is_the_developer_of_tint2_?">Who is the developer of tint2 ?</a></li><li><a href="#Does_tint2_have_a_system_tray/notification_area?">Does tint2 have a system tray/notification area?</a></li><li><a href="#I_have_the_latest_build_of_tint2_but_still_no_system_tray">I have the latest build of tint2 but still no system tray</a></li><li><a href="#tint2_doesn%27t_show_the_systray/notification">tint2 doesn't show the systray/notification</a></li><li><a href="#Why_did_some_systray_icons_disappear_from_the_panel?">Why did some systray icons disappear from the panel?</a></li><li><a href="#Why_don%27t_some_systray_icons_appear_when_you_run_tint2_in_a">Why don't some systray icons appear when you run tint2 in a KDE session?</a></li><li><a href="#I_want_to_disable_the_tint2_systray">I want to disable the tint2 systray</a></li><li><a href="#How_to_configure_real_transparency">How to configure real transparency</a></li><li><a href="#Tint2_doesn%27t_work_on_compiz_correctly?">Tint2 doesn't work on compiz correctly?</a></li><li><a href="#I_want_to_disable_compiz_shadow_on_Tint2">I want to disable compiz shadow on Tint2</a></li><li><a href="#Adding_a_%27show_desktop%27_button">Adding a 'show desktop' button</a></li><li><a href="#Task_list_is_limited">Task list is limited</a></li><li><a href="#How_can_I_get_%27pager_like_capability%27_?">How can I get 'pager like capability' ?</a></li><li><a href="#I_want_to_hide_some_tasks_from_the_panel_?">I want to hide some tasks from the panel ?</a></li><li><a href="#The_tint2_panel_is_blank">The tint2 panel is blank</a></li><li><a href="#How_to_maximize_window_over_tint2">How to maximize window over tint2</a></li><li><a href="#I_get_errors_when_I_try_to_compile_tint2_on_my_own">I get errors when I try to compile tint2 on my own</a></li><li><a href="#I_upgraded_to_tint2_and_I_still_have_the_old_panel_with_its_bugs">I upgraded to tint2 and I still have the old panel with its bugs</a></li><li><a href="#Tint2_doesn%27t_show_in_Pekwm">Tint2 doesn't show in Pekwm</a></li><li><a href="#Is_there_an_IRC_channel?">Is there an IRC channel?</a></li></ul> <p></p><p>Frequently asked questions. Please add any extra tips to the comments. </p><h1><a name="What_is_tint2?"></a>What is tint2?<a href="#What_is_tint2?" class="section_anchor"></a></h1><ul><li>Tint2 is a panel/taskbar for modern x window managers like GNOME, KDE, XFCE, openbox, pekwm,etc.. </li></ul><h1><a name="Who_is_the_developer_of_tint2_?"></a>Who is the developer of tint2 ?<a href="#Who_is_the_developer_of_tint2_?" class="section_anchor"></a></h1><ul><li>Main developers of tint2 are Thierry Lorthiois and Andreas Fink </li></ul><h1><a name="Does_tint2_have_a_system_tray/notification_area?"></a>Does tint2 have a system tray/notification area?<a href="#Does_tint2_have_a_system_tray/notification_area?" class="section_anchor"></a></h1><ul><li>YES! Tint2 finally has system tray/notification area. Please <a href="https://code.google.com/p/tint2/wiki/Install">install</a> the latest build if your current build doesn't have it. </li></ul><h1><a name="I_have_the_latest_build_of_tint2_but_still_no_system_tray"></a>I have the latest build of tint2 but still no system tray<a href="#I_have_the_latest_build_of_tint2_but_still_no_system_tray" class="section_anchor"></a></h1><ul><li>Check your tint2rc to see if you have the systray option configured and the options are not commented out. </li><li>The systray section looks like this </li><pre class="prettyprint">#---------------------------------------------
# SYSTRAYBAR
#---------------------------------------------
systray = 1
systray_padding = 0 3 3
systray_background_id = 0
systray_sort = left2right</pre></ul><h1><a name="tint2_doesn't_show_the_systray/notification"></a>tint2 doesn't show the systray/notification<a href="#tint2_doesn%27t_show_the_systray/notification" class="section_anchor"></a></h1><ul><li>Check your tint2rc to see if you have 'systray = 1' </li><li>run tint2 in a terminal. if you get 'tint2 : another systray is running' it's because you have another systray/notification and you can't run more than one at a time. </li><ul><li>In gnome, remove the systray/notification with a right clic on the separator before your systray/notification -&gt; remove </li></ul></ul><h1><a name="Why_did_some_systray_icons_disappear_from_the_panel?"></a>Why did some systray icons disappear from the panel?<a href="#Why_did_some_systray_icons_disappear_from_the_panel?" class="section_anchor"></a></h1><ul><li>tint2 stops/restarts the systray protocol on some events (like switching theme with tint2conf). But some systray icons do not implement the stop/restart of the manager and so disappear from the panel. You can report the problem to us and also to the systray icon developer. </li></ul><h1><a name="Why_don't_some_systray_icons_appear_when_you_run_tint2_in_a"></a>Why don't some systray icons appear when you run tint2 in a KDE session?<a href="#Why_don%27t_some_systray_icons_appear_when_you_run_tint2_in_a" class="section_anchor"></a></h1><ul><li>Some KDE applications use the KDE status notifier service to show system tray icons. If you disable this service (systemsettings -&gt; Startup and Shutdown -&gt; Service Manager -&gt; uncheck "Status Notifier Manager") all the icons should appear normally in tint2. </li></ul><h1><a name="I_want_to_disable_the_tint2_systray"></a>I want to disable the tint2 systray<a href="#I_want_to_disable_the_tint2_systray" class="section_anchor"></a></h1><ul><li>To disable the systray, just put <tt>systray = 0</tt> in your tint2rc </li><li>Example: </li><pre class="prettyprint">systray = 0
systray_padding = 0 3 3
systray_background_id = 0</pre></ul><h1><a name="How_to_configure_real_transparency"></a>How to configure real transparency<a href="#How_to_configure_real_transparency" class="section_anchor"></a></h1><ul><li>tint2 autodetects your composite manager and uses real transparency when possible. However, xcompmgr have a little bug which prevents tint2 from detecting it. </li><li>If you want autodetect with xcompmgr, download and apply xcompmgr's patch (in bug report). See <a href="http://bugs.freedesktop.org/show_bug.cgi?id=26090" rel="nofollow">xcompmgr patch</a> </li></ul><h1><a name="Tint2_doesn't_work_on_compiz_correctly?"></a>Tint2 doesn't work on compiz correctly?<a href="#Tint2_doesn%27t_work_on_compiz_correctly?" class="section_anchor"></a></h1><ul><li>All my tasks are on one desktop in compiz? </li><ul><li>This is a known issue in compiz. Compiz doesn't support 'Virtual desktop' specification (or you have to disabled visual effect).<br>I look like 'Desktop number' use Viewport instead of 'Virtual desktop'. So pager capabilities are not supported. <br>See <a href="https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/153322" rel="nofollow">https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/153322</a> <br>or <a href="http://forum.compiz.org/viewtopic.php?f=86&amp;t=11943" rel="nofollow">http://forum.compiz.org/viewtopic.php?f=86&amp;t=11943</a> <br>or <a href="https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/150690" rel="nofollow">https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/150690</a> </li></ul><li>Tint is being decorated with a window/ has a shadow /is not fully transparent </li><ul><li>Open CompizConfig Settings manager -&gt; Window Decorations Plugin </li><ul><li>In the box for Decoration windows, put <tt>any &amp; !type=dock</tt> </li><li>In the box for Shadow windows, put <tt>any &amp; !type=dock</tt> </li></ul></ul><blockquote>
</blockquote><li>Tint has ugly white streaks </li><ul><li>Set a background for your desktop </li></ul></ul><h1><a name="I_want_to_disable_compiz_shadow_on_Tint2"></a>I want to disable compiz shadow on Tint2<a href="#I_want_to_disable_compiz_shadow_on_Tint2" class="section_anchor"></a></h1><ul><li>Run ccsm the compiz configuration tool. Go to Window Decorations. For both decoration and shadow windows, replace 'any' with 'any &amp; !name=tint2'. </li></ul><h1><a name="Adding_a_'show_desktop'_button"></a>Adding a 'show desktop' button<a href="#Adding_a_%27show_desktop%27_button" class="section_anchor"></a></h1><ul><li>tint2 doesn't implement 'show desktop' button. But here a way to get it. <br> </li></ul><p>Create a file with following text </p><pre class="prettyprint">#!/bin/sh
if wmctrl -m | grep "mode: ON"; then
exec wmctrl -k off
else
exec wmctrl -k on
fi</pre><p>Save it in /usr/bin/show_desktop.sh and make it executable.<br> Install the package 'wmctrl'. And call the script in tint2rc config file. </p><pre class="prettyprint">time1_format = %H:%M
time1_font = sans 8
time2_format = %A %d %B
time2_font = sans 6
clock_font_color = #ffffff 76
clock_padding = 4 4
clock_background_id = 0
clock_lclick_command = show_desktop.sh</pre><p>Then left click on the clock will do it. </p><h1><a name="Task_list_is_limited"></a>Task list is limited<a href="#Task_list_is_limited" class="section_anchor"></a></h1><ul><li>In your tint2rc file, check the value of <tt>taskbar_mode</tt>. If it's <tt>multi_desktop</tt>, tint2 show one taskbar per desktop. Change the value to <tt>single_desktop</tt> if you want just one taskbar. </li></ul><h1><a name="How_can_I_get_'pager_like_capability'_?"></a>How can I get 'pager like capability' ?<a href="#How_can_I_get_%27pager_like_capability%27_?" class="section_anchor"></a></h1><ul><li>In your tint2rc file, change the value of <tt>taskbar_mode</tt> to <tt>multi_desktop</tt>. This option will show one taskbar per desktop. So you can detect on witch desktop is an application and witch desktop is empty (or full). You can close an application whithout switching to the desktop. You can drag n drop application between desktop. </li></ul><h1><a name="I_want_to_hide_some_tasks_from_the_panel_?"></a>I want to hide some tasks from the panel ?<a href="#I_want_to_hide_some_tasks_from_the_panel_?" class="section_anchor"></a></h1><ul><li>In Openbox config file 'rc.xml' you can assign the property 'skip_taskbar' to your window </li></ul><h1><a name="The_tint2_panel_is_blank"></a>The tint2 panel is blank<a href="#The_tint2_panel_is_blank" class="section_anchor"></a></h1><ul><li>A new option, called <tt>panel_items</tt> has been added to the config file. This option defines the items tint2 will show and the order of those items(from left to right). Please define that in your tint2rc file. The format is shown below. The options are <tt>L</tt> for <tt>Launcher</tt>, <tt>S</tt> for the <tt>Systray</tt>, <tt>T</tt> for the <tt>taskbar</tt>, <tt>C</tt> for the <tt>clock</tt> and <tt>B</tt> for the <tt>battery</tt>. </li><pre class="prettyprint">panel_items = LTSBC </pre></ul><h1><a name="How_to_maximize_window_over_tint2"></a>How to maximize window over tint2<a href="#How_to_maximize_window_over_tint2" class="section_anchor"></a></h1><ul><li>You can manage interaction between tint2 and window with : </li><pre class="prettyprint">panel_layer = bottom,normal,top
strut_policy = follow_size/minimum/none
autohide_height = integer</pre></ul><blockquote>If you want maximized window never cover tint2:
<pre class="prettyprint">panel_layer = top
strut_policy = follow_size</pre>If you want maximized window behind tint2:
<pre class="prettyprint">panel_layer = top
strut_policy = none</pre>If you want maximized window behind tint2, but 2 pixels free so you can use desktop action (right click, ...):
<pre class="prettyprint">panel_layer = top
strut_policy = minimum
autohide_height = 2</pre></blockquote><h1><a name="I_get_errors_when_I_try_to_compile_tint2_on_my_own"></a>I get errors when I try to compile tint2 on my own<a href="#I_get_errors_when_I_try_to_compile_tint2_on_my_own" class="section_anchor"></a></h1><ul><li>Do you have all the dependencies installed? Please check <a href="https://code.google.com/p/tint2/wiki/Install#Dependencies">here</a> </li></ul><h1><a name="I_upgraded_to_tint2_and_I_still_have_the_old_panel_with_its_bugs"></a>I upgraded to tint2 and I still have the old panel with its bugs<a href="#I_upgraded_to_tint2_and_I_still_have_the_old_panel_with_its_bugs" class="section_anchor"></a></h1><ul><li>The tint binary was renamed tint2 to avoid a conflict with another package.So your new tint2 startup command is <strong>tint2</strong> </li><li>Since a new stable release hasn't been released yet, both the old tint and the new tint2 binaries will be on your system when you upgrade just incase you run into some problems and want to fall back on the old binary. </li></ul><h1><a name="Tint2_doesn't_show_in_Pekwm"></a>Tint2 doesn't show in Pekwm<a href="#Tint2_doesn%27t_show_in_Pekwm" class="section_anchor"></a></h1><ul><li>The problem is that pekwm defines by default edge borders, and doesn't allow a panel to get inside these edge borders. The config option is in <tt>~/.pekwm/config</tt> under <tt>Screen/EdgeSize</tt>. You can either disable the edge borders or set tint2 to a size where it doesn't enter these borders (i.e. play with <tt>panel_size</tt> and <tt>panel_margin</tt>) </li><li>Setting the margin to one pixel made it appear on my screen. With horizontal panel: </li><pre class="prettyprint">panel_size = 95% height
panel_margin = 0 1</pre><li>With vertical panel: </li><pre class="prettyprint">panel_size = width 95%
panel_margin = 1 0</pre></ul><h1><a name="Is_there_an_IRC_channel?"></a>Is there an IRC channel?<a href="#Is_there_an_IRC_channel?" class="section_anchor"></a></h1><ul><li>Yes. There is now an irc channel, <strong>#tint2</strong> on <a href="irc://irc.freenode.net" rel="nofollow">irc.freenode.net</a>. </li><li>Just ask your question and stay there, because we are not always watching the channel ;) </li></ul>
</div>
</div>
</td></tr><tr>
</tr></tbody></table>
</div>
<div id="wikicommentcol">
<div class="collapse">
</div>
</div>
<div id="commentform">
</div>
</div>
<div class="hostedBy" style="margin-top: -20px;">
</div>
</body></html>

View File

@@ -35,20 +35,25 @@ gboolean bat1_has_font;
PangoFontDescription *bat1_font_desc;
gboolean bat2_has_font;
PangoFontDescription *bat2_font_desc;
char *bat1_format;
char *bat2_format;
struct BatteryState battery_state;
gboolean battery_enabled;
gboolean battery_tooltip_enabled;
int percentage_hide;
static timeout *battery_timeout;
static char buf_bat_percentage[10];
static char buf_bat_time[20];
#define BATTERY_BUF_SIZE 256
static char buf_bat_line1[BATTERY_BUF_SIZE];
static char buf_bat_line2[BATTERY_BUF_SIZE];
int8_t battery_low_status;
gboolean battery_low_cmd_sent;
gboolean battery_full_cmd_sent;
char *ac_connected_cmd;
char *ac_disconnected_cmd;
char *battery_low_cmd;
char *battery_full_cmd;
char *battery_lclick_command;
char *battery_mclick_command;
char *battery_rclick_command;
@@ -70,14 +75,18 @@ void default_battery()
battery_found = FALSE;
percentage_hide = 101;
battery_low_cmd_sent = FALSE;
battery_full_cmd_sent = FALSE;
battery_timeout = NULL;
bat1_has_font = FALSE;
bat1_font_desc = NULL;
bat1_format = NULL;
bat2_has_font = FALSE;
bat2_font_desc = NULL;
bat2_format = NULL;
ac_connected_cmd = NULL;
ac_disconnected_cmd = NULL;
battery_low_cmd = NULL;
battery_full_cmd = NULL;
battery_lclick_command = NULL;
battery_mclick_command = NULL;
battery_rclick_command = NULL;
@@ -98,6 +107,12 @@ void cleanup_battery()
bat2_font_desc = NULL;
free(battery_low_cmd);
battery_low_cmd = NULL;
free(battery_full_cmd);
battery_full_cmd = NULL;
free(bat1_format);
bat1_format = NULL;
free(bat2_format);
bat2_format = NULL;
free(battery_lclick_command);
battery_lclick_command = NULL;
free(battery_mclick_command);
@@ -119,6 +134,91 @@ void cleanup_battery()
battery_os_free();
}
// Appends addendum to dest, and does not allow dest to grow over limit (including NULL terminator).
char *strnappend(char *dest, const char *addendum, size_t limit)
{
char *tmp = strdup(dest);
// Actually concatenate them.
snprintf(dest, limit, "%s%s", tmp, addendum);
free(tmp);
return dest;
}
void battery_update_text(char *dest, char *format)
{
if (!battery_enabled || !dest || !format)
return;
// We want to loop over the format specifier, replacing any known symbols with our battery data.
// First, erase anything already stored in the buffer.
// This ensures the string will always be null-terminated.
bzero(dest, BATTERY_BUF_SIZE);
for (size_t o = 0; o < strlen(format); o++) {
char buf[BATTERY_BUF_SIZE];
bzero(buf, BATTERY_BUF_SIZE);
char *c = &format[o];
// Format specification:
// %s : State (charging, discharging, full, unknown)
// %m : Minutes left (estimated).
// %h : Hours left (estimated).
// %t : Time left. This is equivalent to the old behaviour; i.e. "(plugged in)" or "hrs:mins" otherwise.
// %p : Percentage left. Includes the % sign.
if (*c == '%') {
c++;
o++; // Skip the format control character.
switch (*c) {
case 's':
// Append the appropriate status message to the string.
strnappend(dest,
(battery_state.state == BATTERY_CHARGING)
? "Charging"
: (battery_state.state == BATTERY_DISCHARGING)
? "Discharging"
: (battery_state.state == BATTERY_FULL)
? "Full"
: "Unknown",
BATTERY_BUF_SIZE);
break;
case 'm':
snprintf(buf, sizeof(buf), "%02d", battery_state.time.minutes);
strnappend(dest, buf, BATTERY_BUF_SIZE);
break;
case 'h':
snprintf(buf, sizeof(buf), "%02d", battery_state.time.hours);
strnappend(dest, buf, BATTERY_BUF_SIZE);
break;
case 'p':
snprintf(buf, sizeof(buf), "%d%%", battery_state.percentage);
strnappend(dest, buf, BATTERY_BUF_SIZE);
break;
case 't':
if (battery_state.state == BATTERY_FULL) {
snprintf(buf, sizeof(buf), "Full");
strnappend(dest, buf, BATTERY_BUF_SIZE);
} else {
snprintf(buf, sizeof(buf), "%02d:%02d", battery_state.time.hours, battery_state.time.minutes);
strnappend(dest, buf, BATTERY_BUF_SIZE);
}
break;
case '%':
case '\0':
strnappend(dest, "%", BATTERY_BUF_SIZE);
break;
default:
fprintf(stderr, "Battery: unrecognised format specifier '%%%c'.\n", *c);
buf[0] = *c;
strnappend(dest, buf, BATTERY_BUF_SIZE);
}
} else {
buf[0] = *c;
strnappend(dest, buf, BATTERY_BUF_SIZE);
}
}
}
void init_battery()
{
if (!battery_enabled)
@@ -169,6 +269,11 @@ void init_battery_panel(void *p)
if (battery_tooltip_enabled)
battery->area._get_tooltip_text = battery_get_tooltip;
instantiate_area_gradients(&battery->area);
if (!bat1_format && !bat2_format) {
bat1_format = strdup("%p");
bat2_format = strdup("%t");
}
}
void battery_init_fonts()
@@ -227,14 +332,14 @@ void update_battery_tick(void *arg)
if (old_ac_connected != battery_state.ac_connected) {
if (battery_state.ac_connected)
tint_exec(ac_connected_cmd);
tint_exec_no_sn(ac_connected_cmd);
else
tint_exec(ac_disconnected_cmd);
tint_exec_no_sn(ac_disconnected_cmd);
}
if (battery_state.percentage < battery_low_status && battery_state.state == BATTERY_DISCHARGING &&
!battery_low_cmd_sent) {
tint_exec(battery_low_cmd);
tint_exec_no_sn(battery_low_cmd);
battery_low_cmd_sent = TRUE;
}
if (battery_state.percentage > battery_low_status && battery_state.state == BATTERY_CHARGING &&
@@ -242,6 +347,16 @@ void update_battery_tick(void *arg)
battery_low_cmd_sent = FALSE;
}
if ((battery_state.percentage >= 100 || battery_state.state == BATTERY_FULL) &&
!battery_full_cmd_sent) {
tint_exec_no_sn(battery_full_cmd);
battery_full_cmd_sent = TRUE;
}
if (battery_state.percentage < 100 && battery_state.state != BATTERY_FULL &&
battery_full_cmd_sent) {
battery_full_cmd_sent = FALSE;
}
for (int i = 0; i < num_panels; i++) {
// Show/hide if needed
if (!battery_found) {
@@ -278,168 +393,51 @@ int update_battery()
battery_state.percentage = 100;
}
battery_update_text(buf_bat_line1, bat1_format);
if (bat2_format != 0) {
battery_update_text(buf_bat_line2, bat2_format);
}
return err;
}
int battery_compute_desired_size(void *obj)
{
Battery *battery = (Battery *)obj;
Panel *panel = (Panel *)battery->area.panel;
int bat_percentage_height, bat_percentage_width, bat_percentage_height_ink;
int bat_time_height, bat_time_width, bat_time_height_ink;
snprintf(buf_bat_percentage, sizeof(buf_bat_percentage), "%d%%", battery_state.percentage);
if (battery_state.state == BATTERY_FULL) {
strcpy(buf_bat_time, "Full");
} else {
snprintf(buf_bat_time, sizeof(buf_bat_time), "%02d:%02d", battery_state.time.hours, battery_state.time.minutes);
}
get_text_size2(bat1_font_desc,
&bat_percentage_height_ink,
&bat_percentage_height,
&bat_percentage_width,
panel->area.height,
panel->area.width,
buf_bat_percentage,
strlen(buf_bat_percentage),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
get_text_size2(bat2_font_desc,
&bat_time_height_ink,
&bat_time_height,
&bat_time_width,
panel->area.height,
panel->area.width,
buf_bat_time,
strlen(buf_bat_time),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
if (panel_horizontal) {
int new_size = (bat_percentage_width > bat_time_width) ? bat_percentage_width : bat_time_width;
new_size += 2 * battery->area.paddingxlr + left_right_border_width(&battery->area);
return new_size;
} else {
int new_size = bat_percentage_height + bat_time_height + 2 * battery->area.paddingxlr +
top_bottom_border_width(&battery->area);
return new_size;
}
return text_area_compute_desired_size(&battery->area, buf_bat_line1, buf_bat_line2, bat1_font_desc, bat2_font_desc);
}
gboolean resize_battery(void *obj)
{
Battery *battery = (Battery *)obj;
Panel *panel = (Panel *)battery->area.panel;
int bat_percentage_height, bat_percentage_width, bat_percentage_height_ink;
int bat_time_height, bat_time_width, bat_time_height_ink;
int ret = 0;
snprintf(buf_bat_percentage, sizeof(buf_bat_percentage), "%d%%", battery_state.percentage);
if (battery_state.state == BATTERY_FULL) {
strcpy(buf_bat_time, "Full");
} else {
snprintf(buf_bat_time, sizeof(buf_bat_time), "%02d:%02d", battery_state.time.hours, battery_state.time.minutes);
}
get_text_size2(bat1_font_desc,
&bat_percentage_height_ink,
&bat_percentage_height,
&bat_percentage_width,
panel->area.height,
panel->area.width,
buf_bat_percentage,
strlen(buf_bat_percentage),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
get_text_size2(bat2_font_desc,
&bat_time_height_ink,
&bat_time_height,
&bat_time_width,
panel->area.height,
panel->area.width,
buf_bat_time,
strlen(buf_bat_time),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
if (panel_horizontal) {
int new_size = (bat_percentage_width > bat_time_width) ? bat_percentage_width : bat_time_width;
new_size += 2 * battery->area.paddingxlr + left_right_border_width(&battery->area);
if (new_size > battery->area.width || new_size < battery->area.width - 2) {
// we try to limit the number of resize
battery->area.width = new_size;
battery->bat1_posy = (battery->area.height - bat_percentage_height - bat_time_height) / 2;
battery->bat2_posy = battery->bat1_posy + bat_percentage_height;
ret = 1;
}
} else {
int new_size = bat_percentage_height + bat_time_height + 2 * battery->area.paddingxlr +
top_bottom_border_width(&battery->area);
if (new_size > battery->area.height || new_size < battery->area.height - 2) {
battery->area.height = new_size;
battery->bat1_posy = (battery->area.height - bat_percentage_height - bat_time_height - 2) / 2;
battery->bat2_posy = battery->bat1_posy + bat_percentage_height + 2;
ret = 1;
}
}
schedule_redraw(&battery->area);
return ret;
return resize_text_area(&battery->area,
buf_bat_line1,
buf_bat_line2,
bat1_font_desc,
bat2_font_desc,
&battery->bat1_posy,
&battery->bat2_posy);
}
void draw_battery(void *obj, cairo_t *c)
{
Battery *battery = obj;
PangoLayout *layout = pango_cairo_create_layout(c);
pango_layout_set_font_description(layout, bat1_font_desc);
pango_layout_set_width(layout, battery->area.width * PANGO_SCALE);
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
pango_layout_set_text(layout, buf_bat_percentage, strlen(buf_bat_percentage));
cairo_set_source_rgba(c,
battery->font_color.rgb[0],
battery->font_color.rgb[1],
battery->font_color.rgb[2],
battery->font_color.alpha);
pango_cairo_update_layout(c, layout);
draw_text(layout, c, 0, battery->bat1_posy, &battery->font_color, ((Panel *)battery->area.panel)->font_shadow);
pango_layout_set_font_description(layout, bat2_font_desc);
pango_layout_set_indent(layout, 0);
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
pango_layout_set_text(layout, buf_bat_time, strlen(buf_bat_time));
pango_layout_set_width(layout, battery->area.width * PANGO_SCALE);
pango_cairo_update_layout(c, layout);
draw_text(layout, c, 0, battery->bat2_posy, &battery->font_color, ((Panel *)battery->area.panel)->font_shadow);
pango_cairo_show_layout(c, layout);
g_object_unref(layout);
Battery *battery = (Battery *)obj;
draw_text_area(&battery->area,
c,
buf_bat_line1,
buf_bat_line2,
bat1_font_desc,
bat2_font_desc,
battery->bat1_posy,
battery->bat2_posy,
&battery->font_color);
}
void battery_dump_geometry(void *obj, int indent)
{
Battery *battery = obj;
fprintf(stderr,
"%*sText 1: y = %d, text = %s\n",
indent,
"",
battery->bat1_posy,
buf_bat_percentage);
fprintf(stderr,
"%*sText 2: y = %d, text = %s\n",
indent,
"",
battery->bat2_posy,
buf_bat_time);
Battery *battery = (Battery *)obj;
fprintf(stderr, "%*sText 1: y = %d, text = %s\n", indent, "", battery->bat1_posy, buf_bat_line1);
fprintf(stderr, "%*sText 2: y = %d, text = %s\n", indent, "", battery->bat2_posy, buf_bat_line2);
}
char *battery_get_tooltip(void *obj)
@@ -447,7 +445,7 @@ char *battery_get_tooltip(void *obj)
return battery_os_tooltip();
}
void battery_action(int button)
void battery_action(void *obj, int button, int x, int y, Time time)
{
char *command = NULL;
switch (button) {
@@ -467,5 +465,5 @@ void battery_action(int button)
command = battery_dwheel_command;
break;
}
tint_exec(command);
tint_exec(command, NULL, NULL, time, obj, x, y);
}

View File

@@ -48,12 +48,15 @@ extern gboolean bat1_has_font;
extern PangoFontDescription *bat1_font_desc;
extern gboolean bat2_has_font;
extern PangoFontDescription *bat2_font_desc;
extern char *bat1_format;
extern char *bat2_format;
extern gboolean battery_enabled;
extern gboolean battery_tooltip_enabled;
extern int percentage_hide;
extern int8_t battery_low_status;
extern char *battery_low_cmd;
extern char *battery_full_cmd;
extern char *ac_connected_cmd;
extern char *ac_disconnected_cmd;
@@ -108,7 +111,7 @@ void battery_default_font_changed();
gboolean resize_battery(void *obj);
void battery_action(int button);
void battery_action(void *obj, int button, int x, int y, Time time);
/* operating system specific functions */
gboolean battery_os_init();

View File

@@ -128,7 +128,8 @@ static gboolean init_linux_battery(struct psy_battery *bat)
goto err0;
}
bat->path_level_now = g_build_filename(battery_sys_prefix, "/sys/class/power_supply", entryname, "energy_now", NULL);
bat->path_level_now =
g_build_filename(battery_sys_prefix, "/sys/class/power_supply", entryname, "energy_now", NULL);
bat->path_level_full =
g_build_filename(battery_sys_prefix, "/sys/class/power_supply", entryname, "energy_full", NULL);
bat->path_rate_now = g_build_filename(battery_sys_prefix, "/sys/class/power_supply", entryname, "power_now", NULL);
@@ -445,6 +446,17 @@ int battery_os_update(BatteryState *state)
/* AC state */
state->ac_connected = ac_connected;
if (state->state == BATTERY_UNKNOWN) {
if (ac_connected) {
if (total_rate_now == 0 && state->percentage >= 90)
state->state = BATTERY_FULL;
else
state->state = BATTERY_CHARGING;
} else {
state->state = BATTERY_DISCHARGING;
}
}
return 0;
}

543
src/button/button.c Normal file
View File

@@ -0,0 +1,543 @@
#include "button.h"
#include <string.h>
#include <stdio.h>
#include <cairo.h>
#include <cairo-xlib.h>
#include <math.h>
#include <pango/pangocairo.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <fcntl.h>
#include "window.h"
#include "server.h"
#include "panel.h"
#include "timer.h"
#include "common.h"
char *button_get_tooltip(void *obj);
void button_init_fonts();
int button_compute_desired_size(void *obj);
void button_dump_geometry(void *obj, int indent);
void default_button()
{
}
Button *create_button()
{
Button *button = calloc(1, sizeof(Button));
button->backend = calloc(1, sizeof(ButtonBackend));
button->backend->centered = TRUE;
button->backend->font_color.alpha = 0.5;
return button;
}
gpointer create_button_frontend(gconstpointer arg, gpointer data)
{
Button *button_backend = (Button *)arg;
Button *button_frontend = calloc(1, sizeof(Button));
button_frontend->backend = button_backend->backend;
button_backend->backend->instances = g_list_append(button_backend->backend->instances, button_frontend);
button_frontend->frontend = calloc(1, sizeof(ButtonFrontend));
return button_frontend;
}
void destroy_button(void *obj)
{
Button *button = (Button *)obj;
if (button->frontend) {
// This is a frontend element
if (button->frontend->icon) {
imlib_context_set_image(button->frontend->icon);
imlib_free_image();
button->frontend->icon = NULL;
}
button->backend->instances = g_list_remove_all(button->backend->instances, button);
free_and_null(button->frontend);
remove_area(&button->area);
free_area(&button->area);
free_and_null(button);
} else {
// This is a backend element
free_and_null(button->backend->text);
free_and_null(button->backend->icon_name);
free_and_null(button->backend->tooltip);
button->backend->bg = NULL;
pango_font_description_free(button->backend->font_desc);
button->backend->font_desc = NULL;
free_and_null(button->backend->lclick_command);
free_and_null(button->backend->mclick_command);
free_and_null(button->backend->rclick_command);
free_and_null(button->backend->dwheel_command);
free_and_null(button->backend->uwheel_command);
if (button->backend->instances) {
fprintf(stderr, "Error: Attempt to destroy backend while there are still frontend instances!\n");
exit(-1);
}
free(button->backend);
free(button);
}
}
void init_button()
{
GList *to_remove = panel_config.button_list;
for (int k = 0; k < strlen(panel_items_order) && to_remove; k++) {
if (panel_items_order[k] == 'P') {
to_remove = to_remove->next;
}
}
if (to_remove) {
if (to_remove == panel_config.button_list) {
g_list_free_full(to_remove, destroy_button);
panel_config.button_list = NULL;
} else {
// Cut panel_config.button_list
if (to_remove->prev)
to_remove->prev->next = NULL;
to_remove->prev = NULL;
// Remove all elements of to_remove and to_remove itself
g_list_free_full(to_remove, destroy_button);
}
}
button_init_fonts();
for (GList *l = panel_config.button_list; l; l = l->next) {
Button *button = l->data;
// Set missing config options
if (!button->backend->bg)
button->backend->bg = &g_array_index(backgrounds, Background, 0);
}
}
void init_button_panel(void *p)
{
Panel *panel = (Panel *)p;
// Make sure this is only done once if there are multiple items
if (panel->button_list && ((Button *)panel->button_list->data)->frontend)
return;
// panel->button_list is now a copy of the pointer panel_config.button_list
// We make it a deep copy
panel->button_list = g_list_copy_deep(panel_config.button_list, create_button_frontend, NULL);
load_icon_themes();
for (GList *l = panel->button_list; l; l = l->next) {
Button *button = l->data;
button->area.bg = button->backend->bg;
button->area.paddingx = button->backend->paddingx;
button->area.paddingy = button->backend->paddingy;
button->area.paddingxlr = button->backend->paddingxlr;
button->area.parent = panel;
button->area.panel = panel;
button->area._dump_geometry = button_dump_geometry;
button->area._compute_desired_size = button_compute_desired_size;
snprintf(button->area.name, sizeof(button->area.name), "Button");
button->area._draw_foreground = draw_button;
button->area.size_mode = LAYOUT_FIXED;
button->area._resize = resize_button;
button->area._get_tooltip_text = button_get_tooltip;
button->area._is_under_mouse = full_width_area_is_under_mouse;
button->area.has_mouse_press_effect =
panel_config.mouse_effects &&
(button->area.has_mouse_over_effect = button->backend->lclick_command || button->backend->mclick_command ||
button->backend->rclick_command || button->backend->uwheel_command ||
button->backend->dwheel_command);
button->area.resize_needed = TRUE;
button->area.on_screen = TRUE;
instantiate_area_gradients(&button->area);
button_reload_icon(button);
}
}
void button_init_fonts()
{
for (GList *l = panel_config.button_list; l; l = l->next) {
Button *button = l->data;
if (!button->backend->font_desc)
button->backend->font_desc = pango_font_description_from_string(get_default_font());
}
}
void button_default_font_changed()
{
gboolean needs_update = FALSE;
for (GList *l = panel_config.button_list; l; l = l->next) {
Button *button = l->data;
if (!button->backend->has_font) {
pango_font_description_free(button->backend->font_desc);
button->backend->font_desc = NULL;
needs_update = TRUE;
}
}
if (!needs_update)
return;
button_init_fonts();
for (int i = 0; i < num_panels; i++) {
for (GList *l = panels[i].button_list; l; l = l->next) {
Button *button = l->data;
if (!button->backend->has_font) {
button->area.resize_needed = TRUE;
schedule_redraw(&button->area);
}
}
}
schedule_panel_redraw();
}
void button_reload_icon(Button *button)
{
free_icon(button->frontend->icon);
free_icon(button->frontend->icon_hover);
free_icon(button->frontend->icon_pressed);
button->frontend->icon = NULL;
button->frontend->icon_hover = NULL;
button->frontend->icon_pressed = NULL;
button->frontend->icon_load_size = button->frontend->iconw;
if (!button->backend->icon_name)
return;
char *new_icon_path = get_icon_path(icon_theme_wrapper, button->backend->icon_name, button->frontend->iconw, TRUE);
if (new_icon_path)
button->frontend->icon = load_image(new_icon_path, TRUE);
free(new_icon_path);
// On loading error, fallback to default
if (!button->frontend->icon) {
new_icon_path = get_icon_path(icon_theme_wrapper, DEFAULT_ICON, button->frontend->iconw, TRUE);
if (new_icon_path)
button->frontend->icon = load_image(new_icon_path, TRUE);
free(new_icon_path);
}
Imlib_Image original = button->frontend->icon;
button->frontend->icon = scale_icon(button->frontend->icon, button->frontend->iconw);
free_icon(original);
if (panel_config.mouse_effects) {
button->frontend->icon_hover = adjust_icon(button->frontend->icon,
panel_config.mouse_over_alpha,
panel_config.mouse_over_saturation,
panel_config.mouse_over_brightness);
button->frontend->icon_pressed = adjust_icon(button->frontend->icon,
panel_config.mouse_pressed_alpha,
panel_config.mouse_pressed_saturation,
panel_config.mouse_pressed_brightness);
}
schedule_redraw(&button->area);
}
void button_default_icon_theme_changed()
{
for (int i = 0; i < num_panels; i++) {
for (GList *l = panels[i].button_list; l; l = l->next) {
Button *button = l->data;
button_reload_icon(button);
}
}
schedule_panel_redraw();
}
void cleanup_button()
{
// Cleanup frontends
for (int i = 0; i < num_panels; i++) {
g_list_free_full(panels[i].button_list, destroy_button);
panels[i].button_list = NULL;
}
// Cleanup backends
g_list_free_full(panel_config.button_list, destroy_button);
panel_config.button_list = NULL;
}
int button_compute_desired_size(void *obj)
{
Button *button = (Button *)obj;
Panel *panel = (Panel *)button->area.panel;
int horiz_padding = (panel_horizontal ? button->area.paddingxlr : button->area.paddingy);
int vert_padding = (panel_horizontal ? button->area.paddingy : button->area.paddingxlr);
int interior_padding = button->area.paddingx;
int icon_w, icon_h;
if (button->backend->icon_name) {
if (panel_horizontal)
icon_h = icon_w = button->area.height - top_bottom_border_width(&button->area) - 2 * vert_padding;
else
icon_h = icon_w = button->area.width - left_right_border_width(&button->area) - 2 * horiz_padding;
if (button->backend->max_icon_size) {
icon_w = MIN(icon_w, button->backend->max_icon_size);
icon_h = MIN(icon_h, button->backend->max_icon_size);
}
} else {
icon_h = icon_w = 0;
}
int txt_height_ink, txt_height, txt_width;
if (button->backend->text) {
if (panel_horizontal) {
get_text_size2(button->backend->font_desc,
&txt_height_ink,
&txt_height,
&txt_width,
panel->area.height,
panel->area.width,
button->backend->text,
strlen(button->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
} else {
get_text_size2(button->backend->font_desc,
&txt_height_ink,
&txt_height,
&txt_width,
panel->area.height,
button->area.width - icon_w - (icon_w ? interior_padding : 0) - 2 * horiz_padding -
left_right_border_width(&button->area),
button->backend->text,
strlen(button->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
}
} else {
txt_height_ink = txt_height = txt_width = 0;
}
if (panel_horizontal) {
int new_size = txt_width + icon_w + (txt_width && icon_w ? interior_padding : 0);
new_size += 2 * horiz_padding + left_right_border_width(&button->area);
return new_size;
} else {
int new_size;
new_size = txt_height + 2 * vert_padding + top_bottom_border_width(&button->area);
new_size = MAX(new_size, icon_h + 2 * vert_padding + top_bottom_border_width(&button->area));
return new_size;
}
}
gboolean resize_button(void *obj)
{
Button *button = (Button *)obj;
Panel *panel = (Panel *)button->area.panel;
Area *area = &button->area;
int horiz_padding = (panel_horizontal ? button->area.paddingxlr : button->area.paddingy);
int vert_padding = (panel_horizontal ? button->area.paddingy : button->area.paddingxlr);
int interior_padding = button->area.paddingx;
int icon_w, icon_h;
if (button->backend->icon_name) {
if (panel_horizontal)
icon_h = icon_w = button->area.height - top_bottom_border_width(&button->area) - 2 * vert_padding;
else
icon_h = icon_w = button->area.width - left_right_border_width(&button->area) - 2 * horiz_padding;
if (button->backend->max_icon_size) {
icon_w = MIN(icon_w, button->backend->max_icon_size);
icon_h = MIN(icon_h, button->backend->max_icon_size);
}
} else {
icon_h = icon_w = 0;
}
button->frontend->iconw = icon_w;
button->frontend->iconh = icon_h;
if (button->frontend->icon_load_size != button->frontend->iconw)
button_reload_icon(button);
int available_w, available_h;
if (panel_horizontal) {
available_w = panel->area.width;
available_h = area->height - 2 * area->paddingy - left_right_border_width(area);
} else {
available_w =
area->width - icon_w - (icon_w ? interior_padding : 0) - 2 * horiz_padding - left_right_border_width(area);
available_h = panel->area.height;
}
int txt_height_ink, txt_height, txt_width;
if (button->backend->text) {
get_text_size2(button->backend->font_desc,
&txt_height_ink,
&txt_height,
&txt_width,
available_h,
available_w,
button->backend->text,
strlen(button->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
} else {
txt_height_ink = txt_height = txt_width = 0;
}
gboolean result = FALSE;
if (panel_horizontal) {
int new_size = txt_width + icon_w + (txt_width && icon_w ? interior_padding : 0);
new_size += 2 * horiz_padding + left_right_border_width(&button->area);
if (new_size != button->area.width) {
button->area.width = new_size;
result = TRUE;
}
} else {
int new_size;
new_size = txt_height + 2 * vert_padding + top_bottom_border_width(&button->area);
new_size = MAX(new_size, icon_h + 2 * vert_padding + top_bottom_border_width(&button->area));
if (new_size != button->area.height) {
button->area.height = new_size;
result = TRUE;
}
}
button->frontend->textw = txt_width;
button->frontend->texth = txt_height;
if (button->backend->centered) {
if (icon_w) {
button->frontend->icony = (button->area.height - icon_h) / 2;
button->frontend->iconx =
(button->area.width - txt_width - (txt_width ? interior_padding : 0) - icon_w) / 2;
button->frontend->texty = (button->area.height - txt_height) / 2;
button->frontend->textx = button->frontend->iconx + icon_w + interior_padding;
} else {
button->frontend->texty = (button->area.height - txt_height) / 2;
button->frontend->textx = (button->area.width - txt_width) / 2;
}
} else {
if (icon_w) {
button->frontend->icony = (button->area.height - icon_h) / 2;
button->frontend->iconx = left_border_width(&button->area) + horiz_padding;
button->frontend->texty = (button->area.height - txt_height) / 2;
button->frontend->textx = button->frontend->iconx + icon_w + interior_padding;
} else {
button->frontend->texty = (button->area.height - txt_height) / 2;
button->frontend->textx = left_border_width(&button->area) + horiz_padding;
}
}
schedule_redraw(&button->area);
return result;
}
void draw_button(void *obj, cairo_t *c)
{
Button *button = obj;
if (button->frontend->icon) {
// Render icon
Imlib_Image image;
if (panel_config.mouse_effects) {
if (button->area.mouse_state == MOUSE_OVER)
image = button->frontend->icon_hover ? button->frontend->icon_hover : button->frontend->icon;
else if (button->area.mouse_state == MOUSE_DOWN)
image = button->frontend->icon_pressed ? button->frontend->icon_pressed : button->frontend->icon;
else
image = button->frontend->icon;
} else {
image = button->frontend->icon;
}
imlib_context_set_image(image);
render_image(button->area.pix, button->frontend->iconx, button->frontend->icony);
}
// Render text
if (button->backend->text) {
PangoLayout *layout = pango_cairo_create_layout(c);
pango_layout_set_font_description(layout, button->backend->font_desc);
pango_layout_set_width(layout, button->frontend->textw * PANGO_SCALE);
pango_layout_set_alignment(layout, button->backend->centered ? PANGO_ALIGN_CENTER : PANGO_ALIGN_LEFT);
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
pango_layout_set_text(layout, button->backend->text, strlen(button->backend->text));
pango_cairo_update_layout(c, layout);
draw_text(layout,
c,
button->frontend->textx,
button->frontend->texty,
&button->backend->font_color,
panel_config.font_shadow);
g_object_unref(layout);
}
}
void button_dump_geometry(void *obj, int indent)
{
Button *button = obj;
if (button->frontend->icon) {
Imlib_Image tmp = imlib_context_get_image();
imlib_context_set_image(button->frontend->icon);
fprintf(stderr,
"%*sIcon: x = %d, y = %d, w = %d, h = %d\n",
indent,
"",
button->frontend->iconx,
button->frontend->icony,
imlib_image_get_width(),
imlib_image_get_height());
if (tmp)
imlib_context_set_image(tmp);
}
fprintf(stderr,
"%*sText: x = %d, y = %d, w = %d, align = %s, text = %s\n",
indent,
"",
button->frontend->textx,
button->frontend->texty,
button->frontend->textw,
button->backend->centered ? "center" : "left",
button->backend->text);
}
void button_action(void *obj, int mouse_button, int x, int y, Time time)
{
Button *button = (Button *)obj;
char *command = NULL;
switch (mouse_button) {
case 1:
command = button->backend->lclick_command;
break;
case 2:
command = button->backend->mclick_command;
break;
case 3:
command = button->backend->rclick_command;
break;
case 4:
command = button->backend->uwheel_command;
break;
case 5:
command = button->backend->dwheel_command;
break;
}
tint_exec(command, NULL, NULL, time, obj, x, y);
}
char *button_get_tooltip(void *obj)
{
Button *button = obj;
if (button->backend->tooltip && strlen(button->backend->tooltip) > 0)
return strdup(button->backend->tooltip);
return NULL;
}

113
src/button/button.h Normal file
View File

@@ -0,0 +1,113 @@
#ifndef BUTTON_H
#define BUTTON_H
#include <sys/time.h>
#include <pango/pangocairo.h>
#include "area.h"
#include "common.h"
#include "timer.h"
// Architecture:
// Panel panel_config contains an array of Button, each storing all config options and all the state variables.
// Only these run commands.
//
// Tint2 maintains an array of Panels, one for each monitor. Each stores an array of Button which was initially copied
// from panel_config. Each works as a frontend to the corresponding Button in panel_config as backend, using the
// backend's config and state variables.
typedef struct ButtonBackend {
// Config:
char *icon_name;
char *text;
char *tooltip;
gboolean centered;
int max_icon_size;
gboolean has_font;
PangoFontDescription *font_desc;
Color font_color;
char *lclick_command;
char *mclick_command;
char *rclick_command;
char *uwheel_command;
char *dwheel_command;
// paddingxlr = horizontal padding left/right
// paddingx = horizontal padding between childs
int paddingxlr, paddingx, paddingy;
Background *bg;
// List of Button which are frontends for this backend, one for each panel
GList *instances;
} ButtonBackend;
typedef struct ButtonFrontend {
// Frontend state:
Imlib_Image icon;
Imlib_Image icon_hover;
Imlib_Image icon_pressed;
int icon_load_size;
int iconx;
int icony;
int iconw;
int iconh;
int textx;
int texty;
int textw;
int texth;
} ButtonFrontend;
typedef struct Button {
Area area;
// All elements have the backend pointer set. However only backend elements have ownership.
ButtonBackend *backend;
// Set only for frontend Button items.
ButtonFrontend *frontend;
} Button;
// Called before the config is read and panel_config/panels are created.
// Afterwards, the config parsing code creates the array of Button in panel_config and populates the configuration
// fields
// in the backend.
// Probably does nothing.
void default_button();
// Creates a new Button item with only the backend field set. The state is NOT initialized. The config is initialized to
// the default values.
// This will be used by the config code to populate its backedn config fields.
Button *create_button();
void destroy_button(void *obj);
// Called after the config is read and panel_config is populated, but before panels are created.
// Initializes the state of the backend items.
// panel_config.panel_items is used to determine which backend items are enabled. The others should be destroyed and
// removed from panel_config.button_list.
void init_button();
// Called after each on-screen panel is created, with a pointer to the panel.
// Initializes the state of the frontend items. Also adds a pointer to it in backend->instances.
// At this point the Area has not been added yet to the GUI tree, but it will be added right away.
void init_button_panel(void *panel);
// Called just before the panels are destroyed. Afterwards, tint2 exits or restarts and reads the config again.
// Releases all frontends and then all the backends.
// The frontend items are not freed by this function, only their members. The items are Areas which are freed in the
// GUI element tree cleanup function (remove_area).
void cleanup_button();
// Called on draw, obj = pointer to the front-end Button item.
void draw_button(void *obj, cairo_t *c);
// Called on resize, obj = pointer to the front-end Button item.
// Returns 1 if the new size is different than the previous size.
gboolean resize_button(void *obj);
// Called on mouse click event.
void button_action(void *obj, int button, int x, int y, Time time);
void button_default_font_changed();
void button_default_icon_theme_changed();
void button_reload_icon(Button *button);
#endif // BUTTON_H

View File

@@ -77,6 +77,9 @@ void default_clock()
time1_font_desc = NULL;
time2_has_font = FALSE;
time2_font_desc = NULL;
buf_time[0] = 0;
buf_date[0] = 0;
buf_tooltip[0] = 0;
}
void cleanup_clock()
@@ -111,31 +114,6 @@ void cleanup_clock()
clock_timeout = NULL;
}
void update_clocks_sec(void *arg)
{
gettimeofday(&time_clock, 0);
if (time1_format) {
for (int i = 0; i < num_panels; i++)
panels[i].clock.area.resize_needed = 1;
}
schedule_panel_redraw();
}
void update_clocks_min(void *arg)
{
// remember old_sec because after suspend/hibernate the clock should be updated directly, and not
// on next minute change
time_t old_sec = time_clock.tv_sec;
gettimeofday(&time_clock, 0);
if (time_clock.tv_sec % 60 == 0 || time_clock.tv_sec - old_sec > 60) {
if (time1_format) {
for (int i = 0; i < num_panels; i++)
panels[i].clock.area.resize_needed = 1;
}
schedule_panel_redraw();
}
}
struct tm *clock_gettime_for_tz(const char *timezone)
{
if (timezone) {
@@ -152,6 +130,46 @@ struct tm *clock_gettime_for_tz(const char *timezone)
}
}
void update_clocks()
{
if (time1_format)
strftime(buf_time, sizeof(buf_time), time1_format, clock_gettime_for_tz(time1_timezone));
if (time2_format)
strftime(buf_date, sizeof(buf_date), time2_format, clock_gettime_for_tz(time2_timezone));
if (time1_format || time2_format) {
for (int i = 0; i < num_panels; i++)
panels[i].clock.area.resize_needed = 1;
}
schedule_panel_redraw();
}
int ms_until_second_change(struct timeval* tm)
{
long us_until_change = 1000000 - tm->tv_usec;
// compute ms, rounding up so we don't ask to wait too short
int ms = (us_until_change+999)/1000;
return ms;
}
void update_clocks_sec(void *arg)
{
gettimeofday(&time_clock, 0);
clock_timeout = add_timeout(ms_until_second_change(&time_clock), 0, update_clocks_sec, 0, NULL);
update_clocks();
}
void update_clocks_min(void *arg)
{
// remember old_sec because after suspend/hibernate the clock should be updated directly, and not
// on next minute change
static time_t old_sec = 0;
gettimeofday(&time_clock, 0);
clock_timeout = add_timeout(ms_until_second_change(&time_clock), 0, update_clocks_min, 0, NULL);
if (time_clock.tv_sec % 60 == 0 || time_clock.tv_sec - old_sec > 60)
update_clocks();
old_sec = time_clock.tv_sec;
}
gboolean time_format_needs_sec_ticks(char *time_format)
{
if (!time_format)
@@ -170,14 +188,6 @@ void init_clock_panel(void *p)
Panel *panel = (Panel *)p;
Clock *clock = &panel->clock;
if (!clock_timeout) {
if (time_format_needs_sec_ticks(time1_format) || time_format_needs_sec_ticks(time2_format)) {
clock_timeout = add_timeout(10, 1000, update_clocks_sec, 0, &clock_timeout);
} else {
clock_timeout = add_timeout(10, 1000, update_clocks_min, 0, &clock_timeout);
}
}
if (!clock->area.bg)
clock->area.bg = &g_array_index(backgrounds, Background, 0);
clock_init_fonts();
@@ -205,6 +215,14 @@ void init_clock_panel(void *p)
clock->area._get_tooltip_text = clock_get_tooltip;
strftime(buf_tooltip, sizeof(buf_tooltip), time_tooltip_format, clock_gettime_for_tz(time_tooltip_timezone));
}
if (!clock_timeout) {
if (time_format_needs_sec_ticks(time1_format) || time_format_needs_sec_ticks(time2_format)) {
update_clocks_sec(NULL);
} else {
update_clocks_min(NULL);
}
}
}
void clock_init_fonts()
@@ -243,7 +261,7 @@ void clock_default_font_changed()
schedule_panel_redraw();
}
void clock_compute_text_geometry(Panel *panel,
void clock_compute_text_geometry(Clock *clock,
int *time_height_ink,
int *time_height,
int *time_width,
@@ -251,131 +269,53 @@ void clock_compute_text_geometry(Panel *panel,
int *date_height,
int *date_width)
{
*date_height = *date_width = 0;
strftime(buf_time, sizeof(buf_time), time1_format, clock_gettime_for_tz(time1_timezone));
get_text_size2(time1_font_desc,
area_compute_text_geometry(&clock->area,
buf_time,
time2_format ? buf_date : NULL,
time1_font_desc,
time2_font_desc,
time_height_ink,
time_height,
time_width,
panel->area.height,
panel->area.width,
buf_time,
strlen(buf_time),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
if (time2_format) {
strftime(buf_date, sizeof(buf_date), time2_format, clock_gettime_for_tz(time2_timezone));
get_text_size2(time2_font_desc,
date_height_ink,
date_height,
date_width,
panel->area.height,
panel->area.width,
buf_date,
strlen(buf_date),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
}
date_width);
}
int clock_compute_desired_size(void *obj)
{
Clock *clock = (Clock *)obj;
Panel *panel = (Panel *)clock->area.panel;
int time_height_ink, time_height, time_width, date_height_ink, date_height, date_width;
clock_compute_text_geometry(panel,
&time_height_ink,
&time_height,
&time_width,
&date_height_ink,
&date_height,
&date_width);
if (panel_horizontal) {
int new_size = (time_width > date_width) ? time_width : date_width;
new_size += 2 * clock->area.paddingxlr + left_right_border_width(&clock->area);
return new_size;
} else {
int new_size = time_height + date_height + 2 * clock->area.paddingxlr + top_bottom_border_width(&clock->area);
return new_size;
}
return text_area_compute_desired_size(&clock->area,
buf_time,
time2_format ? buf_date : NULL,
time1_font_desc,
time2_font_desc);
}
gboolean resize_clock(void *obj)
{
Clock *clock = (Clock *)obj;
Panel *panel = (Panel *)clock->area.panel;
gboolean result = FALSE;
schedule_redraw(&clock->area);
int time_height_ink, time_height, time_width, date_height_ink, date_height, date_width;
clock_compute_text_geometry(panel,
&time_height_ink,
&time_height,
&time_width,
&date_height_ink,
&date_height,
&date_width);
int new_size = clock_compute_desired_size(clock);
if (panel_horizontal) {
if (new_size > clock->area.width || new_size < (clock->area.width - 6)) {
// we try to limit the number of resizes
clock->area.width = new_size + 1;
clock->time1_posy = (clock->area.height - time_height) / 2;
if (time2_format) {
clock->time1_posy -= (date_height) / 2;
clock->time2_posy = clock->time1_posy + time_height;
}
result = TRUE;
}
} else {
if (new_size != clock->area.height) {
// we try to limit the number of resizes
clock->area.height = new_size;
clock->time1_posy = (clock->area.height - time_height) / 2;
if (time2_format) {
clock->time1_posy -= (date_height) / 2;
clock->time2_posy = clock->time1_posy + time_height;
}
result = TRUE;
}
}
return result;
return resize_text_area(&clock->area,
buf_time,
time2_format ? buf_date : NULL,
time1_font_desc,
time2_font_desc,
&clock->time1_posy,
&clock->time2_posy);
}
void draw_clock(void *obj, cairo_t *c)
{
Clock *clock = obj;
PangoLayout *layout = pango_cairo_create_layout(c);
pango_layout_set_font_description(layout, time1_font_desc);
pango_layout_set_width(layout, clock->area.width * PANGO_SCALE);
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
pango_layout_set_text(layout, buf_time, strlen(buf_time));
cairo_set_source_rgba(c, clock->font.rgb[0], clock->font.rgb[1], clock->font.rgb[2], clock->font.alpha);
pango_cairo_update_layout(c, layout);
draw_text(layout, c, 0, clock->time1_posy, &clock->font, ((Panel *)clock->area.panel)->font_shadow);
if (time2_format) {
pango_layout_set_font_description(layout, time2_font_desc);
pango_layout_set_indent(layout, 0);
pango_layout_set_text(layout, buf_date, strlen(buf_date));
pango_layout_set_width(layout, clock->area.width * PANGO_SCALE);
pango_cairo_update_layout(c, layout);
draw_text(layout, c, 0, clock->time2_posy, &clock->font, ((Panel *)clock->area.panel)->font_shadow);
}
g_object_unref(layout);
Clock *clock = (Clock *)obj;
draw_text_area(&clock->area,
c,
buf_time,
time2_format ? buf_date : NULL,
time1_font_desc,
time2_font_desc,
clock->time1_posy,
clock->time2_posy,
&clock->font);
}
void clock_dump_geometry(void *obj, int indent)
@@ -393,7 +333,7 @@ char *clock_get_tooltip(void *obj)
return strdup(buf_tooltip);
}
void clock_action(int button)
void clock_action(void *obj, int button, int x, int y, Time time)
{
char *command = NULL;
switch (button) {
@@ -413,5 +353,5 @@ void clock_action(int button)
command = clock_dwheel_command;
break;
}
tint_exec(command);
tint_exec(command, NULL, NULL, time, obj, x, y);
}

View File

@@ -54,6 +54,6 @@ void draw_clock(void *obj, cairo_t *c);
gboolean resize_clock(void *obj);
void clock_action(int button);
void clock_action(void *obj, int button, int x, int y, Time time);
#endif

View File

@@ -62,8 +62,8 @@
#endif
// global path
char *config_path;
char *snapshot_path;
char *config_path = NULL;
char *snapshot_path = NULL;
#ifndef TINT2CONF
@@ -135,7 +135,16 @@ int get_task_status(char *status)
int config_get_monitor(char *monitor)
{
if (strcmp(monitor, "all") != 0) {
if (strcmp(monitor, "primary") == 0) {
for (int i = 0; i < server.num_monitors; ++i) {
if (server.monitors[i].primary)
return i;
}
return 0;
}
if (strcmp(monitor, "all") == 0) {
return -1;
}
char *endptr;
int ret_int = strtol(monitor, &endptr, 10);
if (*endptr == 0)
@@ -154,8 +163,8 @@ int config_get_monitor(char *monitor)
}
}
}
}
// monitor == "all" or monitor not found or xrandr can't identify monitors
// monitor not found or xrandr can't identify monitors => all
return -1;
}
@@ -221,6 +230,15 @@ Execp *get_or_create_last_execp()
return (Execp *)g_list_last(panel_config.execp_list)->data;
}
Button *get_or_create_last_button()
{
if (!panel_config.button_list) {
fprintf(stderr, "Warning: button items should start with 'button = new'\n");
panel_config.button_list = g_list_append(panel_config.button_list, create_button());
}
return (Button *)g_list_last(panel_config.button_list)->data;
}
void add_entry(char *key, char *value)
{
char *value1 = 0, *value2 = 0, *value3 = 0;
@@ -372,8 +390,6 @@ void add_entry(char *key, char *value)
/* Panel */
else if (strcmp(key, "panel_monitor") == 0) {
panel_config.monitor = config_get_monitor(value);
} else if (strcmp(key, "primary_monitor_first") == 0) {
primary_monitor_first = atoi(value);
} else if (strcmp(key, "panel_shrink") == 0) {
panel_shrink = atoi(value);
} else if (strcmp(key, "panel_size") == 0) {
@@ -535,6 +551,11 @@ void add_entry(char *key, char *value)
#ifdef ENABLE_BATTERY
if (strlen(value) > 0)
battery_low_cmd = strdup(value);
#endif
} else if (strcmp(key, "battery_full_cmd") == 0) {
#ifdef ENABLE_BATTERY
if (strlen(value) > 0)
battery_full_cmd = strdup(value);
#endif
} else if (strcmp(key, "ac_connected_cmd") == 0) {
#ifdef ENABLE_BATTERY
@@ -555,6 +576,21 @@ void add_entry(char *key, char *value)
#ifdef ENABLE_BATTERY
bat2_font_desc = pango_font_description_from_string(value);
bat2_has_font = TRUE;
#endif
} else if (strcmp (key, "bat1_format") == 0) {
#ifdef ENABLE_BATTERY
if (strlen(value) > 0) {
free(bat1_format);
bat1_format = strdup(value);
battery_enabled = 1;
}
#endif
} else if (strcmp (key, "bat2_format") == 0) {
#ifdef ENABLE_BATTERY
if (strlen(value) > 0) {
free(bat2_format);
bat2_format = strdup(value);
}
#endif
} else if (strcmp(key, "battery_font_color") == 0) {
#ifdef ENABLE_BATTERY
@@ -643,8 +679,8 @@ void add_entry(char *key, char *value)
Execp *execp = get_or_create_last_execp();
execp->backend->interval = 0;
int v = atoi(value);
if (v < 1) {
fprintf(stderr, "execp_interval must be an integer >= 1\n");
if (v < 0) {
fprintf(stderr, "execp_interval must be an integer >= 0\n");
} else {
execp->backend->interval = v;
}
@@ -664,6 +700,7 @@ void add_entry(char *key, char *value)
Execp *execp = get_or_create_last_execp();
free_and_null(execp->backend->tooltip);
execp->backend->tooltip = strdup(value);
execp->backend->has_user_tooltip = TRUE;
} else if (strcmp(key, "execp_font") == 0) {
Execp *execp = get_or_create_last_execp();
pango_font_description_free(execp->backend->font_desc);
@@ -738,6 +775,82 @@ void add_entry(char *key, char *value)
execp->backend->dwheel_command = strdup(value);
}
/* Button */
else if (strcmp(key, "button") == 0) {
panel_config.button_list = g_list_append(panel_config.button_list, create_button());
} else if (strcmp(key, "button_icon") == 0 && strlen(value)) {
Button *button = get_or_create_last_button();
button->backend->icon_name = strdup(value);
} else if (strcmp(key, "button_text") == 0 && strlen(value)) {
Button *button = get_or_create_last_button();
free_and_null(button->backend->text);
button->backend->text = strdup(value);
} else if (strcmp(key, "button_tooltip") == 0 && strlen(value)) {
Button *button = get_or_create_last_button();
free_and_null(button->backend->tooltip);
button->backend->tooltip = strdup(value);
} else if (strcmp(key, "button_font") == 0) {
Button *button = get_or_create_last_button();
pango_font_description_free(button->backend->font_desc);
button->backend->font_desc = pango_font_description_from_string(value);
button->backend->has_font = TRUE;
} else if (strcmp(key, "button_font_color") == 0) {
Button *button = get_or_create_last_button();
extract_values(value, &value1, &value2, &value3);
get_color(value1, button->backend->font_color.rgb);
if (value2)
button->backend->font_color.alpha = atoi(value2) / 100.0;
else
button->backend->font_color.alpha = 0.5;
} else if (strcmp(key, "button_padding") == 0) {
Button *button = get_or_create_last_button();
extract_values(value, &value1, &value2, &value3);
button->backend->paddingxlr = button->backend->paddingx = atoi(value1);
if (value2)
button->backend->paddingy = atoi(value2);
else
button->backend->paddingy = 0;
if (value3)
button->backend->paddingx = atoi(value3);
} else if (strcmp(key, "button_max_icon_size") == 0) {
Button *button = get_or_create_last_button();
extract_values(value, &value1, &value2, &value3);
button->backend->max_icon_size = MAX(0, atoi(value));
} else if (strcmp(key, "button_background_id") == 0) {
Button *button = get_or_create_last_button();
int id = atoi(value);
id = (id < backgrounds->len && id >= 0) ? id : 0;
button->backend->bg = &g_array_index(backgrounds, Background, id);
} else if (strcmp(key, "button_centered") == 0) {
Button *button = get_or_create_last_button();
button->backend->centered = atoi(value);
} else if (strcmp(key, "button_lclick_command") == 0) {
Button *button = get_or_create_last_button();
free_and_null(button->backend->lclick_command);
if (strlen(value) > 0)
button->backend->lclick_command = strdup(value);
} else if (strcmp(key, "button_mclick_command") == 0) {
Button *button = get_or_create_last_button();
free_and_null(button->backend->mclick_command);
if (strlen(value) > 0)
button->backend->mclick_command = strdup(value);
} else if (strcmp(key, "button_rclick_command") == 0) {
Button *button = get_or_create_last_button();
free_and_null(button->backend->rclick_command);
if (strlen(value) > 0)
button->backend->rclick_command = strdup(value);
} else if (strcmp(key, "button_uwheel_command") == 0) {
Button *button = get_or_create_last_button();
free_and_null(button->backend->uwheel_command);
if (strlen(value) > 0)
button->backend->uwheel_command = strdup(value);
} else if (strcmp(key, "button_dwheel_command") == 0) {
Button *button = get_or_create_last_button();
free_and_null(button->backend->dwheel_command);
if (strlen(value) > 0)
button->backend->dwheel_command = strdup(value);
}
/* Clock */
else if (strcmp(key, "time1_format") == 0) {
if (!new_config_file) {
@@ -875,6 +988,8 @@ void add_entry(char *key, char *value)
hide_inactive_tasks = atoi(value);
} else if (strcmp(key, "taskbar_hide_different_monitor") == 0) {
hide_task_diff_monitor = atoi(value);
} else if (strcmp(key, "taskbar_hide_different_desktop") == 0) {
hide_task_diff_desktop = atoi(value);
} else if (strcmp(key, "taskbar_hide_if_empty") == 0) {
hide_taskbar_if_empty = atoi(value);
} else if (strcmp(key, "taskbar_always_show_all_desktop_tasks") == 0) {
@@ -1009,7 +1124,7 @@ void add_entry(char *key, char *value)
systray.saturation = atoi(value2);
systray.brightness = atoi(value3);
} else if (strcmp(key, "systray_monitor") == 0) {
systray_monitor = atoi(value) - 1;
systray_monitor = MAX(0, config_get_monitor(value));
} else if (strcmp(key, "systray_name_filter") == 0) {
if (systray_hide_name_filter)
free(systray_hide_name_filter);
@@ -1178,20 +1293,21 @@ void add_entry(char *key, char *value)
gboolean config_read_file(const char *path)
{
FILE *fp;
char line[512];
char *key, *value;
if ((fp = fopen(path, "r")) == NULL)
FILE *fp = fopen(path, "r");
if (!fp)
return FALSE;
while (fgets(line, sizeof(line), fp) != NULL) {
char *line = NULL;
size_t line_size = 0;
while (getline(&line, &line_size, fp) >= 0) {
char *key, *value;
if (parse_line(line, &key, &value)) {
add_entry(key, value);
free(key);
free(value);
}
}
free(line);
fclose(fp);
if (!read_panel_position) {
@@ -1246,7 +1362,8 @@ gboolean config_read_default_path()
// copy tint2rc from system directory to user directory
fprintf(stderr, "tint2 warning: could not find a config file! Creating a default one.\n");
// According to the XDG Base Directory Specification (https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.6.html)
// According to the XDG Base Directory Specification
// (https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.6.html)
// if the user's config directory does not exist, we should create it with permissions set to 0700.
if (!g_file_test(g_get_user_config_dir(), G_FILE_TEST_IS_DIR))
g_mkdir(g_get_user_config_dir(), 0700);

View File

@@ -18,6 +18,8 @@
#include "timer.h"
#include "common.h"
#define MAX_TOOLTIP_LEN 4096
void execp_timer_callback(void *arg);
char *execp_get_tooltip(void *obj);
void execp_init_fonts();
@@ -30,9 +32,10 @@ void default_execp()
Execp *create_execp()
{
Execp *execp = calloc(1, sizeof(Execp));
execp->backend = calloc(1, sizeof(ExecpBackend));
execp->backend->child_pipe = -1;
Execp *execp = (Execp *)calloc(1, sizeof(Execp));
execp->backend = (ExecpBackend *)calloc(1, sizeof(ExecpBackend));
execp->backend->child_pipe_stdout = -1;
execp->backend->child_pipe_stderr = -1;
execp->backend->cmd_pids = g_tree_new(cmp_ptr);
execp->backend->interval = 30;
execp->backend->cache_icon = TRUE;
@@ -45,10 +48,10 @@ gpointer create_execp_frontend(gconstpointer arg, gpointer data)
{
Execp *execp_backend = (Execp *)arg;
Execp *execp_frontend = calloc(1, sizeof(Execp));
Execp *execp_frontend = (Execp *)calloc(1, sizeof(Execp));
execp_frontend->backend = execp_backend->backend;
execp_backend->backend->instances = g_list_append(execp_backend->backend->instances, execp_frontend);
execp_frontend->frontend = calloc(1, sizeof(ExecpFrontend));
execp_frontend->frontend = (ExecpFrontend *)calloc(1, sizeof(ExecpFrontend));
return execp_frontend;
}
@@ -72,16 +75,20 @@ void destroy_execp(void *obj)
imlib_free_image();
execp->backend->icon = NULL;
}
free_and_null(execp->backend->buf_output);
free_and_null(execp->backend->buf_stdout);
free_and_null(execp->backend->text);
free_and_null(execp->backend->icon_path);
if (execp->backend->child) {
kill(-execp->backend->child, SIGHUP);
execp->backend->child = 0;
}
if (execp->backend->child_pipe >= 0) {
close(execp->backend->child_pipe);
execp->backend->child_pipe = -1;
if (execp->backend->child_pipe_stdout >= 0) {
close(execp->backend->child_pipe_stdout);
execp->backend->child_pipe_stdout = -1;
}
if (execp->backend->child_pipe_stderr >= 0) {
close(execp->backend->child_pipe_stderr);
execp->backend->child_pipe_stderr = -1;
}
if (execp->backend->cmd_pids) {
g_tree_destroy(execp->backend->cmd_pids);
@@ -138,8 +145,10 @@ void init_execp()
// Set missing config options
if (!execp->backend->bg)
execp->backend->bg = &g_array_index(backgrounds, Background, 0);
execp->backend->buf_capacity = 1024;
execp->backend->buf_output = calloc(execp->backend->buf_capacity, 1);
execp->backend->buf_stdout_capacity = 1024;
execp->backend->buf_stdout = calloc(execp->backend->buf_stdout_capacity, 1);
execp->backend->buf_stderr_capacity = 1024;
execp->backend->buf_stderr = calloc(execp->backend->buf_stderr_capacity, 1);
execp->backend->text = strdup("");
execp->backend->icon_path = NULL;
}
@@ -188,6 +197,8 @@ void init_execp_panel(void *p)
if (!execp->backend->timer)
execp->backend->timer = add_timeout(10, 0, execp_timer_callback, execp, &execp->backend->timer);
execp_update_post_read(execp);
}
}
@@ -290,156 +301,138 @@ gboolean reload_icon(Execp *execp)
return FALSE;
}
int execp_compute_desired_size(void *obj)
void execp_compute_icon_text_geometry(Execp *execp,
int *horiz_padding,
int *vert_padding,
int *interior_padding,
int *icon_w,
int *icon_h,
gboolean *text_next_line,
int *txt_height_ink,
int *txt_height,
int *txt_width,
int *new_size,
gboolean *resized)
{
Execp *execp = (Execp *)obj;
Panel *panel = (Panel *)execp->area.panel;
int horiz_padding = (panel_horizontal ? execp->area.paddingxlr : execp->area.paddingy);
int vert_padding = (panel_horizontal ? execp->area.paddingy : execp->area.paddingxlr);
int interior_padding = execp->area.paddingx;
Area *area = &execp->area;
*horiz_padding = (panel_horizontal ? area->paddingxlr : area->paddingy);
*vert_padding = (panel_horizontal ? area->paddingy : area->paddingxlr);
*interior_padding = area->paddingx;
int icon_w, icon_h;
if (reload_icon(execp)) {
if (execp->backend->icon) {
imlib_context_set_image(execp->backend->icon);
icon_w = imlib_image_get_width();
icon_h = imlib_image_get_height();
*icon_w = imlib_image_get_width();
*icon_h = imlib_image_get_height();
} else {
icon_w = icon_h = 0;
*icon_w = *icon_h = 0;
}
} else {
icon_w = icon_h = 0;
*icon_w = *icon_h = 0;
}
int text_next_line = !panel_horizontal && icon_w > execp->area.width / 2;
*text_next_line = !panel_horizontal && *icon_w > area->width / 2;
int available_w, available_h;
if (panel_horizontal) {
available_w = panel->area.width;
available_h = area->height - 2 * area->paddingy - left_right_border_width(area);
} else {
available_w = !text_next_line
? area->width - *icon_w - (*icon_w ? *interior_padding : 0) - 2 * *horiz_padding -
left_right_border_width(area)
: area->width - 2 * *horiz_padding - left_right_border_width(area);
available_h = panel->area.height;
}
get_text_size2(execp->backend->font_desc,
txt_height_ink,
txt_height,
txt_width,
available_h,
available_w,
execp->backend->text,
strlen(execp->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
execp->backend->has_markup);
*resized = FALSE;
if (panel_horizontal) {
*new_size = *txt_width;
if (*icon_w)
*new_size += *interior_padding + *icon_w;
*new_size += 2 * *horiz_padding + left_right_border_width(area);
if (*new_size > area->width || *new_size < (area->width - 6)) {
// we try to limit the number of resize
*new_size += 1;
*resized = TRUE;
}
} else {
if (!*text_next_line) {
*new_size = *txt_height + 2 * *vert_padding + top_bottom_border_width(area);
*new_size = MAX(*new_size, *icon_h + 2 * *vert_padding + top_bottom_border_width(area));
} else {
*new_size = *icon_h + *interior_padding + *txt_height + 2 * *vert_padding + top_bottom_border_width(area);
}
if (*new_size != area->height) {
*resized = TRUE;
}
}
}
int execp_compute_desired_size(void *obj)
{
Execp *execp = (Execp *)obj;
int horiz_padding, vert_padding, interior_padding;
int icon_w, icon_h;
gboolean text_next_line;
int txt_height_ink, txt_height, txt_width;
if (panel_horizontal) {
get_text_size2(execp->backend->font_desc,
&txt_height_ink,
&txt_height,
&txt_width,
panel->area.height,
panel->area.width,
execp->backend->text,
strlen(execp->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
execp->backend->has_markup);
} else {
get_text_size2(execp->backend->font_desc,
&txt_height_ink,
&txt_height,
&txt_width,
panel->area.height,
!text_next_line
? execp->area.width - icon_w - (icon_w ? interior_padding : 0) - 2 * horiz_padding -
left_right_border_width(&execp->area)
: execp->area.width - 2 * horiz_padding - left_right_border_width(&execp->area),
execp->backend->text,
strlen(execp->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
execp->backend->has_markup);
}
if (panel_horizontal) {
int new_size = txt_width;
if (icon_w)
new_size += interior_padding + icon_w;
new_size += 2 * horiz_padding + left_right_border_width(&execp->area);
return new_size;
} else {
int new_size;
if (!text_next_line) {
new_size = txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area);
new_size = MAX(new_size, icon_h + 2 * vert_padding + top_bottom_border_width(&execp->area));
} else {
new_size =
icon_h + interior_padding + txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area);
}
gboolean resized;
execp_compute_icon_text_geometry(execp,
&horiz_padding,
&vert_padding,
&interior_padding,
&icon_w,
&icon_h,
&text_next_line,
&txt_height_ink,
&txt_height,
&txt_width,
&new_size,
&resized);
return new_size;
}
}
gboolean resize_execp(void *obj)
{
Execp *execp = (Execp *)obj;
Panel *panel = (Panel *)execp->area.panel;
int horiz_padding = (panel_horizontal ? execp->area.paddingxlr : execp->area.paddingy);
int vert_padding = (panel_horizontal ? execp->area.paddingy : execp->area.paddingxlr);
int interior_padding = execp->area.paddingx;
int horiz_padding, vert_padding, interior_padding;
int icon_w, icon_h;
if (reload_icon(execp)) {
if (execp->backend->icon) {
imlib_context_set_image(execp->backend->icon);
icon_w = imlib_image_get_width();
icon_h = imlib_image_get_height();
} else {
icon_w = icon_h = 0;
}
} else {
icon_w = icon_h = 0;
}
int text_next_line = !panel_horizontal && icon_w > execp->area.width / 2;
gboolean text_next_line;
int txt_height_ink, txt_height, txt_width;
if (panel_horizontal) {
get_text_size2(execp->backend->font_desc,
&txt_height_ink,
&txt_height,
&txt_width,
panel->area.height,
panel->area.width,
execp->backend->text,
strlen(execp->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
execp->backend->has_markup);
} else {
get_text_size2(execp->backend->font_desc,
&txt_height_ink,
&txt_height,
&txt_width,
panel->area.height,
!text_next_line
? execp->area.width - icon_w - (icon_w ? interior_padding : 0) - 2 * horiz_padding -
left_right_border_width(&execp->area)
: execp->area.width - 2 * horiz_padding - left_right_border_width(&execp->area),
execp->backend->text,
strlen(execp->backend->text),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
execp->backend->has_markup);
}
gboolean result = FALSE;
if (panel_horizontal) {
int new_size = txt_width;
if (icon_w)
new_size += interior_padding + icon_w;
new_size += 2 * horiz_padding + left_right_border_width(&execp->area);
if (new_size > execp->area.width || new_size < (execp->area.width - 6)) {
// we try to limit the number of resize
execp->area.width = new_size + 1;
result = TRUE;
}
} else {
int new_size;
if (!text_next_line) {
new_size = txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area);
new_size = MAX(new_size, icon_h + 2 * vert_padding + top_bottom_border_width(&execp->area));
} else {
new_size =
icon_h + interior_padding + txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area);
}
if (new_size != execp->area.height) {
gboolean resized;
execp_compute_icon_text_geometry(execp,
&horiz_padding,
&vert_padding,
&interior_padding,
&icon_w,
&icon_h,
&text_next_line,
&txt_height_ink,
&txt_height,
&txt_width,
&new_size,
&resized);
if (panel_horizontal)
execp->area.width = new_size;
else
execp->area.height = new_size;
result = TRUE;
}
}
execp->frontend->textw = txt_width;
execp->frontend->texth = txt_height;
if (execp->backend->centered) {
@@ -479,13 +472,12 @@ gboolean resize_execp(void *obj)
}
schedule_redraw(&execp->area);
return result;
return resized;
}
void draw_execp(void *obj, cairo_t *c)
{
Execp *execp = obj;
Execp *execp = (Execp *)obj;
PangoLayout *layout = pango_cairo_create_layout(c);
if (execp->backend->has_icon && execp->backend->icon) {
@@ -518,7 +510,7 @@ void draw_execp(void *obj, cairo_t *c)
void execp_dump_geometry(void *obj, int indent)
{
Execp *execp = obj;
Execp *execp = (Execp *)obj;
if (execp->backend->has_icon && execp->backend->icon) {
Imlib_Image tmp = imlib_context_get_image();
@@ -547,7 +539,7 @@ void execp_dump_geometry(void *obj, int indent)
void execp_force_update(Execp *execp)
{
if (execp->backend->child_pipe > 0) {
if (execp->backend->child_pipe_stdout > 0) {
// Command currently running, nothing to do
} else {
if (execp->backend->timer)
@@ -557,9 +549,9 @@ void execp_force_update(Execp *execp)
}
}
void execp_action(void *obj, int button, int x, int y)
void execp_action(void *obj, int button, int x, int y, Time time)
{
Execp *execp = obj;
Execp *execp = (Execp *)obj;
char *command = NULL;
switch (button) {
case 1:
@@ -579,30 +571,17 @@ void execp_action(void *obj, int button, int x, int y)
break;
}
if (command) {
char *full_cmd = g_strdup_printf("export EXECP_X=%d;"
"export EXECP_Y=%d;"
"export EXECP_W=%d;"
"export EXECP_H=%d; %s",
x,
y,
execp->area.width,
execp->area.height,
command);
pid_t pid = fork();
if (pid < 0) {
fprintf(stderr, "Could not fork\n");
} else if (pid == 0) {
// Child process
// Allow children to exist after parent destruction
setsid();
// Run the command
execl("/bin/sh", "/bin/sh", "-c", full_cmd, NULL);
fprintf(stderr, "Failed to execlp %s\n", full_cmd);
exit(1);
}
// Parent process
setenvd("EXECP_X", x);
setenvd("EXECP_Y", y);
setenvd("EXECP_W", execp->area.width);
setenvd("EXECP_H", execp->area.height);
pid_t pid = tint_exec(command, NULL, NULL, time, obj, x, y);
unsetenv("EXECP_X");
unsetenv("EXECP_Y");
unsetenv("EXECP_W");
unsetenv("EXECP_H");
if (pid > 0)
g_tree_insert(execp->backend->cmd_pids, GINT_TO_POINTER(pid), GINT_TO_POINTER(1));
g_free(full_cmd);
} else {
execp_force_update(execp);
}
@@ -616,37 +595,54 @@ void execp_cmd_completed(Execp *execp, pid_t pid)
void execp_timer_callback(void *arg)
{
Execp *execp = arg;
Execp *execp = (Execp *)arg;
if (!execp->backend->command)
return;
// Still running!
if (execp->backend->child_pipe > 0)
if (execp->backend->child_pipe_stdout > 0)
return;
int pipe_fd[2];
if (pipe(pipe_fd)) {
int pipe_fd_stdout[2];
if (pipe(pipe_fd_stdout)) {
// TODO maybe write this in tooltip, but if this happens we're screwed anyways
fprintf(stderr, "Execp: Creating pipe failed!\n");
return;
}
fcntl(pipe_fd[0], F_SETFL, O_NONBLOCK | fcntl(pipe_fd[0], F_GETFL));
fcntl(pipe_fd_stdout[0], F_SETFL, O_NONBLOCK | fcntl(pipe_fd_stdout[0], F_GETFL));
int pipe_fd_stderr[2];
if (pipe(pipe_fd_stderr)) {
close(pipe_fd_stdout[1]);
close(pipe_fd_stdout[0]);
// TODO maybe write this in tooltip, but if this happens we're screwed anyways
fprintf(stderr, "Execp: Creating pipe failed!\n");
return;
}
fcntl(pipe_fd_stderr[0], F_SETFL, O_NONBLOCK | fcntl(pipe_fd_stderr[0], F_GETFL));
// Fork and run command, capturing stdout in pipe
pid_t child = fork();
if (child == -1) {
// TODO maybe write this in tooltip, but if this happens we're screwed anyways
fprintf(stderr, "Fork failed.\n");
close(pipe_fd[1]);
close(pipe_fd[0]);
close(pipe_fd_stdout[1]);
close(pipe_fd_stdout[0]);
close(pipe_fd_stderr[1]);
close(pipe_fd_stderr[0]);
return;
} else if (child == 0) {
fprintf(stderr, "Executing: %s\n", execp->backend->command);
// We are in the child
close(pipe_fd[0]);
dup2(pipe_fd[1], 1); // 1 is stdout
close(pipe_fd[1]);
close(pipe_fd_stdout[0]);
dup2(pipe_fd_stdout[1], 1); // 1 is stdout
close(pipe_fd_stdout[1]);
close(pipe_fd_stderr[0]);
dup2(pipe_fd_stderr[1], 2); // 2 is stderr
close(pipe_fd_stderr[1]);
setpgid(0, 0);
execl("/bin/sh", "/bin/sh", "-c", execp->backend->command, NULL);
// This should never happen!
@@ -654,39 +650,38 @@ void execp_timer_callback(void *arg)
fflush(stdout);
exit(0);
}
close(pipe_fd[1]);
close(pipe_fd_stdout[1]);
close(pipe_fd_stderr[1]);
execp->backend->child = child;
execp->backend->child_pipe = pipe_fd[0];
execp->backend->buf_length = 0;
execp->backend->buf_output[execp->backend->buf_length] = '\0';
execp->backend->child_pipe_stdout = pipe_fd_stdout[0];
execp->backend->child_pipe_stderr = pipe_fd_stderr[0];
execp->backend->buf_stdout_length = 0;
execp->backend->buf_stdout[execp->backend->buf_stdout_length] = '\0';
execp->backend->buf_stderr_length = 0;
execp->backend->buf_stderr[execp->backend->buf_stderr_length] = '\0';
execp->backend->last_update_start_time = time(NULL);
}
gboolean read_execp(void *obj)
void read_from_pipe(int fd, char **buffer, ssize_t *buffer_length, ssize_t *buffer_capacity, gboolean *eof)
{
Execp *execp = (Execp *)obj;
if (execp->backend->child_pipe < 0)
return FALSE;
gboolean command_finished = FALSE;
*eof = FALSE;
while (1) {
// Make sure there is free space in the buffer
if (execp->backend->buf_capacity - execp->backend->buf_length < 1024) {
execp->backend->buf_capacity *= 2;
execp->backend->buf_output = realloc(execp->backend->buf_output, execp->backend->buf_capacity);
if (*buffer_capacity - *buffer_length < 1024) {
*buffer_capacity *= 2;
*buffer = (char *)realloc(*buffer, *buffer_capacity);
}
ssize_t count = read(execp->backend->child_pipe,
execp->backend->buf_output + execp->backend->buf_length,
execp->backend->buf_capacity - execp->backend->buf_length - 1);
ssize_t count = read(fd,
*buffer + *buffer_length,
*buffer_capacity - *buffer_length - 1);
if (count > 0) {
// Successful read
execp->backend->buf_length += count;
execp->backend->buf_output[execp->backend->buf_length] = '\0';
*buffer_length += count;
(*buffer)[*buffer_length] = '\0';
continue;
} else if (count == 0) {
// End of file
command_finished = TRUE;
*eof = TRUE;
break;
} else if (errno == EAGAIN || errno == EWOULDBLOCK) {
// No more data available at the moment
@@ -696,28 +691,87 @@ gboolean read_execp(void *obj)
continue;
} else {
// Error
command_finished = TRUE;
*eof = TRUE;
break;
}
break;
}
}
gboolean starts_with(char *s, char *prefix)
{
char *p, *q;
for (p = s, q = prefix; *p && *q; p++, q++) {
if (*p != *q)
return FALSE;
}
return *q == '\0';
}
char *last_substring(char *s, char *sub)
{
char *result = NULL;
for (char *p = s; *p; p++) {
if (starts_with(p, sub))
result = p;
}
return result;
}
void rstrip(char *s)
{
size_t len = strlen(s);
while (len > 0) {
if (s[len-1] == ' ' || s[len-1] == '\n') {
s[len-1] = 0;
len--;
} else {
break;
}
}
}
gboolean read_execp(void *obj)
{
Execp *execp = (Execp *)obj;
if (execp->backend->child_pipe_stdout < 0)
return FALSE;
gboolean stdout_eof, stderr_eof;
read_from_pipe(execp->backend->child_pipe_stdout,
&execp->backend->buf_stdout,
&execp->backend->buf_stdout_length,
&execp->backend->buf_stdout_capacity,
&stdout_eof);
read_from_pipe(execp->backend->child_pipe_stderr,
&execp->backend->buf_stderr,
&execp->backend->buf_stderr_length,
&execp->backend->buf_stderr_capacity,
&stderr_eof);
gboolean command_finished = stdout_eof && stderr_eof;
if (command_finished) {
execp->backend->child = 0;
close(execp->backend->child_pipe);
execp->backend->child_pipe = -1;
close(execp->backend->child_pipe_stdout);
execp->backend->child_pipe_stdout = -1;
close(execp->backend->child_pipe_stderr);
execp->backend->child_pipe_stderr = -1;
if (execp->backend->interval)
execp->backend->timer =
add_timeout(execp->backend->interval * 1000, 0, execp_timer_callback, execp, &execp->backend->timer);
}
char *ansi_clear_screen = (char*)"\x1b[2J";
if (!execp->backend->continuous && command_finished) {
// Handle stdout
free_and_null(execp->backend->text);
free_and_null(execp->backend->icon_path);
if (!execp->backend->has_icon) {
execp->backend->text = strdup(execp->backend->buf_output);
execp->backend->text = strdup(execp->backend->buf_stdout);
} else {
char *text = strchr(execp->backend->buf_output, '\n');
char *text = strchr(execp->backend->buf_stdout, '\n');
if (text) {
*text = '\0';
text++;
@@ -725,41 +779,75 @@ gboolean read_execp(void *obj)
} else {
execp->backend->text = strdup("");
}
execp->backend->icon_path = strdup(execp->backend->buf_output);
execp->backend->icon_path = strdup(execp->backend->buf_stdout);
}
int len = strlen(execp->backend->text);
if (len > 0 && execp->backend->text[len - 1] == '\n')
execp->backend->text[len - 1] = '\0';
execp->backend->buf_length = 0;
execp->backend->buf_output[execp->backend->buf_length] = '\0';
execp->backend->buf_stdout_length = 0;
execp->backend->buf_stdout[execp->backend->buf_stdout_length] = '\0';
// Handle stderr
if (!execp->backend->has_user_tooltip) {
free_and_null(execp->backend->tooltip);
char *start = last_substring(execp->backend->buf_stderr, ansi_clear_screen);
if (start)
start += strlen(ansi_clear_screen);
else
start = execp->backend->buf_stderr;
if (*start) {
execp->backend->tooltip = strdup(start);
rstrip(execp->backend->tooltip);
if (strlen(execp->backend->tooltip) > MAX_TOOLTIP_LEN)
execp->backend->tooltip[MAX_TOOLTIP_LEN] = '\0';
}
}
execp->backend->buf_stderr_length = 0;
execp->backend->buf_stderr[execp->backend->buf_stderr_length] = '\0';
//
execp->backend->last_update_finish_time = time(NULL);
execp->backend->last_update_duration =
execp->backend->last_update_finish_time - execp->backend->last_update_start_time;
return TRUE;
} else if (execp->backend->continuous > 0) {
// Handle stderr
if (!execp->backend->has_user_tooltip) {
free_and_null(execp->backend->tooltip);
char *start = last_substring(execp->backend->buf_stderr, ansi_clear_screen);
if (start) {
start += strlen(ansi_clear_screen);
memmove(execp->backend->buf_stderr, start, strlen(start) + 1);
execp->backend->buf_stderr_length = (ssize_t)strlen(execp->backend->buf_stderr);
}
if (execp->backend->buf_stderr_length > MAX_TOOLTIP_LEN) {
execp->backend->buf_stderr_length = MAX_TOOLTIP_LEN;
execp->backend->buf_stderr[execp->backend->buf_stderr_length] = '\0';
}
execp->backend->tooltip = strdup(execp->backend->buf_stderr);
rstrip(execp->backend->tooltip);
} else {
execp->backend->buf_stderr_length = 0;
execp->backend->buf_stderr[execp->backend->buf_stderr_length] = '\0';
}
// Handle stdout
// Count lines in buffer
int num_lines = 0;
char *last = execp->backend->buf_output;
char *end = NULL;
for (char *c = execp->backend->buf_output; *c; c++) {
for (char *c = execp->backend->buf_stdout; *c; c++) {
if (*c == '\n') {
num_lines++;
if (num_lines == execp->backend->continuous)
end = c;
}
last = c;
}
if (*last && *last != '\n')
num_lines++;
if (num_lines >= execp->backend->continuous) {
if (end)
*end = '\0';
free_and_null(execp->backend->text);
free_and_null(execp->backend->icon_path);
if (!execp->backend->has_icon) {
execp->backend->text = strdup(execp->backend->buf_output);
execp->backend->text = strdup(execp->backend->buf_stdout);
} else {
char *text = strchr(execp->backend->buf_output, '\n');
char *text = strchr(execp->backend->buf_stdout, '\n');
if (text) {
*text = '\0';
text++;
@@ -767,23 +855,23 @@ gboolean read_execp(void *obj)
} else {
execp->backend->text = strdup("");
}
execp->backend->icon_path = strdup(execp->backend->buf_output);
execp->backend->icon_path = strdup(execp->backend->buf_stdout);
}
int len = strlen(execp->backend->text);
size_t len = strlen(execp->backend->text);
if (len > 0 && execp->backend->text[len - 1] == '\n')
execp->backend->text[len - 1] = '\0';
if (end) {
char *next = end + 1;
int copied = next - execp->backend->buf_output;
int remaining = execp->backend->buf_length - copied;
ssize_t copied = next - execp->backend->buf_stdout;
ssize_t remaining = execp->backend->buf_stdout_length - copied;
if (remaining > 0) {
memmove(execp->backend->buf_output, next, remaining);
execp->backend->buf_length = remaining;
execp->backend->buf_output[execp->backend->buf_length] = '\0';
memmove(execp->backend->buf_stdout, next, (size_t)remaining);
execp->backend->buf_stdout_length = remaining;
execp->backend->buf_stdout[execp->backend->buf_stdout_length] = '\0';
} else {
execp->backend->buf_length = 0;
execp->backend->buf_output[execp->backend->buf_length] = '\0';
execp->backend->buf_stdout_length = 0;
execp->backend->buf_stdout[execp->backend->buf_stdout_length] = '\0';
}
}
@@ -818,7 +906,7 @@ const char *time_to_string(int seconds, char *buffer)
char *execp_get_tooltip(void *obj)
{
Execp *execp = obj;
Execp *execp = (Execp *)obj;
if (execp->backend->tooltip) {
if (strlen(execp->backend->tooltip) > 0)
@@ -832,7 +920,7 @@ char *execp_get_tooltip(void *obj)
char tmp_buf1[256];
char tmp_buf2[256];
char tmp_buf3[256];
if (execp->backend->child_pipe < 0) {
if (execp->backend->child_pipe_stdout < 0) {
// Not executing command
if (execp->backend->last_update_finish_time) {
// We updated at least once
@@ -870,3 +958,30 @@ char *execp_get_tooltip(void *obj)
}
return strdup(execp->backend->tooltip_text);
}
void execp_update_post_read(Execp *execp)
{
int icon_h, icon_w;
if (reload_icon(execp)) {
if (execp->backend->icon) {
imlib_context_set_image(execp->backend->icon);
icon_w = imlib_image_get_width();
icon_h = imlib_image_get_height();
} else {
icon_w = icon_h = 0;
}
} else {
icon_w = icon_h = 0;
}
if ((icon_h == 0 || icon_w == 0) && execp->backend->text[0] == 0) {
// Easy to test with bash -c 'R=$(( RANDOM % 2 )); [ $R -eq 0 ] && echo HELLO $R'
if (execp->area.on_screen)
hide(&execp->area);
} else {
if (!execp->area.on_screen)
show(&execp->area);
execp->area.resize_needed = TRUE;
schedule_panel_redraw();
}
}

View File

@@ -27,6 +27,7 @@ typedef struct ExecpBackend {
gboolean cache_icon;
int icon_w;
int icon_h;
gboolean has_user_tooltip;
char *tooltip;
gboolean centered;
gboolean has_font;
@@ -46,20 +47,24 @@ typedef struct ExecpBackend {
// Backend state:
timeout *timer;
int child_pipe;
int child_pipe_stdout;
int child_pipe_stderr;
pid_t child;
// Command output buffer
char *buf_output;
int buf_length;
int buf_capacity;
char *buf_stdout;
ssize_t buf_stdout_length;
ssize_t buf_stdout_capacity;
char *buf_stderr;
ssize_t buf_stderr_length;
ssize_t buf_stderr_capacity;
// Text extracted from the output buffer
char *text;
// Icon path extracted from the output buffer
char *icon_path;
Imlib_Image icon;
char tooltip_text[512];
gchar tooltip_text[512];
// The time the last command was started
time_t last_update_start_time;
@@ -129,7 +134,7 @@ void draw_execp(void *obj, cairo_t *c);
gboolean resize_execp(void *obj);
// Called on mouse click event.
void execp_action(void *obj, int button, int x, int y);
void execp_action(void *obj, int button, int x, int y, Time time);
void execp_cmd_completed(Execp *obj, pid_t pid);
@@ -138,6 +143,9 @@ void execp_cmd_completed(Execp *obj, pid_t pid);
// Returns 1 if the output has been updated and a redraw is needed.
gboolean read_execp(void *obj);
// Called for Execp front elements when the command output has changed.
void execp_update_post_read(Execp *execp);
void execp_default_font_changed();
#endif // EXECPLUGIN_H

View File

@@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
static gint compare_strings(gconstpointer a, gconstpointer b)
{

View File

@@ -740,7 +740,7 @@ void add_icon_path_to_cache(IconThemeWrapper *wrapper, const char *icon_name, in
g_free(key);
}
char *get_icon_path(IconThemeWrapper *wrapper, const char *icon_name, int size)
char *get_icon_path(IconThemeWrapper *wrapper, const char *icon_name, int size, gboolean use_fallbacks)
{
if (!wrapper)
return NULL;
@@ -761,6 +761,8 @@ char *get_icon_path(IconThemeWrapper *wrapper, const char *icon_name, int size)
return path;
}
if (!use_fallbacks)
goto notfound;
fprintf(stderr, YELLOW "Icon not found in default theme: %s" RESET "\n", icon_name);
load_fallbacks(wrapper);

View File

@@ -51,7 +51,7 @@ void free_icon_theme(IconTheme *theme);
// Returns the full path to an icon file (or NULL) given the list of icon themes to search and the icon name
// Note: needs to be released with free().
char *get_icon_path(IconThemeWrapper *wrapper, const char *icon_name, int size);
char *get_icon_path(IconThemeWrapper *wrapper, const char *icon_name, int size, gboolean use_fallbacks);
// Returns a list of the directories used to store icons.
// Do not free the result, it is cached.

View File

@@ -50,10 +50,11 @@ int launcher_brightness;
char *icon_theme_name_config;
char *icon_theme_name_xsettings;
int launcher_icon_theme_override;
int startup_notifications;
Background *launcher_icon_bg;
GList *launcher_icon_gradients;
IconThemeWrapper *icon_theme_wrapper;
Imlib_Image scale_icon(Imlib_Image original, int icon_size);
void free_icon(Imlib_Image icon);
void launcher_icon_dump_geometry(void *obj, int indent);
@@ -114,10 +115,16 @@ void init_launcher_panel(void *p)
schedule_panel_redraw();
instantiate_area_gradients(&launcher->area);
launcher_load_themes(launcher);
load_icon_themes();
launcher_load_icons(launcher);
}
void free_icon_themes()
{
free_themes(icon_theme_wrapper);
icon_theme_wrapper = NULL;
}
void cleanup_launcher()
{
for (int i = 0; i < num_panels; i++) {
@@ -160,9 +167,6 @@ void cleanup_launcher_theme(Launcher *launcher)
}
g_slist_free(launcher->list_icons);
launcher->list_icons = NULL;
free_themes(launcher->icon_theme_wrapper);
launcher->icon_theme_wrapper = NULL;
}
int launcher_compute_icon_size(Launcher *launcher)
@@ -246,7 +250,7 @@ gboolean resize_launcher(void *obj)
launcher_reload_icon_image(launcher, launcherIcon);
}
}
save_icon_cache(launcher->icon_theme_wrapper);
save_icon_cache(icon_theme_wrapper);
int count = 0;
gboolean needs_repositioning = FALSE;
@@ -411,67 +415,14 @@ void free_icon(Imlib_Image icon)
}
}
void launcher_action(LauncherIcon *icon, XEvent *evt)
void launcher_action(LauncherIcon *icon, XEvent *evt, int x, int y)
{
launcher_reload_icon((Launcher *)icon->area.parent, icon);
launcher_reload_hidden_icons((Launcher *)icon->area.parent);
char *cmd = calloc(strlen(icon->cmd) + 10, 1);
sprintf(cmd, "(%s&)", icon->cmd);
#if HAVE_SN
SnLauncherContext *ctx = 0;
Time time;
if (startup_notifications) {
ctx = sn_launcher_context_new(server.sn_display, server.screen);
sn_launcher_context_set_name(ctx, icon->icon_tooltip);
sn_launcher_context_set_description(ctx, "Application launched from tint2");
sn_launcher_context_set_binary_name(ctx, icon->cmd);
// Get a timestamp from the X event
if (evt->type == ButtonPress || evt->type == ButtonRelease) {
time = evt->xbutton.time;
} else {
fprintf(stderr, "Unknown X event: %d\n", evt->type);
free(cmd);
return;
}
sn_launcher_context_initiate(ctx, "tint2", icon->cmd, time);
}
#endif /* HAVE_SN */
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "Could not fork\n");
} else if (pid == 0) {
// Child process
#if HAVE_SN
if (startup_notifications) {
sn_launcher_context_setup_child_process(ctx);
}
#endif // HAVE_SN
// Allow children to exist after parent destruction
setsid();
// Run the command
if (icon->cwd)
chdir(icon->cwd);
execl("/bin/sh", "/bin/sh", "-c", icon->cmd, NULL);
fprintf(stderr, "Failed to execlp %s\n", icon->cmd);
#if HAVE_SN
if (startup_notifications) {
sn_launcher_context_unref(ctx);
}
#endif // HAVE_SN
exit(1);
} else {
// Parent process
#if HAVE_SN
if (startup_notifications) {
g_tree_insert(server.pids, GINT_TO_POINTER(pid), ctx);
}
#endif // HAVE_SN
}
free(cmd);
}
if (evt->type == ButtonPress || evt->type == ButtonRelease)
tint_exec(icon->cmd, icon->cwd, icon->icon_tooltip, evt->xbutton.time, &icon->area, x, y);
}
// Populates the list_icons list from the list_apps list
void launcher_load_icons(Launcher *launcher)
@@ -565,15 +516,15 @@ void launcher_reload_icon_image(Launcher *launcher, LauncherIcon *launcherIcon)
free_icon(launcherIcon->image_pressed);
launcherIcon->image = NULL;
char *new_icon_path = get_icon_path(launcher->icon_theme_wrapper, launcherIcon->icon_name, launcherIcon->icon_size);
char *new_icon_path = get_icon_path(icon_theme_wrapper, launcherIcon->icon_name, launcherIcon->icon_size, TRUE);
if (new_icon_path)
launcherIcon->image = load_image(new_icon_path, 1);
launcherIcon->image = load_image(new_icon_path, TRUE);
// On loading error, fallback to default
if (!launcherIcon->image) {
free(new_icon_path);
new_icon_path = get_icon_path(launcher->icon_theme_wrapper, DEFAULT_ICON, launcherIcon->icon_size);
new_icon_path = get_icon_path(icon_theme_wrapper, DEFAULT_ICON, launcherIcon->icon_size, TRUE);
if (new_icon_path)
launcherIcon->image = imlib_load_image_immediately(new_icon_path);
launcherIcon->image = load_image(new_icon_path, TRUE);
}
Imlib_Image original = launcherIcon->image;
launcherIcon->image = scale_icon(launcherIcon->image, launcherIcon->icon_size);
@@ -595,10 +546,11 @@ void launcher_reload_icon_image(Launcher *launcher, LauncherIcon *launcherIcon)
schedule_redraw(&launcherIcon->area);
}
// Populates the icon_theme_wrapper list
void launcher_load_themes(Launcher *launcher)
void load_icon_themes()
{
launcher->icon_theme_wrapper =
if (icon_theme_wrapper)
return;
icon_theme_wrapper =
load_themes(launcher_icon_theme_override
? (icon_theme_name_config ? icon_theme_name_config
: icon_theme_name_xsettings ? icon_theme_name_xsettings : "hicolor")
@@ -608,14 +560,9 @@ void launcher_load_themes(Launcher *launcher)
void launcher_default_icon_theme_changed()
{
if (!launcher_enabled)
return;
if (launcher_icon_theme_override && icon_theme_name_config)
return;
for (int i = 0; i < num_panels; i++) {
Launcher *launcher = &panels[i].launcher;
cleanup_launcher_theme(launcher);
launcher_load_themes(launcher);
launcher_load_icons(launcher);
launcher->area.resize_needed = 1;
}

View File

@@ -12,12 +12,15 @@
#include "xsettings-client.h"
#include "icon-theme-common.h"
extern IconThemeWrapper *icon_theme_wrapper;
void load_icon_themes();
void free_icon_themes();
typedef struct Launcher {
// always start with area
Area area;
GSList *list_apps; // List of char*, each is a path to a app.desktop file
GSList *list_icons; // List of LauncherIcon*
IconThemeWrapper *icon_theme_wrapper;
int icon_size;
} Launcher;
@@ -46,7 +49,6 @@ extern int launcher_brightness;
extern char *icon_theme_name_xsettings; // theme name
extern char *icon_theme_name_config;
extern int launcher_icon_theme_override;
extern int startup_notifications;
extern Background *launcher_icon_bg;
extern GList *launcher_icon_gradients;
@@ -65,9 +67,7 @@ void launcher_default_icon_theme_changed();
// Populates the list_icons list
void launcher_load_icons(Launcher *launcher);
// Populates the list_themes list
void launcher_load_themes(Launcher *launcher);
void launcher_action(LauncherIcon *icon, XEvent *e);
void launcher_action(LauncherIcon *icon, XEvent *e, int x, int y);
void test_launcher_read_desktop_file();
void test_launcher_read_theme_file();

View File

@@ -57,6 +57,7 @@ gboolean task_dragged;
char *panel_window_name = NULL;
gboolean debug_geometry;
gboolean debug_gradients;
gboolean startup_notifications;
gboolean panel_autohide;
int panel_autohide_show_timeout;
@@ -180,6 +181,8 @@ void init_panel()
fprintf(stderr, "panel items: %s\n", panel_items_order);
icon_theme_wrapper = NULL;
init_tooltip();
init_systray();
init_launcher();
@@ -190,6 +193,7 @@ void init_panel()
init_taskbar();
init_separator();
init_execp();
init_button();
// number of panels (one monitor or 'all' monitors)
if (panel_config.monitor >= 0)
@@ -247,6 +251,8 @@ void init_panel()
init_separator_panel(p);
if (panel_items_order[k] == 'E')
init_execp_panel(p);
if (panel_items_order[k] == 'P')
init_button_panel(p);
}
set_panel_items_order(p);
@@ -603,6 +609,7 @@ void set_panel_items_order(Panel *p)
int i_execp = 0;
int i_separator = 0;
int i_freespace = 0;
int i_button = 0;
for (int k = 0; k < strlen(panel_items_order); k++) {
if (panel_items_order[k] == 'L') {
p->area.children = g_list_append(p->area.children, &p->launcher);
@@ -640,6 +647,12 @@ void set_panel_items_order(Panel *p)
if (item)
p->area.children = g_list_append(p->area.children, (Area *)item->data);
}
if (panel_items_order[k] == 'P') {
GList *item = g_list_nth(p->button_list, i_button);
i_button++;
if (item)
p->area.children = g_list_append(p->area.children, (Area *)item->data);
}
}
initialize_positions(&p->area, 0);
}
@@ -708,6 +721,14 @@ void set_panel_window_geometry(Panel *panel)
if (!panel->is_hidden) {
if (panel_horizontal) {
if (panel_position & TOP)
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx,
panel->posy,
panel->area.width,
panel->area.height);
else
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx,
@@ -715,6 +736,14 @@ void set_panel_window_geometry(Panel *panel)
panel->area.width,
panel->area.height);
} else {
if (panel_position & LEFT)
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx,
panel->posy,
panel->area.width,
panel->area.height);
else
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx,
@@ -725,6 +754,14 @@ void set_panel_window_geometry(Panel *panel)
} else {
int diff = (panel_horizontal ? panel->area.height : panel->area.width) - panel_autohide_height;
if (panel_horizontal) {
if (panel_position & TOP)
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx,
panel->posy,
panel->hidden_width,
panel->hidden_height);
else
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx,
@@ -732,6 +769,14 @@ void set_panel_window_geometry(Panel *panel)
panel->hidden_width,
panel->hidden_height);
} else {
if (panel_position & LEFT)
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx,
panel->posy,
panel->hidden_width,
panel->hidden_height);
else
XMoveResizeWindow(server.display,
panel->main_win,
panel->posx + diff,
@@ -954,6 +999,16 @@ Execp *click_execp(Panel *panel, int x, int y)
return NULL;
}
Button *click_button(Panel *panel, int x, int y)
{
for (GList *l = panel->button_list; l; l = l->next) {
Button *button = (Button *)l->data;
if (area_is_under_mouse(button, x, y))
return button;
}
return NULL;
}
void stop_autohide_timeout(Panel *p)
{
stop_timeout(p->autohide_timeout);
@@ -1029,6 +1084,7 @@ void shrink_panel(Panel *panel)
systray.area.resize_needed = TRUE;
schedule_redraw(&systray.area);
refresh_systray = TRUE;
update_minimized_icon_positions(panel);
}
}
@@ -1050,7 +1106,16 @@ const char *get_default_font()
void default_icon_theme_changed()
{
if (!launcher_enabled && !panel_config.button_list)
return;
if (launcher_icon_theme_override && icon_theme_name_config)
return;
free_icon_themes();
load_icon_themes();
launcher_default_icon_theme_changed();
button_default_icon_theme_changed();
}
void default_font_changed()
@@ -1060,6 +1125,7 @@ void default_font_changed()
#endif
clock_default_font_changed();
execp_default_font_changed();
button_default_font_changed();
taskbar_default_font_changed();
taskbarname_default_font_changed();
tooltip_default_font_changed();

View File

@@ -23,6 +23,7 @@
#include "freespace.h"
#include "execplugin.h"
#include "separator.h"
#include "button.h"
#ifdef ENABLE_BATTERY
#include "battery.h"
@@ -89,6 +90,7 @@ extern Imlib_Image default_icon;
#define DEFAULT_FONT "sans 10"
extern char *default_font;
extern XSettingsClient *xsettings_client;
extern gboolean startup_notifications;
extern gboolean debug_geometry;
extern gboolean debug_fps;
extern gboolean debug_frames;
@@ -135,6 +137,7 @@ typedef struct Panel {
GList *freespace_list;
GList *separator_list;
GList *execp_list;
GList *button_list;
// Autohide
gboolean is_hidden;
@@ -189,6 +192,7 @@ Battery *click_battery(Panel *panel, int x, int y);
Area *click_area(Panel *panel, int x, int y);
Execp *click_execp(Panel *panel, int x, int y);
Button *click_button(Panel *panel, int x, int y);
void autohide_show(void *p);
void autohide_hide(void *p);
@@ -200,4 +204,7 @@ const char *get_default_font();
void default_icon_theme_changed();
void default_font_changed();
void free_icon(Imlib_Image icon);
Imlib_Image scale_icon(Imlib_Image original, int icon_size);
#endif

View File

@@ -7,11 +7,7 @@
#include "common.h"
#include "area.h"
typedef enum SeparatorStyle {
SEPARATOR_EMPTY = 0,
SEPARATOR_LINE,
SEPARATOR_DOTS
} SeparatorStyle;
typedef enum SeparatorStyle { SEPARATOR_EMPTY = 0, SEPARATOR_LINE, SEPARATOR_DOTS } SeparatorStyle;
typedef struct Separator {
Area area;

View File

@@ -31,8 +31,6 @@
Server server;
gboolean primary_monitor_first = FALSE;
void server_catch_error(Display *d, XErrorEvent *ev)
{
}
@@ -268,13 +266,6 @@ int compare_monitor_pos(const void *monitor1, const void *monitor2)
const Monitor *m1 = (const Monitor *)monitor1;
const Monitor *m2 = (const Monitor *)monitor2;
if (primary_monitor_first) {
if (m1->primary && !m2->primary)
return -1;
if (!m1->primary && m2->primary)
return 1;
}
if (m1->x < m2->x) {
return -1;
} else if (m1->x > m2->x) {

View File

@@ -142,8 +142,8 @@ void init_systray_panel(void *p)
void systray_compute_geometry(int *size)
{
systray.icon_size = panel_horizontal ? systray.area.height : systray.area.width;
systray.icon_size -= MAX(left_right_border_width(&systray.area), top_bottom_border_width(&systray.area)) +
2 * systray.area.paddingy;
systray.icon_size -=
MAX(left_right_border_width(&systray.area), top_bottom_border_width(&systray.area)) + 2 * systray.area.paddingy;
if (systray_max_icon_size > 0)
systray.icon_size = MIN(systray.icon_size, systray_max_icon_size);
@@ -160,8 +160,7 @@ void systray_compute_geometry(int *size)
height - (systray.icons_per_column - 1) * (systray.icon_size + systray.area.paddingx) - systray.icon_size;
systray.icons_per_row = count / systray.icons_per_column + (count % systray.icons_per_column != 0);
*size = left_right_border_width(&systray.area) + 2 * systray.area.paddingxlr +
(systray.icon_size * systray.icons_per_row) +
((systray.icons_per_row - 1) * systray.area.paddingx);
(systray.icon_size * systray.icons_per_row) + ((systray.icons_per_row - 1) * systray.area.paddingx);
} else {
int width = systray.area.width - left_right_border_width(&systray.area) - 2 * systray.area.paddingy;
// here icons_per_row always higher than 0
@@ -253,10 +252,7 @@ void systray_dump_geometry(void *obj, int indent)
{
Systray *tray = (Systray *)obj;
fprintf(stderr,
"%*sIcons:\n",
indent,
"");
fprintf(stderr, "%*sIcons:\n", indent, "");
indent += 2;
for (GSList *l = tray->list_icons; l; l = l->next) {
TrayWindow *traywin = (TrayWindow *)l->data;
@@ -1491,7 +1487,6 @@ void systray_render_icon(void *t)
traywin->win,
traywin->name);
if (systray_composited) {
XSync(server.display, False);
error = FALSE;

View File

@@ -158,6 +158,29 @@ Task *add_task(Window win)
return (Task *)g_ptr_array_index(task_buttons, 0);
}
void task_remove_icon(Task *task)
{
if (!task)
return;
for (int k = 0; k < TASK_STATE_COUNT; ++k) {
if (task->icon[k]) {
imlib_context_set_image(task->icon[k]);
imlib_free_image();
task->icon[k] = 0;
}
if (task->icon_hover[k]) {
imlib_context_set_image(task->icon_hover[k]);
imlib_free_image();
task->icon_hover[k] = 0;
}
if (task->icon_press[k]) {
imlib_context_set_image(task->icon_press[k]);
imlib_free_image();
task->icon_press[k] = 0;
}
}
}
void remove_task(Task *task)
{
if (!task)
@@ -178,23 +201,7 @@ void remove_task(Task *task)
// printf("remove_task %s %d\n", task->title, task->desktop);
if (task->title)
free(task->title);
for (int k = 0; k < TASK_STATE_COUNT; ++k) {
if (task->icon[k]) {
imlib_context_set_image(task->icon[k]);
imlib_free_image();
task->icon[k] = 0;
}
if (task->icon_hover[k]) {
imlib_context_set_image(task->icon_hover[k]);
imlib_free_image();
task->icon_hover[k] = 0;
}
if (task->icon_press[k]) {
imlib_context_set_image(task->icon_press[k]);
imlib_free_image();
task->icon_press[k] = 0;
}
}
task_remove_icon(task);
GPtrArray *task_buttons = g_hash_table_lookup(win_to_task, &win);
for (int i = 0; i < task_buttons->len; ++i) {
@@ -265,31 +272,32 @@ void task_update_icon(Task *task)
if (!panel->g_task.has_icon)
return;
for (int k = 0; k < TASK_STATE_COUNT; ++k) {
if (task->icon[k]) {
imlib_context_set_image(task->icon[k]);
imlib_free_image();
task->icon[k] = 0;
}
}
task_remove_icon(task);
Imlib_Image img = NULL;
if (!img) {
int i;
gulong *data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i);
int len;
gulong *data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &len);
if (data) {
if (len > 0) {
// get ARGB icon
int w, h;
gulong *tmp_data;
tmp_data = get_best_icon(data, get_icon_count(data, i), i, &w, &h, panel->g_task.icon_size1);
gulong *tmp_data = get_best_icon(data, get_icon_count(data, len), len, &w, &h, panel->g_task.icon_size1);
if (tmp_data) {
DATA32 icon_data[w * h];
for (int j = 0; j < w * h; ++j)
icon_data[j] = tmp_data[j];
img = imlib_create_image_using_copied_data(w, h, icon_data);
if (img)
fprintf(stderr, "%s: Got %dx%d icon via _NET_WM_ICON for %s\n", __FUNCTION__, w, h, task->title ? task->title : "task");
if (0 && img)
fprintf(stderr,
"%s: Got %dx%d icon via _NET_WM_ICON for %s\n",
__FUNCTION__,
w,
h,
task->title ? task->title : "task");
}
}
XFree(data);
}
}
@@ -307,8 +315,13 @@ void task_update_icon(Task *task)
XGetGeometry(server.display, hints->icon_pixmap, &root, &icon_x, &icon_y, &w, &h, &border_width, &bpp);
imlib_context_set_drawable(hints->icon_pixmap);
img = imlib_create_image_from_drawable(hints->icon_mask, 0, 0, w, h, 0);
if (img)
fprintf(stderr, "%s: Got %dx%d pixmap icon via WM_HINTS for %s\n", __FUNCTION__, w, h, task->title ? task->title : "task");
if (0 && img)
fprintf(stderr,
"%s: Got %dx%d pixmap icon via WM_HINTS for %s\n",
__FUNCTION__,
w,
h,
task->title ? task->title : "task");
}
XFree(hints);
}
@@ -317,6 +330,7 @@ void task_update_icon(Task *task)
if (img == NULL) {
imlib_context_set_image(default_icon);
img = imlib_clone_image();
if (0)
fprintf(stderr, "%s: Using default icon for %s\n", __FUNCTION__, task->title ? task->title : "task");
}
@@ -485,7 +499,11 @@ void on_change_task(void *obj)
Task *task = (Task *)obj;
Panel *panel = (Panel *)task->area.panel;
long value[] = {panel->posx + task->area.posx, panel->posy + task->area.posy, task->area.width, task->area.height};
if (task->area.on_screen) {
long value[] = {panel->posx + task->area.posx,
panel->posy + task->area.posy,
task->area.width,
task->area.height};
XChangeProperty(server.display,
task->win,
server.atom._NET_WM_ICON_GEOMETRY,
@@ -494,6 +512,9 @@ void on_change_task(void *obj)
PropModeReplace,
(unsigned char *)value,
4);
} else {
XDeleteProperty(server.display, task->win, server.atom._NET_WM_ICON_GEOMETRY);
}
}
Task *find_active_task(Task *current_task)
@@ -603,7 +624,7 @@ void set_task_state(Task *task, TaskState state)
}
}
if (task->current_state != state || hide_task_diff_monitor) {
if (task->current_state != state || hide_task_diff_monitor || hide_task_diff_desktop) {
GPtrArray *task_buttons = get_task_buttons(task->win);
if (task_buttons) {
for (int i = 0; i < task_buttons->len; ++i) {
@@ -627,6 +648,10 @@ void set_task_state(Task *task, TaskState state)
hide = TRUE;
}
}
if (hide_task_diff_desktop) {
if (taskbar->desktop != server.desktop)
hide = TRUE;
}
if (get_window_monitor(task->win) != ((Panel *)task->area.panel)->monitor &&
(hide_task_diff_monitor || num_panels > 1)) {
hide = TRUE;

View File

@@ -39,6 +39,7 @@ Task *active_task;
Task *task_drag;
gboolean taskbar_enabled;
gboolean taskbar_distribute_size;
gboolean hide_task_diff_desktop;
gboolean hide_inactive_tasks;
gboolean hide_task_diff_monitor;
gboolean hide_taskbar_if_empty;
@@ -74,6 +75,7 @@ void default_taskbar()
urgent_list = NULL;
taskbar_enabled = FALSE;
taskbar_distribute_size = FALSE;
hide_task_diff_desktop = FALSE;
hide_inactive_tasks = FALSE;
hide_task_diff_monitor = FALSE;
hide_taskbar_if_empty = FALSE;
@@ -238,9 +240,9 @@ void init_taskbar_panel(void *p)
if ((panel->g_task.config_background_mask & (1 << TASK_URGENT)) == 0)
panel->g_task.background[TASK_URGENT] = panel->g_task.background[TASK_ACTIVE];
if (!panel->g_task.maximum_width)
if (!panel->g_task.maximum_width || !panel_horizontal)
panel->g_task.maximum_width = server.monitors[panel->monitor].width;
if (!panel->g_task.maximum_height)
if (!panel->g_task.maximum_height || panel_horizontal)
panel->g_task.maximum_height = server.monitors[panel->monitor].height;
if (panel_horizontal) {
@@ -288,7 +290,8 @@ void init_taskbar_panel(void *p)
FALSE);
panel->g_task.text_posx = left_bg_border_width(panel->g_task.background[0]) + panel->g_task.area.paddingxlr;
panel->g_task.text_height = panel->g_task.area.height - (2 * panel->g_task.area.paddingy);
panel->g_task.text_height =
panel->g_task.area.height - (2 * panel->g_task.area.paddingy) - top_bottom_border_width(&panel->g_task.area);
if (panel->g_task.has_icon) {
panel->g_task.icon_size1 = MIN(MIN(panel->g_task.maximum_width, panel->g_task.maximum_height),
MIN(panel->g_task.area.width, panel->g_task.area.height)) -
@@ -324,7 +327,6 @@ void init_taskbar_panel(void *p)
free_area_gradient_instances(&taskbar->area);
instantiate_area_gradients(&taskbar->area);
}
}
init_taskbarname_panel(panel);
}
@@ -535,6 +537,15 @@ void set_taskbar_state(Taskbar *taskbar, TaskbarState state)
for (; l; l = l->next)
schedule_redraw((Area *)l->data);
}
if (taskbar_mode == MULTI_DESKTOP && hide_task_diff_desktop) {
GList *l = taskbar->area.children;
if (taskbarname_enabled)
l = l->next;
for (; l; l = l->next) {
Task *task = (Task *)l->data;
set_task_state(task, task->current_state);
}
}
}
schedule_panel_redraw();
}
@@ -674,3 +685,18 @@ void sort_taskbar_for_win(Window win)
}
}
}
void update_minimized_icon_positions(void *p)
{
Panel *panel = (Panel *)p;
for (int i = 0; i < panel->num_desktops; i++) {
Taskbar *taskbar = &panel->taskbar[i];
if (!taskbar->area.on_screen)
continue;
for (GList *c = taskbar->area.children; c; c = c->next) {
Area *area = (Area *)c->data;
if (area->_on_change_layout)
area->_on_change_layout(area);
}
}
}

View File

@@ -49,6 +49,7 @@ typedef struct GlobalTaskbar {
extern gboolean taskbar_enabled;
extern gboolean taskbar_distribute_size;
extern gboolean hide_task_diff_desktop;
extern gboolean hide_inactive_tasks;
extern gboolean hide_task_diff_monitor;
extern gboolean hide_taskbar_if_empty;
@@ -88,6 +89,8 @@ void set_taskbar_state(Taskbar *taskbar, TaskbarState state);
// Updates the visibility of all taskbars
void update_all_taskbars_visibility();
void update_minimized_icon_positions(void *p);
// Sorts the taskbar(s) on which the window is present.
void sort_taskbar_for_win(Window win);

View File

@@ -269,10 +269,6 @@ const char *signal_name(int sig)
return "SIGVTALRM: Virtual alarm clock (4.2 BSD).";
case SIGPROF:
return "SIGPROF: Profiling alarm clock (4.2 BSD).";
case SIGWINCH:
return "SIGWINCH: Window size change (4.3 BSD, Sun).";
case SIGIO:
return "SIGIO: Pollable event occurred (System V) / I/O now possible (4.2 BSD).";
// case SIGPWR: return "SIGPWR: Power failure restart (System V).";
case SIGSYS:
return "SIGSYS: Bad system call.";
@@ -378,6 +374,20 @@ void x11_io_error(Display *display)
handle_crash("X11 I/O error");
}
void print_usage()
{
printf("Usage: tint2 [OPTION...]\n"
"\n"
"Options:\n"
" -c path_to_config_file Loads the configuration file from a\n"
" custom location.\n"
" -v, --version Prints version information and exits.\n"
" -h, --help Display this help and exits.\n"
"\n"
"For more information, run `man tint2` or visit the project page\n"
"<https://gitlab.com/o9000/tint2>.\n");
}
void init(int argc, char *argv[])
{
// Make stdout/stderr flush after a newline (for some reason they don't even if tint2 is started from a terminal)
@@ -397,13 +407,14 @@ void init(int argc, char *argv[])
default_taskbar();
default_tooltip();
default_execp();
default_button();
default_panel();
// Read command line arguments
for (int i = 1; i < argc; ++i) {
int error = 0;
if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
printf("Usage: tint2 [[-c] <config_file>]\n");
print_usage();
exit(0);
} else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) {
printf("tint2 version %s\n", VERSION_STRING);
@@ -436,12 +447,11 @@ void init(int argc, char *argv[])
}
#endif
else {
error = 1;
}
if (error) {
printf("Usage: tint2 [[-c] <config_file>]\n");
print_usage();
exit(1);
}
}
@@ -453,6 +463,7 @@ void init(int argc, char *argv[])
struct sigaction sa = {.sa_handler = signal_handler, .sa_flags = SA_RESTART};
sigaction(SIGUSR1, &sa, 0);
sigaction(SIGUSR2, &sa, 0);
sigaction(SIGINT, &sa, 0);
sigaction(SIGTERM, &sa, 0);
sigaction(SIGHUP, &sa, 0);
@@ -516,12 +527,14 @@ static void sigchld_handler_async()
int status;
while ((pid = waitpid(-1, &status, WNOHANG)) != -1 && pid != 0) {
#ifdef HAVE_SN
if (startup_notifications) {
SnLauncherContext *ctx = (SnLauncherContext *)g_tree_lookup(server.pids, GINT_TO_POINTER(pid));
if (ctx) {
g_tree_remove(server.pids, GINT_TO_POINTER(pid));
sn_launcher_context_complete(ctx);
sn_launcher_context_unref(ctx);
}
}
#endif
for (GList *l = panel_config.execp_list; l; l = l->next) {
Execp *execp = (Execp *)l->data;
@@ -563,9 +576,6 @@ void init_X11_pre_config()
void init_X11_post_config()
{
if (primary_monitor_first)
sort_monitors();
server_init_visual();
gboolean need_sigchld = FALSE;
@@ -604,7 +614,7 @@ void init_X11_post_config()
for (int i = 0; data_dirs[i] != NULL; i++) {
gchar *path = g_build_filename(data_dirs[i], "tint2", "default_icon.png", NULL);
if (g_file_test(path, G_FILE_TEST_EXISTS))
default_icon = imlib_load_image(path);
default_icon = load_image(path, TRUE);
g_free(path);
}
if (!default_icon) {
@@ -616,6 +626,7 @@ void init_X11_post_config()
void cleanup()
{
cleanup_button();
cleanup_execp();
cleanup_systray();
cleanup_tooltip();
@@ -639,6 +650,7 @@ void cleanup()
cleanup_server();
cleanup_timeout();
if (server.display)
XCloseDisplay(server.display);
server.display = NULL;
@@ -816,6 +828,8 @@ int tint2_handles_click(Panel *panel, XButtonEvent *e)
#endif
if (click_execp(panel, e->x, e->y))
return 1;
if (click_button(panel, e->x, e->y))
return 1;
return 0;
}
@@ -900,6 +914,8 @@ void event_button_motion_notify(XEvent *e)
task_drag->desktop = event_taskbar->desktop;
change_window_desktop(task_drag->win, event_taskbar->desktop);
if (hide_task_diff_desktop)
change_desktop(event_taskbar->desktop);
if (taskbar_sort_method != TASKBAR_NOSORT) {
sort_tasks(event_taskbar);
@@ -952,8 +968,9 @@ void event_button_release(XEvent *e)
break;
}
if (click_clock(panel, e->xbutton.x, e->xbutton.y)) {
clock_action(e->xbutton.button);
Clock *clock = click_clock(panel, e->xbutton.x, e->xbutton.y);
if (clock) {
clock_action(clock, e->xbutton.button, e->xbutton.x - clock->area.posx, e->xbutton.y - clock->area.posy, e->xbutton.time);
if (panel_layer == BOTTOM_LAYER)
XLowerWindow(server.display, panel->main_win);
task_drag = 0;
@@ -961,8 +978,9 @@ void event_button_release(XEvent *e)
}
#ifdef ENABLE_BATTERY
if (click_battery(panel, e->xbutton.x, e->xbutton.y)) {
battery_action(e->xbutton.button);
Battery *battery = click_battery(panel, e->xbutton.x, e->xbutton.y);
if (battery) {
battery_action(battery, e->xbutton.button, e->xbutton.x - battery->area.posx, e->xbutton.y - battery->area.posy, e->xbutton.time);
if (panel_layer == BOTTOM_LAYER)
XLowerWindow(server.display, panel->main_win);
task_drag = 0;
@@ -972,7 +990,16 @@ void event_button_release(XEvent *e)
Execp *execp = click_execp(panel, e->xbutton.x, e->xbutton.y);
if (execp) {
execp_action(execp, e->xbutton.button, e->xbutton.x - execp->area.posx, e->xbutton.y - execp->area.posy);
execp_action(execp, e->xbutton.button, e->xbutton.x - execp->area.posx, e->xbutton.y - execp->area.posy, e->xbutton.time);
if (panel_layer == BOTTOM_LAYER)
XLowerWindow(server.display, panel->main_win);
task_drag = 0;
return;
}
Button *button = click_button(panel, e->xbutton.x, e->xbutton.y);
if (button) {
button_action(button, e->xbutton.button, e->xbutton.x - button->area.posx, e->xbutton.y - button->area.posy, e->xbutton.time);
if (panel_layer == BOTTOM_LAYER)
XLowerWindow(server.display, panel->main_win);
task_drag = 0;
@@ -982,7 +1009,7 @@ void event_button_release(XEvent *e)
if (e->xbutton.button == 1 && click_launcher(panel, e->xbutton.x, e->xbutton.y)) {
LauncherIcon *icon = click_launcher_icon(panel, e->xbutton.x, e->xbutton.y);
if (icon) {
launcher_action(icon, e);
launcher_action(icon, e, e->xbutton.x - icon->area.posx, e->xbutton.y - icon->area.posy);
}
task_drag = 0;
return;
@@ -1631,9 +1658,8 @@ start:
init_X11_pre_config();
if (!config_read()) {
fprintf(stderr,
"Could not read config file.\n"
"Usage: tint2 [[-c] <config_file>]\n");
fprintf(stderr, "Could not read config file.\n");
print_usage();
cleanup();
exit(1);
}
@@ -1772,7 +1798,8 @@ start:
double fps_low, fps_median, fps_high, fps_samples;
fps_compute_stats(&fps_low, &fps_median, &fps_high, &fps_samples);
fprintf(stderr,
BLUE "frame %d: fps = %.0f (low %.0f, med %.0f, high %.0f, samples %.0f) : processing %.0f%%, rendering %.0f%%, "
BLUE "frame %d: fps = %.0f (low %.0f, med %.0f, high %.0f, samples %.0f) : processing %.0f%%, "
"rendering %.0f%%, "
"flushing %.0f%%" RESET "\n",
frame,
fps,
@@ -1805,7 +1832,12 @@ start:
}
for (GList *l = panel_config.execp_list; l; l = l->next) {
Execp *execp = (Execp *)l->data;
int fd = execp->backend->child_pipe;
int fd = execp->backend->child_pipe_stdout;
if (fd > 0) {
FD_SET(fd, &fdset);
maxfd = maxfd < fd ? fd : maxfd;
}
fd = execp->backend->child_pipe_stderr;
if (fd > 0) {
FD_SET(fd, &fdset);
maxfd = maxfd < fd ? fd : maxfd;
@@ -1834,9 +1866,8 @@ start:
if (read_execp(execp)) {
GList *l_instance;
for (l_instance = execp->backend->instances; l_instance; l_instance = l_instance->next) {
Execp *instance = l_instance->data;
instance->area.resize_needed = TRUE;
schedule_panel_redraw();
Execp *instance = (Execp *)l_instance->data;
execp_update_post_read(instance);
}
}
}
@@ -2107,7 +2138,7 @@ start:
strcat(cmd, "\"");
strcat(cmd, "&)");
fprintf(stderr, "DnD %s:%d: Running command: %s\n", __FILE__, __LINE__, cmd);
tint_exec(cmd);
tint_exec(cmd, NULL, NULL, e.xselection.time, NULL, 0, 0);
free(cmd);
// Reply OK.
@@ -2150,6 +2181,12 @@ start:
// restart tint2
// SIGUSR1 used when : user's signal, composite manager stop/start or xrandr
goto start;
} else if (signal_pending == SIGUSR2) {
fprintf(stderr, YELLOW "%s %d: reexecuting tint2..." RESET "\n", __FILE__, __LINE__);
if (execvp(argv[0], argv) == -1) {
fprintf(stderr, RED "%s %d: failed!" RESET "\n", __FILE__, __LINE__);
return 1;
}
} else {
// SIGINT, SIGTERM, SIGHUP
exit(0);

View File

@@ -71,3 +71,4 @@ add_subdirectory(po)
install( TARGETS tint2conf DESTINATION bin )
install( FILES tint2conf.svg DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps )
install( FILES tint2conf.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications )
install( FILES tint2conf.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages )

View File

@@ -205,10 +205,14 @@ void gradient_create_new(GradientConfigType t)
gradients = g_list_append(gradients, g);
GtkTreeIter iter;
gtk_list_store_append(gradient_ids, &iter);
gtk_list_store_set(gradient_ids, &iter,
grColPixbuf, NULL,
grColId, &index,
grColText, index == 0 ? _("None") : "",
gtk_list_store_set(gradient_ids,
&iter,
grColPixbuf,
NULL,
grColId,
&index,
grColText,
index == 0 ? _("None") : "",
-1);
gradient_update_image(index);
@@ -245,11 +249,7 @@ void gradient_duplicate(GtkWidget *widget, gpointer data)
gradients = g_list_append(gradients, g);
GtkTreeIter iter;
gtk_list_store_append(gradient_ids, &iter);
gtk_list_store_set(gradient_ids, &iter,
grColPixbuf, NULL,
grColId, &index,
grColText, "",
-1);
gtk_list_store_set(gradient_ids, &iter, grColPixbuf, NULL, grColId, &index, grColText, "", -1);
gradient_update_image(index);
gtk_combo_box_set_active(GTK_COMBO_BOX(current_gradient), index);
@@ -289,8 +289,14 @@ void gradient_draw(cairo_t *c, GradientConfig *g, int w, int h, gboolean preserv
gpat = cairo_pattern_create_linear(0, 0, 0, h);
else if (g->type == GRADIENT_CONFIG_HORIZONTAL)
gpat = cairo_pattern_create_linear(0, 0, w, 0);
else gpat = cairo_pattern_create_radial(w/2, h/2, 0, w/2, h/2, sqrt(w * w + h * h) / 2);
cairo_pattern_add_color_stop_rgba(gpat, 0.0, g->start_color.color.rgb[0], g->start_color.color.rgb[1], g->start_color.color.rgb[2], g->start_color.color.alpha);
else
gpat = cairo_pattern_create_radial(w / 2, h / 2, 0, w / 2, h / 2, sqrt(w * w + h * h) / 2);
cairo_pattern_add_color_stop_rgba(gpat,
0.0,
g->start_color.color.rgb[0],
g->start_color.color.rgb[1],
g->start_color.color.rgb[2],
g->start_color.color.alpha);
for (GList *l = g->extra_color_stops; l; l = l->next) {
GradientConfigColorStop *stop = (GradientConfigColorStop *)l->data;
cairo_pattern_add_color_stop_rgba(gpat,
@@ -300,7 +306,12 @@ void gradient_draw(cairo_t *c, GradientConfig *g, int w, int h, gboolean preserv
stop->color.rgb[2],
stop->color.alpha);
}
cairo_pattern_add_color_stop_rgba(gpat, 1.0, g->end_color.color.rgb[0], g->end_color.color.rgb[1], g->end_color.color.rgb[2], g->end_color.color.alpha);
cairo_pattern_add_color_stop_rgba(gpat,
1.0,
g->end_color.color.rgb[0],
g->end_color.color.rgb[1],
g->end_color.color.rgb[2],
g->end_color.color.alpha);
cairo_set_source(c, gpat);
cairo_rectangle(c, 0, 0, w, h);
if (preserve)
@@ -336,9 +347,7 @@ void gradient_update_image(int index)
gtk_tree_model_get_iter(GTK_TREE_MODEL(gradient_ids), &iter, path);
gtk_tree_path_free(path);
gtk_list_store_set(gradient_ids, &iter,
grColPixbuf, pixbuf,
-1);
gtk_list_store_set(gradient_ids, &iter, grColPixbuf, pixbuf, -1);
if (pixbuf)
g_object_unref(pixbuf);
}
@@ -381,11 +390,7 @@ void gradient_update(GtkWidget *widget, gpointer data)
gdkColor2CairoColor(color, &g->end_color.color.rgb[0], &g->end_color.color.rgb[1], &g->end_color.color.rgb[2]);
g->end_color.color.alpha = opacity / 100.0;
gtk_list_store_set(gradient_ids, &iter,
grColPixbuf, NULL,
grColId, &index,
grColText, "",
-1);
gtk_list_store_set(gradient_ids, &iter, grColPixbuf, NULL, grColId, &index, grColText, "", -1);
gradient_update_image(index);
background_update_for_gradient(index);
}
@@ -428,9 +433,7 @@ void current_gradient_changed(GtkWidget *widget, gpointer data)
for (GList *l = g->extra_color_stops; l; l = l->next, stop_index++) {
GtkTreeIter iter;
gtk_list_store_append(gradient_stop_ids, &iter);
gtk_list_store_set(gradient_stop_ids, &iter,
grStopColPixbuf, NULL,
-1);
gtk_list_store_set(gradient_stop_ids, &iter, grStopColPixbuf, NULL, -1);
gradient_stop_update_image(stop_index);
}
if (old_stop_index >= 0 && old_stop_index < stop_index)
@@ -468,9 +471,7 @@ void gradient_stop_create_new()
g->extra_color_stops = g_list_append(g->extra_color_stops, stop);
GtkTreeIter iter;
gtk_list_store_append(gradient_stop_ids, &iter);
gtk_list_store_set(gradient_stop_ids, &iter,
grStopColPixbuf, NULL,
-1);
gtk_list_store_set(gradient_stop_ids, &iter, grStopColPixbuf, NULL, -1);
int stop_index = g_list_length(g->extra_color_stops) - 1;
gradient_stop_update_image(stop_index);
@@ -545,9 +546,7 @@ void gradient_stop_update_image(int index)
gtk_tree_model_get_iter(GTK_TREE_MODEL(gradient_stop_ids), &iter, path);
gtk_tree_path_free(path);
gtk_list_store_set(gradient_stop_ids, &iter,
grStopColPixbuf, pixbuf,
-1);
gtk_list_store_set(gradient_stop_ids, &iter, grStopColPixbuf, pixbuf, -1);
if (pixbuf)
g_object_unref(pixbuf);
}

View File

@@ -74,7 +74,7 @@ gboolean endswith(const char *str, const char *suffix)
// Returns TRUE if the theme file is in ~/.config.
gboolean theme_is_editable(const char *filepath)
{
return startswith(filepath, g_get_user_config_dir());
return access(filepath, W_OK) == 0;
}
// Returns TRUE if the theme file is ~/.config/tint2/tint2rc.
@@ -119,7 +119,7 @@ gchar *import_no_overwrite(const char *filepath)
if (!g_file_test(newpath, G_FILE_TEST_EXISTS)) {
copy_file(filepath, newpath);
theme_list_append(newpath);
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)update_snapshot, NULL);
g_timeout_add(SNAPSHOT_TICK, update_snapshot, NULL);
}
return newpath;
@@ -138,7 +138,7 @@ void import_with_overwrite(const char *filepath, const char *newpath)
if (theme_is_editable(newpath)) {
if (!theme_existed) {
theme_list_append(newpath);
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)update_snapshot, NULL);
g_timeout_add(SNAPSHOT_TICK, update_snapshot, NULL);
} else {
int unused = system("killall -SIGUSR1 tint2 || pkill -SIGUSR1 -x tint2");
(void)unused;
@@ -158,7 +158,7 @@ static void menuImportFile();
static void menuSaveAs();
static void menuDelete();
static void menuReset();
static void edit_theme();
static gboolean edit_theme(gpointer ignored);
static void make_selected_theme_default();
static void menuAbout();
static gboolean view_onPopupMenu(GtkWidget *treeview, gpointer userdata);
@@ -250,13 +250,43 @@ int main(int argc, char **argv)
// Menubar and toolbar entries
GtkActionEntry entries[] =
{{"ThemeMenu", NULL, _("_Theme"), NULL, NULL, NULL},
{"ThemeImportFile", GTK_STOCK_ADD, _("_Import theme..."), "<Control>N", _("Import theme(s) from file system"), G_CALLBACK(menuImportFile)},
{"ThemeSaveAs", GTK_STOCK_SAVE_AS, _("_Save as..."), NULL, _("Save the theme with a new name"), G_CALLBACK(menuSaveAs)},
{"ThemeImportFile",
GTK_STOCK_ADD,
_("_Import theme..."),
"<Control>N",
_("Import theme(s) from file system"),
G_CALLBACK(menuImportFile)},
{"ThemeSaveAs",
GTK_STOCK_SAVE_AS,
_("_Save as..."),
NULL,
_("Save the theme with a new name"),
G_CALLBACK(menuSaveAs)},
{"ThemeDelete", GTK_STOCK_DELETE, _("_Delete"), NULL, _("Delete the selected theme"), G_CALLBACK(menuDelete)},
{"ThemeReset", GTK_STOCK_REVERT_TO_SAVED, _("_Reset"), NULL, _("Reset the selected theme to default"), G_CALLBACK(menuReset)},
{"ThemeEdit", GTK_STOCK_PROPERTIES, _("_Edit theme..."), NULL, _("Edit the selected theme"), G_CALLBACK(edit_theme)},
{"ThemeMakeDefault", GTK_STOCK_APPLY, _("_Make default"), NULL, _("Replace the default theme with the selected one"), G_CALLBACK(make_selected_theme_default)},
{"ThemeRefresh", GTK_STOCK_REFRESH, _("Refresh"), NULL, _("Redraw the selected theme"), G_CALLBACK(refresh_current_theme)},
{"ThemeReset",
GTK_STOCK_REVERT_TO_SAVED,
_("_Reset"),
NULL,
_("Reset the selected theme to default"),
G_CALLBACK(menuReset)},
{"ThemeEdit",
GTK_STOCK_PROPERTIES,
_("_Edit theme..."),
NULL,
_("Edit the selected theme"),
G_CALLBACK(edit_theme)},
{"ThemeMakeDefault",
GTK_STOCK_APPLY,
_("_Make default"),
NULL,
_("Replace the default theme with the selected one"),
G_CALLBACK(make_selected_theme_default)},
{"ThemeRefresh",
GTK_STOCK_REFRESH,
_("Refresh"),
NULL,
_("Redraw the selected theme"),
G_CALLBACK(refresh_current_theme)},
{"RefreshAll", GTK_STOCK_REFRESH, _("Refresh all"), NULL, _("Redraw all themes"), G_CALLBACK(reload_all_themes)},
{"Quit", GTK_STOCK_QUIT, _("_Quit"), "<control>Q", _("Quit"), G_CALLBACK(gtk_main_quit)},
{"HelpMenu", NULL, _("_Help"), NULL, NULL, NULL},
@@ -309,7 +339,11 @@ int main(int argc, char **argv)
argc--, argv++;
if (argc > 0) {
load_specific_themes(argv, argc);
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)edit_theme, NULL);
g_timeout_add(SNAPSHOT_TICK, edit_theme, NULL);
} else if (getenv("TINT2_CONFIG")) {
char *themes[2] = {getenv("TINT2_CONFIG"), NULL};
load_specific_themes(themes, 1);
g_timeout_add(SNAPSHOT_TICK, edit_theme, NULL);
}
gtk_widget_show_all(g_window);
@@ -409,7 +443,8 @@ gchar *get_selected_theme_or_warn()
return filepath;
}
// For the selected theme, shows save dialog (with overwrite confirmation) and copies to the selected file with overwrite.
// For the selected theme, shows save dialog (with overwrite confirmation) and copies to the selected file with
// overwrite.
// Shows error box if no theme is selected.
static void menuSaveAs()
{
@@ -643,11 +678,11 @@ void select_theme(const char *given_path)
}
// Edits the selected theme. If it is read-only, it copies first to ~.
static void edit_theme()
static gboolean edit_theme(gpointer ignored)
{
gchar *filepath = get_selected_theme_or_warn();
if (!filepath)
return;
return FALSE;
gboolean editable = theme_is_editable(filepath);
if (!editable) {
@@ -665,6 +700,8 @@ static void edit_theme()
g_free(filepath);
destroy_please_wait();
return FALSE;
}
static void make_selected_theme_default()
@@ -680,7 +717,8 @@ static void make_selected_theme_default()
return;
}
GtkWidget *w = gtk_message_dialog_new(GTK_WINDOW(g_window),
GtkWidget *w =
gtk_message_dialog_new(GTK_WINDOW(g_window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_YES_NO,
@@ -702,7 +740,7 @@ static void make_selected_theme_default()
static void viewRowActivated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
edit_theme();
edit_theme(NULL);
}
// ====== Theme load/reload ======
@@ -834,7 +872,7 @@ static void load_all_themes()
have_iter = gtk_tree_model_iter_next(model, &iter);
}
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)update_snapshot, NULL);
g_timeout_add(SNAPSHOT_TICK, update_snapshot, NULL);
}
}
@@ -865,7 +903,7 @@ static void reload_all_themes()
have_iter = gtk_tree_model_iter_next(model, &iter);
}
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)update_snapshot, NULL);
g_timeout_add(SNAPSHOT_TICK, update_snapshot, NULL);
}
}
@@ -899,7 +937,7 @@ static void load_specific_themes(char **paths, int count)
have_iter = gtk_tree_model_iter_next(model, &iter);
}
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)update_snapshot, NULL);
g_timeout_add(SNAPSHOT_TICK, update_snapshot, NULL);
}
}
@@ -910,7 +948,7 @@ void refresh_current_theme()
GtkTreeModel *model;
if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(sel), &model, &iter)) {
gtk_list_store_set(theme_list_store, &iter, COL_SNAPSHOT, NULL, -1);
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)update_snapshot, NULL);
g_timeout_add(SNAPSHOT_TICK, update_snapshot, NULL);
}
}
@@ -925,7 +963,7 @@ void refresh_theme(const char *given_path)
gtk_tree_model_get(model, &iter, COL_THEME_FILE, &filepath, -1);
if (g_str_equal(filepath, given_path)) {
gtk_list_store_set(theme_list_store, &iter, COL_SNAPSHOT, NULL, -1);
g_timeout_add(SNAPSHOT_TICK, (GSourceFunc)update_snapshot, NULL);
g_timeout_add(SNAPSHOT_TICK, update_snapshot, NULL);
g_free(filepath);
break;
}

View File

@@ -15,7 +15,7 @@
#endif
#define SNAPSHOT_TICK 190
gboolean update_snapshot();
gboolean update_snapshot(gpointer ignored);
void menuApply();
void refresh_current_theme();
extern GtkWidget *g_window;

View File

@@ -186,13 +186,11 @@ static int md4_update(struct shash_desc *desc, const u8 *data, unsigned int len)
mctx->byte_count += len;
if (avail > len) {
memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),
data, len);
memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, len);
return 0;
}
memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),
data, avail);
memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, avail);
md4_transform_helper(mctx);
data += avail;
@@ -228,8 +226,7 @@ static int md4_final(struct shash_desc *desc, u8 *out)
memset(p, 0, padding);
mctx->block[14] = mctx->byte_count << 3;
mctx->block[15] = mctx->byte_count >> 29;
le32_to_cpu_array(mctx->block, (sizeof(mctx->block) -
sizeof(u64)) / sizeof(u32));
le32_to_cpu_array(mctx->block, (sizeof(mctx->block) - sizeof(u64)) / sizeof(u32));
md4_transform(mctx->hash, mctx->block);
cpu_to_le32_array(mctx->hash, ARRAY_SIZE(mctx->hash));
memcpy(out, mctx->hash, sizeof(mctx->hash));

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -e
set -x
find .. -name '*.c' | sort -r | xargs xgettext --keyword=_ --language=C --output=tint2conf.pot -
sed -i "s/PACKAGE VERSION/tint2conf $(../../../get_version.sh | head -n1)/g" tint2conf.pot
sed -i "s/CHARSET/UTF-8/g" tint2conf.pot
for f in *.po
do
lang=$(basename $f .po)
echo $lang
msgmerge -i -o $lang.pox $lang.po tint2conf.pot
cat ${lang}.pox > ${lang}.po
rm ${lang}.pox
done

File diff suppressed because it is too large Load Diff

View File

@@ -8,22 +8,20 @@
#include "../launcher/icon-theme-common.h"
// panel
extern GtkWidget *panel_width, *panel_height, *panel_margin_x, *panel_margin_y, *panel_padding_x, *panel_padding_y, *panel_spacing;
extern GtkWidget *panel_wm_menu, *panel_dock, *panel_autohide, *panel_autohide_show_time, *panel_autohide_hide_time, *panel_autohide_size;
extern GtkWidget *panel_combo_strut_policy, *panel_combo_layer, *panel_combo_width_type, *panel_combo_height_type, *panel_combo_monitor;
extern GtkWidget *panel_width, *panel_height, *panel_margin_x, *panel_margin_y, *panel_padding_x, *panel_padding_y,
*panel_spacing;
extern GtkWidget *panel_wm_menu, *panel_dock, *panel_autohide, *panel_autohide_show_time, *panel_autohide_hide_time,
*panel_autohide_size;
extern GtkWidget *panel_combo_strut_policy, *panel_combo_layer, *panel_combo_width_type, *panel_combo_height_type,
*panel_combo_monitor;
extern GtkWidget *panel_window_name, *disable_transparency;
extern GtkWidget *panel_mouse_effects;
extern GtkWidget *mouse_hover_icon_opacity, *mouse_hover_icon_saturation, *mouse_hover_icon_brightness;
extern GtkWidget *mouse_pressed_icon_opacity, *mouse_pressed_icon_saturation, *mouse_pressed_icon_brightness;
extern GtkWidget *panel_primary_monitor_first, *panel_shrink;
extern GtkWidget *panel_shrink;
enum {
itemsColName = 0,
itemsColValue,
itemsNumCols
};
enum { itemsColName = 0, itemsColValue, itemsNumCols };
extern GtkListStore *panel_items, *all_items;
extern GtkWidget *panel_items_view, *all_items_view;
char *get_panel_items();
@@ -51,44 +49,34 @@ extern GtkWidget *panel_background;
// taskbar
extern GtkWidget *taskbar_show_desktop, *taskbar_show_name, *taskbar_padding_x, *taskbar_padding_y, *taskbar_spacing;
extern GtkWidget *taskbar_hide_inactive_tasks, *taskbar_hide_diff_monitor;
extern GtkWidget *taskbar_name_padding_x, *taskbar_name_padding_y, *taskbar_name_inactive_color, *taskbar_name_active_color;
extern GtkWidget *taskbar_hide_inactive_tasks, *taskbar_hide_diff_monitor, *taskbar_hide_diff_desktop;
extern GtkWidget *taskbar_name_padding_x, *taskbar_name_padding_y, *taskbar_name_inactive_color,
*taskbar_name_active_color;
extern GtkWidget *taskbar_name_font, *taskbar_name_font_set;
extern GtkWidget *taskbar_active_background, *taskbar_inactive_background;
extern GtkWidget *taskbar_name_active_background, *taskbar_name_inactive_background;
extern GtkWidget *taskbar_distribute_size, *taskbar_sort_order, *taskbar_alignment, *taskbar_always_show_all_desktop_tasks;
extern GtkWidget *taskbar_distribute_size, *taskbar_sort_order, *taskbar_alignment,
*taskbar_always_show_all_desktop_tasks;
extern GtkWidget *taskbar_hide_empty;
// task
extern GtkWidget *task_mouse_left, *task_mouse_middle, *task_mouse_right, *task_mouse_scroll_up, *task_mouse_scroll_down;
extern GtkWidget *task_mouse_left, *task_mouse_middle, *task_mouse_right, *task_mouse_scroll_up,
*task_mouse_scroll_down;
extern GtkWidget *task_show_icon, *task_show_text, *task_align_center, *font_shadow;
extern GtkWidget *task_maximum_width, *task_maximum_height, *task_padding_x, *task_padding_y, *task_spacing;
extern GtkWidget *task_font, *task_font_set;
extern GtkWidget *task_default_color, *task_default_color_set,
*task_default_icon_opacity, *task_default_icon_osb_set,
*task_default_icon_saturation,
*task_default_icon_brightness,
*task_default_background, *task_default_background_set;
extern GtkWidget *task_normal_color, *task_normal_color_set,
*task_normal_icon_opacity, *task_normal_icon_osb_set,
*task_normal_icon_saturation,
*task_normal_icon_brightness,
*task_normal_background, *task_normal_background_set;
extern GtkWidget *task_active_color, *task_active_color_set,
*task_active_icon_opacity, *task_active_icon_osb_set,
*task_active_icon_saturation,
*task_active_icon_brightness,
*task_active_background, *task_active_background_set;
extern GtkWidget *task_urgent_color, *task_urgent_color_set,
*task_urgent_icon_opacity, *task_urgent_icon_osb_set,
*task_urgent_icon_saturation,
*task_urgent_icon_brightness,
*task_urgent_background, *task_urgent_background_set;
extern GtkWidget *task_default_color, *task_default_color_set, *task_default_icon_opacity, *task_default_icon_osb_set,
*task_default_icon_saturation, *task_default_icon_brightness, *task_default_background,
*task_default_background_set;
extern GtkWidget *task_normal_color, *task_normal_color_set, *task_normal_icon_opacity, *task_normal_icon_osb_set,
*task_normal_icon_saturation, *task_normal_icon_brightness, *task_normal_background, *task_normal_background_set;
extern GtkWidget *task_active_color, *task_active_color_set, *task_active_icon_opacity, *task_active_icon_osb_set,
*task_active_icon_saturation, *task_active_icon_brightness, *task_active_background, *task_active_background_set;
extern GtkWidget *task_urgent_color, *task_urgent_color_set, *task_urgent_icon_opacity, *task_urgent_icon_osb_set,
*task_urgent_icon_saturation, *task_urgent_icon_brightness, *task_urgent_background, *task_urgent_background_set;
extern GtkWidget *task_urgent_blinks;
extern GtkWidget *task_iconified_color, *task_iconified_color_set,
*task_iconified_icon_opacity, *task_iconified_icon_osb_set,
*task_iconified_icon_saturation,
*task_iconified_icon_brightness,
extern GtkWidget *task_iconified_color, *task_iconified_color_set, *task_iconified_icon_opacity,
*task_iconified_icon_osb_set, *task_iconified_icon_saturation, *task_iconified_icon_brightness,
*task_iconified_background, *task_iconified_background_set;
// clock
@@ -100,12 +88,14 @@ extern GtkWidget *clock_font_line1, *clock_font_line1_set, *clock_font_line2, *c
extern GtkWidget *clock_background;
// battery
extern GtkWidget *battery_hide_if_higher, *battery_alert_if_lower, *battery_alert_cmd;
extern GtkWidget *battery_hide_if_higher, *battery_alert_if_lower, *battery_alert_cmd, *battery_alert_full_cmd;
extern GtkWidget *battery_padding_x, *battery_padding_y;
extern GtkWidget *battery_font_line1, *battery_font_line1_set, *battery_font_line2, *battery_font_line2_set, *battery_font_color;
extern GtkWidget *battery_font_line1, *battery_font_line1_set, *battery_font_line2, *battery_font_line2_set,
*battery_font_color, *battery_format1, *battery_format2;
extern GtkWidget *battery_background;
extern GtkWidget *battery_tooltip;
extern GtkWidget *battery_left_command, *battery_mclick_command, *battery_right_command, *battery_uwheel_command, *battery_dwheel_command;
extern GtkWidget *battery_left_command, *battery_mclick_command, *battery_right_command, *battery_uwheel_command,
*battery_dwheel_command;
extern GtkWidget *ac_connected_cmd, *ac_disconnected_cmd;
// systray
@@ -151,15 +141,25 @@ typedef struct Executor {
extern GArray *executors;
// Button
typedef struct Button {
char name[256];
GtkWidget *container;
GtkWidget *page_button;
GtkWidget *page_label;
GtkWidget *button_icon, *button_text, *button_tooltip;
GtkWidget *button_left_command, *button_right_command;
GtkWidget *button_mclick_command, *button_rclick_command, *button_uwheel_command, *button_dwheel_command;
GtkWidget *button_font, *button_font_set, *button_font_color, *button_padding_x, *button_padding_y,
*button_centered;
GtkWidget *button_background, *button_max_icon_size;
} Button;
extern GArray *buttons;
// launcher
enum {
appsColIcon = 0,
appsColIconName,
appsColText,
appsColPath,
appsNumCols
};
enum { appsColIcon = 0, appsColIconName, appsColText, appsColPath, appsNumCols };
extern GtkListStore *launcher_apps, *all_apps;
extern GtkWidget *launcher_apps_view, *all_apps_view;
@@ -207,46 +207,22 @@ enum {
};
extern GtkListStore *backgrounds;
extern GtkWidget *current_background,
*background_fill_color,
*background_border_color,
*background_gradient,
*background_fill_color_over,
*background_border_color_over,
*background_gradient_over,
*background_fill_color_press,
*background_border_color_press,
*background_gradient_press,
*background_border_width,
*background_border_sides_top,
*background_border_sides_bottom,
*background_border_sides_left,
*background_border_sides_right,
extern GtkWidget *current_background, *background_fill_color, *background_border_color, *background_gradient,
*background_fill_color_over, *background_border_color_over, *background_gradient_over, *background_fill_color_press,
*background_border_color_press, *background_gradient_press, *background_border_width, *background_border_sides_top,
*background_border_sides_bottom, *background_border_sides_left, *background_border_sides_right,
*background_corner_radius;
// gradients
enum {
grColPixbuf = 0,
grColId,
grColText,
grNumCols
};
enum { grColPixbuf = 0, grColId, grColText, grNumCols };
// gradient color stops
enum {
grStopColPixbuf = 0,
grStopNumCols
};
enum { grStopColPixbuf = 0, grStopNumCols };
extern GtkListStore *gradient_ids, *gradient_stop_ids;
extern GList *gradients;
extern GtkWidget *current_gradient,
*gradient_combo_type,
*gradient_start_color,
*gradient_end_color,
*current_gradient_stop,
*gradient_stop_color,
*gradient_stop_offset;
extern GtkWidget *current_gradient, *gradient_combo_type, *gradient_start_color, *gradient_end_color,
*current_gradient_stop, *gradient_stop_color, *gradient_stop_offset;
void background_create_new();
void background_force_update();
@@ -264,6 +240,11 @@ Executor *execp_get_last();
void execp_remove(int i);
void execp_update_indices();
void button_create_new();
Button *button_get_last();
void button_remove(int i);
void button_update_indices();
void create_please_wait(GtkWindow *parent);
void process_events();
void destroy_please_wait();

View File

@@ -38,13 +38,6 @@ void config_read_file(const char *path)
background_create_new();
gradient_create_new(GRADIENT_CONFIG_VERTICAL);
FILE *fp;
char line[512];
char *key, *value;
if ((fp = fopen(path, "r")) == NULL)
return;
config_has_panel_items = 0;
config_has_battery = 0;
config_battery_enabled = 0;
@@ -54,14 +47,21 @@ void config_read_file(const char *path)
no_items_systray_enabled = 0;
no_items_battery_enabled = 0;
while (fgets(line, sizeof(line), fp) != NULL) {
FILE *fp = fopen(path, "r");
if (fp) {
char *line = NULL;
size_t line_size = 0;
while (getline(&line, &line_size, fp) >= 0) {
char *key, *value;
if (parse_line(line, &key, &value)) {
add_entry(key, value);
free(key);
free(value);
}
}
free(line);
fclose(fp);
}
finalize_gradient();
finalize_bg();
@@ -108,9 +108,15 @@ void config_write_gradients(FILE *fp)
int opacity;
fprintf(fp, "# Gradient %d\n", index);
fprintf(fp, "gradient = %s\n", g->type == GRADIENT_CONFIG_HORIZONTAL ? "horizontal" : g->type == GRADIENT_CONFIG_VERTICAL ? "vertical" : "radial");
fprintf(fp,
"gradient = %s\n",
g->type == GRADIENT_CONFIG_HORIZONTAL ? "horizontal" : g->type == GRADIENT_CONFIG_VERTICAL ? "vertical"
: "radial");
cairoColor2GdkColor(g->start_color.color.rgb[0], g->start_color.color.rgb[1], g->start_color.color.rgb[2], &color);
cairoColor2GdkColor(g->start_color.color.rgb[0],
g->start_color.color.rgb[1],
g->start_color.color.rgb[2],
&color);
opacity = g->start_color.color.alpha * 100;
config_write_color(fp, "start_color", color, opacity);
@@ -123,7 +129,13 @@ void config_write_gradients(FILE *fp)
// color_stop = percentage #rrggbb opacity
cairoColor2GdkColor(stop->color.rgb[0], stop->color.rgb[1], stop->color.rgb[2], &color);
opacity = stop->color.alpha * 100;
fprintf(fp, "color_stop = %f #%02x%02x%02x %d\n", stop->offset * 100, color.red >> 8, color.green >> 8, color.blue >> 8, opacity);
fprintf(fp,
"color_stop = %f #%02x%02x%02x %d\n",
stop->offset * 100,
color.red >> 8,
color.green >> 8,
color.blue >> 8,
opacity);
}
fprintf(fp, "\n");
}
@@ -314,20 +326,16 @@ void config_write_panel(FILE *fp)
fprintf(fp, "\n");
fprintf(fp, "panel_monitor = ");
if (gtk_combo_box_get_active(GTK_COMBO_BOX(panel_combo_monitor)) == 0) {
if (gtk_combo_box_get_active(GTK_COMBO_BOX(panel_combo_monitor)) <= 0) {
fprintf(fp, "all");
} else if (gtk_combo_box_get_active(GTK_COMBO_BOX(panel_combo_monitor)) == 1) {
fprintf(fp, "primary");
} else {
fprintf(fp, "%d", gtk_combo_box_get_active(GTK_COMBO_BOX(panel_combo_monitor)));
fprintf(fp, "%d", gtk_combo_box_get_active(GTK_COMBO_BOX(panel_combo_monitor)) - 1);
}
fprintf(fp, "\n");
fprintf(fp,
"primary_monitor_first = %d\n",
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel_primary_monitor_first)) ? 1 : 0);
fprintf(fp,
"panel_shrink = %d\n",
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel_shrink)) ? 1 : 0);
fprintf(fp, "panel_shrink = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel_shrink)) ? 1 : 0);
fprintf(fp, "autohide = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel_autohide)) ? 1 : 0);
fprintf(fp, "autohide_show_timeout = %g\n", gtk_spin_button_get_value(GTK_SPIN_BUTTON(panel_autohide_show_time)));
@@ -391,6 +399,9 @@ void config_write_taskbar(FILE *fp)
fprintf(fp,
"taskbar_hide_different_monitor = %d\n",
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(taskbar_hide_diff_monitor)) ? 1 : 0);
fprintf(fp,
"taskbar_hide_different_desktop = %d\n",
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(taskbar_hide_diff_desktop)) ? 1 : 0);
fprintf(fp,
"taskbar_always_show_all_desktop_tasks = %d\n",
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(taskbar_always_show_all_desktop_tasks)) ? 1 : 0);
@@ -619,7 +630,11 @@ void config_write_systray(FILE *fp)
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(systray_icon_brightness)));
fprintf(fp, "systray_monitor = ");
fprintf(fp, "%d", MAX(1, 1 + gtk_combo_box_get_active(GTK_COMBO_BOX(systray_monitor))));
if (gtk_combo_box_get_active(GTK_COMBO_BOX(systray_monitor)) <= 0) {
fprintf(fp, "primary");
} else {
fprintf(fp, "%d", MAX(1, gtk_combo_box_get_active(GTK_COMBO_BOX(systray_monitor))));
}
fprintf(fp, "\n");
fprintf(fp, "systray_name_filter = %s\n", gtk_entry_get_text(GTK_ENTRY(systray_name_filter)));
@@ -742,6 +757,7 @@ void config_write_battery(FILE *fp)
fprintf(fp, "battery_tooltip = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(battery_tooltip)) ? 1 : 0);
fprintf(fp, "battery_low_status = %g\n", gtk_spin_button_get_value(GTK_SPIN_BUTTON(battery_alert_if_lower)));
fprintf(fp, "battery_low_cmd = %s\n", gtk_entry_get_text(GTK_ENTRY(battery_alert_cmd)));
fprintf(fp, "battery_full_cmd = %s\n", gtk_entry_get_text(GTK_ENTRY(battery_alert_full_cmd)));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(battery_font_line1_set)))
fprintf(fp, "bat1_font = %s\n", gtk_font_button_get_font_name(GTK_FONT_BUTTON(battery_font_line1)));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(battery_font_line2_set)))
@@ -752,6 +768,8 @@ void config_write_battery(FILE *fp)
"battery_font_color",
color,
gtk_color_button_get_alpha(GTK_COLOR_BUTTON(battery_font_color)) * 100 / 0xffff);
fprintf(fp, "bat1_format = %s\n", gtk_entry_get_text(GTK_ENTRY(battery_format1)));
fprintf(fp, "bat2_format = %s\n", gtk_entry_get_text(GTK_ENTRY(battery_format2)));
fprintf(fp,
"battery_padding = %d %d\n",
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(battery_padding_x)),
@@ -866,6 +884,52 @@ void config_write_execp(FILE *fp)
}
}
void config_write_button(FILE *fp)
{
for (int i = 0; i < buttons->len; i++) {
fprintf(fp, "#-------------------------------------\n");
fprintf(fp, "# Button %d\n", i + 1);
Button *button = &g_array_index(buttons, Button, i);
fprintf(fp, "button = new\n");
if (strlen(gtk_entry_get_text(GTK_ENTRY(button->button_icon))))
fprintf(fp, "button_icon = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_icon)));
if (gtk_entry_get_text(GTK_ENTRY(button->button_text)))
fprintf(fp, "button_text = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_text)));
if (strlen(gtk_entry_get_text(GTK_ENTRY(button->button_tooltip))))
fprintf(fp, "button_tooltip = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_tooltip)));
fprintf(fp, "button_lclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_left_command)));
fprintf(fp, "button_rclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_right_command)));
fprintf(fp, "button_mclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_mclick_command)));
fprintf(fp, "button_uwheel_command = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_uwheel_command)));
fprintf(fp, "button_dwheel_command = %s\n", gtk_entry_get_text(GTK_ENTRY(button->button_dwheel_command)));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button->button_font_set)))
fprintf(fp, "button_font = %s\n", gtk_font_button_get_font_name(GTK_FONT_BUTTON(button->button_font)));
GdkColor color;
gtk_color_button_get_color(GTK_COLOR_BUTTON(button->button_font_color), &color);
config_write_color(fp,
"button_font_color",
color,
gtk_color_button_get_alpha(GTK_COLOR_BUTTON(button->button_font_color)) * 100 / 0xffff);
fprintf(fp,
"button_padding = %d %d\n",
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(button->button_padding_x)),
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(button->button_padding_y)));
fprintf(fp, "button_background_id = %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(button->button_background)));
fprintf(fp,
"button_centered = %d\n",
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button->button_centered)) ? 1 : 0);
fprintf(fp,
"button_max_icon_size = %d\n",
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(button->button_max_icon_size)));
fprintf(fp, "\n");
}
}
void config_write_tooltip(FILE *fp)
{
fprintf(fp, "#-------------------------------------\n");
@@ -939,6 +1003,7 @@ void config_save_file(const char *path)
config_write_battery(fp);
config_write_separator(fp);
config_write_execp(fp);
config_write_button(fp);
config_write_tooltip(fp);
checksum = checksum_txt(fp);
@@ -1294,20 +1359,20 @@ void add_entry(char *key, char *value)
} else if (strcmp(key, "panel_monitor") == 0) {
if (strcmp(value, "all") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 0);
else if (strcmp(value, "1") == 0)
else if (strcmp(value, "primary") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 1);
else if (strcmp(value, "2") == 0)
else if (strcmp(value, "1") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 2);
else if (strcmp(value, "3") == 0)
else if (strcmp(value, "2") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 3);
else if (strcmp(value, "4") == 0)
else if (strcmp(value, "3") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 4);
else if (strcmp(value, "5") == 0)
else if (strcmp(value, "4") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 5);
else if (strcmp(value, "6") == 0)
else if (strcmp(value, "5") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 6);
} else if (strcmp(key, "primary_monitor_first") == 0) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel_primary_monitor_first), atoi(value));
else if (strcmp(value, "6") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(panel_combo_monitor), 7);
} else if (strcmp(key, "panel_shrink") == 0) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel_shrink), atoi(value));
}
@@ -1346,12 +1411,18 @@ void add_entry(char *key, char *value)
gtk_spin_button_set_value(GTK_SPIN_BUTTON(battery_alert_if_lower), atof(value));
} else if (strcmp(key, "battery_low_cmd") == 0) {
gtk_entry_set_text(GTK_ENTRY(battery_alert_cmd), value);
} else if (strcmp(key, "battery_full_cmd") == 0) {
gtk_entry_set_text(GTK_ENTRY(battery_alert_full_cmd), value);
} else if (strcmp(key, "bat1_font") == 0) {
gtk_font_button_set_font_name(GTK_FONT_BUTTON(battery_font_line1), value);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(battery_font_line1_set), TRUE);
} else if (strcmp(key, "bat2_font") == 0) {
gtk_font_button_set_font_name(GTK_FONT_BUTTON(battery_font_line2), value);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(battery_font_line2_set), TRUE);
} else if (strcmp(key, "bat1_format") == 0) {
gtk_entry_set_text(GTK_ENTRY(battery_format1), value);
} else if (strcmp(key, "bat2_format") == 0) {
gtk_entry_set_text(GTK_ENTRY(battery_format2), value);
} else if (strcmp(key, "battery_font_color") == 0) {
extract_values(value, &value1, &value2, &value3);
GdkColor col;
@@ -1494,6 +1565,8 @@ void add_entry(char *key, char *value)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(taskbar_hide_inactive_tasks), atoi(value));
} else if (strcmp(key, "taskbar_hide_different_monitor") == 0) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(taskbar_hide_diff_monitor), atoi(value));
} else if (strcmp(key, "taskbar_hide_different_desktop") == 0) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(taskbar_hide_diff_desktop), atoi(value));
} else if (strcmp(key, "taskbar_always_show_all_desktop_tasks") == 0) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(taskbar_always_show_all_desktop_tasks), atoi(value));
} else if (strcmp(key, "taskbar_name_padding") == 0) {
@@ -1690,18 +1763,20 @@ void add_entry(char *key, char *value)
} else if (strcmp(key, "systray_icon_size") == 0) {
gtk_spin_button_set_value(GTK_SPIN_BUTTON(systray_icon_size), atoi(value));
} else if (strcmp(key, "systray_monitor") == 0) {
if (strcmp(value, "1") == 0)
if (strcmp(value, "primary") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(systray_monitor), 0);
else if (strcmp(value, "2") == 0)
else if (strcmp(value, "1") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(systray_monitor), 1);
else if (strcmp(value, "3") == 0)
else if (strcmp(value, "2") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(systray_monitor), 2);
else if (strcmp(value, "4") == 0)
else if (strcmp(value, "3") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(systray_monitor), 3);
else if (strcmp(value, "5") == 0)
else if (strcmp(value, "4") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(systray_monitor), 4);
else if (strcmp(value, "6") == 0)
else if (strcmp(value, "5") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(systray_monitor), 5);
else if (strcmp(value, "6") == 0)
gtk_combo_box_set_active(GTK_COMBO_BOX(systray_monitor), 6);
} else if (strcmp(key, "systray_icon_asb") == 0) {
extract_values(value, &value1, &value2, &value3);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(systray_icon_opacity), atoi(value1));
@@ -1888,6 +1963,51 @@ void add_entry(char *key, char *value)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_get_last()->execp_centered), atoi(value));
}
/* Button */
else if (strcmp(key, "button") == 0) {
button_create_new();
} else if (strcmp(key, "button_icon") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_icon), value);
} else if (strcmp(key, "button_text") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_text), value);
} else if (strcmp(key, "button_tooltip") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_tooltip), value);
} else if (strcmp(key, "button_lclick_command") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_left_command), value);
} else if (strcmp(key, "button_rclick_command") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_right_command), value);
} else if (strcmp(key, "button_mclick_command") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_mclick_command), value);
} else if (strcmp(key, "button_uwheel_command") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_uwheel_command), value);
} else if (strcmp(key, "button_dwheel_command") == 0) {
gtk_entry_set_text(GTK_ENTRY(button_get_last()->button_dwheel_command), value);
} else if (strcmp(key, "button_font") == 0) {
gtk_font_button_set_font_name(GTK_FONT_BUTTON(button_get_last()->button_font), value);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_get_last()->button_font_set), TRUE);
} else if (strcmp(key, "button_font_color") == 0) {
extract_values(value, &value1, &value2, &value3);
GdkColor col;
hex2gdk(value1, &col);
gtk_color_button_set_color(GTK_COLOR_BUTTON(button_get_last()->button_font_color), &col);
if (value2) {
int alpha = atoi(value2);
gtk_color_button_set_alpha(GTK_COLOR_BUTTON(button_get_last()->button_font_color), (alpha * 65535) / 100);
}
} else if (strcmp(key, "button_padding") == 0) {
extract_values(value, &value1, &value2, &value3);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(button_get_last()->button_padding_x), atoi(value1));
if (value2)
gtk_spin_button_set_value(GTK_SPIN_BUTTON(button_get_last()->button_padding_y), atoi(value2));
} else if (strcmp(key, "button_background_id") == 0) {
int id = background_index_safe(atoi(value));
gtk_combo_box_set_active(GTK_COMBO_BOX(button_get_last()->button_background), id);
} else if (strcmp(key, "button_centered") == 0) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_get_last()->button_centered), atoi(value));
} else if (strcmp(key, "button_max_icon_size") == 0) {
gtk_spin_button_set_value(GTK_SPIN_BUTTON(button_get_last()->button_max_icon_size), atoi(value));
}
if (value1)
free(value1);
if (value2)

View File

@@ -37,8 +37,13 @@ GtkWidget *create_view()
GtkTreeViewColumn *col;
GtkCellRenderer *renderer;
theme_list_store =
gtk_list_store_new(NB_COL, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN);
theme_list_store = gtk_list_store_new(NB_COL,
G_TYPE_STRING,
G_TYPE_STRING,
GDK_TYPE_PIXBUF,
G_TYPE_INT,
G_TYPE_INT,
G_TYPE_BOOLEAN);
GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(theme_list_store));
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
@@ -140,20 +145,34 @@ void theme_list_append(const gchar *path)
GtkTreeIter iter;
gtk_list_store_append(theme_list_store, &iter);
gchar *name = strrchr(path, '/') + 1;
gchar *name, *dir;
gchar *dir = g_strdup(path);
if (strchr(path, '/')) {
name = strrchr(path, '/') + 1;
dir = g_strdup(path);
strrchr(dir, '/')[0] = 0;
} else {
name = (gchar*)path;
dir = g_strdup(".");
}
char *suffix = contract_tilde(dir);
g_free(dir);
gchar *display_name = g_strdup_printf("%s\n(%s)", name, suffix);
gtk_list_store_set(theme_list_store, &iter, COL_THEME_FILE, path, COL_THEME_NAME, display_name, COL_FORCE_REFRESH, FALSE, -1);
gtk_list_store_set(theme_list_store,
&iter,
COL_THEME_FILE,
path,
COL_THEME_NAME,
display_name,
COL_FORCE_REFRESH,
FALSE,
-1);
g_free(display_name);
g_free(suffix);
}
gboolean update_snapshot()
gboolean update_snapshot(gpointer ignored)
{
{
gchar *tint2_cache_dir = g_build_filename(g_get_user_cache_dir(), "tint2", NULL);

View File

@@ -5,13 +5,15 @@
extern GtkWidget *g_theme_view;
extern GtkListStore *theme_list_store;
enum { COL_THEME_FILE = 0,
enum {
COL_THEME_FILE = 0,
COL_THEME_NAME,
COL_SNAPSHOT,
COL_WIDTH,
COL_HEIGHT,
COL_FORCE_REFRESH,
NB_COL, };
NB_COL,
};
GtkWidget *create_view();

View File

@@ -113,3 +113,4 @@ Exec=tint2conf
Icon=tint2conf
Terminal=false
Categories=Settings;DesktopSettings;
MimeType=application/x-tint2-theme

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-tint2-theme">
<comment xml:lang="en">tint2 theme file</comment>
<sub-class-of type="text/plain"/>
<glob pattern="*tint2rc"/>
</mime-type>
</mime-info>

View File

@@ -1,411 +1,261 @@
#include "tint2rc.h"
unsigned char themes_tint2rc[] = {
0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x69, 0x6e, 0x74, 0x32,
0x63, 0x6f, 0x6e, 0x66, 0x20, 0x32, 0x36, 0x34, 0x31, 0x20, 0x2d, 0x2d,
0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x53, 0x65, 0x65, 0x20, 0x68, 0x74, 0x74,
0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e,
0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x39, 0x30, 0x30, 0x30, 0x2f, 0x74, 0x69,
0x6e, 0x74, 0x32, 0x2f, 0x77, 0x69, 0x6b, 0x69, 0x73, 0x2f, 0x43, 0x6f,
0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20,
0x0a, 0x23, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75,
0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2e, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x0a, 0x23, 0x20, 0x42,
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x31, 0x3a,
0x20, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x65, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65,
0x72, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0x0a,
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x20, 0x36, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x20, 0x33, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b,
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x20, 0x36, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64,
0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76,
0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x20, 0x33, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65,
0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x20, 0x36, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73,
0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x20, 0x33, 0x30, 0x0a, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x32, 0x3a, 0x20, 0x44, 0x65, 0x66,
0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2c, 0x20, 0x49,
0x63, 0x6f, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x74, 0x61, 0x73,
0x6b, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20,
0x34, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64,
0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20,
0x3d, 0x20, 0x23, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x20, 0x32, 0x30,
0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x20, 0x3d, 0x20, 0x23, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x20,
0x33, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e,
0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65,
0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x20,
0x32, 0x32, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20,
0x23, 0x65, 0x61, 0x65, 0x61, 0x65, 0x61, 0x20, 0x34, 0x34, 0x0a, 0x62,
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20,
0x3d, 0x20, 0x23, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x20, 0x34, 0x0a,
0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23,
0x65, 0x61, 0x65, 0x61, 0x65, 0x61, 0x20, 0x34, 0x34, 0x0a, 0x0a, 0x23,
0x20, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20,
0x33, 0x3a, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x61,
0x73, 0x6b, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x3d,
0x20, 0x34, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69,
0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x61, 0x63, 0x6b,
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
0x20, 0x3d, 0x20, 0x23, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x20, 0x32,
0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x20, 0x34, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76,
0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
0x20, 0x32, 0x32, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d,
0x20, 0x23, 0x65, 0x61, 0x65, 0x61, 0x65, 0x61, 0x20, 0x34, 0x34, 0x0a,
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64,
0x20, 0x3d, 0x20, 0x23, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x20, 0x34,
0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20,
0x23, 0x65, 0x61, 0x65, 0x61, 0x65, 0x61, 0x20, 0x34, 0x34, 0x0a, 0x0a,
0x23, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x20, 0x34, 0x3a, 0x20, 0x55, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74,
0x61, 0x73, 0x6b, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20,
0x3d, 0x20, 0x34, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77,
0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x34, 0x34, 0x30, 0x30, 0x20,
0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x37, 0x37,
0x33, 0x33, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f,
0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x63, 0x63, 0x37,
0x37, 0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64,
0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76,
0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x37, 0x37, 0x33, 0x33,
0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72,
0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x35, 0x35, 0x35,
0x35, 0x35, 0x35, 0x20, 0x34, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73,
0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x37, 0x37, 0x33, 0x33,
0x20, 0x31, 0x30, 0x30, 0x0a, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x63, 0x6b,
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x35, 0x3a, 0x20, 0x54, 0x6f,
0x6f, 0x6c, 0x74, 0x69, 0x70, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65,
0x64, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62,
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x61,
0x61, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66,
0x66, 0x66, 0x66, 0x61, 0x61, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f,
0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68,
0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f,
0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x66,
0x66, 0x66, 0x66, 0x61, 0x61, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f,
0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70,
0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x0a, 0x23, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x0a, 0x23, 0x20, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x0a, 0x70, 0x61, 0x6e,
0x65, 0x6c, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x4c,
0x54, 0x53, 0x43, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x69,
0x7a, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x25, 0x20, 0x33, 0x30,
0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69,
0x6e, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x70, 0x61, 0x6e, 0x65,
0x6c, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20,
0x32, 0x20, 0x30, 0x20, 0x32, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f,
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69,
0x64, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x77, 0x6d, 0x5f, 0x6d, 0x65, 0x6e,
0x75, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f,
0x64, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x70, 0x61, 0x6e,
0x65, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20,
0x3d, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x63, 0x65, 0x6e,
0x74, 0x65, 0x72, 0x20, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74,
0x61, 0x6c, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x6c, 0x61, 0x79,
0x65, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x70, 0x0a, 0x70, 0x61, 0x6e,
0x65, 0x6c, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x3d,
0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,
0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x72,
0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x68,
0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x61, 0x75, 0x74, 0x6f,
0x68, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x74, 0x69,
0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x61, 0x75,
0x74, 0x6f, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x68, 0x69, 0x64, 0x65, 0x5f,
0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2e,
0x35, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x68,
0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x32, 0x0a, 0x73, 0x74,
0x72, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x3d,
0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65,
0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f,
0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6e,
0x74, 0x32, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74,
0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x20,
0x3d, 0x20, 0x31, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x65, 0x66,
0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x66, 0x6f,
0x6e, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x3d, 0x20,
0x30, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x76, 0x65,
0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x61, 0x73, 0x62, 0x20, 0x3d,
0x20, 0x31, 0x30, 0x30, 0x20, 0x30, 0x20, 0x31, 0x30, 0x0a, 0x6d, 0x6f,
0x75, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f,
0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x61, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x31,
0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23,
0x20, 0x54, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x0a, 0x74, 0x61, 0x73,
0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20,
0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74,
0x6f, 0x70, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x70,
0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x30,
0x20, 0x32, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x62,
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64,
0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72,
0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b,
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20,
0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61,
0x6d, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62,
0x61, 0x72, 0x5f, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x61, 0x63,
0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x3d,
0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x68,
0x69, 0x64, 0x65, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e,
0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20,
0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x61, 0x6c,
0x77, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x61, 0x6c,
0x6c, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x61,
0x73, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b,
0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x64,
0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x34, 0x20, 0x32, 0x0a, 0x74,
0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f,
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69,
0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61,
0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76,
0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b,
0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x6e,
0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x65,
0x33, 0x65, 0x33, 0x65, 0x33, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x74, 0x61,
0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x61,
0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66,
0x66, 0x66, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62,
0x61, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74,
0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f,
0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6e, 0x65,
0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x20,
0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23,
0x20, 0x54, 0x61, 0x73, 0x6b, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74,
0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x74, 0x61, 0x73, 0x6b,
0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x74, 0x61,
0x73, 0x6b, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20,
0x3d, 0x20, 0x31, 0x0a, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6e,
0x62, 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x3d,
0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b,
0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x73, 0x69, 0x7a,
0x65, 0x20, 0x3d, 0x20, 0x31, 0x35, 0x30, 0x20, 0x33, 0x35, 0x0a, 0x74,
0x61, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20,
0x3d, 0x20, 0x32, 0x20, 0x32, 0x20, 0x34, 0x0a, 0x74, 0x61, 0x73, 0x6b,
0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x31,
0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66,
0x66, 0x66, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f,
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69,
0x64, 0x20, 0x3d, 0x20, 0x32, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x61,
0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72,
0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x33, 0x0a,
0x74, 0x61, 0x73, 0x6b, 0x5f, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x5f,
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69,
0x64, 0x20, 0x3d, 0x20, 0x34, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69,
0x63, 0x6f, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d,
0x20, 0x32, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x66,
0x74, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x5f, 0x69,
0x63, 0x6f, 0x6e, 0x69, 0x66, 0x79, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65,
0x5f, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f,
0x6e, 0x65, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x0a, 0x6d,
0x6f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x5f,
0x75, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x0a,
0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c,
0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x63, 0x6f, 0x6e,
0x69, 0x66, 0x79, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x53, 0x79,
0x73, 0x74, 0x65, 0x6d, 0x20, 0x74, 0x72, 0x61, 0x79, 0x20, 0x28, 0x6e,
0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
0x61, 0x72, 0x65, 0x61, 0x29, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x72, 0x61,
0x79, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20,
0x30, 0x20, 0x34, 0x20, 0x32, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x72, 0x61,
0x79, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x73, 0x79, 0x73, 0x74,
0x72, 0x61, 0x79, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61,
0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x73, 0x79, 0x73,
0x74, 0x72, 0x61, 0x79, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73, 0x69,
0x7a, 0x65, 0x20, 0x3d, 0x20, 0x32, 0x34, 0x0a, 0x73, 0x79, 0x73, 0x74,
0x72, 0x61, 0x79, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x61, 0x73, 0x62,
0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x73,
0x79, 0x73, 0x74, 0x72, 0x61, 0x79, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,
0x6f, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23,
0x20, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x0a, 0x6c, 0x61,
0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69,
0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x34, 0x20, 0x32, 0x0a, 0x6c,
0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x63, 0x6b,
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20,
0x30, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69,
0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x6c, 0x61,
0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f,
0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x32, 0x34, 0x0a, 0x6c, 0x61,
0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f,
0x61, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x20, 0x30, 0x20,
0x30, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69,
0x63, 0x6f, 0x6e, 0x5f, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x5f, 0x6f, 0x76,
0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x73,
0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66,
0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x31,
0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x6f,
0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x6c, 0x61,
0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f,
0x61, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73,
0x68, 0x61, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x69, 0x6e, 0x74, 0x32, 0x63,
0x6f, 0x6e, 0x66, 0x2e, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a,
0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65,
0x6d, 0x5f, 0x61, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72,
0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x65,
0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x74, 0x69, 0x6e, 0x74, 0x32, 0x63, 0x6f, 0x6e, 0x66, 0x2e,
0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61, 0x75, 0x6e,
0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x70,
0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73, 0x68, 0x61,
0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6f, 0x78, 0x2e,
0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61, 0x75, 0x6e,
0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x70,
0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73, 0x68, 0x61,
0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x63, 0x65, 0x77, 0x65, 0x61, 0x73, 0x65,
0x6c, 0x2e, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61,
0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f,
0x61, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73,
0x68, 0x61, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
0x75, 0x6d, 0x2d, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x2e, 0x64,
0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63,
0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x70, 0x70,
0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73, 0x68, 0x61, 0x72,
0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2d, 0x63, 0x68,
0x72, 0x6f, 0x6d, 0x65, 0x2e, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70,
0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b,
0x0a, 0x74, 0x69, 0x6d, 0x65, 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61,
0x74, 0x20, 0x3d, 0x20, 0x25, 0x48, 0x3a, 0x25, 0x4d, 0x0a, 0x74, 0x69,
0x6d, 0x65, 0x32, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d,
0x20, 0x25, 0x41, 0x20, 0x25, 0x64, 0x20, 0x25, 0x42, 0x0a, 0x74, 0x69,
0x6d, 0x65, 0x31, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65,
0x20, 0x3d, 0x20, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x32, 0x5f, 0x74, 0x69,
0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c,
0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x20, 0x31, 0x30, 0x30, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70,
0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x30,
0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30,
0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x74,
0x69, 0x70, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f,
0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65,
0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x5f, 0x6c, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d,
0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x5f, 0x72, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d,
0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x72, 0x61, 0x67, 0x65,
0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x63, 0x6c, 0x69, 0x63,
0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20,
0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x77, 0x68, 0x65, 0x65,
0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20,
0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x77, 0x68, 0x65, 0x65,
0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20,
0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x74, 0x74, 0x65,
0x72, 0x79, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x74,
0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62,
0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x73,
0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x0a, 0x62,
0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x63,
0x6d, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2d,
0x73, 0x65, 0x6e, 0x64, 0x20, 0x22, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72,
0x79, 0x20, 0x6c, 0x6f, 0x77, 0x22, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65,
0x72, 0x79, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20,
0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f,
0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x20,
0x30, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x61,
0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20,
0x3d, 0x20, 0x30, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f,
0x68, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x31, 0x0a, 0x62,
0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x63, 0x6c, 0x69, 0x63,
0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20,
0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x63, 0x6c,
0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20,
0x3d, 0x20, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6d,
0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
0x64, 0x20, 0x3d, 0x20, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79,
0x5f, 0x75, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d,
0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65,
0x72, 0x79, 0x5f, 0x64, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x5f, 0x63, 0x6f,
0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x61, 0x63, 0x5f,
0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6d,
0x64, 0x20, 0x3d, 0x20, 0x0a, 0x61, 0x63, 0x5f, 0x64, 0x69, 0x73, 0x63,
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6d, 0x64,
0x20, 0x3d, 0x20, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x54, 0x6f,
0x6f, 0x6c, 0x74, 0x69, 0x70, 0x0a, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69,
0x70, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f,
0x75, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x0a, 0x74, 0x6f, 0x6f,
0x6c, 0x74, 0x69, 0x70, 0x5f, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x74, 0x69,
0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x31, 0x0a,
0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x70, 0x61, 0x64, 0x64,
0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x32, 0x0a, 0x74, 0x6f,
0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72,
0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x35, 0x0a,
0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x66, 0x6f, 0x6e, 0x74,
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x32, 0x32,
0x32, 0x32, 0x32, 0x32, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x0a
};
unsigned char themes_tint2rc[] =
{0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
0x74, 0x69, 0x6e, 0x74, 0x32, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x32, 0x36, 0x34, 0x31, 0x20, 0x2d, 0x2d, 0x2d, 0x2d,
0x0a, 0x23, 0x20, 0x53, 0x65, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x6c,
0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x39, 0x30, 0x30, 0x30, 0x2f, 0x74, 0x69, 0x6e, 0x74, 0x32, 0x2f,
0x77, 0x69, 0x6b, 0x69, 0x73, 0x2f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72,
0x20, 0x0a, 0x23, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x23, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x42,
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72,
0x6f, 0x75, 0x6e, 0x64, 0x20, 0x31, 0x3a, 0x20, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x65, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68,
0x20, 0x3d, 0x20, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x36, 0x30, 0x0a, 0x62, 0x6f, 0x72,
0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x20, 0x33, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x36,
0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65,
0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x33, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b,
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65,
0x64, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x36, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64,
0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20,
0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x33, 0x30, 0x0a, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x32, 0x3a, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x61,
0x73, 0x6b, 0x2c, 0x20, 0x49, 0x63, 0x6f, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x0a,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x34, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,
0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e,
0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x20, 0x32,
0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x37,
0x37, 0x37, 0x37, 0x37, 0x37, 0x20, 0x33, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x61,
0x61, 0x61, 0x61, 0x20, 0x32, 0x32, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x65, 0x61, 0x65, 0x61, 0x65, 0x61, 0x20, 0x34, 0x34,
0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70,
0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x20, 0x34, 0x0a,
0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65,
0x64, 0x20, 0x3d, 0x20, 0x23, 0x65, 0x61, 0x65, 0x61, 0x65, 0x61, 0x20, 0x34, 0x34, 0x0a, 0x0a, 0x23, 0x20, 0x42,
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x33, 0x3a, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65,
0x20, 0x74, 0x61, 0x73, 0x6b, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x34, 0x0a, 0x62,
0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x37, 0x37,
0x37, 0x37, 0x37, 0x37, 0x20, 0x32, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, 0x34, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b,
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20,
0x3d, 0x20, 0x23, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x20, 0x32, 0x32, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x65, 0x61, 0x65,
0x61, 0x65, 0x61, 0x20, 0x34, 0x34, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x35, 0x35, 0x35,
0x35, 0x35, 0x35, 0x20, 0x34, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f,
0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x65, 0x61, 0x65, 0x61, 0x65, 0x61, 0x20, 0x34,
0x34, 0x0a, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x34, 0x3a, 0x20,
0x55, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64,
0x20, 0x3d, 0x20, 0x34, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d,
0x20, 0x31, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x34, 0x34, 0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64,
0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x37, 0x37, 0x33, 0x33, 0x20,
0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x63, 0x63, 0x37, 0x37, 0x30, 0x30, 0x20, 0x31,
0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76,
0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x61, 0x37, 0x37, 0x33, 0x33, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61,
0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73,
0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x20, 0x34, 0x0a, 0x62, 0x6f, 0x72,
0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d,
0x20, 0x23, 0x61, 0x61, 0x37, 0x37, 0x33, 0x33, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x0a, 0x23, 0x20, 0x42, 0x61, 0x63,
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x35, 0x3a, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x0a,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f,
0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e,
0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x61, 0x61, 0x20, 0x31,
0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66,
0x66, 0x66, 0x66, 0x61, 0x61, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f,
0x6c, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x61,
0x61, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f,
0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31,
0x30, 0x30, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f,
0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x4c, 0x54, 0x53, 0x43, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f,
0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x25, 0x20, 0x33, 0x30, 0x0a, 0x70, 0x61, 0x6e, 0x65,
0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x70, 0x61, 0x6e, 0x65,
0x6c, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x30, 0x20, 0x32, 0x0a, 0x70,
0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20,
0x3d, 0x20, 0x31, 0x0a, 0x77, 0x6d, 0x5f, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x70, 0x61, 0x6e,
0x65, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x70,
0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x63, 0x65,
0x6e, 0x74, 0x65, 0x72, 0x20, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x0a, 0x70, 0x61, 0x6e,
0x65, 0x6c, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x70, 0x0a, 0x70, 0x61, 0x6e, 0x65,
0x6c, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x70, 0x72, 0x69,
0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20,
0x3d, 0x20, 0x30, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x68, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x61, 0x75,
0x74, 0x6f, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
0x20, 0x3d, 0x20, 0x30, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x68, 0x69, 0x64, 0x65, 0x5f,
0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x68,
0x69, 0x64, 0x65, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x32, 0x0a, 0x73, 0x74, 0x72, 0x75,
0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73,
0x69, 0x7a, 0x65, 0x0a, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6e, 0x61,
0x6d, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6e, 0x74, 0x32, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f,
0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x6d, 0x6f,
0x75, 0x73, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x66, 0x6f, 0x6e,
0x74, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f,
0x68, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x61, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x31, 0x30,
0x30, 0x20, 0x30, 0x20, 0x31, 0x30, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65,
0x64, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x61, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x20, 0x30, 0x20,
0x30, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62,
0x61, 0x72, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x64, 0x65,
0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69,
0x6e, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x30, 0x20, 0x32, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f,
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74,
0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61,
0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f,
0x68, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73,
0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x64,
0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20,
0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x68,
0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b,
0x73, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f,
0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x34, 0x20, 0x32, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62,
0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f,
0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f,
0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x65, 0x33, 0x65, 0x33,
0x65, 0x33, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20,
0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62,
0x61, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20,
0x3d, 0x20, 0x30, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x61, 0x72, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72,
0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x6c, 0x69,
0x67, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x0a,
0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f,
0x69, 0x63, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65,
0x72, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x62, 0x5f, 0x6f,
0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x74, 0x61,
0x73, 0x6b, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x31,
0x35, 0x30, 0x20, 0x33, 0x35, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20,
0x3d, 0x20, 0x32, 0x20, 0x32, 0x20, 0x34, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69,
0x70, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x74, 0x61,
0x73, 0x6b, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20,
0x32, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67,
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x33, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x75,
0x72, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64,
0x20, 0x3d, 0x20, 0x34, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64,
0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x32, 0x0a,
0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65,
0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x69, 0x66, 0x79, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x6d, 0x69, 0x64, 0x64,
0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x0a, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x63,
0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x0a, 0x6d, 0x6f,
0x75, 0x73, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x3d, 0x20, 0x69,
0x63, 0x6f, 0x6e, 0x69, 0x66, 0x79, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x74,
0x72, 0x61, 0x79, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61,
0x72, 0x65, 0x61, 0x29, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x72, 0x61, 0x79, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e,
0x67, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x34, 0x20, 0x32, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x72, 0x61, 0x79, 0x5f, 0x62,
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x73, 0x79,
0x73, 0x74, 0x72, 0x61, 0x79, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64,
0x69, 0x6e, 0x67, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x72, 0x61, 0x79, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73, 0x69,
0x7a, 0x65, 0x20, 0x3d, 0x20, 0x32, 0x34, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x72, 0x61, 0x79, 0x5f, 0x69, 0x63, 0x6f,
0x6e, 0x5f, 0x61, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x73, 0x79, 0x73,
0x74, 0x72, 0x61, 0x79, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x0a, 0x23,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,
0x23, 0x20, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72,
0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x34, 0x20, 0x32, 0x0a, 0x6c, 0x61,
0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69,
0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e,
0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a,
0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20,
0x3d, 0x20, 0x32, 0x34, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f,
0x61, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63,
0x68, 0x65, 0x72, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72,
0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x6e, 0x6f,
0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x6c, 0x61, 0x75,
0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x6c,
0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x70, 0x70, 0x20, 0x3d, 0x20,
0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x69, 0x6e, 0x74, 0x32, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x64, 0x65, 0x73, 0x6b,
0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61,
0x70, 0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x73, 0x68, 0x61,
0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x69, 0x6e,
0x74, 0x32, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61, 0x75, 0x6e,
0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73,
0x72, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6f, 0x78, 0x2e, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x6c,
0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x70, 0x70, 0x20, 0x3d, 0x20,
0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x63, 0x65, 0x77, 0x65, 0x61, 0x73, 0x65, 0x6c, 0x2e, 0x64, 0x65, 0x73, 0x6b,
0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61,
0x70, 0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70,
0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2d,
0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x6c, 0x61, 0x75,
0x6e, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x2f, 0x75,
0x73, 0x72, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2d, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x2e, 0x64, 0x65,
0x73, 0x6b, 0x74, 0x6f, 0x70, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x74, 0x69, 0x6d,
0x65, 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x25, 0x48, 0x3a, 0x25, 0x4d, 0x0a, 0x74,
0x69, 0x6d, 0x65, 0x32, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x25, 0x41, 0x20, 0x25, 0x64,
0x20, 0x25, 0x42, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x31, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x20,
0x3d, 0x20, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x32, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x3d,
0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20,
0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b,
0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x30, 0x0a, 0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30,
0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x0a, 0x63,
0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f,
0x6e, 0x65, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6c, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f,
0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x63,
0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x72, 0x61, 0x67,
0x65, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d,
0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x77, 0x68, 0x65, 0x65, 0x6c,
0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64,
0x77, 0x68, 0x65, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x0a, 0x23,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,
0x23, 0x20, 0x42, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x74,
0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f,
0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x0a, 0x62, 0x61, 0x74,
0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6d, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x74, 0x69,
0x66, 0x79, 0x2d, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x22, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x20, 0x6c, 0x6f,
0x77, 0x22, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c,
0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x62, 0x61,
0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x30,
0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x68, 0x69, 0x64,
0x65, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x31, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x63, 0x6c,
0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x62, 0x61, 0x74, 0x74,
0x65, 0x72, 0x79, 0x5f, 0x72, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20,
0x3d, 0x20, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6d, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x63,
0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x75,
0x77, 0x68, 0x65, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x62, 0x61,
0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x64, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
0x64, 0x20, 0x3d, 0x20, 0x0a, 0x61, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63,
0x6d, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x61, 0x63, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
0x65, 0x64, 0x5f, 0x63, 0x6d, 0x64, 0x20, 0x3d, 0x20, 0x0a, 0x0a, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x74,
0x69, 0x70, 0x0a, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x74, 0x69, 0x6d,
0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x0a, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f,
0x68, 0x69, 0x64, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x31, 0x0a,
0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x32,
0x20, 0x32, 0x0a, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
0x6e, 0x64, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x35, 0x0a, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x5f, 0x66,
0x6f, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x23, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
0x20, 0x31, 0x30, 0x30, 0x0a, 0x0a};
unsigned int themes_tint2rc_len = 4870;

View File

@@ -883,6 +883,180 @@ void area_dump_geometry(Area *area, int indent)
}
}
void area_compute_text_geometry(Area *area,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc,
int *line1_height_ink,
int *line1_height,
int *line1_width,
int *line2_height_ink,
int *line2_height,
int *line2_width)
{
Panel *panel = (Panel *)area->panel;
int available_w, available_h;
if (panel_horizontal) {
available_w = panel->area.width;
available_h = area->height - 2 * area->paddingy - left_right_border_width(area);
} else {
available_w = area->width - 2 * area->paddingxlr - left_right_border_width(area);
available_h = panel->area.height;
}
if (line1 && line1[0])
get_text_size2(line1_font_desc,
line1_height_ink,
line1_height,
line1_width,
available_h,
available_w,
line1,
strlen(line1),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
else
*line1_width = *line1_height_ink = *line1_height = 0;
if (line2 && line2[0])
get_text_size2(line2_font_desc,
line2_height_ink,
line2_height,
line2_width,
available_h,
available_w,
line2,
strlen(line2),
PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE,
FALSE);
else
*line2_width = *line2_height_ink = *line2_height = 0;
}
int text_area_compute_desired_size(Area *area,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc)
{
int line1_height_ink, line1_height, line1_width, line2_height_ink, line2_height, line2_width;
area_compute_text_geometry(area,
line1,
line2,
line1_font_desc,
line2_font_desc,
&line1_height_ink,
&line1_height,
&line1_width,
&line2_height_ink,
&line2_height,
&line2_width);
if (panel_horizontal) {
int new_size = MAX(line1_width, line2_width) + 2 * area->paddingxlr + left_right_border_width(area);
return new_size;
} else {
int new_size = line1_height + line2_height + 2 * area->paddingxlr + top_bottom_border_width(area);
return new_size;
}
}
gboolean resize_text_area(Area *area,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc,
int *line1_posy,
int *line2_posy)
{
gboolean result = FALSE;
schedule_redraw(area);
int line1_height_ink, line1_height, line1_width;
int line2_height_ink, line2_height, line2_width;
area_compute_text_geometry(area,
line1,
line2,
line1_font_desc,
line2_font_desc,
&line1_height_ink,
&line1_height,
&line1_width,
&line2_height_ink,
&line2_height,
&line2_width);
int new_size = text_area_compute_desired_size(area,
line1,
line2,
line1_font_desc,
line2_font_desc);
if (panel_horizontal) {
if (new_size > area->width || new_size < (area->width - 6)) {
// we try to limit the number of resizes
area->width = new_size + 1;
*line1_posy = (area->height - line1_height) / 2;
if (line2) {
*line1_posy -= (line2_height) / 2;
*line2_posy = *line1_posy + line1_height;
}
result = TRUE;
}
} else {
if (new_size != area->height) {
// we try to limit the number of resizes
area->height = new_size;
*line1_posy = (area->height - line1_height) / 2;
if (line2) {
*line1_posy -= (line2_height) / 2;
*line2_posy = *line1_posy + line1_height;
}
result = TRUE;
}
}
return result;
}
void draw_text_area(Area *area,
cairo_t *c,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc,
int line1_posy,
int line2_posy,
Color *color)
{
PangoLayout *layout = pango_cairo_create_layout(c);
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
pango_layout_set_width(layout, area->width * PANGO_SCALE);
cairo_set_source_rgba(c, color->rgb[0], color->rgb[1], color->rgb[2], color->alpha);
if (line1 && line1[0]) {
pango_layout_set_font_description(layout, line1_font_desc);
pango_layout_set_text(layout, line1, strlen(line1));
pango_cairo_update_layout(c, layout);
draw_text(layout, c, 0, line1_posy, color, ((Panel *)area->panel)->font_shadow);
}
if (line2 && line2[0]) {
pango_layout_set_font_description(layout, line2_font_desc);
pango_layout_set_indent(layout, 0);
pango_layout_set_text(layout, line2, strlen(line2));
pango_cairo_update_layout(c, layout);
draw_text(layout, c, 0, line2_posy, color, ((Panel *)area->panel)->font_shadow);
}
g_object_unref(layout);
}
Area *compute_element_area(Area *area, Element element)
{
if (element == ELEMENT_SELF)

View File

@@ -263,6 +263,39 @@ int relayout_with_constraint(Area *a, int maximum_size);
int compute_desired_size(Area *a);
int container_compute_desired_size(Area *a);
void area_compute_text_geometry(Area *area,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc,
int *line1_height_ink,
int *line1_height,
int *line1_width,
int *line2_height_ink,
int *line2_height,
int *line2_width);
int text_area_compute_desired_size(Area *area,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc);
gboolean resize_text_area(Area *area,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc,
int *line1_posy,
int *line2_posy);
void draw_text_area(Area *area,
cairo_t *c,
const char *line1,
const char *line2,
PangoFontDescription *line1_font_desc,
PangoFontDescription *line2_font_desc,
int line1_posy,
int line2_posy,
Color *color);
int left_border_width(Area *a);
int right_border_width(Area *a);
int left_right_border_width(Area *a);
@@ -330,4 +363,7 @@ void mouse_out();
void update_gradient(GradientInstance *gi);
void update_dependent_gradients(Area *a);
gboolean area_is_first(void *obj);
gboolean area_is_last(void *obj);
#endif

View File

@@ -1,2 +1 @@
#include "color.h"

View File

@@ -44,6 +44,8 @@
#include <librsvg/rsvg.h>
#endif
#include "../panel.h"
void copy_file(const char *path_src, const char *path_dest)
{
if (g_str_equal(path_src, path_dest))
@@ -99,20 +101,177 @@ gboolean parse_line(const char *line, char **key, char **value)
return TRUE;
}
void tint_exec(const char *command)
extern char *config_path;
int setenvd(const char *name, const int value)
{
if (command) {
if (fork() == 0) {
// change for the fork the signal mask
// sigset_t sigset;
// sigprocmask(SIG_SETMASK, &sigset, 0);
// sigprocmask(SIG_UNBLOCK, &sigset, 0);
char buf[256];
sprintf(buf, "%d", value);
return setenv(name, buf, 1);
}
#ifndef TINT2CONF
pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time time, Area *area, int x, int y)
{
if (!command || strlen(command) == 0)
return -1;
if (area) {
Panel *panel = (Panel *)area->panel;
int aligned_x, aligned_y, aligned_x1, aligned_y1, aligned_x2, aligned_y2;
int panel_x1, panel_x2, panel_y1, panel_y2;
if (panel_horizontal) {
if (area_is_first(area))
aligned_x1 = panel->posx;
else
aligned_x1 = panel->posx + area->posx;
if (area_is_last(area))
aligned_x2 = panel->posx + panel->area.width;
else
aligned_x2 = panel->posx + area->posx + area->width;
if (area_is_first(area))
aligned_x = aligned_x1;
else if (area_is_last(area))
aligned_x = aligned_x2;
else
aligned_x = aligned_x1;
if (panel_position & BOTTOM)
aligned_y = panel->posy;
else
aligned_y = panel->posy + panel->area.height;
aligned_y1 = aligned_y2 = aligned_y;
panel_x1 = panel->posx;
panel_x2 = panel->posx + panel->area.width;
panel_y1 = panel_y2 = aligned_y;
} else {
if (area_is_first(area))
aligned_y1 = panel->posy;
else
aligned_y1 = panel->posy + area->posy;
if (area_is_last(area))
aligned_y2 = panel->posy + panel->area.height;
else
aligned_y2 = panel->posy + area->posy + area->height;
if (area_is_first(area))
aligned_y = aligned_y1;
else if (area_is_last(area))
aligned_y = aligned_y2;
else
aligned_y = aligned_y1;
if (panel_position & RIGHT)
aligned_x = panel->posx;
else
aligned_x = panel->posx + panel->area.width;
aligned_x1 = aligned_x2 = aligned_x;
panel_x1 = panel_x2 = aligned_x;
panel_y1 = panel->posy;
panel_y2 = panel->posy + panel->area.height;
}
setenv("TINT2_CONFIG", config_path, 1);
setenvd("TINT2_BUTTON_X", x);
setenvd("TINT2_BUTTON_Y", y);
setenvd("TINT2_BUTTON_W", area->width);
setenvd("TINT2_BUTTON_H", area->height);
setenvd("TINT2_BUTTON_ALIGNED_X", aligned_x);
setenvd("TINT2_BUTTON_ALIGNED_Y", aligned_y);
setenvd("TINT2_BUTTON_ALIGNED_X1", aligned_x1);
setenvd("TINT2_BUTTON_ALIGNED_Y1", aligned_y1);
setenvd("TINT2_BUTTON_ALIGNED_X2", aligned_x2);
setenvd("TINT2_BUTTON_ALIGNED_Y2", aligned_y2);
setenvd("TINT2_BUTTON_PANEL_X1", panel_x1);
setenvd("TINT2_BUTTON_PANEL_Y1", panel_y1);
setenvd("TINT2_BUTTON_PANEL_X2", panel_x2);
setenvd("TINT2_BUTTON_PANEL_Y2", panel_y2);
} else {
setenv("TINT2_CONFIG", config_path, 1);
}
if (!command)
return -1;
if (!tooltip)
tooltip = command;
#if HAVE_SN
SnLauncherContext *ctx = 0;
if (startup_notifications && time) {
ctx = sn_launcher_context_new(server.sn_display, server.screen);
sn_launcher_context_set_name(ctx, tooltip);
sn_launcher_context_set_description(ctx, "Application launched from tint2");
sn_launcher_context_set_binary_name(ctx, command);
sn_launcher_context_initiate(ctx, "tint2", command, time);
}
#endif /* HAVE_SN */
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "Could not fork\n");
} else if (pid == 0) {
// Child process
#if HAVE_SN
if (startup_notifications && time) {
sn_launcher_context_setup_child_process(ctx);
}
#endif // HAVE_SN
// Allow children to exist after parent destruction
setsid();
// Run the command
if (dir)
chdir(dir);
execl("/bin/sh", "/bin/sh", "-c", command, NULL);
_exit(0);
fprintf(stderr, "Failed to execlp %s\n", command);
#if HAVE_SN
if (startup_notifications && time) {
sn_launcher_context_unref(ctx);
}
#endif // HAVE_SN
_exit(1);
} else {
// Parent process
#if HAVE_SN
if (startup_notifications && time) {
g_tree_insert(server.pids, GINT_TO_POINTER(pid), ctx);
}
#endif // HAVE_SN
}
unsetenv("TINT2_CONFIG");
unsetenv("TINT2_BUTTON_X");
unsetenv("TINT2_BUTTON_Y");
unsetenv("TINT2_BUTTON_W");
unsetenv("TINT2_BUTTON_H");
unsetenv("TINT2_BUTTON_ALIGNED_X");
unsetenv("TINT2_BUTTON_ALIGNED_Y");
unsetenv("TINT2_BUTTON_ALIGNED_X1");
unsetenv("TINT2_BUTTON_ALIGNED_Y1");
unsetenv("TINT2_BUTTON_ALIGNED_X2");
unsetenv("TINT2_BUTTON_ALIGNED_Y2");
unsetenv("TINT2_BUTTON_PANEL_X1");
unsetenv("TINT2_BUTTON_PANEL_Y1");
unsetenv("TINT2_BUTTON_PANEL_X2");
unsetenv("TINT2_BUTTON_PANEL_Y2");
return pid;
}
void tint_exec_no_sn(const char *command)
{
tint_exec(command, NULL, NULL, 0, NULL, 0, 0);
}
#endif
char *expand_tilde(const char *s)
{
const gchar *home = g_get_home_dir();
@@ -577,35 +736,38 @@ void clear_pixmap(Pixmap p, int x, int y, int w, int h)
XRenderFreePicture(server.display, pict);
}
void get_text_size2(PangoFontDescription *font,
void get_text_size2(const PangoFontDescription *font,
int *height_ink,
int *height,
int *width,
int panel_height,
int panel_width,
char *text,
int len,
int available_height,
int available_width,
const char *text,
int text_len,
PangoWrapMode wrap,
PangoEllipsizeMode ellipsis,
gboolean markup)
{
PangoRectangle rect_ink, rect;
Pixmap pmap = XCreatePixmap(server.display, server.root_win, panel_height, panel_width, server.depth);
available_width = MAX(0, available_width);
available_height = MAX(0, available_height);
Pixmap pmap = XCreatePixmap(server.display, server.root_win, available_height, available_width, server.depth);
cairo_surface_t *cs = cairo_xlib_surface_create(server.display, pmap, server.visual, panel_height, panel_width);
cairo_surface_t *cs = cairo_xlib_surface_create(server.display, pmap, server.visual, available_height, available_width);
cairo_t *c = cairo_create(cs);
PangoLayout *layout = pango_cairo_create_layout(c);
pango_layout_set_width(layout, panel_width * PANGO_SCALE);
pango_layout_set_height(layout, panel_height * PANGO_SCALE);
pango_layout_set_width(layout, available_width * PANGO_SCALE);
pango_layout_set_height(layout, available_height * PANGO_SCALE);
pango_layout_set_wrap(layout, wrap);
pango_layout_set_ellipsize(layout, ellipsis);
pango_layout_set_font_description(layout, font);
text_len = MAX(0, text_len);
if (!markup)
pango_layout_set_text(layout, text, len);
pango_layout_set_text(layout, text, text_len);
else
pango_layout_set_markup(layout, text, len);
pango_layout_set_markup(layout, text, text_len);
pango_layout_get_pixel_extents(layout, &rect_ink, &rect);
*height_ink = rect_ink.height;

View File

@@ -54,7 +54,9 @@ void extract_values(const char *value, char **value1, char **value2, char **valu
void extract_values_4(const char *value, char **value1, char **value2, char **value3, char **value4);
// Executes a command in a shell.
void tint_exec(const char *command);
pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time time, Area *area, int x, int y);
void tint_exec_no_sn(const char *command);
int setenvd(const char *name, const int value);
// Returns a copy of s in which "~" is expanded to the path to the user's home directory.
// The caller takes ownership of the string.
@@ -93,14 +95,14 @@ void create_heuristic_mask(DATA32 *data, int w, int h);
// Renders the current Imlib image to a drawable. Wrapper around imlib_render_image_on_drawable.
void render_image(Drawable d, int x, int y);
void get_text_size2(PangoFontDescription *font,
void get_text_size2(const PangoFontDescription *font,
int *height_ink,
int *height,
int *width,
int panel_height,
int panel_with,
char *text,
int len,
int available_height,
int available_with,
const char *text,
int text_len,
PangoWrapMode wrap,
PangoEllipsizeMode ellipsis,
gboolean markup);
@@ -138,4 +140,8 @@ GList *g_list_copy_deep(GList *list, GCopyFunc func, gpointer user_data);
#define g_assert_null(expr) g_assert((expr) == NULL)
#endif
#if !GLIB_CHECK_VERSION(2, 40, 0)
#define g_assert_nonnull(expr) g_assert((expr) != NULL)
#endif
#endif

View File

@@ -9,11 +9,7 @@
//////////////////////////////////////////////////////////////////////
// Gradient types read from config options, not associated to any area
typedef enum GradientType {
GRADIENT_VERTICAL = 0,
GRADIENT_HORIZONTAL,
GRADIENT_CENTERED
} GradientType;
typedef enum GradientType { GRADIENT_VERTICAL = 0, GRADIENT_HORIZONTAL, GRADIENT_CENTERED } GradientType;
typedef struct ColorStop {
Color color;
@@ -21,11 +17,7 @@ typedef struct ColorStop {
double offset;
} ColorStop;
typedef enum Element {
ELEMENT_SELF = 0,
ELEMENT_PARENT,
ELEMENT_PANEL
} Element;
typedef enum Element { ELEMENT_SELF = 0, ELEMENT_PARENT, ELEMENT_PANEL } Element;
typedef enum SizeVariable {
SIZE_WIDTH = 0,

View File

@@ -82,6 +82,16 @@ void cleanup_timeout()
}
}
int gettime(struct timespec *tp)
{
// CLOCK_BOOTTIME under Linux is the same as CLOCK_MONOTONIC under *BSD.
#ifdef CLOCK_BOOTTIME
return clock_gettime(CLOCK_BOOTTIME, tp);
#else
return clock_gettime(CLOCK_MONOTONIC, tp);
#endif
}
// Implementation notes for timeouts
//
// The timeouts are kept in a GSList sorted by their expiration time.
@@ -124,7 +134,7 @@ void update_next_timeout()
timeout *t = timeout_list->data;
struct timespec cur_time;
struct timespec next_timeout2 = {.tv_sec = next_timeout.tv_sec, .tv_nsec = next_timeout.tv_usec * 1000};
clock_gettime(CLOCK_MONOTONIC, &cur_time);
gettime(&cur_time);
if (timespec_subtract(&next_timeout2, &t->timeout_expires, &cur_time)) {
next_timeout.tv_sec = 0;
next_timeout.tv_usec = 0;
@@ -141,7 +151,7 @@ void callback_timeout_expired()
struct timespec cur_time;
timeout *t;
while (timeout_list) {
clock_gettime(CLOCK_MONOTONIC, &cur_time);
gettime(&cur_time);
t = timeout_list->data;
if (compare_timespecs(&t->timeout_expires, &cur_time) <= 0) {
// it's time for the callback function
@@ -187,7 +197,7 @@ void add_timeout_intern(int value_msec, int interval_msec, void (*_callback)(),
t->_callback = _callback;
t->arg = arg;
struct timespec cur_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
gettime(&cur_time);
t->timeout_expires = add_msec_to_timespec(cur_time, value_msec);
int can_align = 0;
@@ -343,7 +353,7 @@ void update_multi_timeout_values(multi_timeout_handler *mth)
int next_timeout_msec = interval;
struct timespec cur_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
gettime(&cur_time);
GSList *it = mth->timeout_list;
struct timespec diff_time;
@@ -368,7 +378,7 @@ void callback_multi_timeout(void *arg)
{
multi_timeout_handler *mth = arg;
struct timespec cur_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
gettime(&cur_time);
GSList *it = mth->timeout_list;
while (it) {
timeout *t = it->data;
@@ -407,7 +417,7 @@ void remove_from_multi_timeout(timeout *t)
free(mth);
struct timespec cur_time, diff_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
gettime(&cur_time);
timespec_subtract(&diff_time, &t->timeout_expires, &cur_time);
int msec_to_expiration = diff_time.tv_sec * 1000 + diff_time.tv_nsec / 1000000;
add_timeout_intern(msec_to_expiration,
@@ -438,7 +448,7 @@ double profiling_get_time_old_time = 0;
double get_time()
{
struct timespec cur_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
gettime(&cur_time);
return cur_time.tv_sec + cur_time.tv_nsec * 1.0e-9;
}

View File

@@ -277,6 +277,9 @@ int get_icon_count(gulong *data, int num)
gulong *get_best_icon(gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size)
{
if (icon_count < 1 || num < 1)
return NULL;
int width[icon_count], height[icon_count], pos, i, w, h;
gulong *icon_data[icon_count];

View File

@@ -0,0 +1,246 @@
#---- Generated by tint2conf f935 ----
# See https://gitlab.com/o9000/tint2/wikis/Configure for
# full documentation of the configuration options.
#-------------------------------------
# Gradients
#-------------------------------------
# Backgrounds
# Background 1: Panel
rounded = 0
border_width = 1
border_sides = TLR
background_color = #000000 80
border_color = #555555 80
background_color_hover = #000000 80
border_color_hover = #555555 80
background_color_pressed = #000000 80
border_color_pressed = #555555 80
# Background 2: Default task, Iconified task
rounded = 0
border_width = 0
border_sides = TBLR
background_color = #777777 0
border_color = #777777 0
background_color_hover = #777777 4
border_color_hover = #cccccc 30
background_color_pressed = #989898 21
border_color_pressed = #777777 30
# Background 3: Active task
rounded = 0
border_width = 0
border_sides = TBLR
background_color = #ffffff 21
border_color = #ffffff 60
background_color_hover = #ffffff 21
border_color_hover = #ffffff 60
background_color_pressed = #989898 21
border_color_pressed = #ffffff 60
# Background 4: Urgent task
rounded = 0
border_width = 0
border_sides = TBLR
background_color = #aa4400 100
border_color = #aa7733 100
background_color_hover = #aa4400 100
border_color_hover = #aa7733 100
background_color_pressed = #aa4400 100
border_color_pressed = #aa7733 100
# Background 5: Tooltip
rounded = 2
border_width = 1
border_sides = TBLR
background_color = #ffffaa 100
border_color = #999999 100
background_color_hover = #ffffaa 100
border_color_hover = #999999 100
background_color_pressed = #ffffaa 100
border_color_pressed = #999999 100
# Background 6: Inactive desktop name
rounded = 0
border_width = 0
border_sides = TBLR
background_color = #777777 0
border_color = #777777 30
background_color_hover = #bdbdbd 21
border_color_hover = #cccccc 30
background_color_pressed = #777777 21
border_color_pressed = #777777 30
# Background 7: Active desktop name
rounded = 0
border_width = 0
border_sides = TBLR
background_color = #ffffff 21
border_color = #ffffff 60
background_color_hover = #ffffff 21
border_color_hover = #ffffff 60
background_color_pressed = #a9a9a9 21
border_color_pressed = #ffffff 60
#-------------------------------------
# Panel
panel_items = L:T:SC
panel_size = 100% 32
panel_margin = 0 0
panel_padding = 4 0 4
panel_background_id = 1
wm_menu = 1
panel_dock = 0
panel_position = bottom center horizontal
panel_layer = normal
panel_monitor = all
panel_shrink = 1
autohide = 0
autohide_show_timeout = 0
autohide_hide_timeout = 0.5
autohide_height = 2
strut_policy = follow_size
panel_window_name = tint2
disable_transparency = 0
mouse_effects = 1
font_shadow = 0
mouse_hover_icon_asb = 100 0 10
mouse_pressed_icon_asb = 100 0 0
#-------------------------------------
# Taskbar
taskbar_mode = multi_desktop
taskbar_hide_if_empty = 0
taskbar_padding = 0 0 0
taskbar_background_id = 0
taskbar_active_background_id = 0
taskbar_name = 1
taskbar_hide_inactive_tasks = 0
taskbar_hide_different_monitor = 0
taskbar_hide_different_desktop = 0
taskbar_always_show_all_desktop_tasks = 0
taskbar_name_padding = 4 0
taskbar_name_background_id = 6
taskbar_name_active_background_id = 7
taskbar_name_font = sans bold 9
taskbar_name_font_color = #dddddd 100
taskbar_name_active_font_color = #dddddd 100
taskbar_distribute_size = 1
taskbar_sort_order = none
task_align = left
#-------------------------------------
# Task
task_text = 0
task_icon = 1
task_centered = 1
urgent_nb_of_blink = 100000
task_maximum_size = 35 35
task_padding = 4 3 4
task_font = sans 8
task_tooltip = 1
task_font_color = #eeeeee 100
task_icon_asb = 100 0 0
task_background_id = 2
task_active_background_id = 3
task_urgent_background_id = 4
task_iconified_background_id = 2
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = prev_task
mouse_scroll_down = next_task
#-------------------------------------
# System tray (notification area)
systray_padding = 0 0 2
systray_background_id = 0
systray_sort = ascending
systray_icon_size = 22
systray_icon_asb = 100 0 0
systray_monitor = 1
systray_name_filter =
#-------------------------------------
# Launcher
launcher_padding = 0 0 2
launcher_background_id = 0
launcher_icon_background_id = 0
launcher_icon_size = 22
launcher_icon_asb = 100 0 0
launcher_icon_theme_override = 0
startup_notifications = 1
launcher_tooltip = 1
launcher_item_app = /usr/share/applications/firefox.desktop
launcher_item_app = /usr/share/applications/iceweasel.desktop
launcher_item_app = /usr/share/applications/google-chrome.desktop
launcher_item_app = /usr/local/share/applications/tint2conf.desktop
#-------------------------------------
# Clock
time1_format = %H:%M
time2_format = %A %d %B
time1_font = sans bold 8
time1_timezone =
time2_timezone =
time2_font = sans 7
clock_font_color = #eeeeee 100
clock_padding = 1 0
clock_background_id = 0
clock_tooltip =
clock_tooltip_timezone =
clock_lclick_command = zenity --calendar --text ""
clock_rclick_command = orage
clock_mclick_command =
clock_uwheel_command =
clock_dwheel_command =
#-------------------------------------
# Battery
battery_tooltip = 1
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
battery_full_cmd =
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #eeeeee 100
bat1_format =
bat2_format =
battery_padding = 1 0
battery_background_id = 0
battery_hide = 101
battery_lclick_command =
battery_rclick_command =
battery_mclick_command =
battery_uwheel_command =
battery_dwheel_command =
ac_connected_cmd =
ac_disconnected_cmd =
#-------------------------------------
# Separator 1
separator = new
separator_background_id = -1
separator_color = #777777 89
separator_style = dots
separator_size = 3
separator_padding = 1 0
#-------------------------------------
# Separator 2
separator = new
separator_background_id = -1
separator_color = #777777 89
separator_style = dots
separator_size = 3
separator_padding = 1 0
#-------------------------------------
# Tooltip
tooltip_show_timeout = 0.5
tooltip_hide_timeout = 0.1
tooltip_padding = 2 2
tooltip_background_id = 5
tooltip_font_color = #222222 100
tooltip_font = sans 9

View File

@@ -0,0 +1,236 @@
#---- Generated by tint2conf 1b26 ----
# See https://gitlab.com/o9000/tint2/wikis/Configure for
# full documentation of the configuration options.
#-------------------------------------
# Gradients
# Gradient 1
gradient = vertical
start_color = #2d2d2d 80
end_color = #000000 80
color_stop = 70.000000 #1c1c1c 80
#-------------------------------------
# Backgrounds
# Background 1: Panel
rounded = 0
border_width = 1
border_sides = T
background_color = #000000 80
border_color = #333333 80
gradient_id = 1
background_color_hover = #000000 80
border_color_hover = #555555 80
background_color_pressed = #000000 80
border_color_pressed = #555555 80
# Background 2: Default task, Iconified task
rounded = 0
border_width = 2
border_sides = B
background_color = #777777 0
border_color = #777777 0
background_color_hover = #777777 21
border_color_hover = #cccccc 30
background_color_pressed = #5a5a5a 21
border_color_pressed = #777777 30
# Background 3: Active task
rounded = 0
border_width = 2
border_sides = B
background_color = #ffffff 0
border_color = #4d75ff 100
background_color_hover = #ffffff 21
border_color_hover = #4c73ff 100
background_color_pressed = #989898 21
border_color_pressed = #4c73ff 100
# Background 4: Urgent task
rounded = 0
border_width = 0
border_sides = TBLR
background_color = #aa4400 100
border_color = #aa7733 100
background_color_hover = #aa4400 100
border_color_hover = #aa7733 100
background_color_pressed = #aa4400 100
border_color_pressed = #aa7733 100
# Background 5: Tooltip
rounded = 2
border_width = 1
border_sides = TBLR
background_color = #ffffaa 100
border_color = #999999 100
background_color_hover = #ffffaa 100
border_color_hover = #999999 100
background_color_pressed = #ffffaa 100
border_color_pressed = #999999 100
# Background 6: Inactive desktop name
rounded = 0
border_width = 2
border_sides = B
background_color = #777777 0
border_color = #777777 0
background_color_hover = #bdbdbd 21
border_color_hover = #cccccc 100
background_color_pressed = #777777 21
border_color_pressed = #777777 100
# Background 7: Active desktop name
rounded = 0
border_width = 2
border_sides = B
background_color = #ffffff 21
border_color = #4c73ff 100
background_color_hover = #ffffff 21
border_color_hover = #4d73ff 100
background_color_pressed = #a9a9a9 21
border_color_pressed = #4d73ff 100
#-------------------------------------
# Panel
panel_items = LTSC
panel_size = 100% 32
panel_margin = 0 0
panel_padding = 4 0 4
panel_background_id = 1
wm_menu = 1
panel_dock = 0
panel_position = bottom center horizontal
panel_layer = normal
panel_monitor = all
panel_shrink = 0
autohide = 0
autohide_show_timeout = 0
autohide_hide_timeout = 0.5
autohide_height = 2
strut_policy = follow_size
panel_window_name = tint2
disable_transparency = 0
mouse_effects = 1
font_shadow = 0
mouse_hover_icon_asb = 100 0 10
mouse_pressed_icon_asb = 100 0 0
#-------------------------------------
# Taskbar
taskbar_mode = multi_desktop
taskbar_hide_if_empty = 0
taskbar_padding = 0 0 0
taskbar_background_id = 0
taskbar_active_background_id = 0
taskbar_name = 1
taskbar_hide_inactive_tasks = 0
taskbar_hide_different_monitor = 0
taskbar_hide_different_desktop = 0
taskbar_always_show_all_desktop_tasks = 0
taskbar_name_padding = 4 0
taskbar_name_background_id = 6
taskbar_name_active_background_id = 7
taskbar_name_font = sans bold 9
taskbar_name_font_color = #dddddd 100
taskbar_name_active_font_color = #dddddd 100
taskbar_distribute_size = 1
taskbar_sort_order = none
task_align = left
#-------------------------------------
# Task
task_text = 1
task_icon = 0
task_centered = 1
urgent_nb_of_blink = 100000
task_maximum_size = 120 35
task_padding = 4 3 4
task_font = Sans 8
task_tooltip = 1
task_font_color = #c6c6c6 100
task_active_font_color = #ffffff 100
task_icon_asb = 100 0 0
task_background_id = 2
task_active_background_id = 3
task_urgent_background_id = 4
task_iconified_background_id = 2
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = prev_task
mouse_scroll_down = next_task
#-------------------------------------
# System tray (notification area)
systray_padding = 0 0 2
systray_background_id = 0
systray_sort = ascending
systray_icon_size = 22
systray_icon_asb = 100 0 0
systray_monitor = 1
systray_name_filter =
#-------------------------------------
# Launcher
launcher_padding = 0 0 2
launcher_background_id = 0
launcher_icon_background_id = 0
launcher_icon_size = 22
launcher_icon_asb = 100 0 0
launcher_icon_theme_override = 0
startup_notifications = 1
launcher_tooltip = 1
launcher_item_app = /usr/share/applications/firefox.desktop
launcher_item_app = /usr/share/applications/iceweasel.desktop
launcher_item_app = /usr/share/applications/google-chrome.desktop
launcher_item_app = /usr/local/share/applications/tint2conf.desktop
#-------------------------------------
# Clock
time1_format = %H:%M
time2_format = %A %d %B
time1_font = sans bold 8
time1_timezone =
time2_timezone =
time2_font = sans 7
clock_font_color = #eeeeee 100
clock_padding = 1 0
clock_background_id = 0
clock_tooltip =
clock_tooltip_timezone =
clock_lclick_command = zenity --calendar --text ""
clock_rclick_command = orage
clock_mclick_command =
clock_uwheel_command =
clock_dwheel_command =
#-------------------------------------
# Battery
battery_tooltip = 1
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
battery_full_cmd =
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #eeeeee 100
bat1_format =
bat2_format =
battery_padding = 1 0
battery_background_id = 0
battery_hide = 101
battery_lclick_command =
battery_rclick_command =
battery_mclick_command =
battery_uwheel_command =
battery_dwheel_command =
ac_connected_cmd =
ac_disconnected_cmd =
#-------------------------------------
# Tooltip
tooltip_show_timeout = 0.5
tooltip_hide_timeout = 0.1
tooltip_padding = 2 2
tooltip_background_id = 5
tooltip_font_color = #222222 100
tooltip_font = sans 9

View File

@@ -1,119 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 7
border_width = 2
background_color = #000000 60
border_color = #FFFFFF 17
# ID 2
rounded = 5
border_width = 0
background_color = #FFFFFF 40
border_color = #FFFFFF 49
# ID 3
rounded = 5
border_width = 0
background_color = #FFFFFF 17
border_color = #FFFFFF 69
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 94% 30
panel_margin = 0 0
panel_padding = 7 0 7
panel_dock = 0
wm_menu = 0
panel_layer = top
panel_background_id = 1
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 2
autohide_height = 2
strut_policy = follow_size
# Taskbar
taskbar_mode = single_desktop
taskbar_padding = 2 3 2
taskbar_background_id = 0
taskbar_active_background_id = 0
# Tasks
urgent_nb_of_blink = 8
task_icon = 1
task_text = 1
task_centered = 1
task_maximum_size = 140 35
task_padding = 6 2
task_background_id = 3
task_active_background_id = 2
task_urgent_background_id = 2
task_iconified_background_id = 3
task_tooltip = 0
# Task Icons
task_icon_asb = 70 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 100 0 0
task_iconified_icon_asb = 70 0 0
# Fonts
task_font = sans 7
task_font_color = #FFFFFF 69
task_active_font_color = #FFFFFF 84
task_urgent_font_color = #FFFFFF 84
task_iconified_font_color = #FFFFFF 69
font_shadow = 0
# System Tray
systray = 1
systray_padding = 0 4 5
systray_sort = ascending
systray_background_id = 0
systray_icon_size = 16
systray_icon_asb = 70 0 0
# Clock
time1_format = %H:%M
time1_font = sans 8
time2_format = %A %d %B
time2_font = sans 6
clock_font_color = #FFFFFF 75
clock_padding = 1 0
clock_background_id = 0
clock_rclick_command = orage
# Tooltips
tooltip_padding = 2 2
tooltip_show_timeout = 0.7
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font = sans 10
tooltip_font_color = #000000 80
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
battery_hide = 98
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #FFFFFF 75
battery_padding = 1 0
battery_background_id = 0
# End of config

View File

@@ -1,118 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 7
border_width = 1
background_color = #000000 60
border_color = #FFFFFF 17
# ID 2
rounded = 5
border_width = 0
background_color = #FFFFFF 40
border_color = #FFFFFF 49
# ID 3
rounded = 5
border_width = 0
background_color = #FFFFFF 17
border_color = #FFFFFF 69
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 98% 28
panel_margin = 0 5
panel_padding = 3 0 3
panel_dock = 0
wm_menu = 0
panel_layer = bottom
panel_background_id = 0
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.7
autohide_hide_timeout = 1.5
autohide_height = 2
strut_policy = follow_size
# Taskbar
taskbar_mode = single_desktop
taskbar_padding = 2 2 2
taskbar_background_id = 1
taskbar_active_background_id = 1
# Tasks
urgent_nb_of_blink = 8
task_icon = 1
task_text = 1
task_centered = 1
task_maximum_size = 140 35
task_padding = 2 3
task_background_id = 3
task_active_background_id = 2
task_urgent_background_id = 2
task_iconified_background_id = 3
task_tooltip = 0
# Task Icons
task_icon_asb = 80 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 100 0 0
task_iconified_icon_asb = 80 0 0
# Fonts
task_font = Sawasdee Bold 8
task_font_color = #FFFFFF 89
task_active_font_color = #FFFFFF 100
task_urgent_font_color = #FFFFFF 100
task_iconified_font_color = #FFFFFF 89
font_shadow = 0
# System Tray
systray = 1
systray_padding = 6 0 5
systray_sort = left2right
systray_background_id = 1
systray_icon_size = 18
systray_icon_asb = 100 0 -10
# Clock
time1_format = %H:%M
time1_font = Sawasdee Bold 12
clock_font_color = #FFFFFF 89
clock_tooltip = %A %d %B
clock_padding = 4 0
clock_background_id = 1
clock_rclick_command = gsimplecal
# Tooltips
tooltip_padding = 5 0
tooltip_show_timeout = 0.7
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font = Sans 10
tooltip_font_color = #000000 80
# Mouse
mouse_left = toggle_iconify
mouse_middle = close
mouse_right = none
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
battery_hide = 95
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #FFFFFF 75
battery_padding = 1 0
battery_background_id = 0
# End of config

View File

@@ -1,124 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 0
border_width = 1
background_color = #EAEAEA 100
border_color = #BBBBBB 100
# ID 2
rounded = 2
border_width = 1
background_color = #E0EBE7 100
border_color = #BBBBBB 100
# ID 3
rounded = 2
border_width = 1
background_color = #FCFAFB 100
border_color = #BBBBBB 100
# ID 4
rounded = 2
border_width = 2
background_color = #E0EBE7 100
border_color = #F15A7D 80
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 100% 30
panel_margin = 0 0
panel_padding = 7 3 4
panel_dock = 0
wm_menu = 1
panel_layer = top
panel_background_id = 1
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.7
autohide_hide_timeout = 1.5
autohide_height = 2
strut_policy = follow_size
# Taskbar
taskbar_mode = single_desktop
taskbar_padding = 0 0 2
taskbar_background_id = 0
#taskbar_active_background_id = 0
# Tasks
urgent_nb_of_blink = 20
task_icon = 1
task_text = 1
task_centered = 1
task_maximum_size = 140 40
task_padding = 5 3
task_background_id = 2
task_active_background_id = 3
task_urgent_background_id = 4
task_iconified_background_id = 2
task_tooltip = 1
# Task Icons
task_icon_asb = 80 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 100 0 0
task_iconified_icon_asb = 80 0 0
# Fonts
task_font = sans 10
task_font_color = #000000 100
task_active_font_color = #000000 100
task_urgent_font_color = #000000 100
task_iconified_font_color = #000000 100
font_shadow = 0
# System Tray
systray = 1
systray_padding = 5 0 5
systray_sort = ascending
systray_background_id = 2
systray_icon_size = 15
systray_icon_asb = 100 0 -10
# Clock
time1_format = %F %l:%M %P
time1_font = sans 10
clock_font_color = #000000 100
clock_tooltip = %A %d %B
clock_padding = 1 1
clock_background_id = 0
clock_rclick_command = gsimplecal
# Tooltips
tooltip_padding = 5 0
tooltip_show_timeout = 1.2
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font = Sans 9
tooltip_font_color = #5E5E5E 100
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 20
battery_low_cmd = notify-send "battery low"
battery_hide = 95
bat1_font = Sans 9
bat2_font = Sans 8
battery_font_color = #000000 100
battery_padding = 1 1
battery_background_id = 0
# End of config

View File

@@ -1,124 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 5
border_width = 0
background_color = #000000 60
border_color = #FFFFFF 20
# ID 2
rounded = 5
border_width = 1
background_color = #FFFFFF 0
border_color = #FFFFFF 20
# ID 3
rounded = 5
border_width = 0
background_color = #000000 29
border_color = #000000 0
# ID 4
rounded = 5
border_width = 1
background_color = #E80000 60
border_color = #FFFFFF 20
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 92% 28
panel_margin = 0 0
panel_padding = 7 0 7
panel_dock = 0
wm_menu = 1
panel_layer = top
panel_background_id = 0
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.0
autohide_hide_timeout = 0.0
autohide_height = 0
strut_policy = follow_size
# Taskbar
taskbar_mode = multi_desktop
taskbar_padding = 2 3 2
taskbar_background_id = 3
#taskbar_active_background_id = 0
# Tasks
urgent_nb_of_blink = 18
task_icon = 1
task_text = 1
task_centered = 1
task_maximum_size = 140 30
task_padding = 2 3
task_background_id = 2
task_active_background_id = 1
task_urgent_background_id = 4
task_iconified_background_id = 2
task_tooltip = 0
# Task Icons
task_icon_asb = 100 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 100 0 0
task_iconified_icon_asb = 100 0 0
# Fonts
task_font = sans 7
task_font_color = #FFFFFF 69
task_active_font_color = #FFFFFF 84
task_urgent_font_color = #FFFFFF 84
task_iconified_font_color = #FFFFFF 69
font_shadow = 0
# System Tray
systray = 1
systray_padding = 5 2 5
systray_sort = ascending
systray_background_id = 1
systray_icon_size = 16
systray_icon_asb = 100 -10 -5
# Clock
time1_format = %H:%M
time1_font = sans 8
time2_format = %A %d %B
time2_font = sans 6
clock_font_color = #FFFFFF 75
clock_padding = 4 4
clock_background_id = 1
# Tooltips
tooltip_padding = 0 0
tooltip_show_timeout = 0
tooltip_hide_timeout = 0
tooltip_background_id = 0
tooltip_font = Sans 12
tooltip_font_color = #FFFFFF 100
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 7
battery_low_cmd = notify-send "battery low"
battery_hide = 95
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #FFFFFF 75
battery_padding = 1 0
battery_background_id = 1
# End of config

View File

@@ -1,138 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 5
border_width = 1
background_color = #44475D 41
border_color = #44475D 100
# ID 2
rounded = 5
border_width = 1
background_color = #FFFFFF 20
border_color = #444444 66
# ID 3
rounded = 0
border_width = 1
background_color = #FFFFFF 20
border_color = #444444 20
# ID 4
rounded = 5
border_width = 1
background_color = #DBDBDB 49
border_color = #222222 74
# ID 5
rounded = 3
border_width = 0
background_color = #44475D 20
border_color = #222222 74
# ID 6
rounded = 3
border_width = 0
background_color = #DE1150 34
border_color = #222222 74
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 96% 37
panel_margin = 0 0
panel_padding = 9 3 9
panel_dock = 0
wm_menu = 1
panel_layer = top
panel_background_id = 1
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 1.7
autohide_height = 2
strut_policy = follow_size
# Taskbar
taskbar_mode = multi_desktop
taskbar_padding = 0 0 0
taskbar_background_id = 2
taskbar_active_background_id = 4
# Tasks
urgent_nb_of_blink = 16
task_icon = 1
task_text = 0
task_centered = 1
task_maximum_size = 40 20
task_padding = 0 2
task_background_id = 0
task_active_background_id = 5
task_urgent_background_id = 6
task_iconified_background_id = 0
task_tooltip = 1
# Task Icons
task_icon_asb = 100 -25 -8
task_active_icon_asb = 100 0 -5
task_urgent_icon_asb = 100 0 -5
task_iconified_icon_asb = 100 -25 -8
# Fonts
task_font = kiloji 10
task_font_color = #333333 80
task_active_font_color = #333333 100
task_urgent_font_color = #333333 100
task_iconified_font_color = #333333 80
font_shadow = 0
# System Tray
systray = 1
systray_padding = 7 0 5
systray_sort = ascending
systray_background_id = 2
systray_icon_size = 18
systray_icon_asb = 100 -20 -5
# Clock
time1_format = %H:%M
time1_font = sans 8 bold
time2_format = %A %d %B
time2_font = sans 7
clock_font_color = #FFFFFF 75
clock_tooltip =
clock_padding = 2 0
clock_background_id = 0
clock_rclick_command = gsimplecal
# Tooltips
tooltip_padding = 5 3
tooltip_show_timeout = 0.8
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font = Sans 8
tooltip_font_color = #FFFFFF 100
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 20
battery_low_cmd = notify-send "battery low"
battery_hide = 90
bat1_font = sans 8 bold
bat2_font = sans 7
battery_font_color = #FFFFFF 75
battery_padding = 2 0
battery_background_id = 0
# End of config

View File

@@ -1,126 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 0
border_width = 0
background_color = #000000 54
border_color = #9B9B9B 34
# ID 2
rounded = 2
border_width = 0
background_color = #000000 69
border_color = #9B9B9B 74
# ID 3
rounded = 1
border_width = 0
background_color = #000000 69
border_color = #FFFFFF 20
# ID 4
rounded = 0
border_width = 0
background_color = #BBBBBB 20
border_color = #BBBBBB 29
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 100% 37
panel_margin = 0 0
panel_padding = 5 2 3
panel_dock = 0
wm_menu = 1
panel_layer = top
panel_background_id = 1
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.7
autohide_hide_timeout = 1.5
autohide_height = 2
strut_policy = follow_size
# Taskbar
taskbar_mode = multi_desktop
taskbar_padding = 0 0 0
taskbar_background_id = 0
taskbar_active_background_id = 2
# Tasks
urgent_nb_of_blink = 21
task_icon = 1
task_text = 0
task_centered = 1
task_maximum_size = 50 35
task_padding = 4 2
task_background_id = 0
task_active_background_id = 3
task_urgent_background_id = 3
task_iconified_background_id = 0
task_tooltip = 1
# Task Icons
task_icon_asb = 90 -100 -20
task_active_icon_asb = 100 -70 -10
task_urgent_icon_asb = 100 -70 -10
task_iconified_icon_asb = 90 -100 -20
# Fonts
task_font = kiloji 8
task_font_color = #A0A0A0 100
task_active_font_color = #D4D4D4 100
task_urgent_font_color = #D4D4D4 100
task_iconified_font_color = #A0A0A0 100
font_shadow = 0
# System Tray
systray = 1
systray_padding = 8 1 5
systray_sort = ascending
systray_background_id = 2
systray_icon_size = 16
systray_icon_asb = 100 -90 -15
# Clock
time1_format = %H:%M
time1_font = sans 8 bold
time2_format = %A %d %B
time2_font = sans 7
clock_font_color = #FFFFFF 75
clock_tooltip = %A %d %B
clock_padding = 2 0
clock_background_id = 0
clock_rclick_command = gsimplecal
# Tooltips
tooltip_padding = 2 2
tooltip_show_timeout = 0.9
tooltip_hide_timeout = 0.3
tooltip_background_id = 4
tooltip_font = sans 10
tooltip_font_color = #000000 80
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 1
battery_low_status = 7
battery_low_cmd = notify-send "battery low"
battery_hide = 90
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #FFFFFF 75
battery_padding = 1 0
battery_background_id = 0
# End of config

View File

@@ -1,115 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 1
border_width = 0
background_color = #282828 49
border_color = #000000 0
# ID 2
rounded = 1
border_width = 1
background_color = #FFFFFF 29
border_color = #FFFFFF 60
# ID 3
rounded = 5
border_width = 0
background_color = #FFFFFF 17
border_color = #FFFFFF 69
# ID 4
rounded = 1
border_width = 0
background_color = #FFFFFF 29
border_color = #FFFFFF 60
# Panel
panel_monitor = all
panel_position = bottom left horizontal
panel_size = 100% 38
panel_margin = 0 0
panel_padding = 7 3 7
panel_dock = 0
wm_menu = 0
panel_layer = bottom
panel_background_id = 0
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 2
autohide_height = 4
strut_policy = minimum
# Taskbar
taskbar_mode = multi_desktop
taskbar_padding = 0 0 0
taskbar_background_id = 1
taskbar_active_background_id = 1
# Tasks
urgent_nb_of_blink = 15
task_icon = 1
task_text = 0
task_centered = 1
task_maximum_size = 45 35
task_padding = 2 1
task_background_id = 0
task_active_background_id = 2
task_urgent_background_id = 4
task_iconified_background_id = 0
task_tooltip = 0
# Task Icons
task_icon_asb = 70 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 70 0 0
task_iconified_icon_asb = 70 0 0
# Fonts
task_font = sans bold 9
task_font_color = #FFFFFF 60
task_active_font_color = #FFFFFF 100
task_urgent_font_color = #FFFFFF 100
task_iconified_font_color = #FFFFFF 60
font_shadow = 0
# System Tray
systray = 1
systray_padding = 0 4 5
systray_sort = left2right
systray_background_id = 0
systray_icon_size = 20
systray_icon_asb = 100 0 0
# Tooltips
tooltip_padding = 2 2
tooltip_show_timeout = 0.7
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font = sans 10
tooltip_font_color = #000000 80
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = none
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
battery_hide = 90
bat1_font = sans 8
bat2_font = sans 6
battery_font_color = #FFFFFF 75
battery_padding = 1 0
battery_background_id = 0
# End of config

View File

@@ -1,115 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 0
border_width = 1
background_color = #888888 29
border_color = #000000 29
# ID 2
rounded = 3
border_width = 1
background_color = #888888 69
border_color = #FFFFFF 49
# ID 3
rounded = 3
border_width = 1
background_color = #888888 29
border_color = #FFFFFF 20
# ID 4
rounded = 3
border_width = 1
background_color = #888888 29
border_color = #ED2323 60
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 100% 40
panel_margin = 0 0
panel_padding = 0 0 0
panel_dock = 0
wm_menu = 1
panel_layer = top
panel_background_id = 1
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.7
autohide_hide_timeout = 1.5
autohide_height = 2
strut_policy = follow_size
# Taskbar
taskbar_mode = multi_desktop
taskbar_padding = 6 1 6
taskbar_background_id = 0
#taskbar_active_background_id = 0
# Tasks
urgent_nb_of_blink = 20
task_icon = 1
task_text = 0
task_centered = 1
task_maximum_size = 40 40
task_padding = 6 3
task_background_id = 3
task_active_background_id = 2
task_urgent_background_id = 4
task_iconified_background_id = 3
task_tooltip = 1
# Task Icons
task_icon_asb = 90 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 100 0 0
task_iconified_icon_asb = 90 0 0
# Fonts
task_font = kroeger 06_55 6
task_font_color = #222222 100
task_active_font_color = #000000 100
task_urgent_font_color = #000000 100
task_iconified_font_color = #222222 100
font_shadow = 0
# System Tray
systray = 1
systray_padding = 4 4 5
systray_sort = ascending
systray_background_id = 0
systray_icon_size = 20
systray_icon_asb = 100 0 -10
# Tooltips
tooltip_padding = 5 0
tooltip_show_timeout = 0.8
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font = Sans 10
tooltip_font_color = #FFFFFF 80
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 20
battery_low_cmd = notify-send "battery low"
battery_hide = 90
bat1_font = Sans 12
bat2_font = Sans 12
battery_font_color = #FFFFFF 100
battery_padding = 0 0
battery_background_id = 0
# End of config

View File

@@ -1,126 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 5
border_width = 0
background_color = #000000 49
border_color = #FFFFFF 40
# ID 2
rounded = 5
border_width = 0
background_color = #FFFFFF 60
border_color = #FFFFFF 49
# ID 3
rounded = 5
border_width = 0
background_color = #FFFFFF 24
border_color = #FFFFFF 69
# ID 4
rounded = 5
border_width = 0
background_color = #BDBDBD 80
border_color = #FFFFFF 69
# Panel
panel_monitor = all
panel_position = top left vertical
panel_size = 75% 50
panel_margin = 0 0
panel_padding = 2 2 2
panel_dock = 0
wm_menu = 0
panel_layer = top
panel_background_id = 0
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.3
autohide_hide_timeout = 2
autohide_height = 4
strut_policy = minimum
# Taskbar
taskbar_mode = single_desktop
taskbar_padding = 2 2 2
taskbar_background_id = 1
taskbar_active_background_id = 1
# Tasks
urgent_nb_of_blink = 20
task_icon = 1
task_text = 0
task_centered = 1
task_maximum_size = 140 35
task_padding = 6 3
task_background_id = 3
task_active_background_id = 2
task_urgent_background_id = 2
task_iconified_background_id = 3
task_tooltip = 1
# Task Icons
task_icon_asb = 100 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 100 0 0
task_iconified_icon_asb = 90 0 0
# Fonts
task_font = sans 7
task_font_color = #FFFFFF 69
task_active_font_color = #FFFFFF 84
task_urgent_font_color = #EC9B9B 84
task_iconified_font_color = #FFFFFF 69
font_shadow = 1
# System Tray
systray = 1
systray_padding = 4 4 5
systray_sort = left2right
systray_background_id = 1
systray_icon_size = 16
systray_icon_asb = 100 0 0
# Clock
time1_format = %H:%M
time1_font = sans bold 8
time2_format = %h.%e
time2_font = sans 6
clock_font_color = #FFFFFF 75
clock_tooltip = %A %d %B
clock_padding = 4 2
clock_background_id = 1
clock_rclick_command = zenity --calendar
# Tooltips
tooltip_padding = 3 2
tooltip_show_timeout = 0.9
tooltip_hide_timeout = 0.3
tooltip_background_id = 4
tooltip_font = sans 8
tooltip_font_color = #000000 89
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 0
battery_low_status = 10
battery_low_cmd = notify-send "battery low"
battery_hide = 98
bat1_font = sans bold 8
bat2_font = sans 6
battery_font_color = #FFFFFF 75
battery_padding = 4 2
battery_background_id = 1
# End of config

View File

@@ -1,122 +0,0 @@
# Tint2 config file
# Generated by tintwizard (http://code.google.com/p/tintwizard/)
# For information on manually configuring tint2 see http://code.google.com/p/tint2/wiki/Configure
# Background definitions
# ID 1
rounded = 1
border_width = 0
background_color = #282828 60
border_color = #000000 0
# ID 2
rounded = 1
border_width = 1
background_color = #CCCCCC 0
border_color = #CCCCCC 54
# ID 3
rounded = 1
border_width = 0
background_color = #CCCCCC 20
border_color = #CCCCCC 40
# Panel
panel_monitor = all
panel_position = bottom center horizontal
panel_size = 95% 30
panel_margin = 0 0
panel_padding = 7 3 7
panel_dock = 0
wm_menu = 1
panel_layer = top
panel_background_id = 1
# Panel Autohide
autohide = 0
autohide_show_timeout = 0.7
autohide_hide_timeout = 1.5
autohide_height = 2
strut_policy = follow_size
# Taskbar
taskbar_mode = multi_desktop
taskbar_padding = 0 0 0
taskbar_background_id = 2
taskbar_active_background_id = 2
# Tasks
urgent_nb_of_blink = 7
task_icon = 1
task_text = 0
task_centered = 1
task_maximum_size = 34 34
task_padding = 2 3
task_background_id = 0
task_active_background_id = 3
task_urgent_background_id = 0
task_iconified_background_id = 0
task_tooltip = 1
# Task Icons
task_icon_asb = 100 0 0
task_active_icon_asb = 100 0 0
task_urgent_icon_asb = 100 0 0
task_iconified_icon_asb = 100 0 0
# Fonts
task_font = sans 8
task_font_color = #FFFFFF 60
task_active_font_color = #FFFFFF 100
task_urgent_font_color = #FFFFFF 60
task_iconified_font_color = #FFFFFF 60
font_shadow = 0
# System Tray
systray = 1
systray_padding = 0 0 5
systray_sort = ascending
systray_background_id = 0
systray_icon_size = 16
systray_icon_asb = 100 0 0
# Clock
time1_format = Paris %H:%M - %d/%m
time1_font = sans 7
time2_format = Moscow %H:%M - %d/%m
time2_font = sans 7
clock_font_color = #FFFFFF 100
clock_tooltip =
clock_padding = 1 0
clock_background_id = 0
clock_rclick_command = gsimplecal
time1_timezone = :Europe/Paris
time2_timezone = :Europe/Moscow
# Tooltips
tooltip_padding = 5 4
tooltip_show_timeout = 0.8
tooltip_hide_timeout = 0.3
tooltip_background_id = 1
tooltip_font = Sans 7
tooltip_font_color = #FFFFFF 100
# Mouse
mouse_left = toggle_iconify
mouse_middle = none
mouse_right = close
mouse_scroll_up = toggle
mouse_scroll_down = iconify
# Battery
battery = 1
battery_low_status = 7
battery_low_cmd = notify-send "battery low"
battery_hide = 90
bat1_font = sans 7
bat2_font = sans 7
battery_font_color = #FFFFFF 100
battery_padding = 1 0
battery_background_id = 0
# End of config

Some files were not shown because too many files have changed in this diff Show More