allow warping the mouse pointer when switching desktops by bumping into the edge of the monitor with a window
based on a patch by Nathaniel Gephart <computinchuck@gmail.com>
This commit is contained in:
parent
b05ac359b8
commit
77ee361f5c
5 changed files with 46 additions and 4 deletions
|
@ -318,6 +318,9 @@
|
|||
<!-- Time before changing desktops when the pointer touches the edge of the
|
||||
screen while moving a window, in milliseconds (1000 = 1 second).
|
||||
Set this to 0 to disable warping -->
|
||||
<screenEdgeWarpMouse>false</screenEdgeWarpMouse>
|
||||
<!-- Set this to TRUE to move the mouse pointer across the desktop when
|
||||
switching due to hitting the edge of the screen -->
|
||||
|
||||
<context name="Frame">
|
||||
<mousebind button="A-Left" action="Press">
|
||||
|
|
|
@ -210,6 +210,7 @@
|
|||
<xsd:element minOccurs="0" name="dragThreshold" type="xsd:integer"/>
|
||||
<xsd:element minOccurs="0" name="doubleClickTime" type="xsd:integer"/>
|
||||
<xsd:element minOccurs="0" name="screenEdgeWarpTime" type="xsd:integer"/>
|
||||
<xsd:element minOccurs="0" name="screenEdgeWarpMouse" type="ob:bool"/>
|
||||
<xsd:element maxOccurs="unbounded" name="context" type="ob:context"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
|
|
@ -86,9 +86,10 @@ guint config_dock_app_move_modifiers;
|
|||
guint config_keyboard_reset_keycode;
|
||||
guint config_keyboard_reset_state;
|
||||
|
||||
gint config_mouse_threshold;
|
||||
gint config_mouse_dclicktime;
|
||||
gint config_mouse_screenedgetime;
|
||||
gint config_mouse_threshold;
|
||||
gint config_mouse_dclicktime;
|
||||
gint config_mouse_screenedgetime;
|
||||
gboolean config_mouse_screenedgewarp;
|
||||
|
||||
guint config_menu_hide_delay;
|
||||
gboolean config_menu_middle;
|
||||
|
@ -465,6 +466,8 @@ static void parse_mouse(xmlNodePtr node, gpointer d)
|
|||
if (config_mouse_screenedgetime && config_mouse_screenedgetime < 25)
|
||||
config_mouse_screenedgetime = 25;
|
||||
}
|
||||
if ((n = obt_xml_find_node(node, "screenEdgeWarpMouse")))
|
||||
config_mouse_screenedgewarp = obt_xml_node_bool(n);
|
||||
|
||||
n = obt_xml_find_node(node, "context");
|
||||
while (n) {
|
||||
|
@ -1030,6 +1033,7 @@ void config_startup(ObtXmlInst *i)
|
|||
config_mouse_threshold = 8;
|
||||
config_mouse_dclicktime = 200;
|
||||
config_mouse_screenedgetime = 400;
|
||||
config_mouse_screenedgewarp = FALSE;
|
||||
|
||||
bind_default_mouse();
|
||||
|
||||
|
|
|
@ -180,6 +180,9 @@ extern gint config_mouse_dclicktime;
|
|||
/*! Number of milliseconds that the mouse has to be on the screen edge before
|
||||
a screen edge event is triggered */
|
||||
extern gint config_mouse_screenedgetime;
|
||||
/*! When TRUE, the mouse is warped to the other side of the desktop after
|
||||
switching desktops from bumping the screen edge */
|
||||
extern gboolean config_mouse_screenedgewarp;
|
||||
|
||||
/*! Number of pixels to resist while crossing another window's edge */
|
||||
extern gint config_resist_win;
|
||||
|
|
|
@ -529,6 +529,34 @@ static void calc_resize(gboolean keyboard, gint keydist, gint *dw, gint *dh,
|
|||
*dh = nh - oh;
|
||||
}
|
||||
|
||||
static void edge_warp_move_ptr(void)
|
||||
{
|
||||
gint x, y;
|
||||
const Rect* a;
|
||||
|
||||
screen_pointer_pos(&x, &y);
|
||||
a = screen_physical_area_all_monitors();
|
||||
|
||||
switch (edge_warp_dir) {
|
||||
case OB_DIRECTION_NORTH:
|
||||
y = a->height - 1;
|
||||
break;
|
||||
case OB_DIRECTION_EAST:
|
||||
x = a->x;
|
||||
break;
|
||||
case OB_DIRECTION_SOUTH:
|
||||
y = a->y;
|
||||
break;
|
||||
case OB_DIRECTION_WEST:
|
||||
x = a->width - 1;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
XWarpPointer(obt_display, 0, obt_root(ob_screen), 0, 0, 0, 0, x, y);
|
||||
}
|
||||
|
||||
static gboolean edge_warp_delay_func(gpointer data)
|
||||
{
|
||||
guint d;
|
||||
|
@ -537,7 +565,10 @@ static gboolean edge_warp_delay_func(gpointer data)
|
|||
after that */
|
||||
if (edge_warp_odd) {
|
||||
d = screen_find_desktop(screen_desktop, edge_warp_dir, TRUE, FALSE);
|
||||
if (d != screen_desktop) screen_set_desktop(d, TRUE);
|
||||
if (d != screen_desktop) {
|
||||
if (config_mouse_screenedgewarp) edge_warp_move_ptr();
|
||||
screen_set_desktop(d, TRUE);
|
||||
}
|
||||
}
|
||||
edge_warp_odd = !edge_warp_odd;
|
||||
|
||||
|
|
Loading…
Reference in a new issue