libxputty  0.1
A damn tiny abstraction Layer to create X11 window/widgets with cairo surfaces
xwidget.h File Reference
#include "xputty.h"
Include dependency graph for xwidget.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  Func_t
 Func_t - struct to hold all supported event callbacks. More...
 
struct  Resize_t
 Resize_t - struct used to resize child widgets. More...
 
struct  Widget_t
 Widget_t - struct to hold the basic Widget_t info. More...
 

Macros

#define XWIDGET_H
 
#define SYSTEM_TRAY_REQUEST_DOCK   0
 
#define SYSTEM_TRAY_BEGIN_MESSAGE   1
 
#define SYSTEM_TRAY_CANCEL_MESSAGE   2
 

Typedefs

typedef void(* vfunc) (void *widget, void *event, Xputty *main, void *user_data)
 *vfunc - function pointer to connect Xevents from the main loop to Widget_t More...
 
typedef void(* evfunc) (void *widget, void *event, void *user_data)
 *evfunc - function pointer to connect Xevents from a Widget_t to a event handler More...
 
typedef void(* xevfunc) (void *widget, void *user_data)
 *xevfunc - function pointer to connect XEvents from a Widget_t to a event handler More...
 

Enumerations

enum  EventType {
  EXPOSE = 1, CONFIGURE, ENTER, LEAVE,
  ADJ_INTERN, VALUE_CHANGED, USER, MEM_FREE,
  CONFIGURE_NOTIFY, MAP_NOTIFY, UNMAP_NOTIFY, DIALOG_RESPONSE,
  BUTTON_PRESS, BUTTON_RELEASE, POINTER_MOTION, KEY_PRESS,
  KEY_RELEASE
}
 EventType - enum to hold identifier for all supported event callbacks
Events could be connected to a handler by using this identifier. More...
 
enum  Gravity {
  NORTHWEST, NORTHEAST, SOUTHWEST, SOUTHEAST,
  CENTER, ASPECT, FIXEDSIZE, MENUITEM,
  NONE
}
 Gravity - enum to indicate how to resize a widget. More...
 
enum  {
  IS_WIDGET = 1<<0, IS_WINDOW = 1<<1, IS_POPUP = 1<<2, IS_RADIO = 1<<3,
  IS_TOOLTIP = 1<<4, USE_TRANSPARENCY = 1<<5, HAS_FOCUS = 1<<6, HAS_POINTER = 1<<7,
  HAS_TOOLTIP = 1<<8, HAS_MEM = 1<<9, NO_AUTOREPEAT = 1<<10, FAST_REDRAW = 1<<11,
  HIDE_ON_DELETE = 1<<12, REUSE_IMAGE = 1<<13, NO_PROPAGATE = 1<<14
}
 anonymous enum - flags to set Widget_t propertys More...
 

Functions

Widget_tcreate_window (Xputty *app, Window win, int x, int y, int width, int height)
 *create_window - create a Window
You need to create as least minimun one Window to get started.
The first created Window is the top_level_widget()
A Window could be created on the DefaultRootWindow() or embeded into a other XWindow More...
 
Widget_tcreate_widget (Xputty *app, Widget_t *win, int x, int y, int width, int height)
 *create_widget - create a widget
A Widget_t could only be created as child of a other Widget_t
To create a Widget_t you need to create a Widget_t with create_window() before. More...
 
void connect_func (void(**event)(), void(*handler)())
 connect_func - connect a event with a handler without type check. For supported events see: Func_t More...
 
void widget_set_title (Widget_t *w, const char *title)
 widget_set_title - set window title for a Widget_t More...
 
void widget_show (Widget_t *w)
 widget_show - map/show widget More...
 
void pop_widget_show_all (Widget_t *w)
 pop_widget_show_all - map/show popup widget with all it's childs More...
 
void widget_hide (Widget_t *w)
 widget_hide - unmap/hide a Widget_t More...
 
void widget_show_all (Widget_t *w)
 widget_show_all - map/show Widget_t with all childs More...
 
void show_tooltip (Widget_t *wid)
 show_tooltip - check if a Widget_t have a tooltip, and show it, if a tooltip is available. More...
 
void hide_tooltip (Widget_t *wid)
 hide_tooltip - check if a Widget_t have a tooltip, and hide it, if a tooltip is mapped. More...
 
Widget_tget_toplevel_widget (Xputty *main)
 *get_toplevel_widget - get pointer to the top level Widget_t More...
 
void quit (Widget_t *w)
 quit - exit the main loop More...
 
void quit_widget (Widget_t *w)
 quit_widget - remove a widget from the processing loop More...
 
void transparent_draw (void *wid, void *user_data)
 transparent_draw - copy parent surface to child surface
you usaualy didn't need to call this, it's used automaticaly when a Widget_t have set the flag USE_TRANSPARENCY
this is the default setting for Widget_t More...
 
void widget_reset_scale (Widget_t *w)
 widget_reset_scale - used to reset scaling mode after a image surface is drawn to the Widget_t surface with widget_set_scale() More...
 
void widget_set_scale (Widget_t *w)
 widget_set_scale - set scaling mode to scale a image surface to the size of the Widget_t surface More...
 
void destroy_widget (Widget_t *w, Xputty *main)
 destroy_widget - destroy a widget
When a Widget_t receive a destroy_widget() call, it will propagate that to all childs in it's Childlist_t. So all childs get destroyed before the Widget_t itself close. More...
 
void widget_event_loop (void *w_, void *event, Xputty *main, void *user_data)
 widget_event_loop - the internal widget event loop More...
 
void send_configure_event (Widget_t *w, int x, int y, int width, int height)
 send_configure_event - send a ConfigureNotify to Widget_t
used to resize a Widget_t More...
 
void send_button_press_event (Widget_t *w)
 send_button_press_event - send ButtonPress event to Widget_t
simulate a BUTTON_PRESS Event More...
 
void send_button_release_event (Widget_t *w)
 send_button_release_event - send ButtonRelease event to Widget_t
simulate a BUTTON_RELEASE Event More...
 
void send_systray_message (Widget_t *w)
 send_systray_message - request a systray icon for Widget_t
currently not working More...
 
void expose_widget (Widget_t *w)
 expose_widgets - send a expose event (EXPOSE) to a Widget_t More...
 
int key_mapping (Display *dpy, XKeyEvent *xkey)
 _key_mapping - modifier key's mapped to a integer value More...
 

Macro Definition Documentation

◆ SYSTEM_TRAY_BEGIN_MESSAGE

#define SYSTEM_TRAY_BEGIN_MESSAGE   1

Definition at line 39 of file xwidget.h.

◆ SYSTEM_TRAY_CANCEL_MESSAGE

#define SYSTEM_TRAY_CANCEL_MESSAGE   2

Definition at line 40 of file xwidget.h.

◆ SYSTEM_TRAY_REQUEST_DOCK

#define SYSTEM_TRAY_REQUEST_DOCK   0

Definition at line 38 of file xwidget.h.

◆ XWIDGET_H

#define XWIDGET_H

Definition at line 24 of file xwidget.h.

Typedef Documentation

◆ evfunc

typedef void(* evfunc) (void *widget, void *event, void *user_data)

*evfunc - function pointer to connect Xevents from a Widget_t to a event handler

Parameters
*widget- void pointer to the Widget_t
*event- void pointer to the XEvent
*user_data- void pointer to attached user_data, maybe NULL
Returns
void

Definition at line 61 of file xwidget.h.

◆ vfunc

typedef void(* vfunc) (void *widget, void *event, Xputty *main, void *user_data)

*vfunc - function pointer to connect Xevents from the main loop to Widget_t

Parameters
*widget- void pointer to the Widget_t
*main- pointer to Xputty main struct running the loop
*event- void pointer to the XEvent
*user_data- void pointer to attached user_data, maybe NULL
Returns
void

Definition at line 51 of file xwidget.h.

◆ xevfunc

typedef void(* xevfunc) (void *widget, void *user_data)

*xevfunc - function pointer to connect XEvents from a Widget_t to a event handler

Parameters
*widget- void pointer to the widget
*user_data- void pointer to attached user_data, maybe NULL
Returns
void

Definition at line 71 of file xwidget.h.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

anonymous enum - flags to set Widget_t propertys

Parameters
IS_WIDGET- Widget_t is a sub widget
IS_WINDOW- Widget_t has no Widget_t parent
IS_POPUP- Widget_t is a pop up widget
IS_RADIO- Widget_t is part of a radio group
USE_TRANSPARENCY- Widget_t need transparent draw (buffer)
HAS_FOCUS- Mouse pointer is above Widget_t
HAS_POINTER- Mouse pointer is pressed on Widget_t
HAS_TOOLTIP- Widget_t have tooltip
HAS_MEM- Widget_t have mem to be released
Enumerator
IS_WIDGET 

