mirror of
https://github.com/davatorium/rofi.git
synced 2025-01-27 15:25:24 -05:00
widget: Add widget_xy_to_relative helper
Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
parent
6a750669d7
commit
30da7e587a
6 changed files with 48 additions and 46 deletions
|
@ -72,15 +72,14 @@ typedef enum
|
||||||
/**
|
/**
|
||||||
* @param widget The container widget itself
|
* @param widget The container widget itself
|
||||||
* @param type The widget type searched for
|
* @param type The widget type searched for
|
||||||
* @param x A pointer to the X coordination of the mouse event relative to @widget
|
* @param x The X coordination of the mouse event relative to @widget
|
||||||
* @param y A pointer to the Y coordination of the mouse event relative to @widget
|
* @param y The Y coordination of the mouse event relative to @widget
|
||||||
*
|
*
|
||||||
* This callback must only iterate over the children of a Widget, and return NULL if none of them is relevant.
|
* This callback must only iterate over the children of a Widget, and return NULL if none of them is relevant.
|
||||||
* If one was found, @x and @y must be adjusted to be relative to this child.
|
|
||||||
*
|
*
|
||||||
* @returns A child widget if found, NULL otherwise
|
* @returns A child widget if found, NULL otherwise
|
||||||
*/
|
*/
|
||||||
typedef widget * ( *widget_find_mouse_target_cb )( widget *widget, WidgetType type, gint *x, gint *y );
|
typedef widget * ( *widget_find_mouse_target_cb )( widget *widget, WidgetType type, gint x, gint y );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param widget The target widget
|
* @param widget The target widget
|
||||||
|
@ -198,6 +197,15 @@ int widget_get_y_pos ( widget *widget );
|
||||||
*/
|
*/
|
||||||
int widget_get_x_pos ( widget *widget );
|
int widget_get_x_pos ( widget *widget );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param widget The widget handle
|
||||||
|
* @param x A pointer to the absolute X coordinates
|
||||||
|
* @param y A pointer to the absolute Y coordinates
|
||||||
|
*
|
||||||
|
* Will modify @x and @y to make them relative to @widget.
|
||||||
|
*/
|
||||||
|
void widget_xy_to_relative ( widget *widget, gint *x, gint *y );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param widget The widget handle
|
* @param widget The widget handle
|
||||||
*
|
*
|
||||||
|
@ -221,15 +229,14 @@ gboolean widget_need_redraw ( widget *wid );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param wid The widget handle
|
* @param wid The widget handle
|
||||||
* @param x A pointer to the x coordinate of the mouse event
|
* @param x The x coordinate of the mouse event
|
||||||
* @param y A pointer to the y coordinate of the mouse event
|
* @param y The y coordinate of the mouse event
|
||||||
*
|
*
|
||||||
* Get the widget that should handle a mouse event.
|
* Get the widget that should handle a mouse event.
|
||||||
* @x and @y are adjusted to be relative to the widget.
|
|
||||||
*
|
*
|
||||||
* @returns returns the widget that should handle the mouse event.
|
* @returns returns the widget that should handle the mouse event.
|
||||||
*/
|
*/
|
||||||
widget *widget_find_mouse_target ( widget *wid, WidgetType type, gint *x, gint *y );
|
widget *widget_find_mouse_target ( widget *wid, WidgetType type, gint x, gint y );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param wid The widget handle
|
* @param wid The widget handle
|
||||||
|
|
|
@ -1358,11 +1358,11 @@ gboolean rofi_view_trigger_action ( guint scope, gpointer user_data )
|
||||||
case SCOPE_MOUSE_SIDEBAR_MODI:
|
case SCOPE_MOUSE_SIDEBAR_MODI:
|
||||||
{
|
{
|
||||||
gint x = state->mouse.x, y = state->mouse.y;
|
gint x = state->mouse.x, y = state->mouse.y;
|
||||||
widget *target = widget_find_mouse_target ( WIDGET ( state->main_window ), scope, &x, &y );
|
widget *target = widget_find_mouse_target ( WIDGET ( state->main_window ), scope, x, y );
|
||||||
if ( target == NULL ) {
|
if ( target == NULL ) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
widget_xy_to_relative ( target, &x, &y );
|
||||||
return widget_trigger_action ( target, GPOINTER_TO_UINT ( user_data ), x, y );
|
return widget_trigger_action ( target, GPOINTER_TO_UINT ( user_data ), x, y );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,7 +277,7 @@ static void box_resize ( widget *widget, short w, short h )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static widget *box_find_mouse_target ( widget *wid, WidgetType type, gint *x, gint *y )
|
static widget *box_find_mouse_target ( widget *wid, WidgetType type, gint x, gint y )
|
||||||
{
|
{
|
||||||
box *b = (box *) wid;
|
box *b = (box *) wid;
|
||||||
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
|
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
|
||||||
|
@ -285,13 +285,11 @@ static widget *box_find_mouse_target ( widget *wid, WidgetType type, gint *x, gi
|
||||||
if ( !child->enabled ) {
|
if ( !child->enabled ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ( widget_intersect ( child, *x, *y ) ) {
|
if ( widget_intersect ( child, x, y ) ) {
|
||||||
gint rx = *x - child->x;
|
gint rx = x - child->x;
|
||||||
gint ry = *y - child->y;
|
gint ry = y - child->y;
|
||||||
widget *target = widget_find_mouse_target ( child, type, &rx, &ry );
|
widget *target = widget_find_mouse_target ( child, type, rx, ry );
|
||||||
if ( target != NULL ) {
|
if ( target != NULL ) {
|
||||||
*x = rx;
|
|
||||||
*y = ry;
|
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,24 +88,18 @@ static void container_resize ( widget *widget, short w, short h )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static widget *container_find_mouse_target ( widget *wid, WidgetType type, gint *x, gint *y )
|
static widget *container_find_mouse_target ( widget *wid, WidgetType type, gint x, gint y )
|
||||||
{
|
{
|
||||||
container *b = (container *) wid;
|
container *b = (container *) wid;
|
||||||
if ( !widget_intersect ( b->child, *x, *y ) ) {
|
if ( !widget_intersect ( b->child, x, y ) ) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
gint rx = *x - b->child->x;
|
x -= b->child->x;
|
||||||
gint ry = *y - b->child->y;
|
y -= b->child->y;
|
||||||
widget *target = widget_find_mouse_target ( b->child, type, &rx, &ry );
|
return widget_find_mouse_target ( b->child, type, x, y );
|
||||||
if ( target == NULL ) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*x = rx;
|
|
||||||
*y = ry;
|
|
||||||
return target;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean container_motion_notify ( widget *wid, xcb_motion_notify_event_t *xme )
|
static gboolean container_motion_notify ( widget *wid, xcb_motion_notify_event_t *xme )
|
||||||
{
|
{
|
||||||
container *b = (container *) wid;
|
container *b = (container *) wid;
|
||||||
|
|
|
@ -302,35 +302,29 @@ static void listview_resize ( widget *wid, short w, short h )
|
||||||
widget_queue_redraw ( wid );
|
widget_queue_redraw ( wid );
|
||||||
}
|
}
|
||||||
|
|
||||||
static widget *listview_find_mouse_target ( widget *wid, WidgetType type, gint *x, gint *y )
|
static widget *listview_find_mouse_target ( widget *wid, WidgetType type, gint x, gint y )
|
||||||
{
|
{
|
||||||
widget *target = NULL;
|
widget *target = NULL;
|
||||||
gint rx, ry;
|
gint rx, ry;
|
||||||
listview *lv = (listview *) wid;
|
listview *lv = (listview *) wid;
|
||||||
if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) && widget_intersect ( WIDGET ( lv->scrollbar ), *x, *y ) ) {
|
if ( widget_enabled ( WIDGET ( lv->scrollbar ) ) && widget_intersect ( WIDGET ( lv->scrollbar ), x, y ) ) {
|
||||||
rx = *x - widget_get_x_pos ( WIDGET ( lv->scrollbar ) );
|
rx = x - widget_get_x_pos ( WIDGET ( lv->scrollbar ) );
|
||||||
ry = *y - widget_get_y_pos ( WIDGET ( lv->scrollbar ) );
|
ry = y - widget_get_y_pos ( WIDGET ( lv->scrollbar ) );
|
||||||
target = widget_find_mouse_target ( WIDGET ( lv->scrollbar ), type, &rx, &ry );
|
target = widget_find_mouse_target ( WIDGET ( lv->scrollbar ), type, rx, ry );
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int max = MIN ( lv->cur_elements, lv->req_elements - lv->last_offset );
|
unsigned int max = MIN ( lv->cur_elements, lv->req_elements - lv->last_offset );
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for ( i = 0; i < max && target == NULL; i++ ) {
|
for ( i = 0; i < max && target == NULL; i++ ) {
|
||||||
widget *w = WIDGET ( lv->boxes[i] );
|
widget *w = WIDGET ( lv->boxes[i] );
|
||||||
if ( widget_intersect ( w, *x, *y ) ) {
|
if ( widget_intersect ( w, x, y ) ) {
|
||||||
rx = *x - widget_get_x_pos ( w );
|
rx = x - widget_get_x_pos ( w );
|
||||||
ry = *y - widget_get_y_pos ( w );
|
ry = y - widget_get_y_pos ( w );
|
||||||
target = widget_find_mouse_target ( w, type, &rx, &ry );
|
target = widget_find_mouse_target ( w, type, rx, ry );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( target != NULL ) {
|
|
||||||
*x = rx;
|
|
||||||
*y = ry;
|
|
||||||
return target;
|
return target;
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean listview_trigger_action ( widget *wid, MouseBindingListviewAction action, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, G_GNUC_UNUSED void *user_data )
|
static gboolean listview_trigger_action ( widget *wid, MouseBindingListviewAction action, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, G_GNUC_UNUSED void *user_data )
|
||||||
|
|
|
@ -395,6 +395,15 @@ int widget_get_y_pos ( widget *widget )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void widget_xy_to_relative ( widget *widget, gint *x, gint *y )
|
||||||
|
{
|
||||||
|
*x -= widget->x;
|
||||||
|
*y -= widget->y;
|
||||||
|
if ( widget->parent != NULL ) {
|
||||||
|
widget_xy_to_relative ( widget->parent, x, y );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void widget_update ( widget *widget )
|
void widget_update ( widget *widget )
|
||||||
{
|
{
|
||||||
// When (desired )size of widget changes.
|
// When (desired )size of widget changes.
|
||||||
|
@ -426,7 +435,7 @@ gboolean widget_need_redraw ( widget *wid )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
widget *widget_find_mouse_target ( widget *wid, WidgetType type, gint *x, gint *y )
|
widget *widget_find_mouse_target ( widget *wid, WidgetType type, gint x, gint y )
|
||||||
{
|
{
|
||||||
if ( !wid ) {
|
if ( !wid ) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Add table
Reference in a new issue