/* * rofi * * MIT/X11 License * Copyright © 2013-2017 Qball Cow * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef ROFI_TEXTBOX_H #define ROFI_TEXTBOX_H #include #include #include #include #include #include "widgets/widget.h" #include "widgets/widget-internal.h" #include "keyb.h" /** * @defgroup Textbox Textbox * @ingroup widget * * @{ */ /** * Internal structure of a textbox widget. * TODO make this internal to textbox */ typedef struct { widget widget; unsigned long flags; short cursor; char *text; PangoLayout *layout; int tbft; int markup; int changed; cairo_surface_t *icon; // AA TODO - pass in icons for a textbox line if needed int icon_index; int blink; guint blink_timeout; double yalign ; PangoFontMetrics *metrics; int left_offset; // const char *theme_name; } textbox; /** * Flags for configuring textbox behaviour and looks during creation. */ typedef enum { TB_AUTOHEIGHT = 1 << 0, TB_AUTOWIDTH = 1 << 1, TB_LEFT = 1 << 16, TB_RIGHT = 1 << 17, TB_CENTER = 1 << 18, TB_EDITABLE = 1 << 19, TB_MARKUP = 1 << 20, TB_WRAP = 1 << 21, TB_PASSWORD = 1 << 22, TB_INDICATOR = 1 << 23, TB_ICON = 1 << 24, } TextboxFlags; /** * Flags indicating current state of the textbox. */ typedef enum { /** Normal */ NORMAL = 0, /** Text in box is urgent. */ URGENT = 1, /** Text in box is active. */ ACTIVE = 2, /** Text in box is selected. */ SELECTED = 4, /** Text in box has pango markup. */ MARKUP = 8, /** Text is on an alternate row */ ALT = 16, /** Render font highlighted (inverted colors.) */ HIGHLIGHT = 32, /** Mask for alternate and highlighted */ FMOD_MASK = ( ALT | HIGHLIGHT ), /** Mask of bits indicating state */ STATE_MASK = ~( SELECTED | MARKUP | ALT | HIGHLIGHT ) } TextBoxFontType; /** * @param type The type of the to be created widget. * @param name The name of the to be created widget. * @param flags #TextboxFlags indicating the type of textbox. * @param tbft #TextBoxFontType current state of textbox. * @param text intial text to display. * * Create a new textbox widget. * * free with #widget_free * @returns a new #textbox */ textbox* textbox_create_full ( WidgetType type, const char *name, TextboxFlags flags, TextBoxFontType tbft, const char *text ); #define textbox_create( n, f, tbft, t ) textbox_create_full ( WIDGET_TYPE_UNKNOWN, n, f, tbft, t ) /** * @param tb Handle to the textbox * @param tbft The style of font to render. * * Set the font render style. */ void textbox_font ( textbox *tb, TextBoxFontType tbft ); /** * @param tb Handle to the textbox * @param text The text to show in the textbox * * Set the text to show. Cursor is moved to end (if visible) */ void textbox_text ( textbox *tb, const char *text ); /** * @param tb Handle to the textbox * @param text The icon to show on the textbox * * Set the text to show. Cursor is moved to end (if visible) */ void textbox_icon ( textbox *tb, cairo_surface_t *icon ); /** * @param tb Handle to the textbox * @param action the #KeyBindingAction to execute on textbox * * Execute an action on the textbox. * * @return TRUE if action was taken. */ int textbox_keybinding ( textbox *tb, KeyBindingAction action ); /** * @param tb Handle to the textbox * @param pad The text to insert * @param pad_len the length of the text * * The text should be one insert from a keypress.. the first gunichar is validated to be (or not) control * return TRUE if inserted */ gboolean textbox_append_text ( textbox *tb, const char *pad, const int pad_len ); /** * @param tb Handle to the textbox * @param pos New cursor position * * Set the cursor position (string index) */ void textbox_cursor ( textbox *tb, int pos ); /** * @param tb Handle to the textbox * @param char_pos The position to insert the string at * @param str The string to insert. * @param slen The length of the string. * * Insert the string str at position pos. */ void textbox_insert ( textbox *tb, const int char_pos, const char *str, const int slen ); /** * Setup the cached fonts. This is required to do * before any of the textbox_ functions is called. * Clean with textbox_cleanup() */ void textbox_setup ( void ); /** * Cleanup the allocated colors and fonts by textbox_setup(). */ void textbox_cleanup ( void ); /** * @param tb Handle to the textbox * * Get the height of the textbox * * @returns the height of the textbox in pixels. */ int textbox_get_height ( const textbox *tb ); /** * @param tb Handle to the textbox * * Get the height of the rendered string. * * @returns the height of the string in pixels. */ int textbox_get_font_height ( const textbox *tb ); /** * @param tb Handle to the textbox * * Get the width of the rendered string. * * @returns the width of the string in pixels. */ int textbox_get_font_width ( const textbox *tb ); /** * Estimate the width of a character. * * @returns the width of a character in pixels. */ double textbox_get_estimated_char_width ( void ); /** * Estimate the height of a character. * * @returns the height of a character in pixels. */ double textbox_get_estimated_char_height ( void ); /** * @param tb Handle to the textbox * @param pos The start position * @param dlen The length * * Remove dlen bytes from position pos. */ void textbox_delete ( textbox *tb, int pos, int dlen ); /** * @param tb Handle to the textbox * @param x The new horizontal position to place with textbox * @param y The new vertical position to place with textbox * @param w The new width of the textbox * @param h The new height of the textbox * * Move and resize the textbox. * TODO remove for #widget_resize and #widget_move */ void textbox_moveresize ( textbox *tb, int x, int y, int w, int h ); /** * @param tb Handle to the textbox * @param eh The number of rows to display * * Get the (estimated) with of a character, can be used to calculate window width. * This includes padding. * * @returns the estimated width of a character. */ int textbox_get_estimated_height ( const textbox *tb, int eh ); /** * @param font The name of the font used. * @param p The new default PangoContext * * Set the default pango context (with font description) for all textboxes. */ void textbox_set_pango_context ( const char *font, PangoContext *p ); /** * @param tb Handle to the textbox * @param list New pango attributes * * Sets list as active pango attributes. */ void textbox_set_pango_attributes ( textbox *tb, PangoAttrList *list ); /** * @param tb Handle to the textbox * @param index character index to draw the icon at. -1 for no icon * * Sets the character index where the icon should be drawn */ void textbox_set_icon_index ( textbox *tb, int index ); /** * @param tb Handle to the textbox * * Get the list of currently active pango attributes. * * @returns the pango attributes */ PangoAttrList *textbox_get_pango_attributes ( textbox *tb ); /** * @param tb Handle to the textbox * * @returns the visible text. */ const char *textbox_get_visible_text ( const textbox *tb ); int textbox_get_desired_width ( widget *wid ); /*@}*/ #endif //ROFI_TEXTBOX_H