Widget_t is a sub widget

IS_WINDOW 

Widget_t has no Widget_t parent

IS_POPUP 

Widget_t is a pop up widget

IS_RADIO 

Widget_t is part of a radio group

IS_TOOLTIP 

Widget_t is a tooltip widget

USE_TRANSPARENCY 

Widget_t need transparent draw (buffer)

HAS_FOCUS 

Mouse pointer is above Widget_t

HAS_POINTER 

Mouse pointer is pressed on Widget_t

HAS_TOOLTIP 

Widget_t have tooltip

HAS_MEM 

Widget_t have mem to be released

NO_AUTOREPEAT 

Widget_t didn't receive autorepeated keys

FAST_REDRAW 

Widget_t need fast redrawing

HIDE_ON_DELETE 

Hide Widget_t instead delete on "WM_DELETE_WINDOW"

REUSE_IMAGE 

Widget_t reuse a surface from a other Widget_t

NO_PROPAGATE 

Widget_t didn't receive redraw events on propagate

Definition at line 231 of file xwidget.h.

231  {
232  /** Widget_t is a sub widget */
233  IS_WIDGET = 1<<0,
234  /** Widget_t has no Widget_t parent */
235  IS_WINDOW = 1<<1,
236  /** Widget_t is a pop up widget */
237  IS_POPUP = 1<<2,
238  /** Widget_t is part of a radio group */
239  IS_RADIO = 1<<3,
240  /** Widget_t is a tooltip widget */
241  IS_TOOLTIP = 1<<4,
242  /** Widget_t need transparent draw (buffer) */
243  USE_TRANSPARENCY = 1<<5,
244  /** Mouse pointer is above Widget_t */
245  HAS_FOCUS = 1<<6,
246  /** Mouse pointer is pressed on Widget_t */
247  HAS_POINTER = 1<<7,
248  /** Widget_t have tooltip */
249  HAS_TOOLTIP = 1<<8,
250  /** Widget_t have mem to be released */
251  HAS_MEM = 1<<9,
252  /** Widget_t didn't receive autorepeated keys */
253  NO_AUTOREPEAT = 1<<10,
254  /** Widget_t need fast redrawing */
255  FAST_REDRAW = 1<<11,
256  /** Hide Widget_t instead delete on "WM_DELETE_WINDOW" */
257  HIDE_ON_DELETE = 1<<12,
258  /** Widget_t reuse a surface from a other Widget_t */
259  REUSE_IMAGE = 1<<13,
260  /** Widget_t didn't receive redraw events on propagate */
261  NO_PROPAGATE = 1<<14,
262 
263 };

◆ EventType

enum EventType

EventType - enum to hold identifier for all supported event callbacks
Events could be connected to a handler by using this identifier.

Parameters
EXPOSE- (xevfunc) expose_callback(void * widget, void user_data)
CONFIGURE- (xevfunc) configure_callback(void * widget, void user_data)
ENTER- (xevfunc) enter_callback(void * widget, void user_data)
LEAVE- (xevfunc) leave_callback(void * widget, void user_data)
ADJ_INTERN- (xevfunc) adj_callback(void * widget, void user_data)
VALUE_CHANGED- (xevfunc) value_changed_callback(void * widget, void user_data)
USER- (xevfunc) user_callback(void * widget, void user_data)
MEM_FREE- (xevfunc) mem_free_callback(void * widget, void user_data)
CONFIGURE_NOTIFY- (xevfunc) configure_notify_callback(void * widget, void user_data)
MAP_NOTIFY- (xevfunc) map_notify_callback(void * widget, void user_data)
UNMAP_NOTIFY- (xevfunc) unmap_notify_callback(void * widget, void user_data)
DIALOG_RESPONS- (xevfunc) dialog_callback(void * widget, void user_data)
BUTTON_PRESS- (evfunc) button_press_callback(void * widget, void * event, void user_data)
BUTTON_RELEASE- (evfunc) button_release_callback(void * widget, void * event, void user_data)
POINTER_MOTION- (evfunc) motion_callback(void * widget, void * event, void user_data)
KEY_PRESS- (evfunc) key_press_callback(void * widget, void * event, void user_data)
KEY_RELEASE- (evfunc) key_release_callback(void * widget, void * event, void user_data)
Enumerator
EXPOSE 
CONFIGURE 
ENTER 
LEAVE 
ADJ_INTERN 
VALUE_CHANGED 
USER 
MEM_FREE 
CONFIGURE_NOTIFY 
MAP_NOTIFY 
UNMAP_NOTIFY 
DIALOG_RESPONSE 
BUTTON_PRESS 
BUTTON_RELEASE 
POINTER_MOTION 
KEY_PRESS 
KEY_RELEASE 

Definition at line 123 of file xwidget.h.

123  {
124  EXPOSE = 1,
125  CONFIGURE,
126  ENTER,
127  LEAVE,
128  ADJ_INTERN,
130  USER,
131  MEM_FREE,
133  MAP_NOTIFY,
134  UNMAP_NOTIFY,
136  BUTTON_PRESS,
139  KEY_PRESS,
140  KEY_RELEASE,
141 } EventType;

◆ Gravity

enum Gravity

Gravity - enum to indicate how to resize a widget.

Parameters
NORTHWEST- Widget_t adjust nord/west
NORTHEAST- Widget_t adjust nord/east
SOUTHWEST- Widget_t adjust south/west
SOUTHEAST- Widget_t adjust south/east
CENTER- Widget_t adjust centered
ASPECT- Widget_t adjust in a aspect frame
NONE- Widget_t request no adjustment in frame
Enumerator
NORTHWEST 

Widget_t adjust nord/west

NORTHEAST 

Widget_t adjust nord/east

SOUTHWEST 

Widget_t adjust south/west

SOUTHEAST 

Widget_t adjust south/east

CENTER 

Widget_t adjust centered

ASPECT 

Widget_t adjust in a aspect frame

FIXEDSIZE 

Widget_t has fixed size

MENUITEM 

Widget_t adjust in a aspect frame

NONE 

Widget_t request no adjustment in frame

Definition at line 155 of file xwidget.h.

155  {
156 /** Widget_t adjust nord/west */
157  NORTHWEST ,
158 /** Widget_t adjust nord/east */
159  NORTHEAST ,
160 /** Widget_t adjust south/west */
161  SOUTHWEST ,
162 /** Widget_t adjust south/east */
163  SOUTHEAST ,
164 /** Widget_t adjust centered */
165  CENTER ,
166 /** Widget_t adjust in a aspect frame */
167  ASPECT ,
168 /** Widget_t has fixed size */
169  FIXEDSIZE ,
170 /** Widget_t adjust in a aspect frame */
171  MENUITEM ,
172 /** Widget_t request no adjustment in frame */
173  NONE ,
174 }Gravity;

Function Documentation

◆ connect_func()

void connect_func ( void(**)()  event,
void(*)()  handler 
)

connect_func - connect a event with a handler without type check. For supported events see: Func_t

Parameters
**event- the event to connect
*handler- the handler to handle the event
Returns
void

Definition at line 380 of file xwidget.c.

380  {
381  debug_print("address of a is: %p\n", (void*)event);
382  debug_print("address of b is: %p\n", (void*)handler);
383  *event = handler;
384  debug_print("address of a is: %p\n", (void*)(*event));
385 }

References debug_print.

◆ create_widget()

Widget_t* create_widget ( Xputty app,
Widget_t win,
int  x,
int  y,
int  width,
int  height 
)

*create_widget - create a widget
A Widget_t could only be created as child of a other Widget_t
To create a Widget_t you need to create a Widget_t with create_window() before.

Parameters
*app- pointer to the Xputty *main struct to use
*parent- pointer to the Parrent Widget_t
x,y,width,height- the position/geometry to create the widget
Returns
Widget_t* - pointer to the Widget_t struct

Definition at line 268 of file xwidget.c.

