2
0
Fork 0
mirror of https://github.com/lbonn/rofi synced 2025-03-01 05:37:08 +00:00

Merge remote-tracking branch 'upstream/next' into wayland

This commit is contained in:
lbonn 2020-09-29 21:10:56 +02:00
commit cef94af6e1
38 changed files with 585 additions and 498 deletions

View file

@ -224,14 +224,6 @@ gdb build/rofi core
apt install rofi
```
#### Ubuntu 16.04 Xenial
**Please note that the latest version of rofi in Ubuntu 16.04 is extremely outdated (v0.15.11)**
This will cause issues with newer scripts (i.e. with clerk) and misses important updates and bug-fixes.
Newer versions of Rofi however requires versions of xcb-util-xrm and libxkbcommon that are not available in the 16.04 repositories.
These need to be manually installed before rofi can be installed either via source code or Zesty version from the [ubuntu's launchpad page for rofi](https://launchpad.net/ubuntu/+source/rofi).
### Fedora
rofi from [russianfedora repository](http://ru.fedoracommunity.org/repository)

View file

@ -184,6 +184,7 @@ EXTRA_DIST += \
doc/rofi-theme.5.markdown \
doc/rofi-script.5.markdown \
doc/rofi-theme-selector.1.markdown \
doc/rofi-sensible-terminal.1.markdown \
doc/rofi.1.markdown
@ -260,11 +261,12 @@ EXTRA_DIST+=\
##
update-manpage: $(top_srcdir)/doc/rofi-theme-selector.1.markdown $(top_srcdir)/doc/rofi.1.markdown $(top_srcdir)/doc/rofi-theme.5.markdown $(top_srcdir)/doc/rofi-script.5.markdown
update-manpage: $(top_srcdir)/doc/rofi-theme-selector.1.markdown $(top_srcdir)/doc/rofi.1.markdown $(top_srcdir)/doc/rofi-theme.5.markdown $(top_srcdir)/doc/rofi-script.5.markdown ${top_srcdir}/doc/rofi-sensible-terminal.1.markdown
go-md2man -in $(top_srcdir)/doc/rofi.1.markdown -out $(top_srcdir)/doc/rofi.1
go-md2man -in $(top_srcdir)/doc/rofi-theme-selector.1.markdown -out $(top_srcdir)/doc/rofi-theme-selector.1
go-md2man -in $(top_srcdir)/doc/rofi-theme.5.markdown -out $(top_srcdir)/doc/rofi-theme.5
go-md2man -in $(top_srcdir)/doc/rofi-script.5.markdown -out $(top_srcdir)/doc/rofi-script.5
go-md2man -in $(top_srcdir)/doc/rofi-sensible-terminal.1.markdown -out $(top_srcdir)/doc/rofi-sensible-terminal.1
##
# Rofi test program

View file

@ -7,6 +7,7 @@
[![Downloads](https://img.shields.io/github/downloads/davatorium/rofi/total.svg)](https://github.com/davatorium/rofi/releases)
[![Coverity](https://scan.coverity.com/projects/3850/badge.svg)](https://scan.coverity.com/projects/davedavenport-rofi)
[![Forum](https://img.shields.io/badge/forum-online-green.svg)](https://reddit.com/r/qtools/)
[![Packages](https://repology.org/badge/tiny-repos/rofi.svg)](https://repology.org/metapackage/rofi/versions)
# A window switcher, Application launcher and dmenu replacement

View file

@ -8,7 +8,7 @@ echo -en "\n1\n2\n3\n4\n5"
}
sleep 5
( shout | rofi -no-hide-scrollbar -columns 1 -width 1200 -location 0 -u 2,3 -a 4,5 -dmenu -p "Prompt:" -padding 20 -line-margin 10 -selected-row 6 ) &
( shout | rofi -no-hide-scrollbar -columns 1 -width 1200 -location 0 -u 2,3 -a 4,5 -dmenu -p "Prompt" -padding 20 -line-margin 10 -selected-row 6 ) &
P=$!
sleep 5
scrot

View file

@ -79,7 +79,7 @@ element-text {
}
element-icon {
background-color: rgba ( 0, 0, 0, 0 % );
size: 1.2000ch ;
size: 1.0000em ;
text-color: inherit;
}
window {

View file

@ -151,6 +151,11 @@ multiple entries can be passed using the \fB\fC\\x1f\fR separator.
.fi
.RE
.SH DASH shell
.PP
If you use the \fB\fCdash\fR shell for your script, take special care with how dash handles escaped values for the separators.
See issue #1201 on github.
.SH SEE ALSO
.PP
rofi(1), rofi\-sensible\-terminal(1), dmenu(1), rofi\-theme(5), rofi\-theme\-selector(1)

View file

@ -108,6 +108,10 @@ multiple entries can be passed using the `\x1f` separator.
echo -en "aap\0icon\x1ffolder\x1finfo\x1ftest\n"
```
## DASH shell
If you use the `dash` shell for your script, take special care with how dash handles escaped values for the separators.
See issue #1201 on github.
## SEE ALSO

View file

