<!-- 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">
<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>
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;
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) {
config_mouse_threshold = 8;
config_mouse_dclicktime = 200;
config_mouse_screenedgetime = 400;
+ config_mouse_screenedgewarp = FALSE;
bind_default_mouse();
/*! 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;
*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;
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;