269  {
270 
271  Widget_t *w = (Widget_t*)malloc(sizeof(Widget_t));
272  assert(w != NULL);
273  debug_print("assert(w)\n");
274  XSetWindowAttributes attributes;
275  attributes.save_under = True;
276  attributes.override_redirect = True;
277 
278  long event_mask = StructureNotifyMask|ExposureMask|KeyPressMask
279  |EnterWindowMask|LeaveWindowMask|ButtonReleaseMask
280  |ButtonPressMask|Button1MotionMask;
281 
282 
283 
284  w->widget = XCreateWindow(app->dpy, parent->widget , x, y, width, height, 0,
285  CopyFromParent, InputOutput, CopyFromParent,
286  CopyFromParent|CWOverrideRedirect, &attributes);
287  debug_print("XCreateWindow\n");
288 
289  XSetLocaleModifiers("");
290  w->xim = XOpenIM(app->dpy, 0, 0, 0);
291  if(!w->xim){
292  XSetLocaleModifiers("@im=none");
293  w->xim = XOpenIM(app->dpy, 0, 0, 0);
294  }
295 
296  w->xic = XCreateIC(w->xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
297  XNClientWindow, w->widget, XNFocusWindow, w->widget, NULL);
298 
299  XSetICFocus(w->xic);
300 
301  XSelectInput(app->dpy, w->widget, event_mask);
302 
303  w->surface = cairo_xlib_surface_create (app->dpy, w->widget,
304  DefaultVisual(app->dpy, DefaultScreen(app->dpy)), width, height);
305  assert(cairo_surface_status(w->surface) == CAIRO_STATUS_SUCCESS);
306  w->cr = cairo_create(w->surface);
307  cairo_select_font_face (w->cr, "Roboto", CAIRO_FONT_SLANT_NORMAL,
308  CAIRO_FONT_WEIGHT_NORMAL);
309 
310  w->buffer = cairo_surface_create_similar (w->surface,
311  CAIRO_CONTENT_COLOR_ALPHA, width, height);
312  assert(cairo_surface_status(w->buffer) == CAIRO_STATUS_SUCCESS);
313  w->crb = cairo_create (w->buffer);
314  cairo_select_font_face (w->crb, "Roboto", CAIRO_FONT_SLANT_NORMAL,
315  CAIRO_FONT_WEIGHT_NORMAL);
316 
317  w->image = NULL;
318 
320  w->flags &= ~NO_AUTOREPEAT;
321  w->flags &= ~FAST_REDRAW;
322  w->flags &= ~HIDE_ON_DELETE;
323  w->flags &= ~REUSE_IMAGE;
324  w->flags &= ~NO_PROPAGATE;
325  w->app = app;
326  w->parent = parent;
327  w->parent_struct = NULL;
328  w->label = NULL;
329  memset(w->input_label, 0, 32 * (sizeof w->input_label[0]));
330  w->state = 0;
331  w->data = 0;
332  w->x = x;
333  w->y = y;
334  w->width = width;
335  w->height = height;
336  w->scale.gravity = CENTER;
337  w->scale.init_width = width;
338  w->scale.init_height = height;
339  w->scale.init_x = x;
340  w->scale.init_y = y;
341  w->scale.scale_x = 0.0;
342  w->scale.scale_y = 0.0;
343  w->scale.cscale_x = 1.0;
344  w->scale.cscale_y = 1.0;
345  w->scale.rcscale_x = 1.0;
346  w->scale.rcscale_y = 1.0;
347  w->scale.ascale = 1.0;
348  w->adj_x = NULL;
349  w->adj_y = NULL;
350  w->adj = NULL;
351  w->childlist = (Childlist_t*)malloc(sizeof(Childlist_t));
352  assert(w->childlist != NULL);
354  childlist_add_child(parent->childlist, w);
373 
375  //XMapWindow(app->dpy, w->widget);
376  debug_print("size of Widget_t = %ld\n", sizeof(struct Widget_t));
377  return w;
378 }

References _dummy1_callback(), _dummy_callback(), Widget_t::adj, Func_t::adj_callback, Widget_t::adj_x, Widget_t::adj_y, Widget_t::app, Resize_t::ascale, Widget_t::buffer, Func_t::button_press_callback, Func_t::button_release_callback, CENTER, Xputty::childlist, Widget_t::childlist, childlist_add_child(), childlist_init(), Func_t::configure_callback, configure_event(), Func_t::configure_notify_callback, Widget_t::cr, Widget_t::crb, Resize_t::cscale_x, Resize_t::cscale_y, Widget_t::data, debug_print, Func_t::dialog_callback, Xputty::dpy, Func_t::enter_callback, Widget_t::event_callback, Func_t::expose_callback, FAST_REDRAW, Widget_t::flags, Widget_t::func, Resize_t::gravity, Widget_t::height, HIDE_ON_DELETE, Widget_t::image, Resize_t::init_height, Resize_t::init_width, Resize_t::init_x, Resize_t::init_y, Widget_t::input_label, IS_WIDGET, Func_t::key_press_callback, Func_t::key_release_callback, Widget_t::label, Func_t::leave_callback, Func_t::map_notify_callback, Func_t::mem_free_callback, Func_t::motion_callback, NO_AUTOREPEAT, NO_PROPAGATE, Widget_t::parent, Widget_t::parent_struct, Resize_t::rcscale_x, Resize_t::rcscale_y, REUSE_IMAGE, Widget_t::scale, Resize_t::scale_x, Resize_t::scale_y, Widget_t::state, Widget_t::surface, transparent_draw(), Func_t::unmap_notify_callback, USE_TRANSPARENCY, Func_t::user_callback, Func_t::value_changed_callback, Widget_t::widget, widget_event_loop(), Widget_t::width, Widget_t::x, Widget_t::xic, Widget_t::xim, and Widget_t::y.

◆ create_window()

Widget_t* create_window ( Xputty app,
Window  win,
int  x,
int  y,
int  width,
int  height 
)

*create_window - create a Window
You need to create as least minimun one Window to get started.
The first created Window is the top_level_widget()
A Window could be created on the DefaultRootWindow() or embeded into a other XWindow

Parameters
*app- pointer to the Xputty *main struct to use
win- pointer to the Parrent Window (may be Root)
x,y,width,height- the position/geometry to create the window
Returns
Widget_t * - pointer to the Widget_t struct

Definition at line 145 of file xwidget.c.

146  {
147 
148  Widget_t *w = (Widget_t*)malloc(sizeof(Widget_t));
149  assert(w != NULL);
150  debug_print("assert(w)\n");
151  XSetWindowAttributes attributes;
152  attributes.save_under = True;
153  attributes.override_redirect = 0;
154 
155  long event_mask = StructureNotifyMask|ExposureMask|KeyPressMask
156  |EnterWindowMask|LeaveWindowMask|ButtonReleaseMask
157  |ButtonPressMask|Button1MotionMask;
158 
159 
160 
161  w->widget = XCreateWindow(app->dpy, win , x, y, width, height, 0,
162  CopyFromParent, InputOutput, CopyFromParent,
163  CopyFromParent, &attributes);
164  debug_print("XCreateWindow\n");
165 
166  XSetLocaleModifiers("");
167  w->xim = XOpenIM(app->dpy, 0, 0, 0);
168  if(!w->xim){
169  XSetLocaleModifiers("@im=none");
170  w->xim = XOpenIM(app->dpy, 0, 0, 0);
171  }
172 
173  w->xic = XCreateIC(w->xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
174  XNClientWindow, w->widget, XNFocusWindow, w->widget, NULL);
175 
176  XSetICFocus(w->xic);
177 
178  XSelectInput(app->dpy, w->widget, event_mask);
179 
180  XSizeHints* win_size_hints;
181  win_size_hints = XAllocSizeHints();
182  win_size_hints->flags = PMinSize|PBaseSize|PWinGravity;
183  win_size_hints->min_width = width/2;
184  win_size_hints->min_height = height/2;
185  win_size_hints->base_width = width;
186  win_size_hints->base_height = height;
187  win_size_hints->win_gravity = CenterGravity;
188  XSetWMNormalHints(app->dpy, w->widget, win_size_hints);
189  XFree(win_size_hints);
190 
191  w->surface = cairo_xlib_surface_create (app->dpy, w->widget,
192  DefaultVisual(app->dpy, DefaultScreen(app->dpy)), width, height);
193 
194  assert(cairo_surface_status(w->surface) == CAIRO_STATUS_SUCCESS);
195  w->cr = cairo_create(w->surface);
196  cairo_select_font_face (w->cr, "Roboto", CAIRO_FONT_SLANT_NORMAL,
197  CAIRO_FONT_WEIGHT_NORMAL);
198 
199  w->buffer = cairo_surface_create_similar (w->surface,
200  CAIRO_CONTENT_COLOR_ALPHA, width, height);
201  assert(cairo_surface_status(w->buffer) == CAIRO_STATUS_SUCCESS);
202  w->crb = cairo_create (w->buffer);
203  cairo_select_font_face (w->crb, "Roboto", CAIRO_FONT_SLANT_NORMAL,
204  CAIRO_FONT_WEIGHT_NORMAL);
205 
206  w->image = NULL;
207 
208  w->flags = IS_WINDOW;
209  w->flags &= ~NO_AUTOREPEAT;
210  w->flags &= ~FAST_REDRAW;
211  w->flags &= ~HIDE_ON_DELETE;
212  w->flags &= ~REUSE_IMAGE;
213  w->flags &= ~NO_PROPAGATE;
214  w->app = app;
215  w->parent = &win;
216  w->parent_struct = NULL;
217  w->label = NULL;
218  memset(w->input_label, 0, 32 * (sizeof w->input_label[0]));
219  w->state = 0;
220  w->data = 0;
221  w->x = x;
222  w->y = y;
223  w->width = width;
224  w->height = height;
225  w->scale.init_x = x;
226  w->scale.init_y = y;
227  w->scale.init_width = width;
228  w->scale.init_height = height;
229  w->scale.scale_x = 0.0;
230  w->scale.scale_y = 0.0;
231  w->scale.cscale_x = 1.0;
232  w->scale.cscale_y = 1.0;
233  w->scale.rcscale_x = 1.0;
234  w->scale.rcscale_y = 1.0;
235  w->scale.ascale = 1.0;
236  w->scale.gravity = CENTER;
237  w->adj_x = NULL;
238  w->adj_y = NULL;
239  w->adj = NULL;
240  w->childlist = (Childlist_t*)malloc(sizeof(Childlist_t));
241  assert(w->childlist != NULL);
261 
263  //XMapWindow(app->dpy, w->widget);
264  debug_print("size of Func_t = %lu\n", sizeof(w->func)/sizeof(void*));
265  return w;
266 }

