Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a7ba9bf50 | ||
|
|
ffa6e5ba49 | ||
|
|
d1f5a46a73 | ||
|
|
131704081c | ||
|
|
21466cc94e | ||
|
|
e06b63e1dc | ||
|
|
9a03b8b4e6 | ||
|
|
47bc01d608 | ||
|
|
0e4b3bd32e | ||
|
|
9ac0cd1254 | ||
|
|
73ab9b6930 | ||
|
|
96361ab1cd | ||
|
|
b9589450bb | ||
|
|
b810bad93f | ||
|
|
b85362b5c7 | ||
|
|
03675b152d | ||
|
|
c3fdd76b58 | ||
|
|
04ba5a6617 | ||
|
|
f5f8792d42 | ||
|
|
965a2665b0 | ||
|
|
b2b0119f4d | ||
|
|
41e49ef4e6 | ||
|
|
25dd623618 | ||
|
|
28b1174c0f | ||
|
|
b70edc437c | ||
|
|
bf58e16b83 | ||
|
|
3190c5b7de | ||
|
|
5db0dceec2 | ||
|
|
5c5f507e54 | ||
|
|
d301ada47a | ||
|
|
b3f9834313 | ||
|
|
c7b23ee94a | ||
|
|
12f04e3055 | ||
|
|
7f62594cf6 | ||
|
|
405c2c9286 | ||
|
|
90a445868c | ||
|
|
427afc61b5 | ||
|
|
ee92fac10e | ||
|
|
95eea350fe |
1
AUTHORS
1
AUTHORS
@@ -6,6 +6,7 @@ tint2 is developped by :
|
||||
- Ovidiu M <mrovi9000 at gmail.com> : launcher, bug fixes
|
||||
- Mishael A Sibiryakov (death@junki.org) : freespace
|
||||
- Sebastian Reichel <sre@ring0.de> : battery, various fixes, debian package maintainer
|
||||
- Chris Lee <chrlee at protonmail> : bug fixes, maintainer starting with v16.3
|
||||
|
||||
tint2 is based on the ttm source code (http://code.google.com/p/ttm/)
|
||||
- 2007-2008 Pål Staurland <staura@gmail.com>
|
||||
|
||||
21
ChangeLog
21
ChangeLog
@@ -1,3 +1,21 @@
|
||||
2018-05-03 16.4
|
||||
- Update AUTHORS
|
||||
- Fixes:
|
||||
- Fix leak in image loading (issue #704)
|
||||
- Executors no longer log unless env var DEBUG_EXECUTORS is set
|
||||
|
||||
2018-04-17 16.3
|
||||
- Fixes:
|
||||
- Layout in executor (issue #695)
|
||||
- Other small issues
|
||||
|
||||
2018-01-21 16.2
|
||||
- Fixes:
|
||||
- Proper fix for issue #688
|
||||
- Fix bad word wrapping (issue #693)
|
||||
- Enhancements:
|
||||
- Preliminary high DPI support
|
||||
|
||||
2017-12-30 16.1
|
||||
- Fixes:
|
||||
- Fixed several use-after-free errors in the timer code
|
||||
@@ -985,3 +1003,6 @@ released tint-0.2
|
||||
.
|
||||
.
|
||||
.
|
||||
.
|
||||
.
|
||||
.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Latest stable release: 16.1
|
||||
Changes: https://gitlab.com/o9000/tint2/blob/16.1/ChangeLog
|
||||
# Latest stable release: 16.4
|
||||
Changes: https://gitlab.com/o9000/tint2/blob/16.4/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 16.1
|
||||
git checkout 16.4
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
@@ -97,4 +97,3 @@ tint2 is a simple panel/taskbar made for modern X window managers. It was specif
|
||||
## More
|
||||
|
||||
* [Tint2 wiki](https://gitlab.com/o9000/tint2/wikis/Home)
|
||||
Home)
|
||||
|
||||
@@ -386,6 +386,8 @@ gradient_id_pressed = 2
|
||||
<li><code>width</code> and <code>height</code> can be specified without units (e.g. <code>123</code>) as pixels, or followed by <code>%</code> as percentages of the monitor size (e.g. <code>50%</code>). Use <code>100%</code> for full monitor width/height.
|
||||
Example:</li>
|
||||
</ul></li>
|
||||
<li><p><code>scale_relative_to_dpi = integer</code> : If set to a non-zero value, HiDPI scaling is enabled. Each panel is visible on a different monitor. Thus each panel has a specific scaling factor. The scaling factor is computed as the ratio between the monitor DPI (obtained from the dimensions in pixels and millimeters from RandR) and a configured reference DPI - this is the DPI for which exising user configs looked normal, for backward compatibility.</p></li>
|
||||
<li><p><code>scale_relative_to_screen_height = integer</code> : Similar to <code>scale_relative_to_dpi</code>, except the scaling factor is computed as the ratio between the monitor height and <code>scale_relative_to_screen_height</code>. The effect is cumulative with <code>scale_relative_to_dpi</code>, i.e. if both options are present, the factors are multiplied.</p></li>
|
||||
</ul>
|
||||
<pre class="highlight plaintext"><code># The panel's width is 94% the size of the monitor, the height is 30 pixels:
|
||||
panel_size = 94% 30
|
||||
|
||||
@@ -199,9 +199,9 @@ pre {
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="latest-stable-release-16-1"><span class="md2man-title">Latest</span> <span class="md2man-section">stable</span> <span class="md2man-date">release:</span> <span class="md2man-source">16.1</span><a name="latest-stable-release-16-1" href="#latest-stable-release-16-1" class="md2man-permalink" title="permalink"></a></h1><p>Changes: <a href="https://gitlab.com/o9000/tint2/blob/16.1/ChangeLog">https://gitlab.com/o9000/tint2/blob/16.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-16-4"><span class="md2man-title">Latest</span> <span class="md2man-section">stable</span> <span class="md2man-date">release:</span> <span class="md2man-source">16.4</span><a name="latest-stable-release-16-4" href="#latest-stable-release-16-4" class="md2man-permalink" title="permalink"></a></h1><p>Changes: <a href="https://gitlab.com/o9000/tint2/blob/16.4/ChangeLog">https://gitlab.com/o9000/tint2/blob/16.4/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 16.1
|
||||
git checkout 16.4
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
@@ -269,8 +269,7 @@ update-mime-database /usr/local/share/mime
|
||||
</ul>
|
||||
<h2 id="more">More<a name="more" href="#more" class="md2man-permalink" title="permalink"></a></h2>
|
||||
<ul>
|
||||
<li><a href="https://gitlab.com/o9000/tint2/wikis/Home">Tint2 wiki</a>
|
||||
Home)</li>
|
||||
<li><a href="https://gitlab.com/o9000/tint2/wikis/Home">Tint2 wiki</a></li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.TH TINT2 1 "2017\-12\-30" 16.1
|
||||
.TH TINT2 1 "2018\-05\-03" 16.4
|
||||
.SH NAME
|
||||
.PP
|
||||
tint2 \- lightweight panel/taskbar
|
||||
@@ -343,6 +343,10 @@ Use \fB\fCpanel_monitor = all\fR to get a separate panel per monitor
|
||||
\fB\fCwidth\fR and \fB\fCheight\fR can be specified without units (e.g. \fB\fC123\fR) as pixels, or followed by \fB\fC%\fR as percentages of the monitor size (e.g. \fB\fC50%\fR). Use \fB\fC100%\fR for full monitor width/height.
|
||||
Example:
|
||||
.RE
|
||||
.IP \(bu 2
|
||||
\fB\fCscale_relative_to_dpi = integer\fR : If set to a non\-zero value, HiDPI scaling is enabled. Each panel is visible on a different monitor. Thus each panel has a specific scaling factor. The scaling factor is computed as the ratio between the monitor DPI (obtained from the dimensions in pixels and millimeters from RandR) and a configured reference DPI \- this is the DPI for which exising user configs looked normal, for backward compatibility.
|
||||
.IP \(bu 2
|
||||
\fB\fCscale_relative_to_screen_height = integer\fR : Similar to \fB\fCscale_relative_to_dpi\fR, except the scaling factor is computed as the ratio between the monitor height and \fB\fCscale_relative_to_screen_height\fR\&. The effect is cumulative with \fB\fCscale_relative_to_dpi\fR, i.e. if both options are present, the factors are multiplied.
|
||||
.RE
|
||||
.PP
|
||||
.RS
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# TINT2 1 "2017-12-30" 16.1
|
||||
# TINT2 1 "2018-05-03" 16.4
|
||||
|
||||
## NAME
|
||||
tint2 - lightweight panel/taskbar
|
||||
@@ -279,6 +279,10 @@ gradient_id_pressed = 2
|
||||
* `width` and `height` can be specified without units (e.g. `123`) as pixels, or followed by `%` as percentages of the monitor size (e.g. `50%`). Use `100%` for full monitor width/height.
|
||||
Example:
|
||||
|
||||
* `scale_relative_to_dpi = integer` : If set to a non-zero value, HiDPI scaling is enabled. Each panel is visible on a different monitor. Thus each panel has a specific scaling factor. The scaling factor is computed as the ratio between the monitor DPI (obtained from the dimensions in pixels and millimeters from RandR) and a configured reference DPI - this is the DPI for which exising user configs looked normal, for backward compatibility.
|
||||
|
||||
* `scale_relative_to_screen_height = integer` : Similar to `scale_relative_to_dpi`, except the scaling factor is computed as the ratio between the monitor height and `scale_relative_to_screen_height`. The effect is cumulative with `scale_relative_to_dpi`, i.e. if both options are present, the factors are multiplied.
|
||||
|
||||
```
|
||||
# The panel's width is 94% the size of the monitor, the height is 30 pixels:
|
||||
panel_size = 94% 30
|
||||
|
||||
@@ -194,3 +194,9 @@ if __name__ == '__main__':
|
||||
choice = raw_input().lower()
|
||||
if choice != "y":
|
||||
run("git reset --hard HEAD~ ; git tag -d %s ; git tag -d %s" % (version, readable_version))
|
||||
sys.exit(1)
|
||||
print "Publish? [y/n]"
|
||||
choice = raw_input().lower()
|
||||
if choice != "y":
|
||||
sys.exit(1)
|
||||
run("git push origin master && git push --tags origin master")
|
||||
|
||||
@@ -49,7 +49,7 @@ echo "echo \"#define VERSION_STRING \\\"$VERSION\\\"\" > version.h" > $DIR/get_v
|
||||
# Copy the debian files into the source directory
|
||||
cp -r debian $DIR/debian
|
||||
|
||||
for DISTRO in trusty xenial zesty artful bionic
|
||||
for DISTRO in trusty xenial artful bionic
|
||||
do
|
||||
# Cleanup from previous builds
|
||||
rm -rf tint2_$VERSION-*
|
||||
|
||||
@@ -15,7 +15,7 @@ git reset --hard
|
||||
git pull
|
||||
|
||||
|
||||
~/tint2/packaging/version_status.py > packaging.tmp.md
|
||||
timeout -k 10 600 ~/tint2/packaging/version_status.py > packaging.tmp.md
|
||||
cat packaging.tmp.md > packaging.md
|
||||
rm packaging.tmp.md
|
||||
|
||||
|
||||
@@ -225,7 +225,8 @@ void init_battery()
|
||||
|
||||
battery_found = battery_os_init();
|
||||
|
||||
change_timer(&battery_timer, true, 10, 30000, update_battery_tick, 0);
|
||||
if (!battery_timer.enabled_)
|
||||
change_timer(&battery_timer, true, 30000, 30000, update_battery_tick, 0);
|
||||
|
||||
update_battery();
|
||||
}
|
||||
@@ -272,6 +273,7 @@ void init_battery_panel(void *p)
|
||||
bat1_format = strdup("%p");
|
||||
bat2_format = strdup("%t");
|
||||
}
|
||||
update_battery_tick(NULL);
|
||||
}
|
||||
|
||||
void battery_init_fonts()
|
||||
@@ -420,6 +422,7 @@ gboolean resize_battery(void *obj)
|
||||
void draw_battery(void *obj, cairo_t *c)
|
||||
{
|
||||
Battery *battery = (Battery *)obj;
|
||||
Panel *panel = (Panel *)battery->area.panel;
|
||||
draw_text_area(&battery->area,
|
||||
c,
|
||||
buf_bat_line1,
|
||||
@@ -428,7 +431,8 @@ void draw_battery(void *obj, cairo_t *c)
|
||||
bat2_font_desc,
|
||||
battery->bat1_posy,
|
||||
battery->bat2_posy,
|
||||
&battery->font_color);
|
||||
&battery->font_color,
|
||||
panel->scale);
|
||||
}
|
||||
|
||||
void battery_dump_geometry(void *obj, int indent)
|
||||
|
||||
@@ -269,9 +269,9 @@ 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 horiz_padding = (panel_horizontal ? button->area.paddingxlr : button->area.paddingy) * panel->scale;
|
||||
int vert_padding = (panel_horizontal ? button->area.paddingy : button->area.paddingxlr) * panel->scale;
|
||||
int interior_padding = button->area.paddingx * panel->scale;
|
||||
|
||||
int icon_w, icon_h;
|
||||
if (button->backend->icon_name) {
|
||||
@@ -280,18 +280,17 @@ int button_compute_desired_size(void *obj)
|
||||
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);
|
||||
icon_w = MIN(icon_w, button->backend->max_icon_size * panel->scale);
|
||||
icon_h = MIN(icon_h, button->backend->max_icon_size * panel->scale);
|
||||
}
|
||||
} else {
|
||||
icon_h = icon_w = 0;
|
||||
}
|
||||
|
||||
int txt_height_ink, txt_height, txt_width;
|
||||
int 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,
|
||||
@@ -300,10 +299,11 @@ int button_compute_desired_size(void *obj)
|
||||
strlen(button->backend->text),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
FALSE);
|
||||
button->backend->centered ? PANGO_ALIGN_CENTER : PANGO_ALIGN_LEFT,
|
||||
FALSE,
|
||||
panel->scale);
|
||||
} else {
|
||||
get_text_size2(button->backend->font_desc,
|
||||
&txt_height_ink,
|
||||
&txt_height,
|
||||
&txt_width,
|
||||
panel->area.height,
|
||||
@@ -313,10 +313,12 @@ int button_compute_desired_size(void *obj)
|
||||
strlen(button->backend->text),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
FALSE);
|
||||
button->backend->centered ? PANGO_ALIGN_CENTER : PANGO_ALIGN_LEFT,
|
||||
FALSE,
|
||||
panel->scale);
|
||||
}
|
||||
} else {
|
||||
txt_height_ink = txt_height = txt_width = 0;
|
||||
txt_height = txt_width = 0;
|
||||
}
|
||||
|
||||
if (panel_horizontal) {
|
||||
@@ -336,9 +338,9 @@ 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 horiz_padding = (panel_horizontal ? button->area.paddingxlr : button->area.paddingy) * panel->scale;
|
||||
int vert_padding = (panel_horizontal ? button->area.paddingy : button->area.paddingxlr) * panel->scale;
|
||||
int interior_padding = button->area.paddingx * panel->scale;
|
||||
|
||||
int icon_w, icon_h;
|
||||
if (button->backend->icon_name) {
|
||||
@@ -347,8 +349,8 @@ gboolean resize_button(void *obj)
|
||||
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);
|
||||
icon_w = MIN(icon_w, button->backend->max_icon_size * panel->scale);
|
||||
icon_h = MIN(icon_h, button->backend->max_icon_size * panel->scale);
|
||||
}
|
||||
} else {
|
||||
icon_h = icon_w = 0;
|
||||
@@ -369,10 +371,9 @@ gboolean resize_button(void *obj)
|
||||
available_h = panel->area.height;
|
||||
}
|
||||
|
||||
int txt_height_ink, txt_height, txt_width;
|
||||
int txt_height, txt_width;
|
||||
if (button->backend->text) {
|
||||
get_text_size2(button->backend->font_desc,
|
||||
&txt_height_ink,
|
||||
&txt_height,
|
||||
&txt_width,
|
||||
available_h,
|
||||
@@ -381,9 +382,11 @@ gboolean resize_button(void *obj)
|
||||
strlen(button->backend->text),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
FALSE);
|
||||
button->backend->centered ? PANGO_ALIGN_CENTER : PANGO_ALIGN_LEFT,
|
||||
FALSE,
|
||||
panel->scale);
|
||||
} else {
|
||||
txt_height_ink = txt_height = txt_width = 0;
|
||||
txt_height = txt_width = 0;
|
||||
}
|
||||
|
||||
gboolean result = FALSE;
|
||||
@@ -436,6 +439,7 @@ gboolean resize_button(void *obj)
|
||||
void draw_button(void *obj, cairo_t *c)
|
||||
{
|
||||
Button *button = obj;
|
||||
Panel *panel = (Panel *)button->area.panel;
|
||||
|
||||
if (button->frontend->icon) {
|
||||
// Render icon
|
||||
@@ -457,10 +461,12 @@ void draw_button(void *obj, cairo_t *c)
|
||||
|
||||
// Render text
|
||||
if (button->backend->text) {
|
||||
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * panel->scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
|
||||
pango_layout_set_font_description(layout, button->backend->font_desc);
|
||||
pango_layout_set_width(layout, (button->frontend->textw + 1) * PANGO_SCALE);
|
||||
pango_layout_set_width(layout, (button->frontend->textw + TINT2_PANGO_SLACK) * 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);
|
||||
@@ -475,6 +481,7 @@ void draw_button(void *obj, cairo_t *c)
|
||||
panel_config.font_shadow);
|
||||
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -261,10 +261,8 @@ void clock_default_font_changed()
|
||||
}
|
||||
|
||||
void clock_compute_text_geometry(Clock *clock,
|
||||
int *time_height_ink,
|
||||
int *time_height,
|
||||
int *time_width,
|
||||
int *date_height_ink,
|
||||
int *date_height,
|
||||
int *date_width)
|
||||
{
|
||||
@@ -273,10 +271,8 @@ void clock_compute_text_geometry(Clock *clock,
|
||||
time2_format ? buf_date : NULL,
|
||||
time1_font_desc,
|
||||
time2_font_desc,
|
||||
time_height_ink,
|
||||
time_height,
|
||||
time_width,
|
||||
date_height_ink,
|
||||
date_height,
|
||||
date_width);
|
||||
}
|
||||
@@ -306,6 +302,7 @@ gboolean resize_clock(void *obj)
|
||||
void draw_clock(void *obj, cairo_t *c)
|
||||
{
|
||||
Clock *clock = (Clock *)obj;
|
||||
Panel *panel = (Panel *)clock->area.panel;
|
||||
draw_text_area(&clock->area,
|
||||
c,
|
||||
buf_time,
|
||||
@@ -314,7 +311,8 @@ void draw_clock(void *obj, cairo_t *c)
|
||||
time2_font_desc,
|
||||
clock->time1_posy,
|
||||
clock->time2_posy,
|
||||
&clock->font);
|
||||
&clock->font,
|
||||
panel->scale);
|
||||
}
|
||||
|
||||
void clock_dump_geometry(void *obj, int indent)
|
||||
|
||||
@@ -244,7 +244,11 @@ void add_entry(char *key, char *value)
|
||||
char *value1 = 0, *value2 = 0, *value3 = 0;
|
||||
|
||||
/* Background and border */
|
||||
if (strcmp(key, "rounded") == 0) {
|
||||
if (strcmp(key, "scale_relative_to_dpi") == 0) {
|
||||
ui_scale_dpi_ref = atof(value);
|
||||
} else if (strcmp(key, "scale_relative_to_screen_height") == 0) {
|
||||
ui_scale_monitor_size_ref = atof(value);
|
||||
} else if (strcmp(key, "rounded") == 0) {
|
||||
// 'rounded' is the first parameter => alloc a new background
|
||||
if (backgrounds->len > 0) {
|
||||
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
|
||||
#define MAX_TOOLTIP_LEN 4096
|
||||
|
||||
bool debug_executors = false;
|
||||
|
||||
void execp_timer_callback(void *arg);
|
||||
char *execp_get_tooltip(void *obj);
|
||||
void execp_init_fonts();
|
||||
@@ -304,7 +306,6 @@ void execp_compute_icon_text_geometry(Execp *execp,
|
||||
int *icon_w,
|
||||
int *icon_h,
|
||||
gboolean *text_next_line,
|
||||
int *txt_height_ink,
|
||||
int *txt_height,
|
||||
int *txt_width,
|
||||
int *new_size,
|
||||
@@ -312,9 +313,9 @@ void execp_compute_icon_text_geometry(Execp *execp,
|
||||
{
|
||||
Panel *panel = (Panel *)execp->area.panel;
|
||||
Area *area = &execp->area;
|
||||
*horiz_padding = (panel_horizontal ? area->paddingxlr : area->paddingy);
|
||||
*vert_padding = (panel_horizontal ? area->paddingy : area->paddingxlr);
|
||||
*interior_padding = area->paddingx;
|
||||
*horiz_padding = (panel_horizontal ? area->paddingxlr : area->paddingy) * panel->scale;
|
||||
*vert_padding = (panel_horizontal ? area->paddingy : area->paddingxlr) * panel->scale;
|
||||
*interior_padding = area->paddingx * panel->scale;
|
||||
|
||||
if (reload_icon(execp)) {
|
||||
if (execp->backend->icon) {
|
||||
@@ -333,7 +334,7 @@ void execp_compute_icon_text_geometry(Execp *execp,
|
||||
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);
|
||||
available_h = area->height - 2 * *vert_padding - left_right_border_width(area);
|
||||
} else {
|
||||
available_w = !text_next_line
|
||||
? area->width - *icon_w - (*icon_w ? *interior_padding : 0) - 2 * *horiz_padding -
|
||||
@@ -342,7 +343,6 @@ void execp_compute_icon_text_geometry(Execp *execp,
|
||||
available_h = panel->area.height;
|
||||
}
|
||||
get_text_size2(execp->backend->font_desc,
|
||||
txt_height_ink,
|
||||
txt_height,
|
||||
txt_width,
|
||||
available_h,
|
||||
@@ -351,7 +351,9 @@ void execp_compute_icon_text_geometry(Execp *execp,
|
||||
strlen(execp->backend->text),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
execp->backend->has_markup);
|
||||
execp->backend->centered ? PANGO_ALIGN_CENTER : PANGO_ALIGN_LEFT,
|
||||
execp->backend->has_markup,
|
||||
panel->scale);
|
||||
|
||||
*resized = FALSE;
|
||||
if (panel_horizontal) {
|
||||
@@ -385,7 +387,7 @@ int execp_compute_desired_size(void *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;
|
||||
int txt_height, txt_width;
|
||||
int new_size;
|
||||
gboolean resized;
|
||||
execp_compute_icon_text_geometry(execp,
|
||||
@@ -395,7 +397,6 @@ int execp_compute_desired_size(void *obj)
|
||||
&icon_w,
|
||||
&icon_h,
|
||||
&text_next_line,
|
||||
&txt_height_ink,
|
||||
&txt_height,
|
||||
&txt_width,
|
||||
&new_size,
|
||||
@@ -410,7 +411,7 @@ gboolean resize_execp(void *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;
|
||||
int txt_height, txt_width;
|
||||
int new_size;
|
||||
gboolean resized;
|
||||
execp_compute_icon_text_geometry(execp,
|
||||
@@ -420,7 +421,6 @@ gboolean resize_execp(void *obj)
|
||||
&icon_w,
|
||||
&icon_h,
|
||||
&text_next_line,
|
||||
&txt_height_ink,
|
||||
&txt_height,
|
||||
&txt_width,
|
||||
&new_size,
|
||||
@@ -476,7 +476,11 @@ gboolean resize_execp(void *obj)
|
||||
void draw_execp(void *obj, cairo_t *c)
|
||||
{
|
||||
Execp *execp = (Execp *)obj;
|
||||
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||
Panel *panel = (Panel *)execp->area.panel;
|
||||
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * panel->scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
|
||||
if (execp->backend->has_icon && execp->backend->icon) {
|
||||
imlib_context_set_image(execp->backend->icon);
|
||||
@@ -486,7 +490,8 @@ void draw_execp(void *obj, cairo_t *c)
|
||||
|
||||
// draw layout
|
||||
pango_layout_set_font_description(layout, execp->backend->font_desc);
|
||||
pango_layout_set_width(layout, (execp->frontend->textw + 1) * PANGO_SCALE);
|
||||
pango_layout_set_width(layout, (execp->frontend->textw + TINT2_PANGO_SLACK) * PANGO_SCALE);
|
||||
pango_layout_set_height(layout, (execp->frontend->texth + TINT2_PANGO_SLACK) * PANGO_SCALE);
|
||||
pango_layout_set_alignment(layout, execp->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);
|
||||
@@ -504,6 +509,7 @@ void draw_execp(void *obj, cairo_t *c)
|
||||
panel_config.font_shadow);
|
||||
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
}
|
||||
|
||||
void execp_dump_geometry(void *obj, int indent)
|
||||
@@ -631,7 +637,8 @@ void execp_timer_callback(void *arg)
|
||||
close(pipe_fd_stderr[0]);
|
||||
return;
|
||||
} else if (child == 0) {
|
||||
fprintf(stderr, "tint2: Executing: %s\n", execp->backend->command);
|
||||
if (debug_executors)
|
||||
fprintf(stderr, "tint2: Executing: %s\n", execp->backend->command);
|
||||
// We are in the child
|
||||
close(pipe_fd_stdout[0]);
|
||||
dup2(pipe_fd_stdout[1], 1); // 1 is stdout
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include "common.h"
|
||||
#include "timer.h"
|
||||
|
||||
extern bool debug_executors;
|
||||
|
||||
// Architecture:
|
||||
// Panel panel_config contains an array of Execp, each storing all config options and all the state variables.
|
||||
// Only these run commands.
|
||||
|
||||
@@ -65,14 +65,14 @@ void cleanup_freespace(Panel *panel)
|
||||
panel->freespace_list = NULL;
|
||||
}
|
||||
|
||||
int freespace_get_max_size(Panel *p)
|
||||
int freespace_get_max_size(Panel *panel)
|
||||
{
|
||||
if (panel_shrink)
|
||||
return 0;
|
||||
// Get space used by every element except the freespace
|
||||
int size = 0;
|
||||
int spacers = 0;
|
||||
for (GList *walk = p->area.children; walk; walk = g_list_next(walk)) {
|
||||
for (GList *walk = panel->area.children; walk; walk = g_list_next(walk)) {
|
||||
Area *a = (Area *)walk->data;
|
||||
|
||||
if (!a->on_screen)
|
||||
@@ -83,15 +83,15 @@ int freespace_get_max_size(Panel *p)
|
||||
}
|
||||
|
||||
if (panel_horizontal)
|
||||
size += a->width + p->area.paddingx;
|
||||
size += a->width + panel->area.paddingx * panel->scale;
|
||||
else
|
||||
size += a->height + p->area.paddingy;
|
||||
size += a->height + panel->area.paddingy * panel->scale;
|
||||
}
|
||||
|
||||
if (panel_horizontal)
|
||||
size = p->area.width - size - left_right_border_width(&p->area) - p->area.paddingxlr;
|
||||
size = panel->area.width - size - left_right_border_width(&panel->area) - panel->area.paddingxlr * panel->scale;
|
||||
else
|
||||
size = p->area.height - size - top_bottom_border_width(&p->area) - p->area.paddingxlr;
|
||||
size = panel->area.height - size - top_bottom_border_width(&panel->area) - panel->area.paddingxlr * panel->scale;
|
||||
|
||||
return size / spacers;
|
||||
}
|
||||
|
||||
@@ -106,6 +106,7 @@ void handle_env_vars()
|
||||
debug_dnd = getenv("DEBUG_DND") != NULL;
|
||||
debug_thumbnails = getenv("DEBUG_THUMBNAILS") != NULL;
|
||||
debug_timers = getenv("DEBUG_TIMERS") != NULL;
|
||||
debug_executors = getenv("DEBUG_EXECUTORS") != NULL;
|
||||
if (debug_fps) {
|
||||
init_fps_distribution();
|
||||
char *s = getenv("TRACING_FPS_THRESHOLD");
|
||||
|
||||
@@ -112,7 +112,7 @@ void init_launcher_panel(void *p)
|
||||
return;
|
||||
|
||||
// This will be recomputed on resize, we just initialize to a non-zero value
|
||||
launcher->icon_size = launcher_max_icon_size > 0 ? launcher_max_icon_size : 24;
|
||||
launcher->icon_size = launcher_max_icon_size > 0 ? launcher_max_icon_size * panel->scale : 24;
|
||||
|
||||
launcher->area.on_screen = TRUE;
|
||||
schedule_panel_redraw();
|
||||
@@ -174,11 +174,12 @@ void cleanup_launcher_theme(Launcher *launcher)
|
||||
|
||||
int launcher_compute_icon_size(Launcher *launcher)
|
||||
{
|
||||
Panel *panel = launcher->area.panel;
|
||||
int icon_size = panel_horizontal ? launcher->area.height : launcher->area.width;
|
||||
icon_size = icon_size - MAX(left_right_border_width(&launcher->area), top_bottom_border_width(&launcher->area)) -
|
||||
(2 * launcher->area.paddingy);
|
||||
if (launcher_max_icon_size > 0 && icon_size > launcher_max_icon_size)
|
||||
icon_size = launcher_max_icon_size;
|
||||
(2 * launcher->area.paddingy * panel->scale);
|
||||
if (launcher_max_icon_size)
|
||||
icon_size = MIN(icon_size, launcher_max_icon_size * panel->scale);
|
||||
return icon_size;
|
||||
}
|
||||
|
||||
@@ -189,6 +190,7 @@ void launcher_compute_geometry(Launcher *launcher,
|
||||
int *icons_per_row,
|
||||
int *margin)
|
||||
{
|
||||
Panel *panel = (Panel*)launcher->area.panel;
|
||||
int count = 0;
|
||||
for (GSList *l = launcher->list_icons; l; l = l->next) {
|
||||
LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
|
||||
@@ -204,25 +206,25 @@ void launcher_compute_geometry(Launcher *launcher,
|
||||
if (!count) {
|
||||
*size = 0;
|
||||
} else {
|
||||
int height = launcher->area.height - top_bottom_border_width(&launcher->area) - 2 * launcher->area.paddingy;
|
||||
int height = launcher->area.height - top_bottom_border_width(&launcher->area) - 2 * launcher->area.paddingy * panel->scale;
|
||||
// here icons_per_column always higher than 0
|
||||
*icons_per_column = (height + launcher->area.paddingx) / (*icon_size + launcher->area.paddingx);
|
||||
*margin = height - (*icons_per_column - 1) * (*icon_size + launcher->area.paddingx) - *icon_size;
|
||||
*icons_per_column = (height + launcher->area.paddingx * panel->scale) / (*icon_size + launcher->area.paddingx * panel->scale);
|
||||
*margin = height - (*icons_per_column - 1) * (*icon_size + launcher->area.paddingx * panel->scale) - *icon_size;
|
||||
*icons_per_row = count / *icons_per_column + (count % *icons_per_column != 0);
|
||||
*size = left_right_border_width(&launcher->area) + 2 * launcher->area.paddingxlr +
|
||||
(*icon_size * *icons_per_row) + ((*icons_per_row - 1) * launcher->area.paddingx);
|
||||
*size = left_right_border_width(&launcher->area) + 2 * launcher->area.paddingxlr * panel->scale +
|
||||
(*icon_size * *icons_per_row) + ((*icons_per_row - 1) * launcher->area.paddingx * panel->scale);
|
||||
}
|
||||
} else {
|
||||
if (!count) {
|
||||
*size = 0;
|
||||
} else {
|
||||
int width = launcher->area.width - top_bottom_border_width(&launcher->area) - 2 * launcher->area.paddingy;
|
||||
int width = launcher->area.width - top_bottom_border_width(&launcher->area) - 2 * launcher->area.paddingy * panel->scale;
|
||||
// here icons_per_row always higher than 0
|
||||
*icons_per_row = (width + launcher->area.paddingx) / (*icon_size + launcher->area.paddingx);
|
||||
*margin = width - (*icons_per_row - 1) * (*icon_size + launcher->area.paddingx) - *icon_size;
|
||||
*icons_per_row = (width + launcher->area.paddingx * panel->scale) / (*icon_size + launcher->area.paddingx * panel->scale);
|
||||
*margin = width - (*icons_per_row - 1) * (*icon_size + launcher->area.paddingx * panel->scale) - *icon_size;
|
||||
*icons_per_column = count / *icons_per_row + (count % *icons_per_row != 0);
|
||||
*size = top_bottom_border_width(&launcher->area) + 2 * launcher->area.paddingxlr +
|
||||
(*icon_size * *icons_per_column) + ((*icons_per_column - 1) * launcher->area.paddingx);
|
||||
*size = top_bottom_border_width(&launcher->area) + 2 * launcher->area.paddingxlr * panel->scale +
|
||||
(*icon_size * *icons_per_column) + ((*icons_per_column - 1) * launcher->area.paddingx * panel->scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -239,6 +241,7 @@ int launcher_compute_desired_size(void *obj)
|
||||
gboolean resize_launcher(void *obj)
|
||||
{
|
||||
Launcher *launcher = (Launcher *)obj;
|
||||
Panel *panel = (Panel*)launcher->area.panel;
|
||||
|
||||
int size, icons_per_column, icons_per_row, margin;
|
||||
launcher_compute_geometry(launcher, &size, &launcher->icon_size, &icons_per_column, &icons_per_row, &margin);
|
||||
@@ -281,11 +284,11 @@ gboolean resize_launcher(void *obj)
|
||||
int posx, posy;
|
||||
int start;
|
||||
if (panel_horizontal) {
|
||||
posy = start = top_border_width(&launcher->area) + launcher->area.paddingy + margin / 2;
|
||||
posx = left_border_width(&launcher->area) + launcher->area.paddingxlr;
|
||||
posy = start = top_border_width(&launcher->area) + launcher->area.paddingy * panel->scale + margin / 2;
|
||||
posx = left_border_width(&launcher->area) + launcher->area.paddingxlr * panel->scale;
|
||||
} else {
|
||||
posx = start = left_border_width(&launcher->area) + launcher->area.paddingy + margin / 2;
|
||||
posy = top_border_width(&launcher->area) + launcher->area.paddingxlr;
|
||||
posx = start = left_border_width(&launcher->area) + launcher->area.paddingy * panel->scale + margin / 2;
|
||||
posy = top_border_width(&launcher->area) + launcher->area.paddingxlr * panel->scale;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
@@ -300,17 +303,17 @@ gboolean resize_launcher(void *obj)
|
||||
// fprintf(stderr, "tint2: launcher %d : %d,%d\n", i, posx, posy);
|
||||
if (panel_horizontal) {
|
||||
if (i % icons_per_column) {
|
||||
posy += launcher->icon_size + launcher->area.paddingx;
|
||||
posy += launcher->icon_size + launcher->area.paddingx * panel->scale;
|
||||
} else {
|
||||
posy = start;
|
||||
posx += (launcher->icon_size + launcher->area.paddingx);
|
||||
posx += (launcher->icon_size + launcher->area.paddingx * panel->scale);
|
||||
}
|
||||
} else {
|
||||
if (i % icons_per_row) {
|
||||
posx += launcher->icon_size + launcher->area.paddingx;
|
||||
posx += launcher->icon_size + launcher->area.paddingx * panel->scale;
|
||||
} else {
|
||||
posx = start;
|
||||
posy += (launcher->icon_size + launcher->area.paddingx);
|
||||
posy += (launcher->icon_size + launcher->area.paddingx * panel->scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
43
src/panel.c
43
src/panel.c
@@ -79,11 +79,16 @@ int num_panels;
|
||||
GArray *backgrounds;
|
||||
GArray *gradients;
|
||||
|
||||
double ui_scale_dpi_ref;
|
||||
double ui_scale_monitor_size_ref;
|
||||
|
||||
Imlib_Image default_icon;
|
||||
char *default_font = NULL;
|
||||
|
||||
void default_panel()
|
||||
{
|
||||
ui_scale_dpi_ref = 0;
|
||||
ui_scale_monitor_size_ref = 0;
|
||||
panels = NULL;
|
||||
num_panels = 0;
|
||||
default_icon = NULL;
|
||||
@@ -218,6 +223,17 @@ void init_panel()
|
||||
|
||||
if (panel_config.monitor < 0)
|
||||
p->monitor = i;
|
||||
if (ui_scale_dpi_ref > 0 && server.monitors[p->monitor].dpi > 0)
|
||||
p->scale = server.monitors[p->monitor].dpi / ui_scale_dpi_ref;
|
||||
else
|
||||
p->scale = 1;
|
||||
if (ui_scale_monitor_size_ref > 0)
|
||||
p->scale *= server.monitors[p->monitor].height / ui_scale_monitor_size_ref;
|
||||
if (p->scale > 8 || p->scale < 1./8) {
|
||||
fprintf(stderr, RED "tint2: panel %d having scale %g outside bounds, resetting to 1.0" RESET "\n", i + 1, p->scale);
|
||||
p->scale = 1;
|
||||
}
|
||||
fprintf(stderr, BLUE "tint2: panel %d uses scale %g " RESET "\n", i + 1, p->scale);
|
||||
if (!p->area.bg)
|
||||
p->area.bg = &g_array_index(backgrounds, Background, 0);
|
||||
p->area.parent = p;
|
||||
@@ -355,6 +371,19 @@ void panel_compute_size(Panel *panel)
|
||||
}
|
||||
}
|
||||
|
||||
if (!panel->fractional_width) {
|
||||
if (panel_horizontal)
|
||||
panel->area.width *= panel->scale;
|
||||
else
|
||||
panel->area.height *= panel->scale;
|
||||
}
|
||||
if (!panel->fractional_height) {
|
||||
if (panel_horizontal)
|
||||
panel->area.height *= panel->scale;
|
||||
else
|
||||
panel->area.width *= panel->scale;
|
||||
}
|
||||
|
||||
if (panel->area.width + panel->marginx > server.monitors[panel->monitor].width)
|
||||
panel->area.width = server.monitors[panel->monitor].width - panel->marginx;
|
||||
if (panel->area.height + panel->marginy > server.monitors[panel->monitor].height)
|
||||
@@ -449,9 +478,9 @@ gboolean resize_panel(void *obj)
|
||||
if (!taskbar->area.on_screen)
|
||||
continue;
|
||||
if (panel_horizontal)
|
||||
taskbar->area.width = 2 * taskbar->area.paddingxlr;
|
||||
taskbar->area.width = 2 * taskbar->area.paddingxlr * panel->scale;
|
||||
else
|
||||
taskbar->area.height = 2 * taskbar->area.paddingxlr;
|
||||
taskbar->area.height = 2 * taskbar->area.paddingxlr * panel->scale;
|
||||
if (taskbarname_enabled && taskbar->area.children) {
|
||||
Area *name = (Area *)taskbar->area.children->data;
|
||||
if (name->on_screen) {
|
||||
@@ -468,9 +497,9 @@ gboolean resize_panel(void *obj)
|
||||
continue;
|
||||
if (!first_child) {
|
||||
if (panel_horizontal)
|
||||
taskbar->area.width += taskbar->area.paddingx;
|
||||
taskbar->area.width += taskbar->area.paddingx * panel->scale;
|
||||
else
|
||||
taskbar->area.height += taskbar->area.paddingy;
|
||||
taskbar->area.height += taskbar->area.paddingy * panel->scale;
|
||||
}
|
||||
first_child = FALSE;
|
||||
}
|
||||
@@ -528,6 +557,8 @@ gboolean resize_panel(void *obj)
|
||||
}
|
||||
} else if (taskbar_alignment == ALIGN_CENTER) {
|
||||
slack /= 2;
|
||||
Taskbar *left_taskbar = NULL;
|
||||
Taskbar *right_taskbar = NULL;
|
||||
for (int i = 0; i < panel->num_desktops; i++) {
|
||||
Taskbar *taskbar = &panel->taskbar[i];
|
||||
if (!taskbar->area.on_screen)
|
||||
@@ -537,6 +568,7 @@ gboolean resize_panel(void *obj)
|
||||
else
|
||||
taskbar->area.height += slack;
|
||||
taskbar->area.alignment = ALIGN_RIGHT;
|
||||
left_taskbar = taskbar;
|
||||
break;
|
||||
}
|
||||
for (int i = panel->num_desktops - 1; i >= 0; i--) {
|
||||
@@ -548,8 +580,11 @@ gboolean resize_panel(void *obj)
|
||||
else
|
||||
taskbar->area.height += slack;
|
||||
taskbar->area.alignment = ALIGN_LEFT;
|
||||
right_taskbar = taskbar;
|
||||
break;
|
||||
}
|
||||
if (left_taskbar == right_taskbar)
|
||||
left_taskbar->area.alignment = ALIGN_CENTER;
|
||||
}
|
||||
} else {
|
||||
// No tasks => expand the first visible taskbar
|
||||
|
||||
@@ -95,6 +95,8 @@ extern gboolean debug_fps;
|
||||
extern double tracing_fps_threshold;
|
||||
extern gboolean debug_frames;
|
||||
extern gboolean debug_thumbnails;
|
||||
extern double ui_scale_dpi_ref;
|
||||
extern double ui_scale_monitor_size_ref;
|
||||
|
||||
typedef struct Panel {
|
||||
Area area;
|
||||
@@ -117,6 +119,7 @@ typedef struct Panel {
|
||||
int mouse_pressed_alpha;
|
||||
int mouse_pressed_saturation;
|
||||
int mouse_pressed_brightness;
|
||||
double scale;
|
||||
|
||||
// Per-panel parameters and states for Taskbar and Task
|
||||
GlobalTaskbar g_taskbar;
|
||||
|
||||
@@ -115,31 +115,33 @@ void cleanup_separator()
|
||||
int separator_compute_desired_size(void *obj)
|
||||
{
|
||||
Separator *separator = (Separator *)obj;
|
||||
Panel *panel = (Panel*)separator->area.panel;
|
||||
if (!separator->area.on_screen)
|
||||
return 0;
|
||||
|
||||
if (panel_horizontal)
|
||||
return separator->thickness + 2 * separator->area.paddingxlr + left_right_border_width(&separator->area);
|
||||
return separator->thickness + 2 * separator->area.paddingxlr * panel->scale + left_right_border_width(&separator->area);
|
||||
else
|
||||
return separator->thickness + 2 * separator->area.paddingxlr + top_bottom_border_width(&separator->area);
|
||||
return separator->thickness + 2 * separator->area.paddingxlr * panel->scale + top_bottom_border_width(&separator->area);
|
||||
}
|
||||
|
||||
gboolean resize_separator(void *obj)
|
||||
{
|
||||
Separator *separator = (Separator *)obj;
|
||||
Panel *panel = (Panel*)separator->area.panel;
|
||||
if (!separator->area.on_screen)
|
||||
return FALSE;
|
||||
|
||||
if (panel_horizontal) {
|
||||
separator->area.width =
|
||||
separator->thickness + 2 * separator->area.paddingxlr + left_right_border_width(&separator->area);
|
||||
separator->thickness + 2 * separator->area.paddingxlr * panel->scale + left_right_border_width(&separator->area);
|
||||
separator->length =
|
||||
separator->area.height - 2 * separator->area.paddingy - top_bottom_border_width(&separator->area);
|
||||
separator->area.height - 2 * separator->area.paddingy * panel->scale - top_bottom_border_width(&separator->area);
|
||||
} else {
|
||||
separator->area.height =
|
||||
separator->thickness + 2 * separator->area.paddingxlr + top_bottom_border_width(&separator->area);
|
||||
separator->thickness + 2 * separator->area.paddingxlr * panel->scale + top_bottom_border_width(&separator->area);
|
||||
separator->length =
|
||||
separator->area.width - 2 * separator->area.paddingy - left_right_border_width(&separator->area);
|
||||
separator->area.width - 2 * separator->area.paddingy * panel->scale - left_right_border_width(&separator->area);
|
||||
}
|
||||
|
||||
schedule_redraw(&separator->area);
|
||||
|
||||
@@ -141,11 +141,12 @@ void init_systray_panel(void *p)
|
||||
|
||||
void systray_compute_geometry(int *size)
|
||||
{
|
||||
Panel *panel = (Panel*)systray.area.panel;
|
||||
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;
|
||||
MAX(left_right_border_width(&systray.area), top_bottom_border_width(&systray.area)) + 2 * systray.area.paddingy * panel->scale;
|
||||
if (systray_max_icon_size > 0)
|
||||
systray.icon_size = MIN(systray.icon_size, systray_max_icon_size);
|
||||
systray.icon_size = MIN(systray.icon_size, systray_max_icon_size * panel->scale);
|
||||
|
||||
int count = 0;
|
||||
for (GSList *l = systray.list_icons; l; l = l->next) {
|
||||
@@ -153,24 +154,24 @@ void systray_compute_geometry(int *size)
|
||||
}
|
||||
|
||||
if (panel_horizontal) {
|
||||
int height = systray.area.height - top_bottom_border_width(&systray.area) - 2 * systray.area.paddingy;
|
||||
int height = systray.area.height - top_bottom_border_width(&systray.area) - 2 * systray.area.paddingy * panel->scale;
|
||||
// here icons_per_column always higher than 0
|
||||
systray.icons_per_column = (height + systray.area.paddingx) / (systray.icon_size + systray.area.paddingx);
|
||||
systray.icons_per_column = (height + systray.area.paddingx * panel->scale) / (systray.icon_size + systray.area.paddingx * panel->scale);
|
||||
systray.margin =
|
||||
height - (systray.icons_per_column - 1) * (systray.icon_size + systray.area.paddingx) - systray.icon_size;
|
||||
height - (systray.icons_per_column - 1) * (systray.icon_size + systray.area.paddingx * panel->scale) - 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);
|
||||
*size = left_right_border_width(&systray.area) + 2 * systray.area.paddingxlr * panel->scale +
|
||||
(systray.icon_size * systray.icons_per_row) + ((systray.icons_per_row - 1) * systray.area.paddingx * panel->scale);
|
||||
} else {
|
||||
int width = systray.area.width - left_right_border_width(&systray.area) - 2 * systray.area.paddingy;
|
||||
int width = systray.area.width - left_right_border_width(&systray.area) - 2 * systray.area.paddingy * panel->scale;
|
||||
// here icons_per_row always higher than 0
|
||||
systray.icons_per_row = (width + systray.area.paddingx) / (systray.icon_size + systray.area.paddingx);
|
||||
systray.icons_per_row = (width + systray.area.paddingx * panel->scale) / (systray.icon_size + systray.area.paddingx * panel->scale);
|
||||
systray.margin =
|
||||
width - (systray.icons_per_row - 1) * (systray.icon_size + systray.area.paddingx) - systray.icon_size;
|
||||
width - (systray.icons_per_row - 1) * (systray.icon_size + systray.area.paddingx * panel->scale) - systray.icon_size;
|
||||
systray.icons_per_column = count / systray.icons_per_row + (count % systray.icons_per_row != 0);
|
||||
*size = top_bottom_border_width(&systray.area) + (2 * systray.area.paddingxlr) +
|
||||
*size = top_bottom_border_width(&systray.area) + (2 * systray.area.paddingxlr * panel->scale) +
|
||||
(systray.icon_size * systray.icons_per_column) +
|
||||
((systray.icons_per_column - 1) * systray.area.paddingx);
|
||||
((systray.icons_per_column - 1) * systray.area.paddingx * panel->scale);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -281,13 +282,13 @@ void on_change_systray(void *obj)
|
||||
int posx, posy;
|
||||
int start;
|
||||
if (panel_horizontal) {
|
||||
posy = start = top_border_width(&panel->area) + panel->area.paddingy + top_border_width(&systray.area) +
|
||||
systray.area.paddingy + systray.margin / 2;
|
||||
posx = systray.area.posx + left_border_width(&systray.area) + systray.area.paddingxlr;
|
||||
posy = start = top_border_width(&panel->area) + panel->area.paddingy * panel->scale + top_border_width(&systray.area) +
|
||||
systray.area.paddingy * panel->scale + systray.margin / 2;
|
||||
posx = systray.area.posx + left_border_width(&systray.area) + systray.area.paddingxlr * panel->scale;
|
||||
} else {
|
||||
posx = start = left_border_width(&panel->area) + panel->area.paddingy + left_border_width(&systray.area) +
|
||||
systray.area.paddingy + systray.margin / 2;
|
||||
posy = systray.area.posy + top_border_width(&systray.area) + systray.area.paddingxlr;
|
||||
posx = start = left_border_width(&panel->area) + panel->area.paddingy * panel->scale + left_border_width(&systray.area) +
|
||||
systray.area.paddingy * panel->scale + systray.margin / 2;
|
||||
posy = systray.area.posy + top_border_width(&systray.area) + systray.area.paddingxlr * panel->scale;
|
||||
}
|
||||
|
||||
TrayWindow *traywin;
|
||||
@@ -312,17 +313,17 @@ void on_change_systray(void *obj)
|
||||
traywin->height = systray.icon_size;
|
||||
if (panel_horizontal) {
|
||||
if (i % systray.icons_per_column) {
|
||||
posy += systray.icon_size + systray.area.paddingx;
|
||||
posy += systray.icon_size + systray.area.paddingx * panel->scale;
|
||||
} else {
|
||||
posy = start;
|
||||
posx += (systray.icon_size + systray.area.paddingx);
|
||||
posx += (systray.icon_size + systray.area.paddingx * panel->scale);
|
||||
}
|
||||
} else {
|
||||
if (i % systray.icons_per_row) {
|
||||
posx += systray.icon_size + systray.area.paddingx;
|
||||
posx += systray.icon_size + systray.area.paddingx * panel->scale;
|
||||
} else {
|
||||
posx = start;
|
||||
posy += (systray.icon_size + systray.area.paddingx);
|
||||
posy += (systray.icon_size + systray.area.paddingx * panel->scale);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -429,7 +429,7 @@ void draw_task_icon(Task *task, int text_width)
|
||||
else
|
||||
task->_icon_x = (task->area.width - panel->g_task.icon_size1) / 2;
|
||||
} else {
|
||||
task->_icon_x = left_border_width(&task->area) + task->area.paddingxlr;
|
||||
task->_icon_x = left_border_width(&task->area) + task->area.paddingxlr * panel->scale;
|
||||
}
|
||||
|
||||
// Render
|
||||
@@ -459,11 +459,13 @@ void draw_task(void *obj, cairo_t *c)
|
||||
|
||||
task->_text_width = 0;
|
||||
if (panel->g_task.has_text) {
|
||||
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * panel->scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
pango_layout_set_font_description(layout, panel->g_task.font_desc);
|
||||
pango_layout_set_text(layout, task->title, -1);
|
||||
|
||||
pango_layout_set_width(layout, (((Taskbar *)task->area.parent)->text_width + 1) * PANGO_SCALE);
|
||||
pango_layout_set_width(layout, (((Taskbar *)task->area.parent)->text_width + TINT2_PANGO_SLACK) * PANGO_SCALE);
|
||||
pango_layout_set_height(layout, panel->g_task.text_height * PANGO_SCALE);
|
||||
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
|
||||
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
||||
@@ -480,6 +482,7 @@ void draw_task(void *obj, cairo_t *c)
|
||||
draw_text(layout, c, panel->g_task.text_posx, task->_text_posy, config_text, panel->font_shadow);
|
||||
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
}
|
||||
|
||||
if (panel->g_task.has_icon)
|
||||
@@ -532,7 +535,7 @@ int task_compute_desired_size(void *obj)
|
||||
{
|
||||
Task *task = (Task *)obj;
|
||||
Panel *panel = (Panel *)task->area.panel;
|
||||
int size = panel_horizontal ? panel->g_task.maximum_width : panel->g_task.maximum_height;
|
||||
int size = (panel_horizontal ? panel->g_task.maximum_width : panel->g_task.maximum_height) * panel->scale;
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -652,12 +655,13 @@ void task_refresh_thumbnail(Task *task)
|
||||
return;
|
||||
if (task->current_state == TASK_ICONIFIED)
|
||||
return;
|
||||
Panel *panel = (Panel*)task->area.panel;
|
||||
double now = get_time();
|
||||
if (now - task->thumbnail_last_update < 0.1)
|
||||
return;
|
||||
if (debug_thumbnails)
|
||||
fprintf(stderr, "tint2: thumbnail for window: %s" RESET "\n", task->title ? task->title : "");
|
||||
cairo_surface_t *thumbnail = get_window_thumbnail(task->win, panel_config.g_task.thumbnail_width);
|
||||
cairo_surface_t *thumbnail = get_window_thumbnail(task->win, panel_config.g_task.thumbnail_width * panel->scale);
|
||||
if (!thumbnail)
|
||||
return;
|
||||
if (task->thumbnail)
|
||||
@@ -754,8 +758,8 @@ void blink_urgent(void *arg)
|
||||
GSList *urgent_task = urgent_list;
|
||||
while (urgent_task) {
|
||||
Task *t = urgent_task->data;
|
||||
if (t->urgent_tick < max_tick_urgent) {
|
||||
if (t->urgent_tick++ % 2)
|
||||
if (t->urgent_tick <= max_tick_urgent) {
|
||||
if (++t->urgent_tick % 2)
|
||||
set_task_state(t, TASK_URGENT);
|
||||
else
|
||||
set_task_state(t, window_is_iconified(t->win) ? TASK_ICONIFIED : TASK_NORMAL);
|
||||
|
||||
@@ -238,15 +238,15 @@ void init_taskbar_panel(void *p)
|
||||
panel->g_taskbar.area.resize_needed = 1;
|
||||
panel->g_taskbar.area.on_screen = TRUE;
|
||||
if (panel_horizontal) {
|
||||
panel->g_taskbar.area.posy = top_border_width(&panel->area) + panel->area.paddingy;
|
||||
panel->g_taskbar.area.posy = top_border_width(&panel->area) + panel->area.paddingy * panel->scale;
|
||||
panel->g_taskbar.area.height =
|
||||
panel->area.height - top_bottom_border_width(&panel->area) - 2 * panel->area.paddingy;
|
||||
panel->area.height - top_bottom_border_width(&panel->area) - 2 * panel->area.paddingy * panel->scale;
|
||||
panel->g_taskbar.area_name.posy = panel->g_taskbar.area.posy;
|
||||
panel->g_taskbar.area_name.height = panel->g_taskbar.area.height;
|
||||
} else {
|
||||
panel->g_taskbar.area.posx = left_border_width(&panel->area) + panel->area.paddingy;
|
||||
panel->g_taskbar.area.posx = left_border_width(&panel->area) + panel->area.paddingy * panel->scale;
|
||||
panel->g_taskbar.area.width =
|
||||
panel->area.width - left_right_border_width(&panel->area) - 2 * panel->area.paddingy;
|
||||
panel->area.width - left_right_border_width(&panel->area) - 2 * panel->area.paddingy * panel->scale;
|
||||
panel->g_taskbar.area_name.posx = panel->g_taskbar.area.posx;
|
||||
panel->g_taskbar.area_name.width = panel->g_taskbar.area.width;
|
||||
}
|
||||
@@ -304,19 +304,19 @@ void init_taskbar_panel(void *p)
|
||||
if (panel_horizontal) {
|
||||
panel->g_task.area.posy = panel->g_taskbar.area.posy +
|
||||
top_bg_border_width(panel->g_taskbar.background[TASKBAR_NORMAL]) +
|
||||
panel->g_taskbar.area.paddingy;
|
||||
panel->g_taskbar.area.paddingy * panel->scale;
|
||||
panel->g_task.area.width = panel->g_task.maximum_width;
|
||||
panel->g_task.area.height = panel->g_taskbar.area.height -
|
||||
top_bottom_bg_border_width(panel->g_taskbar.background[TASKBAR_NORMAL]) -
|
||||
2 * panel->g_taskbar.area.paddingy;
|
||||
2 * panel->g_taskbar.area.paddingy * panel->scale;
|
||||
} else {
|
||||
panel->g_task.area.posx = panel->g_taskbar.area.posx +
|
||||
left_bg_border_width(panel->g_taskbar.background[TASKBAR_NORMAL]) +
|
||||
panel->g_taskbar.area.paddingy;
|
||||
panel->g_taskbar.area.paddingy * panel->scale;
|
||||
panel->g_task.area.width = panel->g_taskbar.area.width -
|
||||
left_right_bg_border_width(panel->g_taskbar.background[TASKBAR_NORMAL]) -
|
||||
2 * panel->g_taskbar.area.paddingy;
|
||||
panel->g_task.area.height = panel->g_task.maximum_height;
|
||||
2 * panel->g_taskbar.area.paddingy * panel->scale;
|
||||
panel->g_task.area.height = panel->g_task.maximum_height * panel->scale;
|
||||
}
|
||||
|
||||
for (int j = 0; j < TASK_STATE_COUNT; ++j) {
|
||||
@@ -333,9 +333,8 @@ void init_taskbar_panel(void *p)
|
||||
}
|
||||
|
||||
// compute vertical position : text and icon
|
||||
int height_ink, height, width;
|
||||
int height, width;
|
||||
get_text_size2(panel->g_task.font_desc,
|
||||
&height_ink,
|
||||
&height,
|
||||
&width,
|
||||
panel->area.height,
|
||||
@@ -344,17 +343,19 @@ void init_taskbar_panel(void *p)
|
||||
5,
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_END,
|
||||
FALSE);
|
||||
panel->g_task.centered ? PANGO_ALIGN_CENTER : PANGO_ALIGN_LEFT,
|
||||
FALSE,
|
||||
panel->scale);
|
||||
|
||||
panel->g_task.text_posx = left_bg_border_width(panel->g_task.background[0]) + panel->g_task.area.paddingxlr;
|
||||
panel->g_task.text_posx = left_bg_border_width(panel->g_task.background[0]) + panel->g_task.area.paddingxlr * panel->scale;
|
||||
panel->g_task.text_height =
|
||||
panel->g_task.area.height - (2 * panel->g_task.area.paddingy) - top_bottom_border_width(&panel->g_task.area);
|
||||
panel->g_task.area.height - (2 * panel->g_task.area.paddingy * panel->scale) - 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),
|
||||
panel->g_task.icon_size1 = MIN(MIN(panel->g_task.maximum_width * panel->scale, panel->g_task.maximum_height * panel->scale),
|
||||
MIN(panel->g_task.area.width, panel->g_task.area.height)) -
|
||||
2 * panel->g_task.area.paddingy - MAX(left_right_border_width(&panel->g_task.area),
|
||||
2 * panel->g_task.area.paddingy * panel->scale - MAX(left_right_border_width(&panel->g_task.area),
|
||||
top_bottom_border_width(&panel->g_task.area));
|
||||
panel->g_task.text_posx += panel->g_task.icon_size1 + panel->g_task.area.paddingx;
|
||||
panel->g_task.text_posx += panel->g_task.icon_size1 + panel->g_task.area.paddingx * panel->scale;
|
||||
panel->g_task.icon_posy = (panel->g_task.area.height - panel->g_task.icon_size1) / 2;
|
||||
}
|
||||
|
||||
@@ -573,12 +574,12 @@ gboolean resize_taskbar(void *obj)
|
||||
}
|
||||
}
|
||||
taskbar->text_width = text_width - panel->g_task.text_posx - right_border_width(&panel->g_task.area) -
|
||||
panel->g_task.area.paddingxlr;
|
||||
panel->g_task.area.paddingxlr * panel->scale;
|
||||
} else {
|
||||
relayout_with_constraint(&taskbar->area, panel->g_task.maximum_height);
|
||||
relayout_with_constraint(&taskbar->area, panel->g_task.maximum_height * panel->scale);
|
||||
|
||||
taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.area.paddingy) - panel->g_task.text_posx -
|
||||
right_border_width(&panel->g_task.area) - panel->g_task.area.paddingxlr;
|
||||
taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.area.paddingy * panel->scale) - panel->g_task.text_posx -
|
||||
right_border_width(&panel->g_task.area) - panel->g_task.area.paddingxlr * panel->scale;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -134,9 +134,8 @@ int taskbarname_compute_desired_size(void *obj)
|
||||
{
|
||||
TaskbarName *taskbar_name = (TaskbarName *)obj;
|
||||
Panel *panel = (Panel *)taskbar_name->area.panel;
|
||||
int name_height, name_width, name_height_ink;
|
||||
int name_height, name_width;
|
||||
get_text_size2(panel_config.taskbarname_font_desc,
|
||||
&name_height_ink,
|
||||
&name_height,
|
||||
&name_width,
|
||||
panel->area.height,
|
||||
@@ -145,12 +144,14 @@ int taskbarname_compute_desired_size(void *obj)
|
||||
strlen(taskbar_name->name),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
FALSE);
|
||||
PANGO_ALIGN_CENTER,
|
||||
FALSE,
|
||||
panel->scale);
|
||||
|
||||
if (panel_horizontal) {
|
||||
return name_width + 2 * taskbar_name->area.paddingxlr + left_right_border_width(&taskbar_name->area);
|
||||
return name_width + 2 * taskbar_name->area.paddingxlr * panel->scale + left_right_border_width(&taskbar_name->area);
|
||||
} else {
|
||||
return name_height + 2 * taskbar_name->area.paddingxlr + top_bottom_border_width(&taskbar_name->area);
|
||||
return name_height + 2 * taskbar_name->area.paddingxlr * panel->scale + top_bottom_border_width(&taskbar_name->area);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,9 +162,8 @@ gboolean resize_taskbarname(void *obj)
|
||||
|
||||
schedule_redraw(&taskbar_name->area);
|
||||
|
||||
int name_height, name_width, name_height_ink;
|
||||
int name_height, name_width;
|
||||
get_text_size2(panel_config.taskbarname_font_desc,
|
||||
&name_height_ink,
|
||||
&name_height,
|
||||
&name_width,
|
||||
panel->area.height,
|
||||
@@ -172,7 +172,9 @@ gboolean resize_taskbarname(void *obj)
|
||||
strlen(taskbar_name->name),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
FALSE);
|
||||
PANGO_ALIGN_CENTER,
|
||||
FALSE,
|
||||
panel->scale);
|
||||
|
||||
gboolean result = FALSE;
|
||||
int new_size = taskbarname_compute_desired_size(obj);
|
||||
@@ -195,11 +197,14 @@ gboolean resize_taskbarname(void *obj)
|
||||
void draw_taskbarname(void *obj, cairo_t *c)
|
||||
{
|
||||
TaskbarName *taskbar_name = obj;
|
||||
Panel *panel = (Panel *)taskbar_name->area.panel;
|
||||
Taskbar *taskbar = taskbar_name->area.parent;
|
||||
Color *config_text = (taskbar->desktop == server.desktop) ? &taskbarname_active_font : &taskbarname_font;
|
||||
|
||||
// draw content
|
||||
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * panel->scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
pango_layout_set_font_description(layout, panel_config.taskbarname_font_desc);
|
||||
pango_layout_set_width(layout, taskbar_name->area.width * PANGO_SCALE);
|
||||
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
|
||||
@@ -213,6 +218,7 @@ void draw_taskbarname(void *obj, cairo_t *c)
|
||||
draw_text(layout, c, 0, taskbar_name->posy, config_text, ((Panel *)taskbar_name->area.panel)->font_shadow);
|
||||
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
}
|
||||
|
||||
void update_desktop_names()
|
||||
|
||||
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
File diff suppressed because it is too large
Load Diff
@@ -22,6 +22,7 @@
|
||||
#include "gradient_gui.h"
|
||||
#include "strlcat.h"
|
||||
|
||||
GtkWidget *scale_relative_to_dpi, *scale_relative_to_screen_height;
|
||||
GtkWidget *panel_width, *panel_height, *panel_margin_x, *panel_margin_y, *panel_padding_x, *panel_padding_y,
|
||||
*panel_spacing;
|
||||
GtkWidget *panel_wm_menu, *panel_dock, *panel_autohide, *panel_autohide_show_time, *panel_autohide_hide_time,
|
||||
@@ -600,6 +601,32 @@ void create_panel(GtkWidget *parent)
|
||||
"for centered panels, it is evenly distributed on both sides of the panel."),
|
||||
NULL);
|
||||
|
||||
row++;
|
||||
col = 2;
|
||||
label = gtk_label_new(_("Scale relative to DPI"));
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||
gtk_widget_show(label);
|
||||
gtk_table_attach(GTK_TABLE(table), label, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
|
||||
col++;
|
||||
|
||||
scale_relative_to_dpi = gtk_spin_button_new_with_range(0, 9000, 1);
|
||||
gtk_widget_show(scale_relative_to_dpi);
|
||||
gtk_table_attach(GTK_TABLE(table), scale_relative_to_dpi, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
|
||||
col++;
|
||||
|
||||
row++;
|
||||
col = 2;
|
||||
label = gtk_label_new(_("Scale relative to screen height"));
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||
gtk_widget_show(label);
|
||||
gtk_table_attach(GTK_TABLE(table), label, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
|
||||
col++;
|
||||
|
||||
scale_relative_to_screen_height = gtk_spin_button_new_with_range(0, 9000, 1);
|
||||
gtk_widget_show(scale_relative_to_screen_height);
|
||||
gtk_table_attach(GTK_TABLE(table), scale_relative_to_screen_height, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
|
||||
col++;
|
||||
|
||||
change_paragraph(parent);
|
||||
|
||||
label = gtk_label_new(_("<b>Appearance</b>"));
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "../launcher/icon-theme-common.h"
|
||||
|
||||
// panel
|
||||
extern GtkWidget *scale_relative_to_dpi, *scale_relative_to_screen_height;
|
||||
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,
|
||||
|
||||
@@ -378,6 +378,13 @@ void config_write_panel(FILE *fp)
|
||||
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(mouse_pressed_icon_saturation)),
|
||||
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(mouse_pressed_icon_brightness)));
|
||||
|
||||
fprintf(fp,
|
||||
"scale_relative_to_dpi = %d\n",
|
||||
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(scale_relative_to_dpi)));
|
||||
fprintf(fp,
|
||||
"scale_relative_to_screen_height = %d\n",
|
||||
(int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(scale_relative_to_screen_height)));
|
||||
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
|
||||
@@ -1108,7 +1115,13 @@ void add_entry(char *key, char *value)
|
||||
char *value1 = 0, *value2 = 0, *value3 = 0;
|
||||
|
||||
/* Gradients */
|
||||
if (strcmp(key, "gradient") == 0) {
|
||||
if (strcmp(key, "scale_relative_to_dpi") == 0) {
|
||||
extract_values(value, &value1, &value2, &value3);
|
||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(scale_relative_to_dpi), atoi(value1));
|
||||
} else if (strcmp(key, "scale_relative_to_screen_height") == 0) {
|
||||
extract_values(value, &value1, &value2, &value3);
|
||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(scale_relative_to_screen_height), atoi(value1));
|
||||
} else if (strcmp(key, "gradient") == 0) {
|
||||
finalize_gradient();
|
||||
GradientConfigType t;
|
||||
if (g_str_equal(value, "horizontal"))
|
||||
|
||||
@@ -153,7 +153,9 @@ void tooltip_update_geometry()
|
||||
|
||||
cairo_surface_t *cs = cairo_xlib_surface_create(server.display, g_tooltip.window, server.visual, width, height);
|
||||
cairo_t *c = cairo_create(cs);
|
||||
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * panel->scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
|
||||
pango_layout_set_font_description(layout, g_tooltip.font_desc);
|
||||
PangoRectangle r1, r2;
|
||||
@@ -161,7 +163,7 @@ void tooltip_update_geometry()
|
||||
pango_layout_get_pixel_extents(layout, &r1, &r2);
|
||||
int max_width = MIN(r2.width * 5, screen_width * 2 / 3);
|
||||
if (g_tooltip.image && cairo_image_surface_get_width(g_tooltip.image) > 0) {
|
||||
max_width = left_right_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingx +
|
||||
max_width = left_right_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingx * panel->scale +
|
||||
cairo_image_surface_get_width(g_tooltip.image);
|
||||
}
|
||||
pango_layout_set_width(layout, max_width * PANGO_SCALE);
|
||||
@@ -169,12 +171,12 @@ void tooltip_update_geometry()
|
||||
pango_layout_set_text(layout, g_tooltip.tooltip_text ? g_tooltip.tooltip_text : "1234567890abcdef", -1);
|
||||
pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
|
||||
pango_layout_get_pixel_extents(layout, &r1, &r2);
|
||||
width = left_right_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingx + r2.width;
|
||||
height = top_bottom_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingy + r2.height;
|
||||
width = left_right_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingx * panel->scale + r2.width;
|
||||
height = top_bottom_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingy * panel->scale + r2.height;
|
||||
if (g_tooltip.image && cairo_image_surface_get_width(g_tooltip.image) > 0) {
|
||||
width = left_right_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingx +
|
||||
width = left_right_bg_border_width(g_tooltip.bg) + 2 * g_tooltip.paddingx * panel->scale +
|
||||
cairo_image_surface_get_width(g_tooltip.image);
|
||||
height += g_tooltip.paddingy + cairo_image_surface_get_height(g_tooltip.image);
|
||||
height += g_tooltip.paddingy * panel->scale + cairo_image_surface_get_height(g_tooltip.image);
|
||||
}
|
||||
|
||||
if (panel_horizontal && panel_position & BOTTOM)
|
||||
@@ -187,6 +189,7 @@ void tooltip_update_geometry()
|
||||
x = panel->posx - width;
|
||||
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
cairo_destroy(c);
|
||||
cairo_surface_destroy(cs);
|
||||
}
|
||||
@@ -243,6 +246,7 @@ void tooltip_update()
|
||||
tooltip_hide(0);
|
||||
return;
|
||||
}
|
||||
Panel *panel = g_tooltip.panel;
|
||||
|
||||
tooltip_update_geometry();
|
||||
if (just_shown) {
|
||||
@@ -277,7 +281,9 @@ void tooltip_update()
|
||||
|
||||
Color fc = g_tooltip.font_color;
|
||||
cairo_set_source_rgba(c, fc.rgb[0], fc.rgb[1], fc.rgb[2], fc.alpha);
|
||||
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * panel->scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
pango_layout_set_font_description(layout, g_tooltip.font_desc);
|
||||
pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
|
||||
pango_layout_set_text(layout, g_tooltip.tooltip_text, -1);
|
||||
@@ -289,15 +295,16 @@ void tooltip_update()
|
||||
// I do not know why this is the right way, but with the below cairo_move_to it seems to be centered (horiz. and
|
||||
// vert.)
|
||||
cairo_move_to(c,
|
||||
-r1.x / 2 + left_bg_border_width(g_tooltip.bg) + g_tooltip.paddingx,
|
||||
-r1.y / 2 + 1 + top_bg_border_width(g_tooltip.bg) + g_tooltip.paddingy);
|
||||
-r1.x / 2 + left_bg_border_width(g_tooltip.bg) + g_tooltip.paddingx * panel->scale,
|
||||
-r1.y / 2 + 1 + top_bg_border_width(g_tooltip.bg) + g_tooltip.paddingy * panel->scale);
|
||||
pango_cairo_show_layout(c, layout);
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
|
||||
if (g_tooltip.image) {
|
||||
cairo_translate(c,
|
||||
left_bg_border_width(g_tooltip.bg) + g_tooltip.paddingx,
|
||||
height - bottom_bg_border_width(g_tooltip.bg) - g_tooltip.paddingy - cairo_image_surface_get_height(g_tooltip.image));
|
||||
left_bg_border_width(g_tooltip.bg) + g_tooltip.paddingx * panel->scale,
|
||||
height - bottom_bg_border_width(g_tooltip.bg) - g_tooltip.paddingy * panel->scale - cairo_image_surface_get_height(g_tooltip.image));
|
||||
cairo_set_source_surface(c, g_tooltip.image, 0, 0);
|
||||
cairo_paint(c);
|
||||
}
|
||||
|
||||
@@ -929,10 +929,8 @@ void area_compute_text_geometry(Area *area,
|
||||
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)
|
||||
{
|
||||
@@ -941,7 +939,6 @@ void area_compute_text_geometry(Area *area,
|
||||
|
||||
if (line1 && line1[0])
|
||||
get_text_size2(line1_font_desc,
|
||||
line1_height_ink,
|
||||
line1_height,
|
||||
line1_width,
|
||||
available_h,
|
||||
@@ -950,13 +947,14 @@ void area_compute_text_geometry(Area *area,
|
||||
strlen(line1),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
FALSE);
|
||||
PANGO_ALIGN_CENTER,
|
||||
FALSE,
|
||||
((Panel*)area->panel)->scale);
|
||||
else
|
||||
*line1_width = *line1_height_ink = *line1_height = 0;
|
||||
*line1_width = *line1_height = 0;
|
||||
|
||||
if (line2 && line2[0])
|
||||
get_text_size2(line2_font_desc,
|
||||
line2_height_ink,
|
||||
line2_height,
|
||||
line2_width,
|
||||
available_h,
|
||||
@@ -965,9 +963,11 @@ void area_compute_text_geometry(Area *area,
|
||||
strlen(line2),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE,
|
||||
FALSE);
|
||||
PANGO_ALIGN_CENTER,
|
||||
FALSE,
|
||||
((Panel*)area->panel)->scale);
|
||||
else
|
||||
*line2_width = *line2_height_ink = *line2_height = 0;
|
||||
*line2_width = *line2_height = 0;
|
||||
}
|
||||
|
||||
int text_area_compute_desired_size(Area *area,
|
||||
@@ -976,16 +976,14 @@ int text_area_compute_desired_size(Area *area,
|
||||
PangoFontDescription *line1_font_desc,
|
||||
PangoFontDescription *line2_font_desc)
|
||||
{
|
||||
int line1_height_ink, line1_height, line1_width, line2_height_ink, line2_height, line2_width;
|
||||
int line1_height, line1_width, 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);
|
||||
|
||||
@@ -1010,17 +1008,15 @@ gboolean resize_text_area(Area *area,
|
||||
|
||||
schedule_redraw(area);
|
||||
|
||||
int line1_height_ink, line1_height, line1_width;
|
||||
int line2_height_ink, line2_height, line2_width;
|
||||
int line1_height, line1_width;
|
||||
int 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);
|
||||
|
||||
@@ -1067,12 +1063,16 @@ void draw_text_area(Area *area,
|
||||
PangoFontDescription *line2_font_desc,
|
||||
int line1_posy,
|
||||
int line2_posy,
|
||||
Color *color)
|
||||
Color *color,
|
||||
double scale)
|
||||
{
|
||||
int inner_w, inner_h;
|
||||
area_compute_inner_size(area, &inner_w, &inner_h);
|
||||
|
||||
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
|
||||
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);
|
||||
@@ -1096,6 +1096,7 @@ void draw_text_area(Area *area,
|
||||
}
|
||||
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
}
|
||||
|
||||
Area *compute_element_area(Area *area, Element element)
|
||||
|
||||
@@ -273,10 +273,8 @@ void area_compute_text_geometry(Area *area,
|
||||
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,
|
||||
@@ -299,7 +297,8 @@ void draw_text_area(Area *area,
|
||||
PangoFontDescription *line2_font_desc,
|
||||
int line1_posy,
|
||||
int line2_posy,
|
||||
Color *color);
|
||||
Color *color,
|
||||
double scale);
|
||||
|
||||
int left_border_width(Area *a);
|
||||
int right_border_width(Area *a);
|
||||
|
||||
@@ -789,11 +789,7 @@ Imlib_Image load_image(const char *path, int cached)
|
||||
{
|
||||
Imlib_Image image;
|
||||
#ifdef HAVE_RSVG
|
||||
if (cached) {
|
||||
image = imlib_load_image_immediately(path);
|
||||
} else {
|
||||
image = imlib_load_image_immediately_without_cache(path);
|
||||
}
|
||||
image = imlib_load_image(path);
|
||||
if (!image && g_str_has_suffix(path, ".svg")) {
|
||||
char tmp_filename[128];
|
||||
snprintf(tmp_filename, sizeof(tmp_filename), "/tmp/tint2-%d.png", (int)getpid());
|
||||
@@ -818,19 +814,17 @@ Imlib_Image load_image(const char *path, int cached)
|
||||
// Parent
|
||||
close(fd);
|
||||
waitpid(pid, 0, 0);
|
||||
image = imlib_load_image_immediately_without_cache(tmp_filename);
|
||||
image = imlib_load_image_immediately(tmp_filename);
|
||||
unlink(tmp_filename);
|
||||
}
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
if (cached) {
|
||||
image = imlib_load_image_immediately(path);
|
||||
} else {
|
||||
image = imlib_load_image_immediately_without_cache(path);
|
||||
}
|
||||
image = imlib_load_image(path);
|
||||
}
|
||||
imlib_context_set_image(image);
|
||||
imlib_image_set_changes_on_disk();
|
||||
return image;
|
||||
}
|
||||
|
||||
@@ -924,30 +918,35 @@ void clear_pixmap(Pixmap p, int x, int y, int w, int h)
|
||||
XRenderFreePicture(server.display, pict);
|
||||
}
|
||||
|
||||
void get_text_size2(const PangoFontDescription *font,
|
||||
int *height_ink,
|
||||
int *height,
|
||||
int *width,
|
||||
int available_height,
|
||||
int available_width,
|
||||
const char *text,
|
||||
int text_len,
|
||||
PangoWrapMode wrap,
|
||||
PangoEllipsizeMode ellipsis,
|
||||
gboolean markup)
|
||||
void get_text_size(const PangoFontDescription *font,
|
||||
int *height,
|
||||
int *width,
|
||||
int available_height,
|
||||
int available_width,
|
||||
const char *text,
|
||||
int text_len,
|
||||
PangoWrapMode wrap,
|
||||
PangoEllipsizeMode ellipsis,
|
||||
PangoAlignment alignment,
|
||||
gboolean markup,
|
||||
double scale)
|
||||
{
|
||||
PangoRectangle rect_ink, rect;
|
||||
|
||||
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_image_surface_create(CAIRO_FORMAT_ARGB32, available_height, available_width);
|
||||
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);
|
||||
PangoContext *context = pango_cairo_create_context(c);
|
||||
pango_cairo_context_set_resolution(context, 96 * scale);
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
pango_layout_set_width(layout, available_width * PANGO_SCALE);
|
||||
pango_layout_set_height(layout, available_height * PANGO_SCALE);
|
||||
pango_layout_set_alignment(layout, alignment);
|
||||
pango_layout_set_wrap(layout, wrap);
|
||||
pango_layout_set_ellipsize(layout, ellipsis);
|
||||
pango_layout_set_font_description(layout, font);
|
||||
@@ -958,14 +957,63 @@ void get_text_size2(const PangoFontDescription *font,
|
||||
pango_layout_set_markup(layout, text, text_len);
|
||||
|
||||
pango_layout_get_pixel_extents(layout, &rect_ink, &rect);
|
||||
*height_ink = rect_ink.height;
|
||||
*height = rect.height;
|
||||
*width = rect.width;
|
||||
|
||||
// fprintf(stderr, "tint2: dimension : %d - %d\n", rect_ink.height, rect.height);
|
||||
|
||||
g_object_unref(layout);
|
||||
g_object_unref(context);
|
||||
cairo_destroy(c);
|
||||
cairo_surface_destroy(cs);
|
||||
XFreePixmap(server.display, pmap);
|
||||
}
|
||||
|
||||
void get_text_size2(const PangoFontDescription *font,
|
||||
int *height,
|
||||
int *width,
|
||||
int available_height,
|
||||
int available_width,
|
||||
const char *text,
|
||||
int text_len,
|
||||
PangoWrapMode wrap,
|
||||
PangoEllipsizeMode ellipsis,
|
||||
PangoAlignment alignment,
|
||||
gboolean markup,
|
||||
double scale)
|
||||
{
|
||||
get_text_size(font, height, width, available_height, available_width, text, text_len, wrap, ellipsis, alignment, markup, scale);
|
||||
|
||||
// We do multiple passes, because pango sucks
|
||||
int actual_height, actual_width, overflow = 0;
|
||||
while (true) {
|
||||
get_text_size(font, &actual_height, &actual_width, *height, *width, text, text_len, wrap, ellipsis, alignment, markup, scale);
|
||||
if (actual_height <= *height)
|
||||
break;
|
||||
if (*width >= available_width)
|
||||
break;
|
||||
overflow = 1;
|
||||
fprintf(stderr, "tint2: text overflows, recomputing: available %dx%d, computed %dx%d, actual %dx%d: %s\n",
|
||||
available_width,
|
||||
available_height,
|
||||
*width,
|
||||
*height,
|
||||
actual_width,
|
||||
actual_height,
|
||||
text);
|
||||
(*width)++;
|
||||
}
|
||||
if (overflow) {
|
||||
*height = actual_height;
|
||||
fprintf(stderr, "tint2: text final size computed as: available %dx%d, computed %dx%d, actual %dx%d: %s\n",
|
||||
available_width,
|
||||
available_height,
|
||||
*width,
|
||||
*height,
|
||||
actual_width,
|
||||
actual_height,
|
||||
text);
|
||||
}
|
||||
}
|
||||
|
||||
#if !GLIB_CHECK_VERSION(2, 34, 0)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#define COMMON_H
|
||||
|
||||
#define WM_CLASS_TINT "panel"
|
||||
#define TINT2_PANGO_SLACK 0
|
||||
|
||||
#include <glib.h>
|
||||
#include <Imlib2.h>
|
||||
@@ -113,7 +114,6 @@ void create_heuristic_mask(DATA32 *data, int w, int h);
|
||||
void render_image(Drawable d, int x, int y);
|
||||
|
||||
void get_text_size2(const PangoFontDescription *font,
|
||||
int *height_ink,
|
||||
int *height,
|
||||
int *width,
|
||||
int available_height,
|
||||
@@ -122,7 +122,9 @@ void get_text_size2(const PangoFontDescription *font,
|
||||
int text_len,
|
||||
PangoWrapMode wrap,
|
||||
PangoEllipsizeMode ellipsis,
|
||||
gboolean markup);
|
||||
PangoAlignment alignment,
|
||||
gboolean markup,
|
||||
double scale);
|
||||
|
||||
void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color, int font_shadow);
|
||||
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
**************************************************************************/
|
||||
|
||||
#include <X11/extensions/Xdamage.h>
|
||||
#include <X11/extensions/Xrender.h>
|
||||
#include <X11/extensions/Xrandr.h>
|
||||
#include <X11/extensions/Xrender.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
@@ -311,6 +311,21 @@ void sort_monitors()
|
||||
qsort(server.monitors, server.num_monitors, sizeof(Monitor), compare_monitor_pos);
|
||||
}
|
||||
|
||||
int compute_dpi(XRRCrtcInfo *crtc, XRROutputInfo *output)
|
||||
{
|
||||
double width = output->mm_width;
|
||||
double height = output->mm_height;
|
||||
double x_res = crtc->width;
|
||||
double y_res = crtc->height;
|
||||
|
||||
if (width > 0 && height > 0) {
|
||||
int dpi_x = x_res / width * 25.4;
|
||||
int dpi_y = y_res / height * 25.4;
|
||||
return MAX(dpi_x, dpi_y);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void get_monitors()
|
||||
{
|
||||
if (XineramaIsActive(server.display)) {
|
||||
@@ -339,12 +354,22 @@ void get_monitors()
|
||||
server.monitors[i_monitor].width = crtc_info->width;
|
||||
server.monitors[i_monitor].height = crtc_info->height;
|
||||
server.monitors[i_monitor].names = calloc((crtc_info->noutput + 1), sizeof(gchar *));
|
||||
server.monitors[i_monitor].dpi = 96;
|
||||
for (int j = 0; j < crtc_info->noutput; ++j) {
|
||||
XRROutputInfo *output_info = XRRGetOutputInfo(server.display, res, crtc_info->outputs[j]);
|
||||
fprintf(stderr, "tint2: xRandr: Linking output %s with crtc %d\n", output_info->name, i);
|
||||
server.monitors[i_monitor].names[j] = g_strdup(output_info->name);
|
||||
XRRFreeOutputInfo(output_info);
|
||||
server.monitors[i_monitor].primary = crtc_info->outputs[j] == primary_output;
|
||||
int dpi = compute_dpi(crtc_info, output_info);
|
||||
if (dpi)
|
||||
server.monitors[i_monitor].dpi = dpi;
|
||||
fprintf(stderr,
|
||||
BLUE "tint2: xRandr: Linking output %s with crtc %d, resolution %dx%d, DPI %d" RESET "\n",
|
||||
output_info->name,
|
||||
i,
|
||||
server.monitors[i_monitor].width,
|
||||
server.monitors[i_monitor].height,
|
||||
server.monitors[i_monitor].dpi);
|
||||
XRRFreeOutputInfo(output_info);
|
||||
}
|
||||
server.monitors[i_monitor].names[crtc_info->noutput] = NULL;
|
||||
XRRFreeCrtcInfo(crtc_info);
|
||||
@@ -357,6 +382,7 @@ void get_monitors()
|
||||
server.monitors[i].width = info[i].width;
|
||||
server.monitors[i].height = info[i].height;
|
||||
server.monitors[i].names = NULL;
|
||||
server.monitors[i].dpi = 96;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -393,6 +419,7 @@ void get_monitors()
|
||||
server.monitors[0].width = DisplayWidth(server.display, server.screen);
|
||||
server.monitors[0].height = DisplayHeight(server.display, server.screen);
|
||||
server.monitors[0].names = 0;
|
||||
server.monitors[0].dpi = 96;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -523,7 +550,8 @@ int get_current_desktop()
|
||||
// fprintf(stderr, "tint2: \n");
|
||||
// fprintf(stderr, "tint2: Work area size: %d x %d\n", work_area_width, work_area_height);
|
||||
// fprintf(stderr, "tint2: Viewport pos: %d x %d\n", viewport_x, viewport_y);
|
||||
// fprintf(stderr, "tint2: Viewport i: %d\n", (viewport_y / work_area_height) * ncols + viewport_x / work_area_width);
|
||||
// fprintf(stderr, "tint2: Viewport i: %d\n", (viewport_y / work_area_height) * ncols + viewport_x /
|
||||
//work_area_width);
|
||||
|
||||
int result = (viewport_y / work_area_height) * ncols + viewport_x / work_area_width;
|
||||
return MAX(0, MIN(server.num_desktops - 1, result));
|
||||
|
||||
@@ -107,6 +107,7 @@ typedef struct Monitor {
|
||||
int y;
|
||||
int width;
|
||||
int height;
|
||||
int dpi;
|
||||
gboolean primary;
|
||||
gchar **names;
|
||||
} Monitor;
|
||||
|
||||
@@ -61,6 +61,8 @@ src/util/blur.c
|
||||
src/util/blur.h
|
||||
src/util/common.c
|
||||
src/util/common.h
|
||||
src/util/server.c
|
||||
src/util/server.h
|
||||
src/util/strlcat.c
|
||||
src/util/strlcat.h
|
||||
src/util/timer.c
|
||||
|
||||
Reference in New Issue
Block a user