X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Faction.c;h=80b0a8f11ce20a4511a640ef0ae23e6b18374cd0;hb=26879183e96f5a0d981e6ae76fda82a0d4564b20;hp=2b4fe8ff8caa500c714b3d7160cf5ae4e48b2d2b;hpb=5606209b8d377072e37e1eea3fcd4f48e15f435a;p=chaz%2Fopenbox diff --git a/openbox/action.c b/openbox/action.c index 2b4fe8ff..80b0a8f1 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -892,6 +892,11 @@ ActionString actionstrings[] = action_growtoedge, setup_action_growtoedge_east }, + { + "breakchroot", + action_break_chroot, + NULL + }, { NULL, NULL, @@ -1566,22 +1571,10 @@ void action_toggle_decorations(union ActionData *data) static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch) { - if (config_resize_four_corners) { - if (x - cx > cw / 2) { - if (y - cy > ch / 2) - return prop_atoms.net_wm_moveresize_size_bottomright; - else - return prop_atoms.net_wm_moveresize_size_topright; - } else { - if (y - cy > ch / 2) - return prop_atoms.net_wm_moveresize_size_bottomleft; - else - return prop_atoms.net_wm_moveresize_size_topleft; - } - } else { - /* let's make x and y client relative instead of screen relative */ - x = x - cx; - y = ch - y - cy; + /* let's make x and y client relative instead of screen relative */ + x = x - cx; + y = ch - (y - cy); /* y is inverted, 0 is at the bottom of the window */ + #define X x*ch/cw #define A -4*X + 7*ch/3 #define B 4*X -15*ch/9 @@ -1596,35 +1589,67 @@ static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch) #define c (x > 5*cw/9) #define d (y < 4*ch/9) - //1 - if (y < A && y >= C) - return prop_atoms.net_wm_moveresize_size_topleft; - //2 - else if (y >= A && y >= B && a) - return prop_atoms.net_wm_moveresize_size_top; - //3 - else if (y < B && y >= D) - return prop_atoms.net_wm_moveresize_size_topright; - //4 - else if (y < C && y >= E && b) - return prop_atoms.net_wm_moveresize_size_left; - //6 - else if (y < D && y >= F && c) - return prop_atoms.net_wm_moveresize_size_right; - //7 - else if (y < E && y >= G) - return prop_atoms.net_wm_moveresize_size_bottomleft; - //8 - else if (y < G && y < H && d) - return prop_atoms.net_wm_moveresize_size_bottom; - //9 - else if (y >= G && y < F) - return prop_atoms.net_wm_moveresize_size_bottomright; - //5 - else - return prop_atoms.net_wm_moveresize_move; - } -} + /* + Each of these defines (except X which is just there for fun), represents + the equation of a line. The lines they represent are shown in the diagram + below. Checking y against these lines, we are able to choose a region + of the window as shown. + + +---------------------A-------|-------|-------B---------------------+ + | |A B| | + | |A | | B| | + | | A B | | + | | A | | B | | + | | A B | | + | | A | | B | | + | northwest | A north B | northeast | + | | A | | B | | + | | A B | | + C---------------------+----A--+-------+--B----+---------------------D + |CCCCCCC | A B | DDDDDDD| + | CCCCCCCC | A | | B | DDDDDDDD | + | CCCCCCC A B DDDDDDD | + - - - - - - - - - - - +CCCCCCC+aaaaaaa+DDDDDDD+ - - - - - - - - - - - + | | b c | | + | west | b move c | east | + | | b c | | + - - - - - - - - - - - +EEEEEEE+ddddddd+FFFFFFF+- - - - - - - - - - - + | EEEEEEE G H FFFFFFF | + | EEEEEEEE | G | | H | FFFFFFFF | + |EEEEEEE | G H | FFFFFFF| + E---------------------+----G--+-------+--H----+---------------------F + | | G H | | + | | G | | H | | + | southwest | G south H | southeast | + | | G | | H | | + | | G H | | + | | G | | H | | + | | G H | | + | |G | | H| | + | |G H| | + +---------------------G-------|-------|-------H---------------------+ + */ + + if (y < A && y >= C) + return prop_atoms.net_wm_moveresize_size_topleft; + else if (y >= A && y >= B && a) + return prop_atoms.net_wm_moveresize_size_top; + else if (y < B && y >= D) + return prop_atoms.net_wm_moveresize_size_topright; + else if (y < C && y >= E && b) + return prop_atoms.net_wm_moveresize_size_left; + else if (y < D && y >= F && c) + return prop_atoms.net_wm_moveresize_size_right; + else if (y < E && y >= G) + return prop_atoms.net_wm_moveresize_size_bottomleft; + else if (y < G && y < H && d) + return prop_atoms.net_wm_moveresize_size_bottom; + else if (y >= H && y < F) + return prop_atoms.net_wm_moveresize_size_bottomright; + else + return prop_atoms.net_wm_moveresize_move; + +#undef X #undef A #undef B #undef C @@ -1637,6 +1662,7 @@ static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch) #undef b #undef c #undef d +} void action_moveresize(union ActionData *data) { @@ -1706,7 +1732,7 @@ void action_showmenu(union ActionData *data) { if (data->showmenu.name) { menu_show(data->showmenu.name, data->any.x, data->any.y, - data->showmenu.any.c); + data->any.button, data->showmenu.any.c); } } @@ -1878,3 +1904,9 @@ void action_unshow_desktop(union ActionData *data) { screen_show_desktop(FALSE); } + +void action_break_chroot(union ActionData *data) +{ + /* break out of one chroot */ + keyboard_reset_chains(1); +}