References _dummy1_callback(), _dummy_callback(), Widget_t::adj, Func_t::adj_callback, Widget_t::adj_x, Widget_t::adj_y, Widget_t::app, Resize_t::ascale, Widget_t::buffer, Func_t::button_press_callback, Func_t::button_release_callback, CENTER, Xputty::childlist, Widget_t::childlist, childlist_add_child(), childlist_init(), Func_t::configure_callback, configure_event(), Func_t::configure_notify_callback, Widget_t::cr, Widget_t::crb, Resize_t::cscale_x, Resize_t::cscale_y, Widget_t::data, debug_print, Func_t::dialog_callback, Xputty::dpy, Func_t::enter_callback, Widget_t::event_callback, Func_t::expose_callback, FAST_REDRAW, Widget_t::flags, Widget_t::func, Resize_t::gravity, Widget_t::height, HIDE_ON_DELETE, Widget_t::image, Resize_t::init_height, Resize_t::init_width, Resize_t::init_x, Resize_t::init_y, Widget_t::input_label, IS_WINDOW, Func_t::key_press_callback, Func_t::key_release_callback, Widget_t::label, Func_t::leave_callback, Func_t::map_notify_callback, Func_t::mem_free_callback, Func_t::motion_callback, NO_AUTOREPEAT, NO_PROPAGATE, Widget_t::parent, Widget_t::parent_struct, Resize_t::rcscale_x, Resize_t::rcscale_y, REUSE_IMAGE, Widget_t::scale, Resize_t::scale_x, Resize_t::scale_y, Widget_t::state, Widget_t::surface, transparent_draw(), Func_t::unmap_notify_callback, Func_t::user_callback, Func_t::value_changed_callback, Widget_t::widget, widget_event_loop(), Widget_t::width, Widget_t::x, Widget_t::xic, Widget_t::xim, and Widget_t::y.

◆ destroy_widget()

void destroy_widget ( Widget_t w,
Xputty main 
)

destroy_widget - destroy a widget
When a Widget_t receive a destroy_widget() call, it will propagate that to all childs in it's Childlist_t. So all childs get destroyed before the Widget_t itself close.

Parameters
*w- pointer to the Widget_t sending the request
*main- pointer to main struct
Returns
void

Definition at line 71 of file xwidget.c.

71  {
72  int count = childlist_find_child(main->childlist, w);
73  if (count == 0 && main->run == true) {
74  quit(w);
75  } else if(childlist_find_child(main->childlist, w)>=0) {
76  if(w->flags & REUSE_IMAGE) {
77  w->image = NULL;
78  }
79  if(w->flags & HAS_MEM) {
80  w->func.mem_free_callback(w, NULL);
81  }
83  int ch = childlist_has_child(w->childlist);
84  if (ch) {
85  int i = ch;
86  for(;i>0;i--) {
87  destroy_widget(w->childlist->childs[i-1],main);
88  }
89  destroy_widget(w,main);
90  }
91  if(w->flags & IS_WIDGET) {
92  Widget_t *p = (Widget_t *) w->parent;
94  }
98  cairo_surface_destroy(w->image);
99  cairo_destroy(w->crb);
100  cairo_surface_destroy(w->buffer);
101  cairo_destroy(w->cr);
102  cairo_surface_destroy(w->surface);
103 
104  XDestroyIC(w->xic);
105  XCloseIM(w->xim);
106  XUnmapWindow(w->app->dpy, w->widget);
107  XDestroyWindow(w->app->dpy, w->widget);
108  free(w->childlist);
109  free(w);
110  w = NULL;
111  }
112 }

References Widget_t::adj_x, Widget_t::adj_y, Widget_t::app, Widget_t::buffer, Xputty::childlist, Widget_t::childlist, childlist_destroy(), childlist_find_child(), childlist_has_child(), childlist_remove_child(), Childlist_t::childs, Widget_t::cr, Widget_t::crb, delete_adjustment(), Xputty::dpy, Widget_t::flags, Widget_t::func, HAS_MEM, Widget_t::image, IS_WIDGET, Func_t::mem_free_callback, Widget_t::parent, quit(), REUSE_IMAGE, Xputty::run, Widget_t::surface, Widget_t::widget, Widget_t::xic, and Widget_t::xim.

◆ expose_widget()

void expose_widget ( Widget_t w)

expose_widgets - send a expose event (EXPOSE) to a Widget_t

Parameters
w- the Widget_t to send the event to
Returns
void

Definition at line 461 of file xwidget.c.

461  {
462  XEvent exp;
463  memset(&exp, 0, sizeof(exp));
464  exp.type = Expose;
465  exp.xexpose.window = w->widget;
466  XSendEvent(w->app->dpy, w->widget, False, ExposureMask, (XEvent *)&exp);
467 }

References Widget_t::app, Xputty::dpy, and Widget_t::widget.

◆ get_toplevel_widget()

Widget_t* get_toplevel_widget ( Xputty main)

*get_toplevel_widget - get pointer to the top level Widget_t

Parameters
*main- pointer to the main Xputty struct
Returns
void

Definition at line 457 of file xwidget.c.

457  {
458  return main->childlist->childs[0];
459 }

References Xputty::childlist, and Childlist_t::childs.

◆ hide_tooltip()

void hide_tooltip ( Widget_t wid)

hide_tooltip - check if a Widget_t have a tooltip, and hide it, if a tooltip is mapped.

Parameters
*wid- pointer to the Widget_t receiving the event
Returns
void

Definition at line 446 of file xwidget.c.

446  {
447  int i = 0;
448  for(;i<wid->childlist->elem;i++) {
449  Widget_t *w = wid->childlist->childs[i];
450  if (w->flags & IS_TOOLTIP) {
451  widget_hide(w);
452  break;
453  }
454  }
455 }

References Widget_t::childlist, Childlist_t::childs, Childlist_t::elem, Widget_t::flags, IS_TOOLTIP, and widget_hide().

◆ key_mapping()

int key_mapping ( Display *  dpy,
XKeyEvent *  xkey 
)

_key_mapping - modifier key's mapped to a integer value

Parameters
*dpy- pointer to the Display in use
*xkey- the key to map
Returns
int - value (1-10) or 0 when not mapped

Definition at line 26 of file xwidget.c.

26  {
27  if (xkey->keycode == XKeysymToKeycode(dpy,XK_Tab))
28  return (xkey->state == ShiftMask) ? 1 : 2;
29  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_Up))
30  return 3;
31  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_Right))
32  return 4;
33  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_Down))
34  return 5;
35  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_Left))
36  return 6;
37  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_Home))
38  return 7;
39  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_Insert))
40  return 8;
41  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_End))
42  return 9;
43  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_Return))
44  return 10;
45  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_BackSpace))
46  return 11;
47  // keypad
48  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Subtract))
49  return 1;
50  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Add))
51  return 2;
52  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Up))
53  return 3;
54  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Right))
55  return 4;
56  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Down))
57  return 5;
58  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Left))
59  return 6;
60  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Home))
61  return 7;
62  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Insert))
63  return 8;
64  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_End))
65  return 9;
66  else if (xkey->keycode == XKeysymToKeycode(dpy,XK_KP_Enter))
67  return 10;
68  else return 0;
69 }

◆ pop_widget_show_all()

void pop_widget_show_all ( Widget_t w)

pop_widget_show_all - map/show popup widget with all it's childs

Parameters
*w- pointer to the Widget_t to map
Returns
void

Definition at line 418 of file xwidget.c.

418  {
419  w->func.map_notify_callback(w, NULL);
420  XMapWindow(w->app->dpy, w->widget);
421  int i=0;
422  for(;i<w->childlist->elem;i++) {
424  }
425 }

References Widget_t::app, Widget_t::childlist, Childlist_t::childs, Xputty::dpy, Childlist_t::elem, Widget_t::func, Func_t::map_notify_callback, and Widget_t::widget.

◆ quit()

void quit ( Widget_t w)

quit - exit the main loop

Parameters
*w- pointer to the Widget_t sending the request
Returns
void

Definition at line 701 of file xwidget.c.

701  {
702  Atom WM_DELETE_WINDOW = XInternAtom(w->app->dpy, "WM_DELETE_WINDOW", True);
703  XClientMessageEvent xevent;
704  xevent.type = ClientMessage;
705  xevent.message_type = WM_DELETE_WINDOW;
706  xevent.display = w->app->dpy;
707  xevent.window = get_toplevel_widget(w->app)->widget;
708  xevent.format = 16;
709  xevent.data.l[0] = WM_DELETE_WINDOW;
710  XSendEvent(w->app->dpy, w->widget, 0, 0, (XEvent *)&xevent);
711 }

References Widget_t::app, Xputty::dpy, get_toplevel_widget(), and Widget_t::widget.

◆ quit_widget()

void quit_widget ( Widget_t w)

quit_widget - remove a widget from the processing loop

Parameters
*w- pointer to the Widget_t sending the request
Returns
void

Definition at line 713 of file xwidget.c.

713  {
714  Atom QUIT_WIDGET = XInternAtom(w->app->dpy, "WIDGET_DESTROY", False);
715  XClientMessageEvent xevent;
716  xevent.type = ClientMessage;
717  xevent.message_type = QUIT_WIDGET;
718  xevent.display = w->app->dpy;
719  xevent.window = w->widget;
720  xevent.format = 16;
721  xevent.data.l[0] = 1;
722  XSendEvent(w->app->dpy, w->widget, 0, 0, (XEvent *)&xevent);
723 }

References Widget_t::app, Xputty::dpy, and Widget_t::widget.

◆ send_button_press_event()

void send_button_press_event ( Widget_t w)

send_button_press_event - send ButtonPress event to Widget_t
simulate a BUTTON_PRESS Event

Parameters
*w- pointer to the Widget_t to send the notify
Returns
void

Definition at line 630 of file xwidget.c.

630  {
631  XEvent event;
632  memset(&event, 0, sizeof(XEvent));
633  XWindowAttributes attr;
634  XGetWindowAttributes(w->app->dpy, w->widget, &attr);
635  event.type = ButtonPress;
636  event.xbutton.same_screen = true;
637  event.xbutton.root = None;
638  event.xbutton.window = w->widget;
639  event.xbutton.subwindow = None;
640  event.xbutton.x = 1;
641  event.xbutton.y = 1;
642  event.xbutton.x_root = attr.x;
643  event.xbutton.y_root = attr.y;
644  event.xbutton.state = 0;
645  event.xbutton.button = Button1;
646  XSendEvent(w->app->dpy, PointerWindow, True, ButtonPressMask, &event);
647 }

References Widget_t::app, Xputty::dpy, and Widget_t::widget.

◆ send_button_release_event()

void send_button_release_event ( Widget_t w)

send_button_release_event - send ButtonRelease event to Widget_t
simulate a BUTTON_RELEASE Event

Parameters
*w- pointer to the Widget_t to send the notify
Returns
void

Definition at line 649 of file xwidget.c.

649  {
650  XEvent event;
651  memset(&event, 0, sizeof(XEvent));
652  XWindowAttributes attr;
653  XGetWindowAttributes(w->app->dpy, w->widget, &attr);
654  event.type = ButtonRelease;
655  event.xbutton.same_screen = true;
656  event.xbutton.root = None;
657  event.xbutton.window = w->widget;
658  event.xbutton.subwindow = None;
659  event.xbutton.x = 1;
660  event.xbutton.y = 1;
661  event.xbutton.x_root = attr.x;
662  event.xbutton.y_root = attr.y;
663  event.xbutton.state = 0;
664  event.xbutton.button = Button1;
665  XSendEvent(w->app->dpy, PointerWindow, True, ButtonReleaseMask, &event);
666 }

References Widget_t::app, Xputty::dpy, and Widget_t::widget.

◆ send_configure_event()

void send_configure_event ( Widget_t w,
int  x,
int  y,
int  width,
int  height 
)

send_configure_event - send a ConfigureNotify to Widget_t
used to resize a Widget_t

Parameters
*w- pointer to the Widget_t to send the notify
x,y- the new Widget_t position
width,height- the new Widget_t size
Returns
void

Definition at line 612 of file xwidget.c.

612  {
613  XConfigureEvent notify;
614  memset(&notify, 0, sizeof(notify));
615  notify.type = ConfigureNotify;
616  notify.display = w->app->dpy;
617  notify.send_event = True;
618  notify.event = w->widget;
619  notify.window = w->widget;
620  notify.x = x;
621  notify.y = y;
622  notify.width = width;
623  notify.height = height;
624  notify.border_width = 0;
625  notify.above = None;
626  notify.override_redirect = 1;
627  XSendEvent( w->app->dpy, w->widget, true, StructureNotifyMask, (XEvent*)&notify );
628 }

References Widget_t::app, Xputty::dpy, and Widget_t::widget.

◆ send_systray_message()

void send_systray_message ( Widget_t w)

send_systray_message - request a systray icon for Widget_t
currently not working

Parameters
*w- pointer to the Widget_t to send the notify
Returns
void

Definition at line 668 of file xwidget.c.

668  {
669  XEvent event;
670  Screen *xscreen;
671  char buf[256];
672  buf[0]=0;
673 
674  xscreen=DefaultScreenOfDisplay(w->app->dpy);
675  sprintf(buf,"_NET_SYSTEM_TRAY_S%d",XScreenNumberOfScreen (xscreen));
676  Atom selection_atom = XInternAtom (w->app->dpy,buf,0);
677 
678  Window tray = XGetSelectionOwner (w->app->dpy,selection_atom);
679  Atom visualatom = XInternAtom(w->app->dpy, "_NET_SYSTEM_TRAY_VISUAL", False);
680  VisualID value = XVisualIDFromVisual(DefaultVisual(w->app->dpy, DefaultScreen(w->app->dpy)));
681  XChangeProperty(w->app->dpy, w->widget, visualatom, XA_VISUALID, 32,
682  PropModeReplace, (unsigned char*)&value, 1);
683 
684  if ( tray != None)
685  XSelectInput (w->app->dpy,tray,StructureNotifyMask);
686 
687  memset(&event, 0, sizeof(event));
688  event.xclient.type = ClientMessage;
689  event.xclient.window = tray;
690  event.xclient.message_type = XInternAtom (w->app->dpy, "_NET_SYSTEM_TRAY_OPCODE", False );
691  event.xclient.format = 32;
692  event.xclient.data.l[0] = CurrentTime;
693  event.xclient.data.l[1] = SYSTEM_TRAY_REQUEST_DOCK;
694  event.xclient.data.l[2] = w->widget;
695  event.xclient.data.l[3] = 0;
696  event.xclient.data.l[4] = 0;
697 
698  XSendEvent(w->app->dpy, tray, False, NoEventMask, &event);
699 }

References Widget_t::app, Xputty::dpy, SYSTEM_TRAY_REQUEST_DOCK, and Widget_t::widget.

◆ show_tooltip()

void show_tooltip ( Widget_t wid)

show_tooltip - check if a Widget_t have a tooltip, and show it, if a tooltip is available.

Parameters
*wid- pointer to the Widget_t receiving the event
Returns
void

Definition at line 427 of file xwidget.c.

