// end of line static void textbox_cursor_end ( textbox *tb ) { if ( tb->text == NULL ) { tb->cursor = 0; tb->update = TRUE; widget_queue_redraw ( WIDGET ( tb ) ); return; } tb->cursor = ( int ) g_utf8_strlen ( tb->text, -1 ); tb->update = TRUE; widget_queue_redraw ( WIDGET ( tb ) ); // Stop blink! tb->blink = 2; }
void textbox_font ( textbox *tb, TextBoxFontType tbft ) { TextBoxFontType t = tbft & STATE_MASK; if ( tb == NULL ) { return; } // ACTIVE has priority over URGENT if both set. if ( t == ( URGENT | ACTIVE ) ) { t = ACTIVE; } switch ( ( tbft & FMOD_MASK ) ) { case HIGHLIGHT: widget_set_state ( WIDGET ( tb ), theme_prop_names[t][1] ); break; case ALT: widget_set_state ( WIDGET ( tb ), theme_prop_names[t][2] ); break; default: widget_set_state ( WIDGET ( tb ), theme_prop_names[t][0] ); break; } if ( tb->tbft != tbft || tb->widget.state == NULL ) { tb->update = TRUE; widget_queue_redraw ( WIDGET ( tb ) ); } tb->tbft = tbft; }
void listview_set_selected ( listview *lv, unsigned int selected ) { if ( lv && lv->req_elements > 0 ) { lv->selected = MIN ( selected, lv->req_elements - 1 ); widget_queue_redraw ( WIDGET ( lv ) ); } }
void listview_set_num_elements ( listview *lv, unsigned int rows ) { lv->req_elements = rows; listview_set_selected ( lv, lv->selected ); listview_recompute_elements ( lv ); widget_queue_redraw ( WIDGET ( lv ) ); }
// set the default text to display void textbox_text ( textbox *tb, const char *text ) { tb->update = TRUE; g_free ( tb->text ); const gchar *last_pointer = NULL; if ( g_utf8_validate ( text, -1, &last_pointer ) ) { tb->text = g_strdup ( text ); } else { if ( last_pointer != NULL ) { // Copy string up to invalid character. tb->text = g_strndup ( text, ( last_pointer - text ) ); } else { tb->text = g_strdup ( "Invalid UTF-8 string." ); } } __textbox_update_pango_text ( tb ); if ( tb->flags & TB_AUTOWIDTH ) { textbox_moveresize ( tb, tb->widget.x, tb->widget.y, tb->widget.w, tb->widget.h ); if ( WIDGET ( tb )->parent ) { widget_update ( WIDGET ( tb )->parent ); } } tb->cursor = MAX ( 0, MIN ( ( int ) g_utf8_strlen ( tb->text, -1 ), tb->cursor ) ); widget_queue_redraw ( WIDGET ( tb ) ); }
static void listview_resize ( widget *wid, short w, short h ) { listview *lv = (listview *) wid; lv->widget.w = MAX ( 0, w ); lv->widget.h = MAX ( 0, h ); int height = lv->widget.h - widget_padding_get_padding_height ( WIDGET ( lv ) ); int spacing_vert = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL ); lv->max_rows = ( spacing_vert + height ) / ( lv->element_height + spacing_vert ); lv->max_elements = lv->max_rows * lv->menu_columns; if ( lv->scrollbar->widget.index == 0 ) { widget_move ( WIDGET ( lv->scrollbar ), widget_padding_get_left ( WIDGET ( lv ) ), widget_padding_get_top ( WIDGET ( lv ) ) ); } else { widget_move ( WIDGET ( lv->scrollbar ), lv->widget.w - widget_padding_get_right ( WIDGET ( lv ) ) - widget_get_width ( WIDGET ( lv->scrollbar ) ), widget_padding_get_top ( WIDGET ( lv ) ) ); } widget_resize ( WIDGET ( lv->scrollbar ), widget_get_width ( WIDGET ( lv->scrollbar ) ), height ); listview_recompute_elements ( lv ); widget_queue_redraw ( wid ); }
// cursor handling for edit mode void textbox_cursor ( textbox *tb, int pos ) { int length = ( tb->text == NULL ) ? 0 : g_utf8_strlen ( tb->text, -1 ); tb->cursor = MAX ( 0, MIN ( length, pos ) ); tb->update = TRUE; // Stop blink! tb->blink = 3; widget_queue_redraw ( WIDGET ( tb ) ); }
void listview_nav_left ( listview *lv ) { if ( lv == NULL ) { return; } if ( lv->selected >= lv->max_rows ) { lv->selected -= lv->max_rows; widget_queue_redraw ( WIDGET ( lv ) ); } }
void widget_set_state ( widget *widget, const char *state ) { if ( g_strcmp0 ( widget->state, state ) ) { widget->state = state; // Update border. widget->border = rofi_theme_get_padding ( widget, "border", widget->border ); widget_queue_redraw ( widget ); } }
static void listview_nav_down_int ( listview *lv ) { if ( lv == NULL ) { return; } if ( lv->req_elements == 0 || ( lv->selected == ( lv->req_elements - 1 ) && !lv->cycle ) ) { return; } lv->selected = lv->selected < lv->req_elements - 1 ? MIN ( lv->req_elements - 1, lv->selected + 1 ) : 0; widget_queue_redraw ( WIDGET ( lv ) ); }
static void listview_nav_page_prev_int ( listview *lv ) { if ( lv == NULL ) { return; } if ( lv->selected < lv->max_elements ) { lv->selected = 0; } else{ lv->selected -= ( lv->max_elements ); } widget_queue_redraw ( WIDGET ( lv ) ); }
void listview_nav_right ( listview *lv ) { if ( lv == NULL ) { return; } if ( ( lv->selected + lv->max_rows ) < lv->req_elements ) { lv->selected += lv->max_rows; widget_queue_redraw ( WIDGET ( lv ) ); } else if ( lv->selected < ( lv->req_elements - 1 ) ) { // We do not want to move to last item, UNLESS the last column is only // partially filled, then we still want to move column and select last entry. // First check the column we are currently in. int col = lv->selected / lv->max_rows; // Check total number of columns. int ncol = lv->req_elements / lv->max_rows; // If there is an extra column, move. if ( col != ncol ) { lv->selected = lv->req_elements - 1; widget_queue_redraw ( WIDGET ( lv ) ); } } }
static void listview_nav_up_int ( listview *lv ) { if ( lv == NULL ) { return; } if ( lv->req_elements == 0 || ( lv->selected == 0 && !lv->cycle ) ) { return; } if ( lv->selected == 0 ) { lv->selected = lv->req_elements; } lv->selected--; widget_queue_redraw ( WIDGET ( lv ) ); }
static gboolean textbox_blink ( gpointer data ) { textbox *tb = (textbox *) data; if ( tb->blink < 2 ) { tb->blink = !tb->blink; tb->update = TRUE; widget_queue_redraw ( WIDGET ( tb ) ); rofi_view_queue_redraw ( ); } else { tb->blink--; } return TRUE; }
static void listview_nav_page_next_int ( listview *lv ) { if ( lv == NULL ) { return; } if ( lv->req_elements == 0 ) { return; } lv->selected += ( lv->max_elements ); if ( lv->selected >= lv->req_elements ) { lv->selected = lv->req_elements - 1; } widget_queue_redraw ( WIDGET ( lv ) ); }
void widget_resize ( widget *widget, short w, short h ) { if ( widget != NULL ) { if ( widget->resize != NULL ) { if ( widget->w != w || widget->h != h ) { widget->resize ( widget, w, h ); } } else { widget->w = w; widget->h = h; } // On a resize we always want to udpate. widget_queue_redraw ( widget ); } }
// within the parent handled auto width/height modes void textbox_moveresize ( textbox *tb, int x, int y, int w, int h ) { unsigned int offset = ( tb->flags & TB_INDICATOR ) ? DOT_OFFSET : 0; if ( tb->flags & TB_AUTOWIDTH ) { pango_layout_set_width ( tb->layout, -1 ); unsigned int offset = ( tb->flags & TB_INDICATOR ) ? DOT_OFFSET : 0; w = textbox_get_font_width ( tb ) + widget_padding_get_padding_width ( WIDGET ( tb ) ) + offset; } else { // set ellipsize if ( ( tb->flags & TB_EDITABLE ) == TB_EDITABLE ) { pango_layout_set_ellipsize ( tb->layout, PANGO_ELLIPSIZE_MIDDLE ); } else if ( ( tb->flags & TB_WRAP ) != TB_WRAP ) { pango_layout_set_ellipsize ( tb->layout, PANGO_ELLIPSIZE_END ); } } if ( tb->flags & TB_AUTOHEIGHT ) { // Width determines height! int tw = MAX ( 1, w ); pango_layout_set_width ( tb->layout, PANGO_SCALE * ( tw - widget_padding_get_padding_width ( WIDGET ( tb ) ) - offset ) ); int hd = textbox_get_height ( tb ); h = MAX ( hd, h ); } if ( x != tb->widget.x || y != tb->widget.y || w != tb->widget.w || h != tb->widget.h ) { tb->widget.x = x; tb->widget.y = y; tb->widget.h = MAX ( 1, h ); tb->widget.w = MAX ( 1, w ); } // We always want to update this pango_layout_set_width ( tb->layout, PANGO_SCALE * ( tb->widget.w - widget_padding_get_padding_width ( WIDGET ( tb ) ) - offset ) ); tb->update = TRUE; widget_queue_redraw ( WIDGET ( tb ) ); }
int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv ) { // box 20 by 40 widget *wid= (widget*)g_malloc0(sizeof(widget)); widget_resize ( wid, 20, 40); widget_move ( wid, 10, 10); // Getter, setter x pos // TASSERT( widget_get_x_pos ( wid ) == 10 ); TASSERT( widget_get_y_pos ( wid ) == 10 ); // Left of box TASSERT ( widget_intersect ( wid, 0, 0) == 0 ); TASSERT ( widget_intersect ( wid, 0, 10) == 0 ); TASSERT ( widget_intersect ( wid, 0, 25) == 0 ); TASSERT ( widget_intersect ( wid, 0, 40) == 0 ); TASSERT ( widget_intersect ( wid, 0, 50) == 0 ); TASSERT ( widget_intersect ( wid, 9, 0) == 0 ); TASSERT ( widget_intersect ( wid, 9, 10) == 0 ); TASSERT ( widget_intersect ( wid, 9, 25) == 0 ); TASSERT ( widget_intersect ( wid, 9, 40) == 0 ); TASSERT ( widget_intersect ( wid, 9, 50) == 0 ); TASSERT ( widget_intersect ( wid, 10, 0) == 0 ); TASSERT ( widget_intersect ( wid, 10, 10) == 1 ); TASSERT ( widget_intersect ( wid, 10, 25) == 1 ); TASSERT ( widget_intersect ( wid, 10, 40) == 1 ); TASSERT ( widget_intersect ( wid, 10, 50) == 0 ); // Middle TASSERT ( widget_intersect ( wid, 25, 0) == 0 ); TASSERT ( widget_intersect ( wid, 25, 10) == 1 ); TASSERT ( widget_intersect ( wid, 25, 25) == 1 ); TASSERT ( widget_intersect ( wid, 25, 40) == 1 ); TASSERT ( widget_intersect ( wid, 25, 50) == 0 ); // Right TASSERT ( widget_intersect ( wid, 29, 0) == 0 ); TASSERT ( widget_intersect ( wid, 29, 10) == 1 ); TASSERT ( widget_intersect ( wid, 29, 25) == 1 ); TASSERT ( widget_intersect ( wid, 29, 40) == 1 ); TASSERT ( widget_intersect ( wid, 29, 50) == 0 ); TASSERT ( widget_intersect ( wid, 30, 0) == 0 ); TASSERT ( widget_intersect ( wid, 30, 10) == 0 ); TASSERT ( widget_intersect ( wid, 30, 25) == 0 ); TASSERT ( widget_intersect ( wid, 30, 40) == 0 ); TASSERT ( widget_intersect ( wid, 30, 50) == 0 ); widget_move ( wid, 30, 30); // Left of box TASSERT ( widget_intersect ( wid, 10, 20) == 0 ); TASSERT ( widget_intersect ( wid, 10, 30) == 0 ); TASSERT ( widget_intersect ( wid, 10, 45) == 0 ); TASSERT ( widget_intersect ( wid, 10, 60) == 0 ); TASSERT ( widget_intersect ( wid, 10, 70) == 0 ); TASSERT ( widget_intersect ( wid, 19, 20) == 0 ); TASSERT ( widget_intersect ( wid, 19, 30) == 0 ); TASSERT ( widget_intersect ( wid, 19, 45) == 0 ); TASSERT ( widget_intersect ( wid, 19, 60) == 0 ); TASSERT ( widget_intersect ( wid, 19, 70) == 0 ); TASSERT ( widget_intersect ( wid, 30, 20) == 0 ); TASSERT ( widget_intersect ( wid, 30, 30) == 1 ); TASSERT ( widget_intersect ( wid, 30, 45) == 1 ); TASSERT ( widget_intersect ( wid, 30, 60) == 1 ); TASSERT ( widget_intersect ( wid, 30, 70) == 0 ); // Middle TASSERT ( widget_intersect ( wid, 20+25,20+ 0) == 0 ); TASSERT ( widget_intersect ( wid, 20+25,20+ 10) == 1 ); TASSERT ( widget_intersect ( wid, 20+25,20+ 25) == 1 ); TASSERT ( widget_intersect ( wid, 20+25,20+ 40) == 1 ); TASSERT ( widget_intersect ( wid, 20+25,20+ 50) == 0 ); TASSERT ( widget_intersect ( wid, 20+29, 20+0) == 0 ); TASSERT ( widget_intersect ( wid, 20+29, 20+10) == 1 ); TASSERT ( widget_intersect ( wid, 20+29, 20+25) == 1 ); TASSERT ( widget_intersect ( wid, 20+29, 20+40) == 1 ); TASSERT ( widget_intersect ( wid, 20+29, 20+50) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+0) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+10) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+25) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+40) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+50) == 0 ); // Right TASSERT ( widget_intersect ( wid, 20+29, 20+0) == 0 ); TASSERT ( widget_intersect ( wid, 20+29, 20+10) == 1 ); TASSERT ( widget_intersect ( wid, 20+29, 20+25) == 1 ); TASSERT ( widget_intersect ( wid, 20+29, 20+40) == 1 ); TASSERT ( widget_intersect ( wid, 20+29, 20+50) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+0) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+10) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+25) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+40) == 0 ); TASSERT ( widget_intersect ( wid, 20+30, 20+50) == 0 ); TASSERT ( widget_intersect ( wid, -100, -100) == 0); TASSERT ( widget_intersect ( wid, INT_MIN, INT_MIN) == 0); TASSERT ( widget_intersect ( wid, INT_MAX, INT_MAX) == 0); // Other wrappers. TASSERT ( widget_get_height ( wid ) == wid->h); TASSERT ( widget_get_width ( wid ) == wid->w); TASSERT ( widget_enabled ( wid ) == FALSE ); widget_enable ( wid ); TASSERT ( widget_enabled ( wid ) == TRUE ); widget_disable ( wid ); TASSERT ( widget_enabled ( wid ) == FALSE ); // Null pointer tests. TASSERT ( widget_intersect ( NULL, 0, 0) == 0 ); widget_move ( NULL, 0, 0 ); TASSERT ( widget_get_height ( NULL ) == 0); TASSERT ( widget_get_width ( NULL ) == 0); TASSERT ( widget_enabled ( NULL ) == 0); widget_disable ( NULL ); widget_enable ( NULL ); widget_draw ( NULL, NULL ); widget_free ( NULL ); widget_resize ( NULL, 0, 0); widget_update ( NULL ); widget_queue_redraw ( NULL ); TASSERT (widget_need_redraw ( NULL ) == FALSE); widget_clicked ( NULL, NULL ); widget_set_clicked_handler ( NULL, NULL, NULL ); g_free(wid); }