1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2024-10-27 05:23:18 -04:00
rofi/include/widgets/textbox.h

332 lines
8.8 KiB
C
Raw Normal View History

/*
* rofi
*
* MIT/X11 License
* Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>
*
* 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.
*
*/
2015-07-27 04:17:12 -04:00
#ifndef ROFI_TEXTBOX_H
#define ROFI_TEXTBOX_H
#include <xkbcommon/xkbcommon.h>
2014-08-02 14:02:37 -04:00
#include <pango/pango.h>
#include <pango/pango-fontmap.h>
#include <pango/pangocairo.h>
2015-09-26 14:34:34 -04:00
#include <cairo.h>
#include "widgets/widget.h"
#include "widgets/widget-internal.h"
#include "keyb.h"
2014-08-02 14:02:37 -04:00
2016-01-07 02:54:24 -05:00
/**
* @defgroup Textbox Textbox
2016-10-13 03:22:08 -04:00
* @ingroup widget
2016-01-07 02:54:24 -05:00
*
* @{
*/
2016-10-14 10:46:54 -04:00
/**
* Internal structure of a textbox widget.
2016-11-15 15:54:31 -05:00
* TODO make this internal to textbox
2016-10-14 10:46:54 -04:00
*/
2015-09-26 14:34:34 -04:00
typedef struct
{
2017-02-03 14:49:16 -05:00
widget widget;
unsigned long flags;
short cursor;
char *text;
PangoLayout *layout;
int tbft;
int markup;
int changed;
2015-09-26 14:34:34 -04:00
2017-04-12 11:58:32 -04:00
cairo_surface_t *icon; // AA TODO - pass in icons for a textbox line if needed
int icon_index;
2017-02-03 14:49:16 -05:00
int blink;
guint blink_timeout;
2017-06-03 14:35:50 -04:00
double yalign;
double xalign;
2017-05-24 13:57:35 -04:00
2017-02-03 14:49:16 -05:00
PangoFontMetrics *metrics;
int left_offset;
2016-12-11 11:06:31 -05:00
//
2017-02-03 14:49:16 -05:00
const char *theme_name;
} textbox;
2016-10-14 10:46:54 -04:00
/**
* Flags for configuring textbox behaviour and looks during creation.
*/
2014-03-22 16:04:19 -04:00
typedef enum
{
TB_AUTOHEIGHT = 1 << 0,
TB_AUTOWIDTH = 1 << 1,
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;
2016-10-14 10:46:54 -04:00
/**
* Flags indicating current state of the textbox.
*/
typedef enum
{
2016-10-14 10:46:54 -04:00
/** Normal */
2015-04-06 11:13:26 -04:00
NORMAL = 0,
2016-10-14 10:46:54 -04:00
/** Text in box is urgent. */
2015-04-06 11:13:26 -04:00
URGENT = 1,
2016-10-14 10:46:54 -04:00
/** Text in box is active. */
2015-04-06 11:13:26 -04:00
ACTIVE = 2,
2016-10-14 10:46:54 -04:00
/** Text in box is selected. */
2015-11-30 08:05:39 -05:00
SELECTED = 4,
2016-10-14 10:46:54 -04:00
/** Text in box has pango markup. */
2015-11-30 08:05:39 -05:00
MARKUP = 8,
2015-04-06 11:13:26 -04:00
2016-10-14 10:46:54 -04:00
/** Text is on an alternate row */
2015-11-30 08:05:39 -05:00
ALT = 16,
2016-10-14 10:46:54 -04:00
/** Render font highlighted (inverted colors.) */
2015-11-30 08:05:39 -05:00
HIGHLIGHT = 32,
2016-10-14 10:46:54 -04:00
/** Mask for alternate and highlighted */
2015-04-06 11:13:26 -04:00
FMOD_MASK = ( ALT | HIGHLIGHT ),
2016-10-14 10:46:54 -04:00
/** Mask of bits indicating state */
2015-11-30 08:05:39 -05:00
STATE_MASK = ~( SELECTED | MARKUP | ALT | HIGHLIGHT )
} TextBoxFontType;
2016-10-14 10:46:54 -04:00
/**
2017-09-09 05:25:33 -04:00
* @param parent The widget's parent.
* @param type The type of the to be created widget.
2017-01-01 12:40:49 -05:00
* @param name The name of the to be created widget.
2016-10-14 10:46:54 -04:00
* @param flags #TextboxFlags indicating the type of textbox.
* @param tbft #TextBoxFontType current state of textbox.
* @param text intial text to display.
* @param xalign Set the Xalign value.
* @param yalign set the yalign value.
2016-10-14 10:46:54 -04:00
*
* Create a new textbox widget.
*
* free with #widget_free
* @returns a new #textbox
*/
2017-09-07 07:46:09 -04:00
textbox* textbox_create ( widget *parent, WidgetType type, const char *name, TextboxFlags flags,
TextBoxFontType tbft, const char *text, double xalign, double yalign );
2014-11-24 14:22:44 -05:00
/**
* @param tb Handle to the textbox
* @param tbft The style of font to render.
*
2014-11-24 14:35:28 -05:00
* Set the font render style.
2014-11-24 14:22:44 -05:00
*/
void textbox_font ( textbox *tb, TextBoxFontType tbft );
2014-11-24 14:35:28 -05:00
/**
* @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)
*/
2015-02-03 02:21:59 -05:00
void textbox_text ( textbox *tb, const char *text );
2014-11-24 14:35:28 -05:00
2017-04-12 11:58:32 -04:00
/**
* @param tb Handle to the textbox
2017-06-03 10:27:11 -04:00
* @param icon The icon to show on the textbox
2017-04-12 11:58:32 -04:00
*
* Set the text to show. Cursor is moved to end (if visible)
*/
void textbox_icon ( textbox *tb, cairo_surface_t *icon );
2016-10-14 10:46:54 -04:00
/**
* @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 );
2016-05-22 13:41:52 -04:00
/**
* @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 );
2014-11-24 14:35:28 -05:00
/**
* @param tb Handle to the textbox
* @param pos New cursor position
*
* Set the cursor position (string index)
*/
2014-05-27 06:55:47 -04:00
void textbox_cursor ( textbox *tb, int pos );
2014-11-24 14:35:28 -05:00
/**
* @param tb Handle to the textbox
2017-04-23 09:17:15 -04:00
* @param char_pos The position to insert the string at
* @param str The string to insert.
* @param slen The length of the string.
2014-11-24 14:35:28 -05:00
*
* Insert the string str at position pos.
*/
2017-04-23 09:17:15 -04:00
void textbox_insert ( textbox *tb, const int char_pos, const char *str, const int slen );
2014-11-24 14:22:44 -05:00
2014-05-27 02:31:59 -04:00
/**
* 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 );
2014-05-27 02:31:59 -04:00
/**
* Cleanup the allocated colors and fonts by textbox_setup().
*/
void textbox_cleanup ( void );
2014-05-27 02:31:59 -04:00
2014-11-24 14:22:44 -05:00
/**
* @param tb Handle to the textbox
*
2014-11-24 14:35:28 -05:00
* Get the height of the textbox
2014-11-24 14:22:44 -05:00
*
2014-11-24 14:35:28 -05:00
* @returns the height of the textbox in pixels.
2014-11-24 14:22:44 -05:00
*/
2016-08-23 18:39:56 -04:00
int textbox_get_height ( const textbox *tb );
2014-11-24 14:22:44 -05:00
/**
* @param tb Handle to the textbox
*
* Get the height of the rendered string.
*
2014-11-24 14:35:28 -05:00
* @returns the height of the string in pixels.
2014-11-24 14:22:44 -05:00
*/
2016-08-23 18:39:56 -04:00
int textbox_get_font_height ( const textbox *tb );
2014-11-24 14:22:44 -05:00
/**
* @param tb Handle to the textbox
*
* Get the width of the rendered string.
*
2014-11-24 14:35:28 -05:00
* @returns the width of the string in pixels.
2014-11-24 14:22:44 -05:00
*/
2016-08-23 18:39:56 -04:00
int textbox_get_font_width ( const textbox *tb );
2014-08-02 14:02:37 -04:00
2014-11-24 14:22:44 -05:00
/**
* Estimate the width of a character.
*
* @returns the width of a character in pixels.
*/
double textbox_get_estimated_char_width ( void );
2017-09-05 07:52:21 -04:00
/**
* Estimate the width of a 0.
*
* @returns the width of a 0 in pixels.
*/
double textbox_get_estimated_ch ( void );
/**
* Estimate the height of a character.
*
* @returns the height of a character in pixels.
*/
2016-12-31 17:00:06 -05:00
double textbox_get_estimated_char_height ( void );
2014-11-24 14:35:28 -05:00
/**
* @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 );
2016-10-14 10:46:54 -04:00
/**
* @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.
2016-11-15 15:54:31 -05:00
* TODO remove for #widget_resize and #widget_move
2016-10-14 10:46:54 -04:00
*/
void textbox_moveresize ( textbox *tb, int x, int y, int w, int h );
2016-12-31 17:00:06 -05:00
2016-10-14 10:46:54 -04:00
/**
* @param tb Handle to the textbox
2017-01-01 12:40:49 -05:00
* @param eh The number of rows to display
*
2016-10-14 10:46:54 -04:00
* Get the (estimated) with of a character, can be used to calculate window width.
2017-01-01 12:40:49 -05:00
* This includes padding.
2016-10-14 10:46:54 -04:00
*
* @returns the estimated width of a character.
*/
2016-12-31 17:00:06 -05:00
int textbox_get_estimated_height ( const textbox *tb, int eh );
2016-10-14 10:46:54 -04:00
/**
* @param font The name of the font used.
2016-10-14 10:46:54 -04:00
* @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 );
2016-10-14 10:46:54 -04:00
/**
* @param tb Handle to the textbox
* @param list New pango attributes
*
2016-11-15 15:54:31 -05:00
* Sets list as active pango attributes.
2016-10-14 10:46:54 -04:00
*/
void textbox_set_pango_attributes ( textbox *tb, PangoAttrList *list );
2016-01-07 02:54:24 -05:00
2017-04-12 11:58:32 -04:00
/**
* @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 );
2016-10-14 10:46:54 -04:00
/**
* @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 );
2016-08-23 18:39:56 -04:00
/**
* @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 );
/**
* @param tb Handle to the textbox
*
* Move the cursor to the end of the string.
*/
void textbox_cursor_end ( textbox *tb );
2016-01-07 02:54:24 -05:00
/*@}*/
2015-07-27 04:17:12 -04:00
#endif //ROFI_TEXTBOX_H