mirror of https://github.com/davatorium/rofi.git
Add percentage option to border,padding
This commit is contained in:
parent
7600668bff
commit
f9fc01b176
|
@ -11,6 +11,8 @@ typedef enum {
|
||||||
PW_PX,
|
PW_PX,
|
||||||
/** PixelWidth in EM. */
|
/** PixelWidth in EM. */
|
||||||
PW_EM,
|
PW_EM,
|
||||||
|
/** PixelWidget in percentage */
|
||||||
|
PW_PERCENT,
|
||||||
} PixelWidth;
|
} PixelWidth;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,6 +25,13 @@ typedef struct {
|
||||||
PixelWidth type;
|
PixelWidth type;
|
||||||
} Distance;
|
} Distance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of orientation.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
ORIENTATION_VERTICAL,
|
||||||
|
ORIENTATION_HORIZONTAL
|
||||||
|
} Orientation;
|
||||||
/**
|
/**
|
||||||
* Type of property
|
* Type of property
|
||||||
*/
|
*/
|
||||||
|
@ -251,11 +260,12 @@ Padding rofi_theme_get_padding ( const char *wclass, const char *name, const ch
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param d The distance handle.
|
* @param d The distance handle.
|
||||||
|
* @param ori The orientation.
|
||||||
*
|
*
|
||||||
* Convert Distance into pixels.
|
* Convert Distance into pixels.
|
||||||
* @returns the number of pixels this distance represents.
|
* @returns the number of pixels this distance represents.
|
||||||
*/
|
*/
|
||||||
int distance_get_pixel ( Distance d );
|
int distance_get_pixel ( Distance d, Orientation ori );
|
||||||
|
|
||||||
#ifdef THEME_CONVERTER
|
#ifdef THEME_CONVERTER
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -248,5 +248,12 @@ void rofi_view_workers_initialize ( void );
|
||||||
* Stop all threads and free the resources used by the threadpool
|
* Stop all threads and free the resources used by the threadpool
|
||||||
*/
|
*/
|
||||||
void rofi_view_workers_finalize ( void );
|
void rofi_view_workers_finalize ( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the current monitor workarea.
|
||||||
|
*
|
||||||
|
* @returns the current monitor workarea
|
||||||
|
*/
|
||||||
|
void rofi_view_get_current_monitor ( int *width, int *height );
|
||||||
/**@}*/
|
/**@}*/
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,6 +27,7 @@ NUMBER [[:digit:]]
|
||||||
REAL [[:digit:]]+(\.[[:digit:]]+)?
|
REAL [[:digit:]]+(\.[[:digit:]]+)?
|
||||||
PX (px)
|
PX (px)
|
||||||
EM (em)
|
EM (em)
|
||||||
|
PERCENT (\%)
|
||||||
NEWLINES (\r|\n)+
|
NEWLINES (\r|\n)+
|
||||||
|
|
||||||
%x PROPERTIES
|
%x PROPERTIES
|
||||||
|
@ -117,6 +118,11 @@ if ( queue == NULL ){
|
||||||
yylval->distance.type = PW_PX;
|
yylval->distance.type = PW_PX;
|
||||||
return T_PIXEL;
|
return T_PIXEL;
|
||||||
}
|
}
|
||||||
|
<PROPERTIES>{REAL}{PERCENT} {
|
||||||
|
yylval->distance.distance = (double)g_ascii_strtod(yytext, NULL);
|
||||||
|
yylval->distance.type = PW_PERCENT;
|
||||||
|
return T_PIXEL;
|
||||||
|
}
|
||||||
<PROPERTIES>#{HEX}{8} {
|
<PROPERTIES>#{HEX}{8} {
|
||||||
union { unsigned int val; struct { unsigned char b,g,r,a;};} val;
|
union { unsigned int val; struct { unsigned char b,g,r,a;};} val;
|
||||||
val.val = (unsigned int)strtoull ( &yytext[1], NULL, 16);
|
val.val = (unsigned int)strtoull ( &yytext[1], NULL, 16);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "helper.h"
|
#include "helper.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "widgets/textbox.h"
|
#include "widgets/textbox.h"
|
||||||
|
#include "view.h"
|
||||||
|
|
||||||
void yyerror ( YYLTYPE *ylloc, const char *);
|
void yyerror ( YYLTYPE *ylloc, const char *);
|
||||||
|
|
||||||
|
@ -369,10 +370,21 @@ Padding rofi_theme_get_padding ( const char *wclass, const char *name, const ch
|
||||||
}
|
}
|
||||||
return pad;
|
return pad;
|
||||||
}
|
}
|
||||||
int distance_get_pixel ( Distance d )
|
int distance_get_pixel ( Distance d, Orientation ori )
|
||||||
{
|
{
|
||||||
if ( d.type == PW_EM ){
|
if ( d.type == PW_EM ){
|
||||||
return d.distance*textbox_get_estimated_char_height();
|
return d.distance*textbox_get_estimated_char_height();
|
||||||
|
} else if ( d.type == PW_PERCENT ) {
|
||||||
|
if ( ori == ORIENTATION_VERTICAL ){
|
||||||
|
int height = 0;
|
||||||
|
rofi_view_get_current_monitor ( NULL, &height );
|
||||||
|
return (d.distance*height)/(100.0);
|
||||||
|
} else {
|
||||||
|
int width = 0;
|
||||||
|
rofi_view_get_current_monitor ( &width, NULL );
|
||||||
|
return (d.distance*width)/(100.0);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return d.distance;
|
return d.distance;
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,6 +124,15 @@ struct
|
||||||
.repaint_source = 0,
|
.repaint_source = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void rofi_view_get_current_monitor ( int *width, int *height)
|
||||||
|
{
|
||||||
|
if (width ){
|
||||||
|
*width = CacheState.mon.w;
|
||||||
|
}
|
||||||
|
if (height){
|
||||||
|
*height = CacheState.mon.h;
|
||||||
|
}
|
||||||
|
}
|
||||||
static char * get_matching_state ( void )
|
static char * get_matching_state ( void )
|
||||||
{
|
{
|
||||||
if ( config.case_sensitive ) {
|
if ( config.case_sensitive ) {
|
||||||
|
|
|
@ -55,7 +55,7 @@ static void box_update ( widget *wid );
|
||||||
static int box_get_desired_height ( widget *wid )
|
static int box_get_desired_height ( widget *wid )
|
||||||
{
|
{
|
||||||
box *b = (box *)wid;
|
box *b = (box *)wid;
|
||||||
int spacing = distance_get_pixel ( b->spacing );
|
int spacing = distance_get_pixel ( b->spacing, b->type == BOX_VERTICAL? ORIENTATION_VERTICAL:ORIENTATION_HORIZONTAL );
|
||||||
int active_widgets = 0;
|
int active_widgets = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
if ( b->type == BOX_VERTICAL ){
|
if ( b->type == BOX_VERTICAL ){
|
||||||
|
@ -90,7 +90,7 @@ static int box_get_desired_height ( widget *wid )
|
||||||
|
|
||||||
static void vert_calculate_size ( box *b )
|
static void vert_calculate_size ( box *b )
|
||||||
{
|
{
|
||||||
int spacing = distance_get_pixel ( b->spacing );
|
int spacing = distance_get_pixel ( b->spacing, ORIENTATION_VERTICAL );
|
||||||
int expanding_widgets = 0;
|
int expanding_widgets = 0;
|
||||||
int active_widgets = 0;
|
int active_widgets = 0;
|
||||||
int rem_width = widget_padding_get_remaining_width ( WIDGET (b) );
|
int rem_width = widget_padding_get_remaining_width ( WIDGET (b) );
|
||||||
|
@ -169,7 +169,7 @@ static void vert_calculate_size ( box *b )
|
||||||
}
|
}
|
||||||
static void hori_calculate_size ( box *b )
|
static void hori_calculate_size ( box *b )
|
||||||
{
|
{
|
||||||
int spacing = distance_get_pixel ( b->spacing );
|
int spacing = distance_get_pixel ( b->spacing, ORIENTATION_HORIZONTAL );
|
||||||
int expanding_widgets = 0;
|
int expanding_widgets = 0;
|
||||||
int active_widgets = 0;
|
int active_widgets = 0;
|
||||||
int rem_width = widget_padding_get_remaining_width ( WIDGET (b) );
|
int rem_width = widget_padding_get_remaining_width ( WIDGET (b) );
|
||||||
|
|
|
@ -164,21 +164,22 @@ static void listview_draw ( widget *wid, cairo_t *draw )
|
||||||
scrollbar_set_handle_length ( lv->scrollbar, lv->cur_columns * lv->max_rows );
|
scrollbar_set_handle_length ( lv->scrollbar, lv->cur_columns * lv->max_rows );
|
||||||
scrollbar_set_handle ( lv->scrollbar, lv->selected );
|
scrollbar_set_handle ( lv->scrollbar, lv->selected );
|
||||||
lv->last_offset = offset;
|
lv->last_offset = offset;
|
||||||
int spacing = distance_get_pixel ( lv->spacing );
|
int spacing_vert = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL );
|
||||||
|
int spacing_hori = distance_get_pixel ( lv->spacing, ORIENTATION_HORIZONTAL );
|
||||||
if ( lv->cur_elements > 0 && lv->max_rows > 0 ) {
|
if ( lv->cur_elements > 0 && lv->max_rows > 0 ) {
|
||||||
// Set new x/y possition.
|
// Set new x/y possition.
|
||||||
unsigned int max = MIN ( lv->cur_elements, lv->req_elements - offset );
|
unsigned int max = MIN ( lv->cur_elements, lv->req_elements - offset );
|
||||||
if ( lv->rchanged ) {
|
if ( lv->rchanged ) {
|
||||||
unsigned int width = lv->widget.w - spacing * ( lv->cur_columns - 1 );
|
unsigned int width = lv->widget.w - spacing_hori * ( lv->cur_columns - 1 );
|
||||||
width -= widget_padding_get_padding_width ( wid );
|
width -= widget_padding_get_padding_width ( wid );
|
||||||
if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) ) {
|
if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) ) {
|
||||||
width -= spacing;
|
width -= spacing_hori;
|
||||||
width -= widget_get_width ( WIDGET ( lv->scrollbar ) );
|
width -= widget_get_width ( WIDGET ( lv->scrollbar ) );
|
||||||
}
|
}
|
||||||
unsigned int element_width = ( width ) / lv->cur_columns;
|
unsigned int element_width = ( width ) / lv->cur_columns;
|
||||||
for ( unsigned int i = 0; i < max; i++ ) {
|
for ( unsigned int i = 0; i < max; i++ ) {
|
||||||
unsigned int ex = widget_padding_get_left ( wid ) + ( ( i ) / lv->max_rows ) * ( element_width + spacing );
|
unsigned int ex = widget_padding_get_left ( wid ) + ( ( i ) / lv->max_rows ) * ( element_width + spacing_hori );
|
||||||
unsigned int ey = widget_padding_get_top ( wid ) + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing );
|
unsigned int ey = widget_padding_get_top ( wid ) + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert );
|
||||||
textbox_moveresize ( lv->boxes[i], ex, ey, element_width, lv->element_height );
|
textbox_moveresize ( lv->boxes[i], ex, ey, element_width, lv->element_height );
|
||||||
|
|
||||||
update_element ( lv, i, i + offset, TRUE );
|
update_element ( lv, i, i + offset, TRUE );
|
||||||
|
@ -256,8 +257,8 @@ static void listview_resize ( widget *wid, short w, short h )
|
||||||
lv->widget.w = MAX ( 0, w );
|
lv->widget.w = MAX ( 0, w );
|
||||||
lv->widget.h = MAX ( 0, h );
|
lv->widget.h = MAX ( 0, h );
|
||||||
int height = lv->widget.h - widget_padding_get_padding_height ( WIDGET (lv) );
|
int height = lv->widget.h - widget_padding_get_padding_height ( WIDGET (lv) );
|
||||||
int spacing = distance_get_pixel ( lv->spacing );
|
int spacing_vert = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL );
|
||||||
lv->max_rows = ( spacing + height ) / ( lv->element_height + spacing );
|
lv->max_rows = ( spacing_vert + height ) / ( lv->element_height + spacing_vert );
|
||||||
lv->max_elements = lv->max_rows * lv->menu_columns;
|
lv->max_elements = lv->max_rows * lv->menu_columns;
|
||||||
|
|
||||||
widget_move ( WIDGET ( lv->scrollbar ),
|
widget_move ( WIDGET ( lv->scrollbar ),
|
||||||
|
@ -464,7 +465,7 @@ void listview_nav_page_next ( listview *lv )
|
||||||
static int listview_get_desired_height ( widget *wid )
|
static int listview_get_desired_height ( widget *wid )
|
||||||
{
|
{
|
||||||
listview *lv = (listview *)wid;
|
listview *lv = (listview *)wid;
|
||||||
int spacing = distance_get_pixel ( lv->spacing );
|
int spacing = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL );
|
||||||
if ( lv == NULL || lv->widget.enabled == FALSE ) {
|
if ( lv == NULL || lv->widget.enabled == FALSE ) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,10 +98,10 @@ void widget_draw ( widget *widget, cairo_t *d )
|
||||||
// Set new x/y possition.
|
// Set new x/y possition.
|
||||||
cairo_translate ( d, widget->x, widget->y );
|
cairo_translate ( d, widget->x, widget->y );
|
||||||
|
|
||||||
int left = distance_get_pixel ( widget->border.left );
|
int left = distance_get_pixel ( widget->border.left, ORIENTATION_HORIZONTAL );
|
||||||
int top = distance_get_pixel ( widget->border.top );
|
int top = distance_get_pixel ( widget->border.top, ORIENTATION_HORIZONTAL );
|
||||||
int right = distance_get_pixel ( widget->border.right );
|
int right = distance_get_pixel ( widget->border.right, ORIENTATION_VERTICAL );
|
||||||
int bottom = distance_get_pixel ( widget->border.bottom );
|
int bottom = distance_get_pixel ( widget->border.bottom, ORIENTATION_VERTICAL );
|
||||||
rofi_theme_get_color ( widget->class_name, widget->name, widget->state, "foreground", d );
|
rofi_theme_get_color ( widget->class_name, widget->name, widget->state, "foreground", d );
|
||||||
if ( left > 0 ) {
|
if ( left > 0 ) {
|
||||||
cairo_set_line_width ( d, left );
|
cairo_set_line_width ( d, left );
|
||||||
|
@ -250,26 +250,26 @@ void widget_set_name ( widget *wid, const char *name )
|
||||||
|
|
||||||
int widget_padding_get_left ( const widget *wid )
|
int widget_padding_get_left ( const widget *wid )
|
||||||
{
|
{
|
||||||
int distance = distance_get_pixel ( wid->padding.left );
|
int distance = distance_get_pixel ( wid->padding.left, ORIENTATION_HORIZONTAL );
|
||||||
distance += distance_get_pixel ( wid->border.left );
|
distance += distance_get_pixel ( wid->border.left, ORIENTATION_HORIZONTAL );
|
||||||
return distance;
|
return distance;
|
||||||
}
|
}
|
||||||
int widget_padding_get_right ( const widget *wid )
|
int widget_padding_get_right ( const widget *wid )
|
||||||
{
|
{
|
||||||
int distance = distance_get_pixel ( wid->padding.right );
|
int distance = distance_get_pixel ( wid->padding.right, ORIENTATION_HORIZONTAL );
|
||||||
distance += distance_get_pixel ( wid->border.right );
|
distance += distance_get_pixel ( wid->border.right, ORIENTATION_HORIZONTAL );
|
||||||
return distance;
|
return distance;
|
||||||
}
|
}
|
||||||
int widget_padding_get_top ( const widget *wid )
|
int widget_padding_get_top ( const widget *wid )
|
||||||
{
|
{
|
||||||
int distance = distance_get_pixel ( wid->padding.top );
|
int distance = distance_get_pixel ( wid->padding.top, ORIENTATION_VERTICAL );
|
||||||
distance += distance_get_pixel ( wid->border.top );
|
distance += distance_get_pixel ( wid->border.top, ORIENTATION_VERTICAL );
|
||||||
return distance;
|
return distance;
|
||||||
}
|
}
|
||||||
int widget_padding_get_bottom ( const widget *wid )
|
int widget_padding_get_bottom ( const widget *wid )
|
||||||
{
|
{
|
||||||
int distance = distance_get_pixel ( wid->padding.bottom );
|
int distance = distance_get_pixel ( wid->padding.bottom, ORIENTATION_VERTICAL );
|
||||||
distance += distance_get_pixel ( wid->border.bottom );
|
distance += distance_get_pixel ( wid->border.bottom, ORIENTATION_VERTICAL );
|
||||||
return distance;
|
return distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue