summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2016-09-27 08:51:17 +0200
committerDave Davenport <qball@gmpclient.org>2016-09-27 22:15:39 +0200
commit89acc7b6edc80c54d1746348ed02329a08c50b41 (patch)
treec565883fc2e974f493162e7a0330323116b70be7
parent769dab5f66e1a344d22c9a3587f5a56ec4b77c2e (diff)
Make one widget_draw function, abstract rest (textbox, scrollbar) behind it.
-rw-r--r--include/scrollbar.h8
-rw-r--r--include/textbox.h8
-rw-r--r--include/widget.h16
-rw-r--r--source/scrollbar.c46
-rw-r--r--source/textbox.c13
-rw-r--r--source/view.c32
-rw-r--r--source/widget.c7
-rw-r--r--source/xrmoptions.c2
8 files changed, 69 insertions, 63 deletions
diff --git a/include/scrollbar.h b/include/scrollbar.h
index 71002676..24dee506 100644
--- a/include/scrollbar.h
+++ b/include/scrollbar.h
@@ -65,14 +65,6 @@ void scrollbar_set_max_value ( scrollbar *sb, unsigned int max );
/**
* @param sb scrollbar object
- * @param draw the cairo object used to draw itself
- *
- * Draw the scrollbar, used after expose event or update
- */
-void scrollbar_draw ( scrollbar *sb, cairo_t *draw );
-
-/**
- * @param sb scrollbar object
* @param y clicked position
*
* Calculate the position of the click relative to the max value of bar
diff --git a/include/textbox.h b/include/textbox.h
index 936593d1..7252f311 100644
--- a/include/textbox.h
+++ b/include/textbox.h
@@ -96,14 +96,6 @@ void textbox_font ( textbox *tb, TextBoxFontType tbft );
*/
void textbox_text ( textbox *tb, const char *text );
-/**
- * @param tb Handle to the textbox
- * @param draw The cairo object used to draw itself.
- *
- * Render the textbox.
- */
-void textbox_draw ( textbox *tb, cairo_t *draw );
-
int textbox_keybinding ( textbox *tb, KeyBindingAction action );
/**
* @param tb Handle to the textbox
diff --git a/include/widget.h b/include/widget.h
index acf3037d..6ecb7b18 100644
--- a/include/widget.h
+++ b/include/widget.h
@@ -1,6 +1,7 @@
#ifndef ROFI_WIDGET_H
#define ROFI_WIDGET_H
+#include <cairo.h>
/**
* @defgroup Widgets Widgets
*
@@ -8,7 +9,7 @@
*
* @{
*/
-typedef struct
+typedef struct _Widget
{
/** X position relative to parent */
short x;
@@ -20,10 +21,13 @@ typedef struct
short h;
/** enabled or not */
gboolean enabled;
+ /** Function prototypes */
+
+ void ( *draw )( struct _Widget *tb, cairo_t *draw );
} Widget;
/** Macro to get widget from an implementation (e.g. textbox/scrollbar) */
-#define WIDGET( a ) ( a != NULL ? &( a->widget ) : NULL )
+#define WIDGET( a ) ( a != NULL ? (Widget *) ( a ) : NULL )
/**
* @param widget The widget to check
@@ -49,5 +53,13 @@ gboolean widget_enabled ( Widget *widget );
void widget_disable ( Widget *widget );
void widget_enable ( Widget *widget );
+/**
+ * @param tb Handle to the widget
+ * @param draw The cairo object used to draw itself.
+ *
+ * Render the textbox.
+ */
+void widget_draw ( Widget *widget, cairo_t *d );
+
/*@}*/
#endif // ROFI_WIDGET_H
diff --git a/source/scrollbar.c b/source/scrollbar.c
index 1da6f689..e58ebb5c 100644
--- a/source/scrollbar.c
+++ b/source/scrollbar.c
@@ -29,14 +29,17 @@
#include "x11-helper.h"
#include "settings.h"
+static void scrollbar_draw ( Widget *widget, cairo_t *draw );
+
scrollbar *scrollbar_create ( short x, short y, short w, short h )
{
scrollbar *sb = g_malloc0 ( sizeof ( scrollbar ) );
- sb->widget.x = x;
- sb->widget.y = y;
- sb->widget.w = MAX ( 1, w );
- sb->widget.h = MAX ( 1, h );
+ sb->widget.x = x;
+ sb->widget.y = y;
+ sb->widget.w = MAX ( 1, w );
+ sb->widget.h = MAX ( 1, h );
+ sb->widget.draw = scrollbar_draw;
sb->length = 10;
sb->pos = 0;
@@ -75,26 +78,25 @@ void scrollbar_set_handle_length ( scrollbar *sb, unsigned int pos_length )
}
}
-void scrollbar_draw ( scrollbar *sb, cairo_t *draw )
+static void scrollbar_draw ( Widget *widget, cairo_t *draw )
{
- if ( sb != NULL && sb->widget.enabled ) {
- // Calculate position and size.
- const short bh = sb->widget.h - 0;
- float sec = ( ( bh ) / (float) sb->length );
- short height = sb->pos_length * sec;
- short y = sb->pos * sec;
- // Set max pos.
- y = MIN ( y, bh - 2 );
- // Never go out of bar.
- height = MAX ( 2, height );
- // Cap length;
- height = MIN ( bh - y + 1, ( height ) );
- // Redraw base window
- color_separator ( draw );
+ scrollbar *sb = (scrollbar *) widget;
+ // Calculate position and size.
+ const short bh = sb->widget.h - 0;
+ float sec = ( ( bh ) / (float) sb->length );
+ short height = sb->pos_length * sec;
+ short y = sb->pos * sec;
+ // Set max pos.
+ y = MIN ( y, bh - 2 );
+ // Never go out of bar.
+ height = MAX ( 2, height );
+ // Cap length;
+ height = MIN ( bh - y + 1, ( height ) );
+ // Redraw base window
+ color_separator ( draw );
- cairo_rectangle ( draw, sb->widget.x + config.line_margin, sb->widget.y + y, sb->widget.w - config.line_margin, height );
- cairo_fill ( draw );
- }
+ cairo_rectangle ( draw, sb->widget.x + config.line_margin, sb->widget.y + y, sb->widget.w - config.line_margin, height );
+ cairo_fill ( draw );
}
void scrollbar_resize ( scrollbar *sb, int w, int h )
{
diff --git a/source/textbox.c b/source/textbox.c
index 6b0e7d41..3429da45 100644
--- a/source/textbox.c
+++ b/source/textbox.c
@@ -38,6 +38,8 @@
#define DOT_OFFSET 15
+static void textbox_draw ( Widget *tb, cairo_t *draw );
+
/**
* Font + font color cache.
* Avoid re-loading font on every change on every textbox.
@@ -75,7 +77,8 @@ textbox* textbox_create ( TextboxFlags flags, short x, short y, short w, short h
{
textbox *tb = g_slice_new0 ( textbox );
- tb->flags = flags;
+ tb->widget.draw = textbox_draw;
+ tb->flags = flags;
tb->widget.x = x;
tb->widget.y = y;
@@ -269,8 +272,8 @@ void textbox_free ( textbox *tb )
static void texbox_update ( textbox *tb )
{
- unsigned int offset = ( tb->flags & TB_INDICATOR ) ? DOT_OFFSET : 0;
if ( tb->update ) {
+ unsigned int offset = ( tb->flags & TB_INDICATOR ) ? DOT_OFFSET : 0;
if ( tb->main_surface ) {
cairo_destroy ( tb->main_draw );
cairo_surface_destroy ( tb->main_surface );
@@ -353,11 +356,9 @@ static void texbox_update ( textbox *tb )
tb->update = FALSE;
}
}
-void textbox_draw ( textbox *tb, cairo_t *draw )
+static void textbox_draw ( Widget *widget, cairo_t *draw )
{
- if ( tb->widget.enabled == FALSE ) {
- return;
- }
+ textbox *tb = (textbox *) widget;
texbox_update ( tb );
/* Write buffer */
diff --git a/source/view.c b/source/view.c
index 142a1791..bb7f1cbe 100644
--- a/source/view.c
+++ b/source/view.c
@@ -189,10 +189,10 @@ static void rofi_view_calculate_window_position ( RofiViewState *state )
return;
}
-
- if ( !config.fixed_num_lines && ( config.location == WL_CENTER || config.location == WL_EAST || config.location == WL_WEST )){
- state->y = CacheState.mon.y + CacheState.mon.h /2 - state->top_offset;
- }else {
+ if ( !config.fixed_num_lines && ( config.location == WL_CENTER || config.location == WL_EAST || config.location == WL_WEST ) ) {
+ state->y = CacheState.mon.y + CacheState.mon.h / 2 - state->top_offset;
+ }
+ else {
// Default location is center.
state->y = CacheState.mon.y + ( CacheState.mon.h - state->height ) / 2;
}
@@ -393,7 +393,7 @@ static void rofi_view_resize ( RofiViewState *state )
textbox_moveresize ( state->modi[j],
state->border + j * ( width + config.line_margin ), state->height - state->line_height - state->border,
width, state->line_height );
- textbox_draw ( state->modi[j], CacheState.draw );
+ widget_draw ( WIDGET ( state->modi[j] ), CacheState.draw );
}
}
int entrybox_width = state->width - ( 2 * ( state->border ) );
@@ -426,7 +426,7 @@ static void rofi_view_resize ( RofiViewState *state )
h -= state->line_height + config.line_margin;
}
}
- state->max_rows = MAX ( 0, ( h / element_height ) );
+ state->max_rows = MAX ( 0, ( h / element_height ) );
state->menu_lines = state->max_rows;
state->max_elements = state->max_rows * config.menu_columns;
// Free boxes no longer needed.
@@ -998,7 +998,7 @@ static void rofi_view_draw ( RofiViewState *state, cairo_t *d )
unsigned int max_elements = MIN ( a_lines, state->max_rows * columns );
scrollbar_set_handle_length ( state->scrollbar, columns * state->max_rows );
- scrollbar_draw ( state->scrollbar, d );
+ widget_draw ( WIDGET ( state->scrollbar ), d );
// Element width.
unsigned int element_width = state->width - ( 2 * ( state->border ) );
if ( state->scrollbar != NULL ) {
@@ -1042,7 +1042,7 @@ static void rofi_view_draw ( RofiViewState *state, cairo_t *d )
pango_attr_list_unref ( list );
g_free ( text );
}
- textbox_draw ( state->boxes[i], d );
+ widget_draw ( WIDGET ( state->boxes[i] ), d );
}
tokenize_free ( tokens );
state->rchanged = FALSE;
@@ -1055,7 +1055,7 @@ static void rofi_view_draw ( RofiViewState *state, cairo_t *d )
mode_get_display_value ( state->sw, state->line_map[i + offset], &fstate, FALSE );
TextBoxFontType tbft = fstate | ( ( i + offset ) == state->selected ? HIGHLIGHT : type );
textbox_font ( state->boxes[i], tbft );
- textbox_draw ( state->boxes[i], d );
+ widget_draw ( WIDGET ( state->boxes[i] ), d );
}
}
}
@@ -1111,16 +1111,16 @@ void rofi_view_update ( RofiViewState *state )
rofi_view_draw ( state, d );
}
if ( state->prompt_tb ) {
- textbox_draw ( state->prompt_tb, d );
+ widget_draw ( WIDGET ( state->prompt_tb ), d );
}
if ( state->text ) {
- textbox_draw ( state->text, d );
+ widget_draw ( WIDGET ( state->text ), d );
}
if ( state->case_indicator ) {
- textbox_draw ( state->case_indicator, d );
+ widget_draw ( WIDGET ( state->case_indicator ), d );
}
if ( state->message_tb ) {
- textbox_draw ( state->message_tb, d );
+ widget_draw ( WIDGET ( state->message_tb ), d );
}
color_separator ( d );
@@ -1152,12 +1152,12 @@ void rofi_view_update ( RofiViewState *state )
if ( config.sidebar_mode == TRUE ) {
for ( unsigned int j = 0; j < state->num_modi; j++ ) {
if ( state->modi[j] != NULL ) {
- textbox_draw ( state->modi[j], d );
+ widget_draw ( WIDGET ( state->modi[j] ), d );
}
}
}
if ( state->overlay ) {
- textbox_draw ( state->overlay, d );
+ widget_draw ( WIDGET ( state->overlay ), d );
}
state->update = FALSE;
@@ -1361,7 +1361,7 @@ static void rofi_view_refilter ( RofiViewState *state )
state->quit = TRUE;
}
scrollbar_set_max_value ( state->scrollbar, state->filtered_lines );
- if ( current_active_menu && config.fixed_num_lines == FALSE && ( CacheState.flags & MENU_NORMAL_WINDOW ) == 0 ) {
+ if ( current_active_menu && config.fixed_num_lines == FALSE && ( CacheState.flags & MENU_NORMAL_WINDOW ) == 0 ) {
int columns = config.menu_columns;
// Calculate the number or rows. We do this by getting the num_lines rounded up to X columns
// (num elements is better name) then dividing by columns.
diff --git a/source/widget.c b/source/widget.c
index fe788c97..7fc9d957 100644
--- a/source/widget.c
+++ b/source/widget.c
@@ -43,3 +43,10 @@ void widget_disable ( Widget *widget )
widget->enabled = FALSE;
}
}
+void widget_draw ( Widget *widget, cairo_t *d )
+{
+ // Check if enabled and if draw is implemented.
+ if ( widget && widget->enabled && widget->draw ) {
+ widget->draw ( widget, d );
+ }
+}
diff --git a/source/xrmoptions.c b/source/xrmoptions.c
index ec6253cb..dd337a1b 100644
--- a/source/xrmoptions.c
+++ b/source/xrmoptions.c
@@ -190,7 +190,7 @@ static XrmOption xrmOptions[] = {
"Background to use for fake transparency. (background or screenshot)", CONFIG_DEFAULT },
{ xrm_String, "window-format", { .str = &config.window_format }, NULL,
"Window Format. w (desktop name), t (title), n (name), r (role), c (class)", CONFIG_DEFAULT },
- { xrm_Boolean, "click-to-exit", { .snum = &config.click_to_exit }, NULL,
+ { xrm_Boolean, "click-to-exit", { .snum = &config.click_to_exit }, NULL,
"Click outside the window to exit", CONFIG_DEFAULT },
};