427  {
428  int i = 0;
429  for(;i<wid->childlist->elem;i++) {
430  Widget_t *w = wid->childlist->childs[i];
431  if (w->flags & IS_TOOLTIP) {
432  unsigned int mask;
433  int x, y, rx, ry;
434  Window child, root;
435  XQueryPointer(wid->app->dpy, wid->widget, &root, &child, &rx, &ry, &x, &y, &mask);
436  int x1, y1;
437  XTranslateCoordinates( wid->app->dpy, wid->widget, DefaultRootWindow(wid->app->dpy),
438  x, y, &x1, &y1, &child );
439  XMoveWindow(w->app->dpy,w->widget,x1+10, y1-10);
440  widget_show(w);
441  break;
442  }
443  }
444 }

References Widget_t::app, Widget_t::childlist, Childlist_t::childs, Xputty::dpy, Childlist_t::elem, Widget_t::flags, IS_TOOLTIP, Widget_t::widget, and widget_show().

◆ transparent_draw()

void transparent_draw ( void *  wid,
void *  user_data 
)

transparent_draw - copy parent surface to child surface
you usaualy didn't need to call this, it's used automaticaly when a Widget_t have set the flag USE_TRANSPARENCY
this is the default setting for Widget_t

Parameters
*wid- pointer to the Widget_t receiving the event
*user_data- void pointer to attached user_data
Returns
void

Definition at line 469 of file xwidget.c.

469  {
470  Widget_t *wid = (Widget_t*)w_;
471 
472  cairo_push_group (wid->cr);
473 
474  if (wid->flags & USE_TRANSPARENCY) {
475  Widget_t *parent = (Widget_t*)wid->parent;
476  XWindowAttributes attrs;
477  XGetWindowAttributes(wid->app->dpy, wid->widget, &attrs);
478 
479  debug_print("Widget_t _transparency \n");
480  cairo_set_source_surface (wid->crb, parent->buffer, -attrs.x, -attrs.y);
481  cairo_paint (wid->crb);
482  }
483 
484  cairo_push_group (wid->crb);
485  wid->func.expose_callback(wid, user_data);
486  cairo_pop_group_to_source (wid->crb);
487  cairo_paint (wid->crb);
488 
489  cairo_set_source_surface (wid->cr, wid->buffer,0,0);
490  cairo_paint (wid->cr);
491 
492  cairo_pop_group_to_source (wid->cr);
493  cairo_paint (wid->cr);
495 }

References _propagate_child_expose(), Widget_t::app, Widget_t::buffer, Widget_t::cr, Widget_t::crb, debug_print, Xputty::dpy, Func_t::expose_callback, Widget_t::flags, Widget_t::func, Widget_t::parent, USE_TRANSPARENCY, and Widget_t::widget.

◆ widget_event_loop()

void widget_event_loop ( void *  w_,
void *  event,
Xputty main,
void *  user_data 
)

widget_event_loop - the internal widget event loop

Parameters
*w- void pointer to the Widget_t receiving the event
*event- void pointer to the XEvent
*main- void pointer to the Xputty *main struct running the event loop
*user_data- void pointer to attached user_data
Returns
void

Definition at line 497 of file xwidget.c.

497  {
498  Widget_t *wid = (Widget_t*)w_;
499  XEvent *xev = (XEvent*)event;
500 
501  switch(xev->type) {
502  case ConfigureNotify:
503  wid->func.configure_callback(w_, user_data);
504  //transparent_draw(w_, user_data);
505  debug_print("Widget_t ConfigureNotify \n");
506  break;
507 
508  case Expose:
509  if (xev->xexpose.count == 0) {
510  transparent_draw(w_, user_data);
511  debug_print("Widget_t Expose \n");
512  }
513  break;
514 
515  case ButtonPress:
516  if (wid->state == 4) break;
517  if (wid->flags & HAS_TOOLTIP) hide_tooltip(wid);
518  _button_press(wid, &xev->xbutton, user_data);
519  debug_print("Widget_t ButtonPress %i\n", xev->xbutton.button);
520  break;
521 
522  case ButtonRelease:
523  _check_grab(wid, &xev->xbutton, main);
524  if (wid->state == 4) break;
525  _has_pointer(wid, &xev->xbutton);
526  if(wid->flags & HAS_POINTER) wid->state = 1;
527  else wid->state = 0;
528  _check_enum(wid, &xev->xbutton);
529  wid->func.button_release_callback(w_, &xev->xbutton, user_data);
530  debug_print("Widget_t ButtonRelease %i\n", xev->xbutton.button);
531  break;
532 
533  case KeyPress:
534  if (wid->state == 4) break;
535  _check_keymap(wid, xev->xkey);
536  wid->func.key_press_callback(w_, &xev->xkey, user_data);
537  debug_print("Widget_t KeyPress %u\n", xev->xkey.keycode);
538  break;
539 
540  case KeyRelease:
541  if (wid->state == 4) break;
542  {
543  unsigned short is_retriggered = 0;
544  if(wid->flags & NO_AUTOREPEAT) {
545  if (XEventsQueued(main->dpy, QueuedAlready)) {
546  XEvent nev;
547  XPeekEvent(main->dpy, &nev);
548  if (nev.type == KeyPress && nev.xkey.time == xev->xkey.time &&
549  nev.xkey.keycode == xev->xkey.keycode &&
550  (nev.xkey.keycode > 119 || nev.xkey.keycode < 110)) {
551  XNextEvent (main->dpy, xev);
552  is_retriggered = 1;
553  }
554  }
555  }
556  if (!is_retriggered) {
557  wid->func.key_release_callback(w_, &xev->xkey, user_data);
558  debug_print("Widget_t KeyRelease %u\n", xev->xkey.keycode);
559  }
560  }
561  break;
562 
563  case LeaveNotify:
564  wid->flags &= ~HAS_FOCUS;
565  if (wid->state == 4) break;
566  if(!(xev->xcrossing.state & Button1Mask)) {
567  wid->state = 0;
568  wid->func.leave_callback(w_, user_data);
569  }
570  if (wid->flags & HAS_TOOLTIP) hide_tooltip(wid);
571  debug_print("Widget_t LeaveNotify \n");
572  break;
573 
574  case EnterNotify:
575  wid->flags |= HAS_FOCUS;
576  if (wid->state == 4) break;
577  if(!(xev->xcrossing.state & Button1Mask)) {
578  wid->state = 1;
579  wid->func.enter_callback(w_, user_data);
580  if (wid->flags & HAS_TOOLTIP) show_tooltip(wid);
581  else _hide_all_tooltips(wid);
582  }
583  debug_print("Widget_t EnterNotify \n");
584  break;
585 
586  case MotionNotify:
587  if (wid->state == 4) break;
588  adj_set_motion_state(wid, xev->xmotion.x, xev->xmotion.y);
589  wid->func.motion_callback(w_,&xev->xmotion, user_data);
590  debug_print("Widget_t MotionNotify x = %i Y = %i \n",xev->xmotion.x,xev->xmotion.y );
591  break;
592 
593  case ClientMessage:
594  if (xev->xclient.message_type == XInternAtom(wid->app->dpy, "WIDGET_DESTROY", 1)) {
595  int ch = childlist_has_child(wid->childlist);
596  if (ch) {
597  int i = ch;
598  for(;i>0;i--) {
599  quit_widget(wid->childlist->childs[i-1]);
600  }
601  quit_widget(wid);
602  } else {
603  destroy_widget(wid,main);
604  }
605  }
606 
607  default:
608  break;
609  }
610 }

References _button_press(), _check_enum(), _check_grab(), _check_keymap(), _has_pointer(), _hide_all_tooltips(), adj_set_motion_state(), Widget_t::app, Func_t::button_release_callback, Widget_t::childlist, childlist_has_child(), Childlist_t::childs, Func_t::configure_callback, debug_print, destroy_widget(), Xputty::dpy, Func_t::enter_callback, Widget_t::flags, Widget_t::func, HAS_FOCUS, HAS_POINTER, HAS_TOOLTIP, hide_tooltip(), Func_t::key_press_callback, Func_t::key_release_callback, Func_t::leave_callback, Func_t::motion_callback, NO_AUTOREPEAT, quit_widget(), show_tooltip(), Widget_t::state, transparent_draw(), and Widget_t::x.

◆ widget_hide()

void widget_hide ( Widget_t w)

widget_hide - unmap/hide a Widget_t

Parameters
*w- pointer to the Widget_t to unmap
Returns
void

Definition at line 396 of file xwidget.c.

396  {
397  int i=0;
398  for(;i<w->childlist->elem;i++) {
399  widget_hide(w->childlist->childs[i]);
400  }
401  w->func.unmap_notify_callback(w, NULL);
402  XUnmapWindow(w->app->dpy, w->widget);
403 }