@ -1,148 +1,66 @@
.TH "ROFI\-SENSIBLE\-TERMIN" "1"
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.nh
.ad l
.SH "NAME"
rofi-sensible-terminal \- launches $TERMINAL with fallbacks
.SH "SYNOPSIS"
.sp
.TH rofi\-sensible\-terminal 1 rofi\-sensible\-terminal
.SH NAME
.PP
\fBrofi\-sensible\-terminal\fP \- launches $TERMINAL with fallbacks
.SH SYNOPSIS
.PP
rofi\-sensible\-terminal [arguments]
.SH "DESCRIPTION"
.sp
rofi\-sensible\-terminal is invoked in the rofi default config to start a terminal\&. This wrapper script is necessary since there is no distribution\-independent terminal launcher (but for example Debian has x\-terminal\-emulator)\&. Distribution packagers are responsible for shipping this script in a way which is appropriate for the distribution\&.
.sp
.SH DESCRIPTION
.PP
rofi\-sensible\-terminal is invoked in the rofi default config to start a terminal. This
wrapper script is necessary since there is no distribution\-independent terminal launcher
(but for example Debian has x\-terminal\-emulator). Distribution packagers are responsible for
shipping this script in a way which is appropriate for the distribution.
.PP
It tries to start one of the following (in that order):
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
$TERMINAL (this is a non\-standard variable)
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.IP \(bu 2
\fB\fC$TERMINAL\fR (this is a non\-standard variable)
.IP \(bu 2
x\-terminal\-emulator
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
termite
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.IP \(bu 2
urxvt
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.IP \(bu 2
rxvt
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
terminator
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.IP \(bu 2
st
.IP \(bu 2
terminology
.IP \(bu 2
qterminal
.IP \(bu 2
Eterm
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.IP \(bu 2
aterm
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.IP \(bu 2
uxterm
.IP \(bu 2
xterm
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.IP \(bu 2
roxterm
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
xfce4\-terminal
.RE
.sp
Please don\(cqt complain about the order: If the user has any preference, she will have $TERMINAL set or modified her rofi configuration file\&.
.SH "SEE ALSO"
.sp
.IP \(bu 2
xfce4\-terminal.wrapper
.IP \(bu 2
mate\-terminal
.IP \(bu 2
lxterminal
.IP \(bu 2
konsole
.IP \(bu 2
alacritty
.IP \(bu 2
kitty
.SH SEE ALSO
.PP
rofi(1)
.SH "AUTHOR"
.sp
.SH AUTHORS
.PP
Dave Davenport and contributors
.sp
.PP
Copied script from i3:
.br
Michael Stapelberg and contributors

View file

@ -0,0 +1,50 @@
# rofi-sensible-terminal 1 rofi-sensible-terminal
## NAME
**rofi-sensible-terminal** - launches $TERMINAL with fallbacks
## SYNOPSIS
rofi-sensible-terminal [arguments]
## DESCRIPTION
rofi-sensible-terminal is invoked in the rofi default config to start a terminal. This
wrapper script is necessary since there is no distribution-independent terminal launcher
(but for example Debian has x-terminal-emulator). Distribution packagers are responsible for
shipping this script in a way which is appropriate for the distribution.
It tries to start one of the following (in that order):
* `$TERMINAL` (this is a non-standard variable)
* x-terminal-emulator
* urxvt
* rxvt
* st
* terminology
* qterminal
* Eterm
* aterm
* uxterm
* xterm
* roxterm
* xfce4-terminal.wrapper
* mate-terminal
* lxterminal
* konsole
* alacritty
* kitty
## SEE ALSO
rofi(1)
## AUTHORS
Dave Davenport and contributors
Copied script from i3:
Michael Stapelberg and contributors

View file

@ -8,7 +8,7 @@
The need for a new theme format was motivated by the fact that the way rofi handled widgets has changed. From a very
static drawing of lines and text to a nice structured form of packing widgets. This change made it possible to provide a
more flexible theme framework. The old theme format and config file are not flexible enough to expose these options in a
user\-friendly way. Therefor, a new file format has been created, replacing the old one.
user\-friendly way. Therefore, a new file format has been created, replacing the old one.
.SH FORMAT SPECIFICATION
.SH Encoding
@ -531,15 +531,19 @@ width: calc( 100% \- 37px );
.PP
It supports the following operations:
.IP \(bu 2
\fB\fC+\fR: Add
\fB\fC+\fR : Add
.IP \(bu 2
\fB\fC\-\fR: Subtract
\fB\fC\-\fR : Subtract
.IP \(bu 2
\fB\fC/\fR: Divide
\fB\fC/\fR : Divide
.IP \(bu 2
\fB\fC*\fR: Multiply
\fB\fC*\fR : Multiply
.IP \(bu 2
\fB\fC%\fR: Multiply
\fB\fC%\fR : Multiply
.IP \(bu 2
\fB\fCmin\fR : Minimum of l or rvalue;
.IP \(bu 2
\fB\fCmax\fR : Maximum of l or rvalue;
.PP
It uses the C precedence ordering.
@ -1400,7 +1404,7 @@ Parts of the theme can be conditionally loaded, like the CSS \fB\fC@media\fR opt
.RS
.nf
@media ( min\-width: 120px ) {
@media ( min\-width: 120 ) {
}
@ -1410,20 +1414,34 @@ Parts of the theme can be conditionally loaded, like the CSS \fB\fC@media\fR opt
.PP
It supports the following keys as constraint:
.IP \(bu 2
\fB\fCmin\-width\fR: load when width is bigger then value.
\fB\fCmin\-width\fR: load when width is bigger or equal then value.
.IP \(bu 2
\fB\fCmax\-width\fR: load when width is smaller then value.
.IP \(bu 2
\fB\fCmin\-height\fR: load when height is bigger then value.
\fB\fCmin\-height\fR: load when height is bigger or equal then value.
.IP \(bu 2
\fB\fCmax\-height\fR: load when height is smaller then value.
.IP \(bu 2
\fB\fCmin\-aspect\-ratio\fR load when aspect ratio is over value.
.IP \(bu 2
\fB\fCmax\-aspect\_ratio\fR: load when aspect ratio is under value.
\fB\fCmax\-aspect\-ratio\fR: load when aspect ratio is under value.
.IP \(bu 2
\fB\fCmonitor\-id\fR: The monitor id, see rofi \-help for id's.
.PP
@media takes an integer number or a fraction, for integer number \fB\fCpx\fR can be added.
.PP
.RS
.nf
@media ( min\-width: 120 px ) {
}
.fi
.RE
.SH Multiple file handling
.PP
The rasi file format offers two methods of including other files.

View file

@ -9,7 +9,7 @@
The need for a new theme format was motivated by the fact that the way rofi handled widgets has changed. From a very
static drawing of lines and text to a nice structured form of packing widgets. This change made it possible to provide a
more flexible theme framework. The old theme format and config file are not flexible enough to expose these options in a
user-friendly way. Therefor, a new file format has been created, replacing the old one.
user-friendly way. Therefore, a new file format has been created, replacing the old one.
## FORMAT SPECIFICATION
@ -364,11 +364,13 @@ width: calc( 100% - 37px );
It supports the following operations:
* `+`: Add
* `-`: Subtract
* `/`: Divide
* `*`: Multiply
* `%`: Multiply
* `+` : Add
* `-` : Subtract
* `/` : Divide
* `*` : Multiply
* `%` : Multiply
* `min` : Minimum of l or rvalue;
* `max` : Maximum of l or rvalue;
It uses the C precedence ordering.
@ -985,21 +987,29 @@ rofi -dump-theme
Parts of the theme can be conditionally loaded, like the CSS `@media` option.
```
@media ( min-width: 120px ) {
@media ( min-width: 120 ) {
}
```
It supports the following keys as constraint:
* `min-width`: load when width is bigger then value.
* `min-width`: load when width is bigger or equal then value.
* `max-width`: load when width is smaller then value.
* `min-height`: load when height is bigger then value.
* `min-height`: load when height is bigger or equal then value.
* `max-height`: load when height is smaller then value.
* `min-aspect-ratio` load when aspect ratio is over value.
* `max-aspect_ratio`: load when aspect ratio is under value.
* `max-aspect-ratio`: load when aspect ratio is under value.
* `monitor-id`: The monitor id, see rofi -help for id's.
@media takes an integer number or a fraction, for integer number `px` can be added.
```
@media ( min-width: 120 px ) {
}
```
## Multiple file handling

View file

@ -927,7 +927,7 @@ default: {w} {c} {t}
\fB\fC\-window\-command\fR \fIcmd\fP
.PP
Set command to execute on selected window for a custom action.
Set command to execute on selected window for a alt action (\fB\fC\-kb\-accept\-alt\fR).
See \fIPATTERN\fP\&.
.PP
@ -1013,7 +1013,7 @@ Specify the prompt to show in \fB\fCdmenu\fR mode. For example, select 'monkey',
.RS
.nf
echo "a|b|c|d|e" | rofi \-sep '|' \-dmenu \-p "monkey:"
echo "a|b|c|d|e" | rofi \-sep '|' \-dmenu \-p "monkey"
.fi
.RE
@ -1518,6 +1518,9 @@ Pressing the \fB\fCdelete\-entry\fR binding (\fB\fCshift\-delete\fR) will kill t
Pressing the \fB\fCaccept\-custom\fR binding (\fB\fCcontrol\-enter\fR or \fB\fCshift\-enter\fR) will run a command on the window.
(See option \fB\fCwindow\-command\fR );
.PP
If there is no match, it will try to launch the input.
.SS run
.PP
Shows a list of executables in \fB\fC$PATH\fR and can launch them (optional in a terminal).
@ -1529,7 +1532,7 @@ Pressing the \fB\fCaccept\-custom\fR binding (\fB\fCcontrol\-enter\fR or \fB\fCs
Same as the \fBrun\fP launches, but the list is created from the installed desktop files. It automatically launches them
in a terminal if specified in the Desktop File.
Pressing the \fB\fCdelete\-entry\fR binding (\fB\fCshift\-delete\fR) will remove this entry from the run history.
Pressing the \fB\fCaccept\-custom\fR binding (\fB\fCcontrol\-enter\fR or \fB\fCshift\-enter\fR) with custom input (no entry matching) will run the command in a terminal.
Pressing the \fB\fCaccept\-custom\fR binding (\fB\fCcontrol\-enter\fR or \fB\fCshift\-enter\fR) will run the command in a terminal.
.SS ssh
.PP
@ -1554,6 +1557,9 @@ For example, say you have specified \fB\fC\-combi\-modi run,window,windowcd\fR\&
query begins with the bang \fB\fC!w\fR, only results from the \fB\fCwindow\fR and \fB\fCwindowcd\fR
modi are shown, even if the rest of the input text would match results from \fB\fCrun\fR\&.
.PP
If no match, the input is handled by the first combined modi.
.SH FAQ
.SS The text in the window switcher is not nicely aligned.
.PP

View file

@ -547,7 +547,7 @@ default: {w} {c} {t}
`-window-command` *cmd*
Set command to execute on selected window for a custom action.
Set command to execute on selected window for a alt action (`-kb-accept-alt`).
See *PATTERN*.
Default: *"wmctrl -i -R {window}"*
@ -604,7 +604,7 @@ Separator for `dmenu`. Example: To show a list of 'a' to 'e' with '|' as a separ
Specify the prompt to show in `dmenu` mode. For example, select 'monkey', a,b,c,d, or e.
echo "a|b|c|d|e" | rofi -sep '|' -dmenu -p "monkey:"
echo "a|b|c|d|e" | rofi -sep '|' -dmenu -p "monkey"
Default: *dmenu*
@ -921,6 +921,8 @@ Pressing the `delete-entry` binding (`shift-delete`) will kill the window.
Pressing the `accept-custom` binding (`control-enter` or `shift-enter`) will run a command on the window.
(See option `window-command` );
If there is no match, it will try to launch the input.
### run
Shows a list of executables in `$PATH` and can launch them (optional in a terminal).
@ -932,7 +934,7 @@ Pressing the `accept-custom` binding (`control-enter` or `shift-enter`) will run
Same as the **run** launches, but the list is created from the installed desktop files. It automatically launches them
in a terminal if specified in the Desktop File.
Pressing the `delete-entry` binding (`shift-delete`) will remove this entry from the run history.
Pressing the `accept-custom` binding (`control-enter` or `shift-enter`) with custom input (no entry matching) will run the command in a terminal.
Pressing the `accept-custom` binding (`control-enter` or `shift-enter`) will run the command in a terminal.
### ssh
@ -956,6 +958,8 @@ For example, say you have specified `-combi-modi run,window,windowcd`. If your
query begins with the bang `!w`, only results from the `window` and `windowcd`
modi are shown, even if the rest of the input text would match results from `run`.
If no match, the input is handled by the first combined modi.
## FAQ
### The text in the window switcher is not nicely aligned.

View file

@ -77,6 +77,8 @@ typedef enum
MENU_ENTRY_DELETE = 0x00100000,
/** User wants to jump to another switcher. */
MENU_QUICK_SWITCH = 0x00200000,
/** User wants to jump to custom command. */
MENU_CUSTOM_COMMAND= 0x00800000,
/** Go to the previous menu. */
MENU_PREVIOUS = 0x00400000,
/** Bindings specifics */

View file

@ -102,6 +102,8 @@ typedef enum
ROFI_DISTANCE_MODIFIER_MULTIPLY,
ROFI_DISTANCE_MODIFIER_MODULO,
ROFI_DISTANCE_MODIFIER_GROUP,
ROFI_DISTANCE_MODIFIER_MIN,
ROFI_DISTANCE_MODIFIER_MAX,
} RofiDistanceModifier;
typedef struct RofiDistanceUnit

View file

@ -187,13 +187,23 @@ void rofi_view_free ( RofiViewState *state );
RofiViewState * rofi_view_get_active ( void );
/**
* @param state the new active view handle, NULL to clear.
* @param state the new active view handle.
*
* Set the current active view Handle.
* Set the current active view Handle, If NULL passed a queued view is popped
* from stack.
*
*/
void rofi_view_set_active ( RofiViewState *state );
/**
* @param state remove view handle.
*
* remove state handle from queue, if current view, pop view from
* stack.
*
*/
void rofi_view_remove_active ( RofiViewState *state );
/**
* @param msg The error message to show.
* @param markup The error message uses pango markup.
@ -267,6 +277,7 @@ void rofi_view_clear_input ( RofiViewState *state );
* TODO: Internal call to view exposed.
*/
void __create_window ( MenuFlags menu_flags );
/**
* Get the handle of the main window.
*

View file

@ -43,6 +43,17 @@
*
* @{
*/
/** Cache to hold font descriptions. This it to avoid having to lookup each time. */
typedef struct TBFontConfig
{
/** Font description */
PangoFontDescription *pfd;
/** Font metrics */
PangoFontMetrics *metrics;
/** height */
double height;
}TBFontConfig;
/**
* Internal structure of a textbox widget.
* TODO make this internal to textbox
@ -66,7 +77,8 @@ typedef struct
double yalign;
double xalign;
PangoFontMetrics *metrics;
TBFontConfig *tbfc;
PangoEllipsizeMode emode;
//
const char *theme_name;

View file

@ -167,6 +167,7 @@ UANYN {ASCN}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
WHITESPACE [[:blank:]]
WSO [[:blank:]]*
WORD [[:alnum:]-]+
MEDIA_NAME [[:alpha:]-]+
COLOR_NAME [[:alpha:]]+
STRING \"{UANYN}*\"
CHAR \'({ASCN}|\\\\|\\\'|\\0)\'
@ -188,6 +189,8 @@ ENV $\{[[:alnum:]]*\}
MODIFIER_ADD \+
MODIFIER_SUBTRACT -
MODIFIER_MULTIPLY \*
MODIFIER_MIN (min)
MODIFIER_MAX (max)
/* Position */
CENTER (?i:center)
@ -462,6 +465,8 @@ if ( queue == NULL ){
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{MODIFIER_ADD} { return T_MODIFIER_ADD; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{MODIFIER_SUBTRACT} { return T_MODIFIER_SUBTRACT; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{MODIFIER_MULTIPLY} { return T_MODIFIER_MULTIPLY; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{MODIFIER_MIN} { return T_MODIFIER_MIN; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{MODIFIER_MAX} { return T_MODIFIER_MAX; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{CALC} { return T_CALC; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{ENV} {
@ -648,7 +653,7 @@ if ( queue == NULL ){
BEGIN(MEDIA_CONTENT);
return T_PARENT_LEFT;
}
<MEDIA_CONTENT>{WORD} {
<MEDIA_CONTENT>{MEDIA_NAME} {
yylval->sval = g_strdup(yytext);
return T_STRING;
}

View file

@ -218,6 +218,9 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
%token T_MODIFIER_SUBTRACT "Subtract ('-')"
%token T_MODIFIER_MULTIPLY "Multiply ('*')"
%token T_MODIFIER_MAX "Max ('max')"
%token T_MODIFIER_MIN "Min ('min')"
%token T_CALC "calc"
%token T_BOPEN "bracket open ('{')"
@ -243,9 +246,7 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
%token T_MEDIA_MAX "Max"
%token T_MEDIA_SEP "-"
%type <sval> t_entry
%type <theme> t_entry_list
%type <theme> t_media_entry_list
%type <list> t_entry_name_path
%type <list> t_entry_name_path_selectors
%type <property> t_property
@ -263,6 +264,7 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
%type <distance> t_property_distance_zero
%type <distance_unit> t_property_distance_unit_math
%type <distance_unit> t_property_distance_unit_math2
%type <distance_unit> t_property_distance_unit_math3
%type <distance_unit> t_property_distance_unit
%type <ival> t_property_unit
%type <wloc> t_property_position
@ -285,6 +287,16 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
t_main
: t_configuration_list t_entry_list {
// Dummy at this point.
if (rofi_theme == NULL ){
rofi_theme_reset();
}
rofi_theme_widget_add_properties ( rofi_theme, $2->properties );
for ( unsigned int i = 0; i < $2->num_widgets;i++) {
ThemeWidget *d = $2->widgets[i];
rofi_theme_parse_merge_widgets(rofi_theme, d);
}
}
;
@ -292,55 +304,23 @@ t_configuration_list:
%empty {}
| t_configuration_list T_CONFIGURATION T_BOPEN t_config_property_list_optional T_BCLOSE {};
t_entry_list:
%empty {
// There is always a base widget.
if (rofi_theme == NULL ){
rofi_theme_reset();
$$ = rofi_theme;
}
}
| t_entry_list t_entry {
}
/**
* Small dummy object to make the prefix optional.
*/
t_name_prefix_optional
: T_NAME_PREFIX {}
| %empty {}
;
t_media_entry_list:
t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optional T_BCLOSE {
ThemeWidget *widget = $$ = g_slice_new0 ( ThemeWidget );
for ( GList *liter = g_list_first ( $2); liter; liter = g_list_next ( liter ) ) {
for ( GList *iter = g_list_first ( (GList*)liter->data ); widget && iter ; iter = g_list_next ( iter ) ) {
widget = rofi_theme_find_or_create_name ( widget, iter->data );
}
g_list_free_full ( (GList*)liter->data, g_free );
widget->set = TRUE;
rofi_theme_widget_add_properties ( widget, $4);
}
if ( $4 ) {
g_hash_table_destroy ( $4 );
}
g_list_free ( $2 );
}
| T_PDEFAULTS T_BOPEN t_property_list_optional T_BCLOSE {
ThemeWidget *widget = $$ = g_slice_new0( ThemeWidget ) ;
widget = rofi_theme_find_or_create_name ( widget, "*" );
widget->set = TRUE;
rofi_theme_widget_add_properties ( widget, $3);
if ( $3 ) {
g_hash_table_destroy ( $3 );
}
}
| t_media_entry_list T_PDEFAULTS T_BOPEN t_property_list_optional T_BCLOSE {
ThemeWidget *widget = $$ = $1 ;
widget = rofi_theme_find_or_create_name ( widget, "*" );
widget->set = TRUE;
rofi_theme_widget_add_properties ( widget, $4);
if ( $4 ) {
g_hash_table_destroy ( $4 );
}
}
| t_media_entry_list t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optional T_BCLOSE {
ThemeWidget *widget = $$ = $1 ;
t_entry_list:
%empty {
$$ = g_slice_new0 ( ThemeWidget );
}
| t_entry_list t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optional T_BCLOSE
{
for ( GList *liter = g_list_first ( $3); liter; liter = g_list_next ( liter ) ) {
ThemeWidget *widget = $1;
for ( GList *iter = g_list_first ( (GList*)liter->data ); widget && iter ; iter = g_list_next ( iter ) ) {
widget = rofi_theme_find_or_create_name ( widget, iter->data );
}
@ -352,79 +332,52 @@ t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optio
g_hash_table_destroy ( $5 );
}
g_list_free ( $3 );
};
/**
* Small dummy object to make the prefix optional.
*/
t_name_prefix_optional
: T_NAME_PREFIX {}
| %empty {}
;
t_entry:
t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optional T_BCLOSE
{
for ( GList *liter = g_list_first ( $2); liter; liter = g_list_next ( liter ) ) {
ThemeWidget *widget = rofi_theme;
for ( GList *iter = g_list_first ( (GList*)liter->data ); widget && iter ; iter = g_list_next ( iter ) ) {
widget = rofi_theme_find_or_create_name ( widget, iter->data );
}
g_list_free_full ( (GList*)liter->data, g_free );
widget->set = TRUE;
rofi_theme_widget_add_properties ( widget, $4);
}
}
| t_entry_list T_PDEFAULTS T_BOPEN t_property_list_optional T_BCLOSE {
rofi_theme_widget_add_properties ( $1, $4);
if ( $4 ) {
g_hash_table_destroy ( $4 );
}
g_list_free ( $2 );
}
|
T_PDEFAULTS T_BOPEN t_property_list_optional T_BCLOSE {
rofi_theme_widget_add_properties ( rofi_theme, $3);
if ( $3 ) {
g_hash_table_destroy ( $3 );
}
}
| T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_INT T_PARENT_RIGHT T_BOPEN t_media_entry_list T_BCLOSE {
gchar *name = g_strdup_printf("@media ( %s: %d )",$3, $5);
ThemeWidget *widget = rofi_theme_find_or_create_name ( rofi_theme, name );
| t_entry_list T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_INT T_PARENT_RIGHT T_BOPEN t_entry_list T_BCLOSE {
gchar *name = g_strdup_printf("@media ( %s: %d )",$4, $6);
ThemeWidget *widget = rofi_theme_find_or_create_name ( $1, name );
widget->set = TRUE;
widget->media = g_slice_new0(ThemeMedia);
widget->media->type = rofi_theme_parse_media_type ( $3 );
widget->media->value = (double)$5;
for ( unsigned int i = 0; i < $8->num_widgets;i++) {
ThemeWidget *d = $8->widgets[i];
rofi_theme_parse_merge_widgets(widget, d);
}
g_free ( name );
}
| T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_DOUBLE T_PARENT_RIGHT T_BOPEN t_media_entry_list T_BCLOSE {
gchar *name = g_strdup_printf("@media ( %s: %f )",$3, $5);
ThemeWidget *widget = rofi_theme_find_or_create_name ( rofi_theme, name );
widget->set = TRUE;
widget->media = g_slice_new0(ThemeMedia);
widget->media->type = rofi_theme_parse_media_type ( $3 );
widget->media->value = $5;
for ( unsigned int i = 0; i < $8->num_widgets;i++) {
ThemeWidget *d = $8->widgets[i];
rofi_theme_parse_merge_widgets(widget, d);
}
g_free ( name );
}
| T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_INT T_UNIT_PX T_PARENT_RIGHT T_BOPEN t_media_entry_list T_BCLOSE {
gchar *name = g_strdup_printf("@media ( %s: %d px )",$3, $5);
ThemeWidget *widget = rofi_theme_find_or_create_name ( rofi_theme, name );
widget->set = TRUE;
widget->media = g_slice_new0(ThemeMedia);
widget->media->type = rofi_theme_parse_media_type ( $3 );
widget->media->value = (double)$5;
widget->media->type = rofi_theme_parse_media_type ( $4 );
widget->media->value = (double)$6;
for ( unsigned int i = 0; i < $9->num_widgets;i++) {
ThemeWidget *d = $9->widgets[i];
rofi_theme_parse_merge_widgets(widget, d);
}
g_free ( name );
}
| t_entry_list T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_DOUBLE T_PARENT_RIGHT T_BOPEN t_entry_list T_BCLOSE {
gchar *name = g_strdup_printf("@media ( %s: %f )",$4, $6);
ThemeWidget *widget = rofi_theme_find_or_create_name ( $1, name );
widget->set = TRUE;
widget->media = g_slice_new0(ThemeMedia);
widget->media->type = rofi_theme_parse_media_type ( $4 );
widget->media->value = $6;
for ( unsigned int i = 0; i < $9->num_widgets;i++) {
ThemeWidget *d = $9->widgets[i];
rofi_theme_parse_merge_widgets(widget, d);
}
g_free ( name );
}
| t_entry_list T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_INT T_UNIT_PX T_PARENT_RIGHT T_BOPEN t_entry_list T_BCLOSE {
gchar *name = g_strdup_printf("@media ( %s: %d px )",$4, $6);
ThemeWidget *widget = rofi_theme_find_or_create_name ( $1, name );
widget->set = TRUE;
widget->media = g_slice_new0(ThemeMedia);
widget->media->type = rofi_theme_parse_media_type ( $4 );
widget->media->value = (double)$6;
for ( unsigned int i = 0; i < $10->num_widgets;i++) {
ThemeWidget *d = $10->widgets[i];
rofi_theme_parse_merge_widgets(widget, d);
}
g_free ( name );
}
;
t_config_property_list_optional
@ -652,7 +605,7 @@ t_property_distance_unit
$$->right = NULL;
$$->modtype = ROFI_DISTANCE_MODIFIER_NONE;
}
| T_PARENT_LEFT t_property_distance_unit_math2 T_PARENT_RIGHT {
| T_PARENT_LEFT t_property_distance_unit_math3 T_PARENT_RIGHT {
$$ = g_slice_new0(RofiDistanceUnit);
$$->distance = 0;
$$->type = ROFI_PU_PX;
@ -706,6 +659,23 @@ t_property_distance_unit_math2
| t_property_distance_unit_math {
$$ = $1;
};
/** Level 3 (min max)*/
t_property_distance_unit_math3
: t_property_distance_unit_math3 T_MODIFIER_MIN t_property_distance_unit_math2 {
$$ = g_slice_new0(RofiDistanceUnit);
$$->left = $1;
$$->right = $3;
$$->modtype = ROFI_DISTANCE_MODIFIER_MIN;
}
| t_property_distance_unit_math3 T_MODIFIER_MAX t_property_distance_unit_math2 {
$$ = g_slice_new0(RofiDistanceUnit);
$$->left = $1;
$$->right = $3;
$$->modtype = ROFI_DISTANCE_MODIFIER_MAX;
}
| t_property_distance_unit_math2 {
$$ = $1;
};
t_property_distance
@ -727,8 +697,8 @@ t_property_distance
$$.base.right = NULL;
$$.style = $3;
}
| T_CALC T_PARENT_LEFT t_property_distance_unit_math2 T_PARENT_RIGHT t_property_line_style {
$$.base.distance = 0;
| T_CALC T_PARENT_LEFT t_property_distance_unit_math3 T_PARENT_RIGHT t_property_line_style {
$$.base.distance = 0;
$$.base.type = ROFI_PU_PX;
$$.base.left = $3;
$$.base.right = NULL;

View file

@ -274,6 +274,7 @@ install_man(
'doc/rofi.1',
'doc/rofi-theme-selector.1',
'doc/rofi-sensible-terminal.1',
'doc/rofi-script.5',
'doc/rofi-theme.5',
)

View file

@ -121,7 +121,7 @@ height, monitor id, minimum acpect ratio or maximum acpect ratio.
For example, go to fullscreen mode on screens smaller then full HD:
```
@media (max-width: 1920px ) {
@media (max-width: 1920 ) {
window {
fullscreen: true;
}

View file

@ -76,27 +76,37 @@ static void combi_mode_parse_switchers ( Mode *sw )
sizeof ( CombiMode ) * ( pd->num_switchers + 1 ) );
Mode *mode = rofi_collect_modi_search ( token );
if ( mode ) {
if ( mode != NULL ) {
pd->switchers[pd->num_switchers].disable = FALSE;
pd->switchers[pd->num_switchers++].mode = mode;
continue;
}
else {
// If not build in, use custom switchers.
Mode *sw = script_switcher_parse_setup ( token );
if ( sw != NULL ) {
pd->switchers[pd->num_switchers].disable = FALSE;
pd->switchers[pd->num_switchers++].mode = sw;
}
else {
// Report error, don't continue.
g_warning ( "Invalid script switcher: %s", token );
token = NULL;
}
// If not build in, use custom switchers.
mode = script_switcher_parse_setup ( token );
if ( mode != NULL ) {
pd->switchers[pd->num_switchers].disable = FALSE;
pd->switchers[pd->num_switchers++].mode = mode;
continue;
}
// Report error, don't continue.
g_warning ( "Invalid script switcher: %s", token );
token = NULL;
}
// Free string that was modified by strtok_r
g_free ( switcher_str );
}
static unsigned int combi_mode_get_num_entries ( const Mode *sw )
{
const CombiModePrivateData *pd = (const CombiModePrivateData *) mode_get_private_data ( sw );
unsigned int length = 0;
for ( unsigned int i = 0; i < pd->num_switchers; i++ ) {
unsigned int entries = mode_get_num_entries ( pd->switchers[i].mode );
pd->starts[i] = length;
pd->lengths[i] = entries;
length += entries;
}
return length;
}
static int combi_mode_init ( Mode *sw )
{
@ -112,29 +122,11 @@ static int combi_mode_init ( Mode *sw )
}
}
if ( pd->cmd_list_length == 0 ) {
pd->cmd_list_length = 0;
for ( unsigned int i = 0; i < pd->num_switchers; i++ ) {
unsigned int length = mode_get_num_entries ( pd->switchers[i].mode );
pd->starts[i] = pd->cmd_list_length;
pd->lengths[i] = length;
pd->cmd_list_length += length;
}
pd->cmd_list_length = combi_mode_get_num_entries ( sw );
}
}
return TRUE;
}
static unsigned int combi_mode_get_num_entries ( const Mode *sw )
{
const CombiModePrivateData *pd = (const CombiModePrivateData *) mode_get_private_data ( sw );
unsigned int length = 0;
for ( unsigned int i = 0; i < pd->num_switchers; i++ ) {
unsigned int entries = mode_get_num_entries ( pd->switchers[i].mode );
pd->starts[i] = length;
pd->lengths[i] = entries;
length += entries;
}
return length;
}
static void combi_mode_destroy ( Mode *sw )
{
CombiModePrivateData *pd = (CombiModePrivateData *) mode_get_private_data ( sw );
@ -163,11 +155,12 @@ static ModeMode combi_mode_result ( Mode *sw, int mretv, char **input, unsigned
}
ssize_t bang_len = g_utf8_pointer_to_offset ( input[0], eob ) - 1;
if ( bang_len > 0 ) {
for ( unsigned i = 0; switcher == -1 && i < pd->num_switchers; i++ ) {
for ( unsigned i = 0; i < pd->num_switchers; i++ ) {
const char *mode_name = mode_get_name ( pd->switchers[i].mode );
size_t mode_name_len = g_utf8_strlen ( mode_name, -1 );
if ( (size_t) bang_len <= mode_name_len && utf8_strncmp ( &input[0][1], mode_name, bang_len ) == 0 ) {
switcher = i;
break;
}
}
}
@ -180,9 +173,6 @@ static ModeMode combi_mode_result ( Mode *sw, int mretv, char **input, unsigned
return MODE_EXIT;
}
}
if ( mretv & MENU_QUICK_SWITCH ) {
return mretv & MENU_LOWER_MASK;
}
for ( unsigned i = 0; i < pd->num_switchers; i++ ) {
if ( selected_line >= pd->starts[i] &&
@ -190,6 +180,9 @@ static ModeMode combi_mode_result ( Mode *sw, int mretv, char **input, unsigned
return mode_result ( pd->switchers[i].mode, mretv, input, selected_line - pd->starts[i] );
}
}
if ( ( mretv & MENU_CUSTOM_INPUT ) ) {
return mode_result ( pd->switchers[0].mode, mretv, input, selected_line );
}
return MODE_EXIT;
}
static int combi_mode_match ( const Mode *sw, rofi_int_matcher **tokens, unsigned int index )

View file

@ -575,14 +575,14 @@ static void dmenu_finalize ( RofiViewState *state )
rofi_view_set_overlay ( state, NULL );
}
}
else if ( ( mretv & ( MENU_OK | MENU_QUICK_SWITCH ) ) && cmd_list[pd->selected_line].entry != NULL ) {
else if ( ( mretv & ( MENU_OK | MENU_CUSTOM_COMMAND ) ) && cmd_list[pd->selected_line].entry != NULL ) {
if ( cmd_list[pd->selected_line].nonselectable == TRUE ) {
g_free ( input );
return;
}
dmenu_print_results ( pd, input );
retv = TRUE;
if ( ( mretv & MENU_QUICK_SWITCH ) ) {
if ( ( mretv & MENU_CUSTOM_COMMAND ) ) {
retv = 10 + ( mretv & MENU_LOWER_MASK );
}
g_free ( input );
@ -640,7 +640,7 @@ static void dmenu_finalize ( RofiViewState *state )
retv = TRUE;
}
// Quick switch with entry selected.
else if ( ( mretv & MENU_QUICK_SWITCH ) ) {
else if ( ( mretv & MENU_CUSTOM_COMMAND ) ) {
dmenu_print_results ( pd, input );
restart = FALSE;

View file

@ -723,7 +723,7 @@ static gint drun_int_sort_list ( gconstpointer a, gconstpointer b, G_GNUC_UNUSED
* Cache voodoo *
*******************************************/
#define CACHE_VERSION 1
#define CACHE_VERSION 2
static void drun_write_str ( FILE *fd, const char *str )
{
size_t l = ( str == NULL ? 0 : strlen ( str ) );
@ -734,6 +734,17 @@ static void drun_write_str ( FILE *fd, const char *str )
fwrite ( str, 1, l + 1, fd );
}
}
static void drun_write_integer ( FILE *fd, int32_t val )
{
fwrite ( &val,sizeof(val), 1, fd );
}
static void drun_read_integer ( FILE *fd, int32_t *type )
{
if ( fread ( type, sizeof ( int32_t), 1, fd ) != 1 ) {
g_warning ( "Failed to read entry, cache corrupt?" );
return;
}
}
static void drun_read_string ( FILE *fd, char **str )
{
size_t l = 0;
@ -810,6 +821,7 @@ static void write_cache ( DRunModePrivateData *pd, const char *cache_file )
drun_write_strv ( fd, entry->keywords );
drun_write_str ( fd, entry->comment );
drun_write_integer ( fd, (int32_t)entry->type );
}
fclose ( fd );
@ -842,21 +854,21 @@ static gboolean drun_read_cache ( DRunModePrivateData *pd, const char *cache_fil
fclose ( fd );
g_warning ( "Cache corrupt, ignoring." );
TICK_N ( "DRUN Read CACHE: stop" );
return FALSE;
return TRUE;
}
if ( version != CACHE_VERSION ) {
fclose ( fd );
g_warning ( "Cache file wrong version, ignoring." );
TICK_N ( "DRUN Read CACHE: stop" );
return FALSE;
return TRUE;
}
if ( fread ( &( pd->cmd_list_length ), sizeof ( pd->cmd_list_length ), 1, fd ) != 1 ) {
fclose ( fd );
g_warning ( "Cache corrupt, ignoring." );
TICK_N ( "DRUN Read CACHE: stop" );
return FALSE;
return TRUE;
}
// set actual length to length;
pd->cmd_list_length_actual = pd->cmd_list_length;
@ -880,6 +892,9 @@ static gboolean drun_read_cache ( DRunModePrivateData *pd, const char *cache_fil
drun_read_stringv ( fd, &( entry->keywords ) );
drun_read_string ( fd, &( entry->comment ) );
int32_t type = 0;
drun_read_integer( fd, &( type ) );
entry->type = type;
}
fclose ( fd );
@ -1012,16 +1027,7 @@ static ModeMode drun_mode_result ( Mode *sw, int mretv, char **input, unsigned i
DRunModePrivateData *rmpd = (DRunModePrivateData *) mode_get_private_data ( sw );
ModeMode retv = MODE_EXIT;
if ( mretv & MENU_NEXT ) {
retv = NEXT_DIALOG;
}
else if ( mretv & MENU_PREVIOUS ) {
retv = PREVIOUS_DIALOG;
}
else if ( mretv & MENU_QUICK_SWITCH ) {
retv = ( mretv & MENU_LOWER_MASK );
}
else if ( ( mretv & MENU_OK ) ) {
if ( ( mretv & MENU_OK ) ) {
switch ( rmpd->entry_list[selected_line].type )
{
case DRUN_DESKTOP_ENTRY_TYPE_APPLICATION:
@ -1035,7 +1041,12 @@ static ModeMode drun_mode_result ( Mode *sw, int mretv, char **input, unsigned i
}
}
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
retv = RELOAD_DIALOG;
RofiHelperExecuteContext context = { .name = NULL };
gboolean run_in_term = ( ( mretv & MENU_CUSTOM_ACTION ) == MENU_CUSTOM_ACTION );
// FIXME: We assume startup notification in terminals, not in others
if ( ! helper_execute_command ( NULL, *input, run_in_term, run_in_term ? &context : NULL ) ) {
retv = RELOAD_DIALOG;
}
}
else if ( ( mretv & MENU_ENTRY_DELETE ) && selected_line < rmpd->cmd_list_length ) {
// Possitive sort index means it is in history.

View file

@ -71,18 +71,7 @@ static ModeMode help_keys_mode_result ( G_GNUC_UNUSED Mode *sw,
G_GNUC_UNUSED char **input,
G_GNUC_UNUSED unsigned int selected_line )
{
ModeMode retv = MODE_EXIT;
if ( mretv & MENU_NEXT ) {
retv = NEXT_DIALOG;
}
else if ( mretv & MENU_PREVIOUS ) {
retv = PREVIOUS_DIALOG;
}
else if ( mretv & MENU_QUICK_SWITCH ) {
retv = ( mretv & MENU_LOWER_MASK );
}
return retv;
return MODE_EXIT;
}
static void help_keys_mode_destroy ( Mode *sw )
{

View file

@ -78,18 +78,18 @@ typedef struct
*
* Execute command and add to history.
*/
static void exec_cmd ( const char *cmd, int run_in_term )
static gboolean exec_cmd ( const char *cmd, int run_in_term )
{
GError *error = NULL;
if ( !cmd || !cmd[0] ) {
return;
return FALSE;
}
gsize lf_cmd_size = 0;
gchar *lf_cmd = g_locale_from_utf8 ( cmd, -1, NULL, &lf_cmd_size, &error );
if ( error != NULL ) {
g_warning ( "Failed to convert command to locale encoding: %s", error->message );
g_error_free ( error );
return;
return FALSE;
}
char *path = g_build_filename ( cache_dir, RUN_CACHE_FILE, NULL );
@ -102,12 +102,16 @@ static void exec_cmd ( const char *cmd, int run_in_term )
*/
history_set ( path, cmd );
g_free ( path );
g_free ( lf_cmd );
return TRUE;
}
else {
history_remove ( path, cmd );
g_free ( path );
g_free ( lf_cmd );
return FALSE;
}
g_free ( path );
g_free ( lf_cmd );
}
/**
@ -370,20 +374,15 @@ static ModeMode run_mode_result ( Mode *sw, int mretv, char **input, unsigned in
gboolean run_in_term = ( ( mretv & MENU_CUSTOM_ACTION ) == MENU_CUSTOM_ACTION );
if ( mretv & MENU_NEXT ) {
retv = NEXT_DIALOG;
}
else if ( mretv & MENU_PREVIOUS ) {
retv = PREVIOUS_DIALOG;
}
else if ( mretv & MENU_QUICK_SWITCH ) {
retv = ( mretv & MENU_LOWER_MASK );
}
else if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line] != NULL ) {
exec_cmd ( rmpd->cmd_list[selected_line], run_in_term );
if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line] != NULL ) {
if ( !exec_cmd ( rmpd->cmd_list[selected_line], run_in_term ) ) {
retv = RELOAD_DIALOG;
}
}
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
exec_cmd ( *input, run_in_term );
if ( !exec_cmd ( *input, run_in_term ) ) {
retv = RELOAD_DIALOG;
}
}
else if ( ( mretv & MENU_ENTRY_DELETE ) && rmpd->cmd_list[selected_line] ) {
delete_entry ( rmpd->cmd_list[selected_line] );

View file

@ -278,26 +278,20 @@ static ModeMode script_mode_result ( Mode *sw, int mretv, char **input, unsigned
DmenuScriptEntry *new_list = NULL;
unsigned int new_length = 0;
if ( ( mretv & MENU_NEXT ) ) {
retv = NEXT_DIALOG;
}
else if ( ( mretv & MENU_PREVIOUS ) ) {
retv = PREVIOUS_DIALOG;
}
else if ( ( mretv & MENU_QUICK_SWITCH ) ) {
//retv = 1+( mretv & MENU_LOWER_MASK );
script_mode_reset_highlight ( sw );
if ( selected_line != UINT32_MAX ) {
new_list = execute_executor ( sw, rmpd->cmd_list[selected_line].entry, &new_length, 10 + ( mretv & MENU_LOWER_MASK ), &( rmpd->cmd_list[selected_line] ) );
if ( ( mretv & MENU_CUSTOM_COMMAND ) ) {
//retv = 1+( mretv & MENU_LOWER_MASK );
script_mode_reset_highlight ( sw );
if ( selected_line != UINT32_MAX ) {
new_list = execute_executor ( sw, rmpd->cmd_list[selected_line].entry, &new_length, 10 + ( mretv & MENU_LOWER_MASK ), &( rmpd->cmd_list[selected_line] ) );
}
else {
if ( rmpd->no_custom == FALSE ) {
new_list = execute_executor ( sw, *input, &new_length, 10 + ( mretv & MENU_LOWER_MASK ), NULL );
}
else {
if ( rmpd->no_custom == FALSE ) {
new_list = execute_executor ( sw, *input, &new_length, 10 + ( mretv & MENU_LOWER_MASK ), NULL );
}
else {
return RELOAD_DIALOG;
}
return RELOAD_DIALOG;
}
}
}
else if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line].entry != NULL ) {
if ( rmpd->cmd_list[selected_line].nonselectable ) {

View file

@ -593,16 +593,7 @@ static ModeMode ssh_mode_result ( Mode *sw, int mretv, char **input, unsigned in
{
ModeMode retv = MODE_EXIT;
SSHModePrivateData *rmpd = (SSHModePrivateData *) mode_get_private_data ( sw );
if ( mretv & MENU_NEXT ) {
retv = NEXT_DIALOG;
}
else if ( mretv & MENU_PREVIOUS ) {
retv = PREVIOUS_DIALOG;
}
else if ( mretv & MENU_QUICK_SWITCH ) {
retv = ( mretv & MENU_LOWER_MASK );
}
else if ( ( mretv & MENU_OK ) && rmpd->hosts_list[selected_line].hostname != NULL ) {
if ( ( mretv & MENU_OK ) && rmpd->hosts_list[selected_line].hostname != NULL ) {
exec_ssh ( &( rmpd->hosts_list[selected_line] ) );
}
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {

View file

@ -650,16 +650,7 @@ static ModeMode window_mode_result ( Mode *sw, int mretv, G_GNUC_UNUSED char **i
{
ModeModePrivateData *rmpd = (ModeModePrivateData *) mode_get_private_data ( sw );
ModeMode retv = MODE_EXIT;
if ( mretv & MENU_NEXT ) {
retv = NEXT_DIALOG;
}
else if ( mretv & MENU_PREVIOUS ) {
retv = PREVIOUS_DIALOG;
}
else if ( ( mretv & MENU_QUICK_SWITCH ) == MENU_QUICK_SWITCH ) {
retv = ( mretv & MENU_LOWER_MASK );
}
else if ( ( mretv & ( MENU_OK ) ) ) {
if ( ( mretv & ( MENU_OK ) ) ) {
if ( mretv & MENU_CUSTOM_ACTION ) {
act_on_window ( rmpd->ids->array[selected_line] );
}
@ -706,6 +697,23 @@ static ModeMode window_mode_result ( Mode *sw, int mretv, G_GNUC_UNUSED char **i
xcb_ewmh_request_close_window ( &( xcb->ewmh ), xcb->screen_nbr, rmpd->ids->array[selected_line], XCB_CURRENT_TIME, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER );
xcb_flush ( xcb->connection );
}
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
GError *error = NULL;
gboolean run_in_term = ( ( mretv & MENU_CUSTOM_ACTION ) == MENU_CUSTOM_ACTION );
gsize lf_cmd_size = 0;
gchar *lf_cmd = g_locale_from_utf8 ( *input, -1, NULL, &lf_cmd_size, &error );
if ( error != NULL ) {
g_warning ( "Failed to convert command to locale encoding: %s", error->message );
g_error_free ( error );
return RELOAD_DIALOG;
}
RofiHelperExecuteContext context = { .name = NULL };
if ( ! helper_execute_command ( NULL, lf_cmd, run_in_term, run_in_term ? &context : NULL ) ) {
retv = RELOAD_DIALOG;
}
g_free ( lf_cmd );
}
return retv;
}

View file

@ -96,9 +96,20 @@ char * mode_get_completion ( const Mode *mode, unsigned int selected_line )
ModeMode mode_result ( Mode *mode, int menu_retv, char **input, unsigned int selected_line )
{
if ( menu_retv & MENU_NEXT ) {
return NEXT_DIALOG;
}
else if ( menu_retv & MENU_PREVIOUS ) {
return PREVIOUS_DIALOG;
}
else if ( menu_retv & MENU_QUICK_SWITCH ) {
return ( menu_retv & MENU_LOWER_MASK );
}
g_assert ( mode != NULL );
g_assert ( mode->_result != NULL );
g_assert ( input != NULL );
return mode->_result ( mode, menu_retv, input, selected_line );
}

View file

@ -208,7 +208,7 @@ static void run_switcher ( ModeMode mode )
void process_result ( RofiViewState *state )
{
Mode *sw = state->sw;
rofi_view_set_active ( NULL );
// rofi_view_set_active ( NULL );
if ( sw != NULL ) {
unsigned int selected_line = rofi_view_get_selected_line ( state );;
MenuReturn mretv = rofi_view_get_return_value ( state );
@ -246,11 +246,17 @@ void process_result ( RofiViewState *state )
* Load in the new mode.
*/
rofi_view_switch_mode ( state, modi[mode] );
rofi_view_set_active ( state );
curr_switcher = mode;
return;
} else {
// On exit, free current view, and pop to one above.
rofi_view_remove_active ( state );
rofi_view_free ( state );
return;
}
}
// rofi_view_set_active ( NULL );
rofi_view_remove_active ( state );
rofi_view_free ( state );
}
@ -291,7 +297,7 @@ static void print_main_application_options ( int is_term )
print_help_msg ( "-no-plugins", "", "Disable loading of external plugins.", NULL, is_term );
print_help_msg ( "-plugin-path", "", "Directory used to search for rofi plugins. *DEPRECATED*", NULL, is_term );
print_help_msg ( "-dump-config", "", "Dump the current configuration in rasi format and exit.", NULL, is_term );
print_help_msg ( "-upgrade-config", "", "Upgrade the old-style configuration fiel in the new rasi format and exit.", NULL, is_term );
print_help_msg ( "-upgrade-config", "", "Upgrade the old-style configuration file in the new rasi format and exit.", NULL, is_term );
print_help_msg ( "-dump-theme", "", "Dump the current theme in rasi format and exit.", NULL, is_term );
}
static void help ( G_GNUC_UNUSED int argc, char **argv )

View file

@ -298,6 +298,12 @@ static void rofi_theme_print_distance_unit ( RofiDistanceUnit *unit )
else if ( unit->modtype == ROFI_DISTANCE_MODIFIER_MODULO ) {
fputs ( " % ", stdout );
}
else if ( unit->modtype == ROFI_DISTANCE_MODIFIER_MIN ) {
fputs ( " min ", stdout );
}
else if ( unit->modtype == ROFI_DISTANCE_MODIFIER_MAX ) {
fputs ( " max ", stdout );
}
if ( unit->right ) {
rofi_theme_print_distance_unit ( unit->right );
}
@ -465,62 +471,73 @@ static void rofi_theme_print_property_index ( size_t pnl, int depth, Property *p
putchar ( '\n' );
}
static void rofi_theme_print_index ( ThemeWidget *widget )
static void rofi_theme_print_index ( ThemeWidget *widget, int index )
{
GHashTableIter iter;
gpointer key, value;
if ( widget->properties ) {
int index = 0;
GList *list = NULL;
ThemeWidget *w = widget;
while ( w ) {
if ( g_strcmp0 ( w->name, "Root" ) == 0 ) {
break;
}
list = g_list_prepend ( list, w->name );
w = w->parent;
if ( widget->media ) {
printf("%s {\n", widget->name );
for ( unsigned int i = 0; i < widget->num_widgets; i++ ) {
rofi_theme_print_index ( widget->widgets[i], index+4 );
}
if ( g_list_length ( list ) > 0 ) {
index = 4;
for ( GList *iter = g_list_first ( list ); iter != NULL; iter = g_list_next ( iter ) ) {
char *name = (char *) iter->data;
fputs ( name, stdout );
if ( iter->prev == NULL && iter->next ) {
putchar ( ' ' );
printf("}\n");
} else {
if ( widget->properties ) {
GList *list = NULL;
ThemeWidget *w = widget;
while ( w ) {
if ( g_strcmp0 ( w->name, "Root" ) == 0 ) {
break;
}
else if ( iter->next ) {
putchar ( '.' );
if ( w->media ) {
break;
}
list = g_list_prepend ( list, w->name );
w = w->parent;
}
printf ( " {\n" );
if ( g_list_length ( list ) > 0 ) {
printf("%*s", index, "");
for ( GList *iter = g_list_first ( list ); iter != NULL; iter = g_list_next ( iter ) ) {
char *name = (char *) iter->data;
fputs ( name, stdout );
if ( iter->prev == NULL && iter->next ) {
putchar ( ' ' );
}
else if ( iter->next ) {
putchar ( '.' );
}
}
printf ( " {\n" );
}
else {
printf ( "%*s* {\n", index, "" );
}
size_t property_name_length = 0;
g_hash_table_iter_init ( &iter, widget->properties );
while ( g_hash_table_iter_next ( &iter, &key, &value ) ) {
Property *p = (Property *) value;
property_name_length = MAX ( strlen ( p->name ), property_name_length );
}
g_hash_table_iter_init ( &iter, widget->properties );
while ( g_hash_table_iter_next ( &iter, &key, &value ) ) {
Property *p = (Property *) value;
rofi_theme_print_property_index ( property_name_length, index+4, p );
}
printf ( "%*s}\n", index, "" );
g_list_free ( list );
}
else {
index = 4;
printf ( "* {\n" );
for ( unsigned int i = 0; i < widget->num_widgets; i++ ) {
rofi_theme_print_index ( widget->widgets[i], index );
}
size_t property_name_length = 0;
g_hash_table_iter_init ( &iter, widget->properties );
while ( g_hash_table_iter_next ( &iter, &key, &value ) ) {
Property *p = (Property *) value;
property_name_length = MAX ( strlen ( p->name ), property_name_length );
}
g_hash_table_iter_init ( &iter, widget->properties );
while ( g_hash_table_iter_next ( &iter, &key, &value ) ) {
Property *p = (Property *) value;
rofi_theme_print_property_index ( property_name_length, index, p );
}
printf ( "}\n" );
g_list_free ( list );
}
for ( unsigned int i = 0; i < widget->num_widgets; i++ ) {
rofi_theme_print_index ( widget->widgets[i] );
}
}
void rofi_theme_print ( ThemeWidget *widget )
{
if ( widget != NULL ) {
printf ( "/**\n * rofi -dump-theme output.\n * Rofi version: %s\n **/\n", PACKAGE_VERSION );
rofi_theme_print_index ( widget );
rofi_theme_print_index ( widget, 0 );
}
}
@ -988,6 +1005,18 @@ static int distance_unit_get_pixel ( RofiDistanceUnit *unit, RofiOrientation ori
}
return 0;
}
case ROFI_DISTANCE_MODIFIER_MIN:
{
int a = distance_unit_get_pixel ( unit->left, ori );
int b = distance_unit_get_pixel ( unit->right, ori );
return MIN(a,b);
}
case ROFI_DISTANCE_MODIFIER_MAX:
{
int a = distance_unit_get_pixel ( unit->left, ori );
int b = distance_unit_get_pixel ( unit->right, ori );
return MAX(a,b);
}
default:
break;
}
@ -1189,6 +1218,23 @@ char * rofi_theme_parse_prepare_file ( const char *file, const char *parent_file
return filename;
}
static void rofi_theme_parse_merge_widgets_no_media ( ThemeWidget *parent, ThemeWidget *child )
{
g_assert ( parent != NULL );
g_assert ( child != NULL );
if ( parent == rofi_theme && g_strcmp0 ( child->name, "*" ) == 0 ) {
rofi_theme_widget_add_properties ( parent, child->properties );
return;
}
ThemeWidget *w = rofi_theme_find_or_create_name ( parent, child->name );
rofi_theme_widget_add_properties ( w, child->properties );
for ( unsigned int i = 0; i < child->num_widgets; i++ ) {
rofi_theme_parse_merge_widgets_no_media ( w, child->widgets[i] );
}
}
void rofi_theme_parse_merge_widgets ( ThemeWidget *parent, ThemeWidget *child )
{
g_assert ( parent != NULL );
@ -1199,22 +1245,26 @@ void rofi_theme_parse_merge_widgets ( ThemeWidget *parent, ThemeWidget *child )
return;
}
ThemeWidget *w = rofi_theme_find_or_create_name ( parent, child->name );
if ( child->media ) {
w->media = g_slice_new0(ThemeMedia);
*(w->media) = *(child->media);
}
rofi_theme_widget_add_properties ( w, child->properties );
for ( unsigned int i = 0; i < child->num_widgets; i++ ) {
rofi_theme_parse_merge_widgets ( w, child->widgets[i] );
}
}
void rofi_theme_parse_process_conditionals ( void )
static void rofi_theme_parse_process_conditionals_int ( workarea mon, ThemeWidget *rwidget )
{
workarea mon;
monitor_active ( &mon );
if ( rofi_theme == NULL ) {
if ( rwidget == NULL ) {
return;
}
for ( unsigned int i = 0; i < rofi_theme->num_widgets; i++ ) {
ThemeWidget *widget = rofi_theme->widgets[i];
for ( unsigned int i = 0; i < rwidget->num_widgets; i++ ) {
ThemeWidget *widget = rwidget->widgets[i];
rofi_theme_parse_process_conditionals_int ( mon, widget );
if ( widget->media != NULL ) {
switch ( widget->media->type )
{
@ -1223,7 +1273,7 @@ void rofi_theme_parse_process_conditionals ( void )
int w = widget->media->value;
if ( mon.w >= w ) {
for ( unsigned int x = 0; x < widget->num_widgets; x++ ) {
rofi_theme_parse_merge_widgets ( rofi_theme, widget->widgets[x] );
rofi_theme_parse_merge_widgets_no_media ( rofi_theme, widget->widgets[x] );
}
}
break;
@ -1233,7 +1283,7 @@ void rofi_theme_parse_process_conditionals ( void )
int w = widget->media->value;
if ( mon.w < w ) {
for ( unsigned int x = 0; x < widget->num_widgets; x++ ) {
rofi_theme_parse_merge_widgets ( rofi_theme, widget->widgets[x] );
rofi_theme_parse_merge_widgets_no_media ( rofi_theme, widget->widgets[x] );
}
}
break;
@ -1243,7 +1293,7 @@ void rofi_theme_parse_process_conditionals ( void )
int h = widget->media->value;
if ( mon.h >= h ) {
for ( unsigned int x = 0; x < widget->num_widgets; x++ ) {
rofi_theme_parse_merge_widgets ( rofi_theme, widget->widgets[x] );
rofi_theme_parse_merge_widgets_no_media ( rofi_theme, widget->widgets[x] );
}
}
break;
@ -1253,7 +1303,7 @@ void rofi_theme_parse_process_conditionals ( void )
int h = widget->media->value;
if ( mon.h < h ) {
for ( unsigned int x = 0; x < widget->num_widgets; x++ ) {
rofi_theme_parse_merge_widgets ( rofi_theme, widget->widgets[x] );
rofi_theme_parse_merge_widgets_no_media ( rofi_theme, widget->widgets[x] );
}
}
break;
@ -1262,7 +1312,7 @@ void rofi_theme_parse_process_conditionals ( void )
{
if ( mon.monitor_id == widget->media->value ) {
for ( unsigned int x = 0; x < widget->num_widgets; x++ ) {
rofi_theme_parse_merge_widgets ( rofi_theme, widget->widgets[x] );
rofi_theme_parse_merge_widgets_no_media ( rofi_theme, widget->widgets[x] );
}
}
break;
@ -1272,7 +1322,7 @@ void rofi_theme_parse_process_conditionals ( void )
double r = widget->media->value;
if ( ( mon.w / (double) mon.h ) >= r ) {
for ( unsigned int x = 0; x < widget->num_widgets; x++ ) {
rofi_theme_parse_merge_widgets ( rofi_theme, widget->widgets[x] );
rofi_theme_parse_merge_widgets_no_media ( rofi_theme, widget->widgets[x] );
}
}
break;
@ -1282,7 +1332,7 @@ void rofi_theme_parse_process_conditionals ( void )
double r = widget->media->value;
if ( ( mon.w / (double) mon.h ) < r ) {
for ( unsigned int x = 0; x < widget->num_widgets; x++ ) {
rofi_theme_parse_merge_widgets ( rofi_theme, widget->widgets[x] );
rofi_theme_parse_merge_widgets_no_media ( rofi_theme, widget->widgets[x] );
}
}
break;
@ -1295,6 +1345,12 @@ void rofi_theme_parse_process_conditionals ( void )
}
}
}
void rofi_theme_parse_process_conditionals ( void )
{
workarea mon;
monitor_active ( &mon );
rofi_theme_parse_process_conditionals_int ( mon, rofi_theme );
}
ThemeMediaType rofi_theme_parse_media_type ( const char *type )
{

View file

@ -149,6 +149,15 @@ RofiViewState * rofi_view_get_active ( void )
return current_active_menu;
}
void rofi_view_remove_active ( RofiViewState *state )
{
if ( state == current_active_menu ) {
rofi_view_set_active ( NULL );
}
else if ( state ) {
g_queue_remove ( &(CacheState.views ), state);
}
}
void rofi_view_set_active ( RofiViewState *state )
{
if ( current_active_menu != NULL && state != NULL ) {
@ -698,7 +707,7 @@ static void rofi_view_trigger_global_action ( KeyBindingAction action )
if ( selected < state->filtered_lines ) {
( state->selected_line ) = state->line_map[selected];
}
state->retv = MENU_QUICK_SWITCH | ( ( action - CUSTOM_1 ) & MENU_LOWER_MASK );
state->retv = MENU_CUSTOM_COMMAND | ( ( action - CUSTOM_1 ) & MENU_LOWER_MASK );
state->quit = TRUE;
break;
}

View file

@ -142,6 +142,9 @@ static int rofi_get_location ( RofiViewState *state )
static void wayland_rofi_view_window_update_size ( RofiViewState * state )
{
if ( state == NULL ) {
return;
}
widget_resize ( WIDGET ( state->main_window ), state->width, state->height );
display_set_surface_dimensions ( state->width, state->height, rofi_get_location ( state ) );
}

View file

@ -55,16 +55,8 @@ static PangoContext *p_context = NULL;
/** The pango font metrics */
static PangoFontMetrics *p_metrics = NULL;
/** Cache to hold font descriptions. This it to avoid having to lookup each time. */
typedef struct TBFontConfig
{
/** Font description */
PangoFontDescription *pfd;
/** Font metrics */
PangoFontMetrics *metrics;
/** height */
double height;
}TBFontConfig;
/* Default tbfc */
TBFontConfig *tbfc_default = NULL;
/** HashMap of previously parsed font descriptions. */
static GHashTable *tbfc_cache = NULL;
@ -133,7 +125,7 @@ static WidgetTriggerActionResult textbox_editable_trigger_action ( widget *wid,
static void textbox_initialize_font ( textbox *tb )
{
tb->metrics = p_metrics;
tb->tbfc = tbfc_default;
const char * font = rofi_theme_get_string ( WIDGET ( tb ), "font", NULL );
if ( font ) {
TBFontConfig *tbfc = g_hash_table_lookup ( tbfc_cache, font );
@ -142,7 +134,13 @@ static void textbox_initialize_font ( textbox *tb )
tbfc->pfd = pango_font_description_from_string ( font );
if ( helper_validate_font ( tbfc->pfd, font ) ) {
tbfc->metrics = pango_context_get_metrics ( p_context, tbfc->pfd, NULL );
tbfc->height = pango_font_metrics_get_ascent ( tbfc->metrics ) + pango_font_metrics_get_descent ( tbfc->metrics );
PangoLayout *layout = pango_layout_new(p_context );
pango_layout_set_text(layout,"aAjb", -1);
PangoRectangle rect;
pango_layout_get_pixel_extents(layout, NULL, &rect );
tbfc->height = rect.y + rect.height;
g_object_unref ( layout);
// Cast away consts. (*yuck*) because table_insert does not know it is const.
g_hash_table_insert ( tbfc_cache, (char *) font, tbfc );
@ -156,7 +154,7 @@ static void textbox_initialize_font ( textbox *tb )
if ( tbfc ) {
// Update for used font.
pango_layout_set_font_description ( tb->layout, tbfc->pfd );
tb->metrics = tbfc->metrics;
tb->tbfc = tbfc;
}
}
}
@ -419,7 +417,7 @@ static void textbox_draw ( widget *wid, cairo_t *draw )
// Skip the side MARGIN on the X axis.
int x = widget_padding_get_left ( WIDGET ( tb ) );
int top = widget_padding_get_top ( WIDGET ( tb ) );
int y = ( pango_font_metrics_get_ascent ( tb->metrics ) - pango_layout_get_baseline ( tb->layout ) ) / PANGO_SCALE;
int y = ( pango_font_metrics_get_ascent ( tb->tbfc->metrics ) - pango_layout_get_baseline ( tb->layout ) ) / PANGO_SCALE;
int line_width = 0, line_height = 0;
// Get actual width.
pango_layout_get_pixel_size ( tb->layout, &line_width, &line_height );
@ -828,7 +826,15 @@ void textbox_set_pango_context ( const char *font, PangoContext *p )
p_metrics = pango_context_get_metrics ( p_context, NULL, NULL );
TBFontConfig *tbfc = g_malloc0 ( sizeof ( TBFontConfig ) );
tbfc->metrics = p_metrics;
tbfc->height = pango_font_metrics_get_ascent ( tbfc->metrics ) + pango_font_metrics_get_descent ( tbfc->metrics );
PangoLayout *layout = pango_layout_new( p_context );
pango_layout_set_text(layout,"aAjb", -1);
PangoRectangle rect;
pango_layout_get_pixel_extents(layout, NULL, &rect );
tbfc->height = rect.y + rect.height;
g_object_unref ( layout);
tbfc_default = tbfc;
g_hash_table_insert ( tbfc_cache, (gpointer *) ( font ? font : default_font_name ), tbfc );
}
@ -866,27 +872,22 @@ int textbox_get_height ( const textbox *tb )
int textbox_get_font_height ( const textbox *tb )
{
int height;
pango_layout_get_pixel_size ( tb->layout, NULL, &height );
return height;
PangoRectangle rect;
pango_layout_get_pixel_extents ( tb->layout, NULL, &rect );
return rect.height+ rect.y;
}
int textbox_get_font_width ( const textbox *tb )
{
PangoRectangle rect;
pango_layout_get_pixel_extents ( tb->layout, NULL, &rect );
pango_layout_get_pixel_extents ( tb->layout, NULL, &rect);
return rect.width + rect.x;
}
/** Caching for the estimated character height. (em) */
static double char_height = -1;
double textbox_get_estimated_char_height ( void )
{
if ( char_height < 0 ) {
int height = pango_font_metrics_get_ascent ( p_metrics ) + pango_font_metrics_get_descent ( p_metrics );
char_height = ( height ) / (double) PANGO_SCALE;
}
return char_height;
return tbfc_default->height;
}
/** Caching for the expected character width. */
@ -913,8 +914,8 @@ double textbox_get_estimated_ch ( void )
int textbox_get_estimated_height ( const textbox *tb, int eh )
{
int height = pango_font_metrics_get_ascent ( tb->metrics ) + pango_font_metrics_get_descent ( tb->metrics );
return ceil ( ( eh * height ) / (double) PANGO_SCALE ) + widget_padding_get_padding_height ( WIDGET ( tb ) );
int height = tb->tbfc->height;
return ( eh * height ) + widget_padding_get_padding_height ( WIDGET ( tb ) );
}
int textbox_get_desired_width ( widget *wid )
{

View file

@ -432,6 +432,9 @@ static void xcb_rofi_view_calculate_window_position ( RofiViewState *state )
static void xcb_rofi_view_window_update_size ( RofiViewState * state )
{
if ( state == NULL ) {
return;
}
uint16_t mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
uint32_t vals[] = { state->x, state->y, state->width, state->height };

View file

@ -127,7 +127,7 @@ static XrmOption xrmOptions[] = {
{ xrm_String, "run-shell-command", { .str = &config.run_shell_command }, NULL,
"Run command to execute that runs in shell", CONFIG_DEFAULT },
{ xrm_String, "window-command", { .str = &config.window_command }, NULL,
"Command executed on accep-entry-custom for window modus", CONFIG_DEFAULT },
"Command to executed when -kb-accept-alt binding is hit on selected window ", CONFIG_DEFAULT },
{ xrm_String, "window-match-fields", { .str = &config.window_match_fields }, NULL,
"Window fields to match in window mode", CONFIG_DEFAULT },
{ xrm_String, "icon-theme", { .str = &config.icon_theme }, NULL,

View file

@ -158,10 +158,10 @@ START_TEST (test_core_error_root )
{
rofi_theme_parse_string ( "Blaat");
ck_assert_int_eq ( error, 1 );
ck_assert_ptr_nonnull ( rofi_theme );
ck_assert_ptr_null ( rofi_theme );
//ck_assert_ptr_null ( rofi_theme->widgets );
ck_assert_ptr_null ( rofi_theme->properties );
ck_assert_ptr_null ( rofi_theme->parent );
//ck_assert_ptr_null ( rofi_theme->properties );
//ck_assert_ptr_null ( rofi_theme->parent );
const char *error_str = "<big><b>Error while parsing theme:</b></big> <i>Blaat</i>\n"\
" Parser error: <span size=\"smaller\" style=\"italic\">syntax error, unexpected end of file, expecting &quot;bracket open (&apos;{&apos;)&quot; or &quot;Selector separator (&apos;,&apos;)&quot;</span>\n"\
" Location: line 1 column 6 to line 1 column 6\n";