References Widget_t::app, Widget_t::childlist, Childlist_t::childs, Xputty::dpy, Childlist_t::elem, Widget_t::func, Func_t::unmap_notify_callback, and Widget_t::widget.

◆ widget_reset_scale()

void widget_reset_scale ( Widget_t w)

widget_reset_scale - used to reset scaling mode after a image surface is drawn to the Widget_t surface with widget_set_scale()

Parameters
*w- pointer to the Widget_t sending the request
Returns
void

Definition at line 137 of file xwidget.c.

137  {
138  cairo_scale(w->crb, w->scale.cscale_x,w->scale.cscale_y);
139 }

References Widget_t::crb, Resize_t::cscale_x, Resize_t::cscale_y, and Widget_t::scale.

◆ widget_set_scale()

void widget_set_scale ( Widget_t w)

widget_set_scale - set scaling mode to scale a image surface to the size of the Widget_t surface

Parameters
*w- pointer to the Widget_t sending the request
Returns
void

Definition at line 141 of file xwidget.c.

141  {
142  cairo_scale(w->crb, w->scale.rcscale_x,w->scale.rcscale_y);
143 }

References Widget_t::crb, Resize_t::rcscale_x, Resize_t::rcscale_y, and Widget_t::scale.

◆ widget_set_title()

void widget_set_title ( Widget_t w,
const char *  title 
)

widget_set_title - set window title for a Widget_t

Parameters
*w- pointer to the Widget_t to set the title
*title- the title to store
Returns
void

Definition at line 387 of file xwidget.c.

387  {
388  XStoreName(w->app->dpy, w->widget, title);
389 }

References Widget_t::app, Xputty::dpy, and Widget_t::widget.

◆ widget_show()

void widget_show ( Widget_t w)

widget_show - map/show widget

Parameters
*w- pointer to the Widget_t to map
Returns
void

Definition at line 391 of file xwidget.c.

391  {
392  w->func.map_notify_callback(w, NULL);
393  XMapWindow(w->app->dpy, w->widget);
394 }

References Widget_t::app, Xputty::dpy, Widget_t::func, Func_t::map_notify_callback, and Widget_t::widget.

◆ widget_show_all()

void widget_show_all ( Widget_t w)

widget_show_all - map/show Widget_t with all childs

Parameters
*w- pointer to the Widget_t to map
Returns
void

Definition at line 405 of file xwidget.c.

405  {
406  if (w->flags & IS_POPUP || w->flags & IS_TOOLTIP) {
407  return;
408  } else {
409  w->func.map_notify_callback(w, NULL);
410  XMapWindow(w->app->dpy, w->widget);
411  int i=0;
412  for(;i<w->childlist->elem;i++) {
414  }
415  }
416 }

References Widget_t::app, Widget_t::childlist, Childlist_t::childs, Xputty::dpy, Childlist_t::elem, Widget_t::flags, Widget_t::func, IS_POPUP, IS_TOOLTIP, Func_t::map_notify_callback, and Widget_t::widget.

_check_enum
void _check_enum(Widget_t *wid, XButtonEvent *xbutton)
_check_enum - internal check if Adjustment_t is of type CL_ENUM and handle events acordingly
Definition: xwidget_private.c:67
Func_t::leave_callback
xevfunc leave_callback
Definition: xwidget.h:83
CONFIGURE_NOTIFY
@ CONFIGURE_NOTIFY
Definition: xwidget.h:132
HAS_TOOLTIP
@ HAS_TOOLTIP
Definition: xwidget.h:249
Func_t::enter_callback
xevfunc enter_callback
Definition: xwidget.h:82
NORTHWEST
@ NORTHWEST
Definition: xwidget.h:157
Widget_t::y
int y
Definition: xwidget.h:350
POINTER_MOTION
@ POINTER_MOTION
Definition: xwidget.h:138
pop_widget_show_all
void pop_widget_show_all(Widget_t *w)
pop_widget_show_all - map/show popup widget with all it's childs
Definition: xwidget.c:418
Resize_t::scale_x
float scale_x
Definition: xwidget.h:202
SOUTHWEST
@ SOUTHWEST
Definition: xwidget.h:161
Func_t::configure_callback
xevfunc configure_callback
Definition: xwidget.h:81
Widget_t::width
int width
Definition: xwidget.h:352
Resize_t::gravity
Gravity gravity
Definition: xwidget.h:192
configure_event
void configure_event(void *w_, void *user_data)
Definition: xwidget.c:114
BUTTON_RELEASE
@ BUTTON_RELEASE
Definition: xwidget.h:137
Resize_t::init_x
int init_x
Definition: xwidget.h:194
Xputty::childlist
Childlist_t * childlist
Definition: xputty.h:179
Widget_t::image
cairo_surface_t * image
Definition: xwidget.h:320
Resize_t::scale_y
float scale_y
Definition: xwidget.h:204
_button_press
void _button_press(Widget_t *wid, XButtonEvent *xbutton, void *user_data)
_button_press - internal check which button is pressed (BUTTON_PRESS)
Definition: xwidget_private.c:84
MENUITEM
@ MENUITEM
Definition: xwidget.h:171
quit_widget
void quit_widget(Widget_t *w)
quit_widget - remove a widget from the processing loop
Definition: xwidget.c:713
Widget_t::data
int data
Definition: xwidget.h:322
childlist_init
void childlist_init(Childlist_t *childlist)
childlist_init - internal use to allocate the array to min size You usually didn't need to call thi...
Definition: xchildlist.c:25
_dummy_callback
void _dummy_callback(void *w_, void *user_data)
_dummy1_callback - default debuging callback for xevfunc's
Definition: xwidget_private.c:242
quit
void quit(Widget_t *w)
quit - exit the main loop
Definition: xwidget.c:701
Resize_t::cscale_y
float cscale_y
Definition: xwidget.h:208
_hide_all_tooltips
void _hide_all_tooltips(Widget_t *wid)
_hide_all_tooltips - hide all active tooltips
Definition: xwidget_private.c:201
Widget_t::parent_struct
void * parent_struct
Definition: xwidget.h:306
REUSE_IMAGE
@ REUSE_IMAGE
Definition: xwidget.h:259
NONE
@ NONE
Definition: xwidget.h:173
Childlist_t::childs
Widget_t ** childs
Definition: xchildlist.h:51
Xputty::run
bool run
Definition: xputty.h:187
childlist_add_child
void childlist_add_child(Childlist_t *childlist, Widget_t *child)
childlist_add_child - internal use to add a child to the Childlist_t You usually didn't need to cal...
Definition: xchildlist.c:42
Func_t::key_release_callback
evfunc key_release_callback
Definition: xwidget.h:97
NO_AUTOREPEAT
@ NO_AUTOREPEAT
Definition: xwidget.h:253
adj_set_motion_state
void adj_set_motion_state(void *w, float x, float y)
adj_set_motion_state - internal use to set value and state of the Adjustment_t on mouse pointer movme...
Definition: xadjustment.c:187
Func_t::expose_callback
xevfunc expose_callback
Definition: xwidget.h:80
CENTER
@ CENTER
Definition: xwidget.h:165
IS_WINDOW
@ IS_WINDOW
Definition: xwidget.h:235
HAS_POINTER
@ HAS_POINTER
Definition: xwidget.h:247
Widget_t::crb
cairo_t * crb
Definition: xwidget.h:318
LEAVE
@ LEAVE
Definition: xwidget.h:127
HAS_FOCUS
@ HAS_FOCUS
Definition: xwidget.h:245
Resize_t::rcscale_y
float rcscale_y
Definition: xwidget.h:212
_has_pointer
void _has_pointer(Widget_t *w, XButtonEvent *button)
_has_pointer - check if the widget has the pointer
Definition: xwidget_private.c:211
Func_t::user_callback
xevfunc user_callback
Definition: xwidget.h:86
Func_t::motion_callback
evfunc motion_callback
Definition: xwidget.h:95
Widget_t::flags
long long flags
Definition: xwidget.h:324
SYSTEM_TRAY_REQUEST_DOCK
#define SYSTEM_TRAY_REQUEST_DOCK
Definition: xwidget.h:38
Widget_t::adj
Adjustment_t * adj
Definition: xwidget.h:334
transparent_draw
void transparent_draw(void *w_, void *user_data)
transparent_draw - copy parent surface to child surface you usaualy didn't need to call this,...
Definition: xwidget.c:469
HIDE_ON_DELETE
@ HIDE_ON_DELETE
Definition: xwidget.h:257
Func_t::unmap_notify_callback
xevfunc unmap_notify_callback
Definition: xwidget.h:90
Widget_t::cr
cairo_t * cr
Definition: xwidget.h:314
CONFIGURE
@ CONFIGURE
Definition: xwidget.h:125
Widget_t::scale
Resize_t scale
Definition: xwidget.h:356
EventType
EventType
EventType - enum to hold identifier for all supported event callbacks Events could be connected to ...
Definition: xwidget.h:123
KEY_PRESS
@ KEY_PRESS
Definition: xwidget.h:139
Func_t::key_press_callback
evfunc key_press_callback
Definition: xwidget.h:96
widget_hide
void widget_hide(Widget_t *w)
widget_hide - unmap/hide a Widget_t
Definition: xwidget.c:396
DIALOG_RESPONSE
@ DIALOG_RESPONSE
Definition: xwidget.h:135
HAS_MEM
@ HAS_MEM
Definition: xwidget.h:251
Widget_t::app
Xputty * app
Definition: xwidget.h:300
Resize_t::init_y
int init_y
Definition: xwidget.h:196
BUTTON_PRESS
@ BUTTON_PRESS
Definition: xwidget.h:136
Func_t::button_press_callback
evfunc button_press_callback
Definition: xwidget.h:93
Xputty::dpy
Display * dpy
Definition: xputty.h:181
delete_adjustment
void * delete_adjustment(Adjustment_t *adj)
delete_adjustment - freeing the memory of the Adjustment_t You usually don't need to call this,...
Definition: xadjustment.c:133
USE_TRANSPARENCY
@ USE_TRANSPARENCY
Definition: xwidget.h:243
destroy_widget
void destroy_widget(Widget_t *w, Xputty *main)
destroy_widget - destroy a widget When a Widget_t receive a destroy_widget() call,...
Definition: xwidget.c:71
IS_RADIO
@ IS_RADIO
Definition: xwidget.h:239
Widget_t::state
int state
Definition: xwidget.h:342
Resize_t::ascale
float ascale
Definition: xwidget.h:214
Func_t::map_notify_callback
xevfunc map_notify_callback
Definition: xwidget.h:89
MAP_NOTIFY
@ MAP_NOTIFY
Definition: xwidget.h:133
NO_PROPAGATE
@ NO_PROPAGATE
Definition: xwidget.h:261
Widget_t::widget
Window widget
Definition: xwidget.h:302
ENTER
@ ENTER
Definition: xwidget.h:126
debug_print
#define debug_print(...)
debug_print - print out state messages when compiled with the -DDEBUG flag
Definition: xputty.h:64
FIXEDSIZE
@ FIXEDSIZE
Definition: xwidget.h:169
USER
@ USER
Definition: xwidget.h:130
Widget_t
Widget_t - struct to hold the basic Widget_t info.
Definition: xwidget.h:298
VALUE_CHANGED
@ VALUE_CHANGED
Definition: xwidget.h:129
ADJ_INTERN
@ ADJ_INTERN
Definition: xwidget.h:128
Resize_t::rcscale_x
float rcscale_x
Definition: xwidget.h:210
ASPECT
@ ASPECT
Definition: xwidget.h:167
Childlist_t
Childlist_t - struct to hold a Widget_t child list Xputty main holds a list of any Widget_t created...
Definition: xchildlist.h:49
Widget_t::xic
XIC xic
Definition: xwidget.h:338
widget_show_all
void widget_show_all(Widget_t *w)
widget_show_all - map/show Widget_t with all childs
Definition: xwidget.c:405
Widget_t::surface
cairo_surface_t * surface
Definition: xwidget.h:312
IS_POPUP
@ IS_POPUP
Definition: xwidget.h:237
UNMAP_NOTIFY
@ UNMAP_NOTIFY
Definition: xwidget.h:134
Func_t::mem_free_callback
xevfunc mem_free_callback
Definition: xwidget.h:87
Widget_t::height
int height
Definition: xwidget.h:354
MEM_FREE
@ MEM_FREE
Definition: xwidget.h:131
childlist_destroy
void childlist_destroy(Childlist_t *childlist)
childlist_destroy - internal use to free the Childlist_t You usually didn't need to call this
Definition: xchildlist.c:38
Func_t::button_release_callback
evfunc button_release_callback
Definition: xwidget.h:94
IS_WIDGET
@ IS_WIDGET
Definition: xwidget.h:233
Widget_t::childlist
Childlist_t * childlist
Definition: xwidget.h:336
IS_TOOLTIP
@ IS_TOOLTIP
Definition: xwidget.h:241
Func_t::adj_callback
xevfunc adj_callback
Definition: xwidget.h:84
childlist_find_child
int childlist_find_child(Childlist_t *childlist, Widget_t *child)
childlist_find_child - find a child in a the Childlist_t this could be sued to check if a Widget_t is...
Definition: xchildlist.c:71
FAST_REDRAW
@ FAST_REDRAW
Definition: xwidget.h:255
Childlist_t::elem
int elem
Definition: xchildlist.h:57
_check_grab
void _check_grab(Widget_t *wid, XButtonEvent *xbutton, Xputty *main)
_check_grab - internal check if a Widgt_t holds a grab when a BUTTON_PRESS event occur....
Definition: xwidget_private.c:112
Widget_t::input_label
char input_label[32]
Definition: xwidget.h:328
Widget_t::adj_y
Adjustment_t * adj_y
Definition: xwidget.h:332
Widget_t::func
Func_t func
Definition: xwidget.h:310
Widget_t::xim
XIM xim
Definition: xwidget.h:340
childlist_remove_child
void childlist_remove_child(Childlist_t *childlist, Widget_t *child)
childlist_remove_child - internal use to remove a child from the childlist You usually didn't need ...
Definition: xchildlist.c:57
_propagate_child_expose
void _propagate_child_expose(Widget_t *wid)
_propagate_child_expose - send expose to any child Widget_t
Definition: xwidget_private.c:139
_check_keymap
void _check_keymap(void *w_, XKeyEvent xkey)
_check_keymap - check if key is in map, send requests if so
Definition: xwidget_private.c:155
Func_t::configure_notify_callback
xevfunc configure_notify_callback
Definition: xwidget.h:88
widget_event_loop
void widget_event_loop(void *w_, void *event, Xputty *main, void *user_data)
widget_event_loop - the internal widget event loop
Definition: xwidget.c:497
EXPOSE
@ EXPOSE
Definition: xwidget.h:124
childlist_has_child
int childlist_has_child(Childlist_t *childlist)
childlist_has_child - check if a Widget_t Childlist_t contain a child
Definition: xchildlist.c:91
Widget_t::buffer
cairo_surface_t * buffer
Definition: xwidget.h:316
Widget_t::parent
void * parent
Definition: xwidget.h:304
Widget_t::event_callback
vfunc event_callback
Definition: xwidget.h:308
get_toplevel_widget
Widget_t * get_toplevel_widget(Xputty *main)
*get_toplevel_widget - get pointer to the top level Widget_t
Definition: xwidget.c:457
Gravity
Gravity
Gravity - enum to indicate how to resize a widget.
Definition: xwidget.h:155
Widget_t::label
const char * label
Definition: xwidget.h:326
Func_t::value_changed_callback
xevfunc value_changed_callback
Definition: xwidget.h:85
Widget_t::x
int x
Definition: xwidget.h:348
show_tooltip
void show_tooltip(Widget_t *wid)
show_tooltip - check if a Widget_t have a tooltip, and show it, if a tooltip is available.
Definition: xwidget.c:427
Widget_t::adj_x
Adjustment_t * adj_x
Definition: xwidget.h:330
Resize_t::cscale_x
float cscale_x
Definition: xwidget.h:206
Resize_t::init_width
int init_width
Definition: xwidget.h:198
NORTHEAST
@ NORTHEAST
Definition: xwidget.h:159
Resize_t::init_height
int init_height
Definition: xwidget.h:200
hide_tooltip
void hide_tooltip(Widget_t *wid)
hide_tooltip - check if a Widget_t have a tooltip, and hide it, if a tooltip is mapped.
Definition: xwidget.c:446
_dummy1_callback
void _dummy1_callback(void *w_, void *_data, void *user_data)
_dummy1_callback - default debuging callback for evfunc's
Definition: xwidget_private.c:238
SOUTHEAST
@ SOUTHEAST
Definition: xwidget.h:163
Func_t::dialog_callback
xevfunc dialog_callback
Definition: xwidget.h:91
KEY_RELEASE
@ KEY_RELEASE
Definition: xwidget.h:140
widget_show
void widget_show(Widget_t *w)
widget_show - map/show widget
Definition: xwidget.c:391