Merge branch 'backport' into work
Conflicts: openbox/client.c openbox/event.c openbox/event.h
This commit is contained in:
commit
22a88cfe99
6 changed files with 155 additions and 225 deletions
|
@ -22,10 +22,13 @@ if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS"; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make GTK apps look and behave how they were set up in the gnome config tools
|
# Make GTK apps look and behave how they were set up in the gnome config tools
|
||||||
if which /usr/libexec/gnome-settings-daemon >/dev/null; then
|
if test -x /usr/libexec/gnome-settings-daemon >/dev/null; then
|
||||||
/usr/libexec/gnome-settings-daemon &
|
/usr/libexec/gnome-settings-daemon &
|
||||||
elif which gnome-settings-daemon >/dev/null; then
|
elif which gnome-settings-daemon >/dev/null; then
|
||||||
gnome-settings-daemon &
|
gnome-settings-daemon &
|
||||||
|
# Make GTK apps look and behave how they were set up in the XFCE config tools
|
||||||
|
elif which xfce-mcs-manager >/dev/null; then
|
||||||
|
xfce-mcs-manager n &
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Preload stuff for KDE apps
|
# Preload stuff for KDE apps
|
||||||
|
|
|
@ -460,7 +460,7 @@ void client_manage(Window window, ObPrompt *prompt)
|
||||||
"Not focusing the window because the user is "
|
"Not focusing the window because the user is "
|
||||||
"working in another window");
|
"working in another window");
|
||||||
}
|
}
|
||||||
/* If its a transient (and its parents aren't focused) */
|
/* If it's a transient (and its parents aren't focused) */
|
||||||
else if (client_has_parent(self)) {
|
else if (client_has_parent(self)) {
|
||||||
activate = FALSE;
|
activate = FALSE;
|
||||||
ob_debug_type(OB_DEBUG_FOCUS,
|
ob_debug_type(OB_DEBUG_FOCUS,
|
||||||
|
@ -501,7 +501,7 @@ void client_manage(Window window, ObPrompt *prompt)
|
||||||
if (!activate) {
|
if (!activate) {
|
||||||
ob_debug_type(OB_DEBUG_FOCUS,
|
ob_debug_type(OB_DEBUG_FOCUS,
|
||||||
"Focus stealing prevention activated for %s at "
|
"Focus stealing prevention activated for %s at "
|
||||||
"time %u (last user interactioon time %u)",
|
"time %u (last user interaction time %u)",
|
||||||
self->title, map_time, event_last_user_time);
|
self->title, map_time, event_last_user_time);
|
||||||
/* if the client isn't focused, then hilite it so the user
|
/* if the client isn't focused, then hilite it so the user
|
||||||
knows it is there */
|
knows it is there */
|
||||||
|
@ -598,7 +598,7 @@ ObClient *client_fake_manage(Window window)
|
||||||
|
|
||||||
void client_unmanage_all(void)
|
void client_unmanage_all(void)
|
||||||
{
|
{
|
||||||
while (client_list != NULL)
|
while (client_list)
|
||||||
client_unmanage(client_list->data);
|
client_unmanage(client_list->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1003,7 +1003,7 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
|
||||||
|
|
||||||
/* This makes sure windows aren't entirely outside of the screen so you
|
/* This makes sure windows aren't entirely outside of the screen so you
|
||||||
can't see them at all.
|
can't see them at all.
|
||||||
It makes sure 10% of the window is on the screen at least. At don't
|
It makes sure 10% of the window is on the screen at least. And don't
|
||||||
let it move itself off the top of the screen, which would hide the
|
let it move itself off the top of the screen, which would hide the
|
||||||
titlebar on you. (The user can still do this if they want too, it's
|
titlebar on you. (The user can still do this if they want too, it's
|
||||||
only limiting the application.
|
only limiting the application.
|
||||||
|
@ -1225,7 +1225,7 @@ static void client_get_shaped(ObClient *self)
|
||||||
XShapeQueryExtents(obt_display, self->window, &s, &foo,
|
XShapeQueryExtents(obt_display, self->window, &s, &foo,
|
||||||
&foo, &ufoo, &ufoo, &foo, &foo, &foo, &ufoo,
|
&foo, &ufoo, &ufoo, &foo, &foo, &foo, &ufoo,
|
||||||
&ufoo);
|
&ufoo);
|
||||||
self->shaped = (s != 0);
|
self->shaped = !!s;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -1237,9 +1237,9 @@ void client_update_transient_for(ObClient *self)
|
||||||
gboolean trangroup = FALSE;
|
gboolean trangroup = FALSE;
|
||||||
|
|
||||||
if (XGetTransientForHint(obt_display, self->window, &t)) {
|
if (XGetTransientForHint(obt_display, self->window, &t)) {
|
||||||
if (t != self->window) { /* cant be transient to itself! */
|
if (t != self->window) { /* can't be transient to itself! */
|
||||||
ObWindow *tw = window_find(t);
|
ObWindow *tw = window_find(t);
|
||||||
/* if this happens then we need to check for it*/
|
/* if this happens then we need to check for it */
|
||||||
g_assert(tw != CLIENT_AS_WINDOW(self));
|
g_assert(tw != CLIENT_AS_WINDOW(self));
|
||||||
if (tw && WINDOW_IS_CLIENT(tw)) {
|
if (tw && WINDOW_IS_CLIENT(tw)) {
|
||||||
/* watch out for windows with a parent that is something
|
/* watch out for windows with a parent that is something
|
||||||
|
@ -1327,7 +1327,7 @@ static void client_update_transient_tree(ObClient *self,
|
||||||
/* If we are now transient for a single window we need to add ourselves to
|
/* If we are now transient for a single window we need to add ourselves to
|
||||||
its children
|
its children
|
||||||
|
|
||||||
WARNING: Cyclical transient ness is possible if two windows are
|
WARNING: Cyclical transient-ness is possible if two windows are
|
||||||
transient for eachother.
|
transient for eachother.
|
||||||
*/
|
*/
|
||||||
else if (newparent &&
|
else if (newparent &&
|
||||||
|
@ -1366,7 +1366,7 @@ static void client_update_transient_tree(ObClient *self,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** If we change our group transient-ness, our children change their
|
/** If we change our group transient-ness, our children change their
|
||||||
effect group transient-ness, which affects how they relate to other
|
effective group transient-ness, which affects how they relate to other
|
||||||
group windows **/
|
group windows **/
|
||||||
|
|
||||||
for (it = self->transients; it; it = g_slist_next(it)) {
|
for (it = self->transients; it; it = g_slist_next(it)) {
|
||||||
|
@ -1527,7 +1527,7 @@ void client_update_colormap(ObClient *self, Colormap colormap)
|
||||||
if (client_focused(self)) {
|
if (client_focused(self)) {
|
||||||
screen_install_colormap(self, FALSE); /* uninstall old one */
|
screen_install_colormap(self, FALSE); /* uninstall old one */
|
||||||
self->colormap = colormap;
|
self->colormap = colormap;
|
||||||
screen_install_colormap(self, FALSE); /* install new one */
|
screen_install_colormap(self, TRUE); /* install new one */
|
||||||
} else
|
} else
|
||||||
self->colormap = colormap;
|
self->colormap = colormap;
|
||||||
}
|
}
|
||||||
|
@ -1810,7 +1810,7 @@ void client_update_wmhints(ObClient *self)
|
||||||
{
|
{
|
||||||
XWMHints *hints;
|
XWMHints *hints;
|
||||||
|
|
||||||
/* assume a window takes input if it doesnt specify */
|
/* assume a window takes input if it doesn't specify */
|
||||||
self->can_focus = TRUE;
|
self->can_focus = TRUE;
|
||||||
|
|
||||||
if ((hints = XGetWMHints(obt_display, self->window)) != NULL) {
|
if ((hints = XGetWMHints(obt_display, self->window)) != NULL) {
|
||||||
|
@ -1842,7 +1842,7 @@ void client_update_wmhints(ObClient *self)
|
||||||
ObGroup *oldgroup = self->group;
|
ObGroup *oldgroup = self->group;
|
||||||
|
|
||||||
/* remove from the old group if there was one */
|
/* remove from the old group if there was one */
|
||||||
if (self->group != NULL) {
|
if (self->group) {
|
||||||
group_remove(self->group, self);
|
group_remove(self->group, self);
|
||||||
self->group = NULL;
|
self->group = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1913,7 +1913,7 @@ void client_update_title(ObClient *self)
|
||||||
*/
|
*/
|
||||||
data = g_strdup("");
|
data = g_strdup("");
|
||||||
} else
|
} else
|
||||||
data = g_strdup("Unnamed Window");
|
data = g_strdup(_("Unnamed Window"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self->original_title = g_strdup(data);
|
self->original_title = g_strdup(data);
|
||||||
|
@ -2529,13 +2529,6 @@ gboolean client_hide(ObClient *self)
|
||||||
|
|
||||||
if (!client_should_show(self)) {
|
if (!client_should_show(self)) {
|
||||||
if (self == focus_client) {
|
if (self == focus_client) {
|
||||||
/* if there is a grab going on, then we need to cancel it. if we
|
|
||||||
move focus during the grab, applications will get
|
|
||||||
NotifyWhileGrabbed events and ignore them !
|
|
||||||
|
|
||||||
actions should not rely on being able to move focus during an
|
|
||||||
interactive grab.
|
|
||||||
*/
|
|
||||||
event_cancel_all_key_grabs();
|
event_cancel_all_key_grabs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2748,7 +2741,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
|
||||||
Rect desired = {*x, *y, *w, *h};
|
Rect desired = {*x, *y, *w, *h};
|
||||||
frame_rect_to_frame(self->frame, &desired);
|
frame_rect_to_frame(self->frame, &desired);
|
||||||
|
|
||||||
/* make the frame recalculate its dimentions n shit without changing
|
/* make the frame recalculate its dimensions n shit without changing
|
||||||
anything visible for real, this way the constraints below can work with
|
anything visible for real, this way the constraints below can work with
|
||||||
the updated frame dimensions. */
|
the updated frame dimensions. */
|
||||||
frame_adjust_area(self->frame, FALSE, TRUE, TRUE);
|
frame_adjust_area(self->frame, FALSE, TRUE, TRUE);
|
||||||
|
@ -2803,7 +2796,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
|
||||||
/* gets the client's position */
|
/* gets the client's position */
|
||||||
frame_frame_gravity(self->frame, x, y);
|
frame_frame_gravity(self->frame, x, y);
|
||||||
|
|
||||||
/* work within the prefered sizes given by the window */
|
/* work within the preferred sizes given by the window */
|
||||||
if (!(*w == self->area.width && *h == self->area.height)) {
|
if (!(*w == self->area.width && *h == self->area.height)) {
|
||||||
gint basew, baseh, minw, minh;
|
gint basew, baseh, minw, minh;
|
||||||
gint incw, inch;
|
gint incw, inch;
|
||||||
|
@ -2833,6 +2826,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
|
||||||
minh = self->base_size.height;
|
minh = self->base_size.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This comment is no longer true */
|
||||||
/* if this is a user-requested resize, then check against min/max
|
/* if this is a user-requested resize, then check against min/max
|
||||||
sizes */
|
sizes */
|
||||||
|
|
||||||
|
@ -3068,7 +3062,7 @@ void client_fullscreen(ObClient *self, gboolean fs)
|
||||||
if (fs) {
|
if (fs) {
|
||||||
self->pre_fullscreen_area = self->area;
|
self->pre_fullscreen_area = self->area;
|
||||||
/* if the window is maximized, its area isn't all that meaningful.
|
/* if the window is maximized, its area isn't all that meaningful.
|
||||||
save it's premax area instead. */
|
save its premax area instead. */
|
||||||
if (self->max_horz) {
|
if (self->max_horz) {
|
||||||
self->pre_fullscreen_area.x = self->pre_max_area.x;
|
self->pre_fullscreen_area.x = self->pre_max_area.x;
|
||||||
self->pre_fullscreen_area.width = self->pre_max_area.width;
|
self->pre_fullscreen_area.width = self->pre_max_area.width;
|
||||||
|
@ -3119,7 +3113,6 @@ static void client_iconify_recursive(ObClient *self,
|
||||||
GSList *it;
|
GSList *it;
|
||||||
gboolean changed = FALSE;
|
gboolean changed = FALSE;
|
||||||
|
|
||||||
|
|
||||||
if (self->iconic != iconic) {
|
if (self->iconic != iconic) {
|
||||||
ob_debug("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"),
|
ob_debug("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"),
|
||||||
self->window);
|
self->window);
|
||||||
|
@ -3335,10 +3328,11 @@ static void client_prompt_kill(ObClient *self)
|
||||||
/* check if we're already prompting */
|
/* check if we're already prompting */
|
||||||
if (!self->kill_prompt) {
|
if (!self->kill_prompt) {
|
||||||
ObPromptAnswer answers[] = {
|
ObPromptAnswer answers[] = {
|
||||||
{ _("Cancel"), OB_KILL_RESULT_NO },
|
{ 0, OB_KILL_RESULT_NO },
|
||||||
{ _("Force Exit"), OB_KILL_RESULT_YES }
|
{ 0, OB_KILL_RESULT_YES }
|
||||||
};
|
};
|
||||||
gchar *m;
|
gchar *m;
|
||||||
|
const gchar *y;
|
||||||
|
|
||||||
if (client_on_localhost(self)) {
|
if (client_on_localhost(self)) {
|
||||||
const gchar *sig;
|
const gchar *sig;
|
||||||
|
@ -3349,12 +3343,19 @@ static void client_prompt_kill(ObClient *self)
|
||||||
sig = "kill";
|
sig = "kill";
|
||||||
|
|
||||||
m = g_strdup_printf
|
m = g_strdup_printf
|
||||||
(_("The window \"%s\" does not seem to be responding. Do you want to force it to exit by sending the %s signal?"), self->original_title, sig);
|
(_("The window \"%s\" does not seem to be responding. Do you want to force it to exit by sending the %s signal?"),
|
||||||
|
self->original_title, sig);
|
||||||
|
y = _("End Process");
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
m = g_strdup_printf
|
m = g_strdup_printf
|
||||||
(_("The window \"%s\" does not seem to be responding. Do you want to disconnect it from the X server?"), self->original_title);
|
(_("The window \"%s\" does not seem to be responding. Do you want to disconnect it from the X server?"),
|
||||||
|
self->original_title);
|
||||||
|
y = _("Disconnect");
|
||||||
|
}
|
||||||
|
/* set the dialog buttons' text */
|
||||||
|
answers[0].text = _("Cancel"); /* "no" */
|
||||||
|
answers[1].text = y; /* "yes" */
|
||||||
|
|
||||||
self->kill_prompt = prompt_new(m, answers,
|
self->kill_prompt = prompt_new(m, answers,
|
||||||
sizeof(answers)/sizeof(answers[0]),
|
sizeof(answers)/sizeof(answers[0]),
|
||||||
|
@ -3735,13 +3736,6 @@ gboolean client_focus(ObClient *self)
|
||||||
go moving on us */
|
go moving on us */
|
||||||
event_halt_focus_delay();
|
event_halt_focus_delay();
|
||||||
|
|
||||||
/* if there is a grab going on, then we need to cancel it. if we move
|
|
||||||
focus during the grab, applications will get NotifyWhileGrabbed events
|
|
||||||
and ignore them !
|
|
||||||
|
|
||||||
actions should not rely on being able to move focus during an
|
|
||||||
interactive grab.
|
|
||||||
*/
|
|
||||||
event_cancel_all_key_grabs();
|
event_cancel_all_key_grabs();
|
||||||
|
|
||||||
obt_display_ignore_errors(TRUE);
|
obt_display_ignore_errors(TRUE);
|
||||||
|
@ -3801,6 +3795,8 @@ static void client_present(ObClient *self, gboolean here, gboolean raise,
|
||||||
client_focus(self);
|
client_focus(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this function exists to map to the client_activate message in the ewmh,
|
||||||
|
the user arg is unused because nobody uses it correctly anyway. */
|
||||||
void client_activate(ObClient *self, gboolean here, gboolean raise,
|
void client_activate(ObClient *self, gboolean here, gboolean raise,
|
||||||
gboolean unshade, gboolean user)
|
gboolean unshade, gboolean user)
|
||||||
{
|
{
|
||||||
|
@ -3846,8 +3842,6 @@ gboolean client_focused(ObClient *self)
|
||||||
return self == focus_client;
|
return self == focus_client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RrImage* client_icon(ObClient *self)
|
RrImage* client_icon(ObClient *self)
|
||||||
{
|
{
|
||||||
RrImage *ret = NULL;
|
RrImage *ret = NULL;
|
||||||
|
|
266
openbox/event.c
266
openbox/event.c
|
@ -841,11 +841,63 @@ void event_enter_client(ObClient *client)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean *context_to_button(ObFrame *f, ObFrameContext con, gboolean press)
|
||||||
|
{
|
||||||
|
if (press) {
|
||||||
|
switch (con) {
|
||||||
|
case OB_FRAME_CONTEXT_MAXIMIZE:
|
||||||
|
return &f->max_press;
|
||||||
|
case OB_FRAME_CONTEXT_CLOSE:
|
||||||
|
return &f->close_press;
|
||||||
|
case OB_FRAME_CONTEXT_ICONIFY:
|
||||||
|
return &f->iconify_press;
|
||||||
|
case OB_FRAME_CONTEXT_ALLDESKTOPS:
|
||||||
|
return &f->desk_press;
|
||||||
|
case OB_FRAME_CONTEXT_SHADE:
|
||||||
|
return &f->shade_press;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (con) {
|
||||||
|
case OB_FRAME_CONTEXT_MAXIMIZE:
|
||||||
|
return &f->max_hover;
|
||||||
|
case OB_FRAME_CONTEXT_CLOSE:
|
||||||
|
return &f->close_hover;
|
||||||
|
case OB_FRAME_CONTEXT_ICONIFY:
|
||||||
|
return &f->iconify_hover;
|
||||||
|
case OB_FRAME_CONTEXT_ALLDESKTOPS:
|
||||||
|
return &f->desk_hover;
|
||||||
|
case OB_FRAME_CONTEXT_SHADE:
|
||||||
|
return &f->shade_hover;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void compress_client_message_event(XEvent *e, XEvent *ce, Window window,
|
||||||
|
Atom msgtype)
|
||||||
|
{
|
||||||
|
/* compress changes into a single change */
|
||||||
|
while (XCheckTypedWindowEvent(obt_display, window, e->type, ce)) {
|
||||||
|
/* XXX: it would be nice to compress ALL messages of a
|
||||||
|
type, not just messages in a row without other
|
||||||
|
message types between. */
|
||||||
|
if (ce->xclient.message_type != msgtype) {
|
||||||
|
XPutBackEvent(obt_display, ce);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
e->xclient = ce->xclient;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void event_handle_client(ObClient *client, XEvent *e)
|
static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
{
|
{
|
||||||
XEvent ce;
|
XEvent ce;
|
||||||
Atom msgtype;
|
Atom msgtype;
|
||||||
ObFrameContext con;
|
ObFrameContext con;
|
||||||
|
gboolean *but;
|
||||||
static gint px = -1, py = -1;
|
static gint px = -1, py = -1;
|
||||||
static guint pb = 0;
|
static guint pb = 0;
|
||||||
static ObFrameContext pcon = OB_FRAME_CONTEXT_NONE;
|
static ObFrameContext pcon = OB_FRAME_CONTEXT_NONE;
|
||||||
|
@ -883,30 +935,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
e->xbutton.button == pb)
|
e->xbutton.button == pb)
|
||||||
pb = 0, px = py = -1, pcon = OB_FRAME_CONTEXT_NONE;
|
pb = 0, px = py = -1, pcon = OB_FRAME_CONTEXT_NONE;
|
||||||
|
|
||||||
switch (con) {
|
but = context_to_button(client->frame, con, TRUE);
|
||||||
case OB_FRAME_CONTEXT_MAXIMIZE:
|
if (but) {
|
||||||
client->frame->max_press = (e->type == ButtonPress);
|
*but = (e->type == ButtonPress);
|
||||||
frame_adjust_state(client->frame);
|
frame_adjust_state(client->frame);
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_CLOSE:
|
|
||||||
client->frame->close_press = (e->type == ButtonPress);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ICONIFY:
|
|
||||||
client->frame->iconify_press = (e->type == ButtonPress);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ALLDESKTOPS:
|
|
||||||
client->frame->desk_press = (e->type == ButtonPress);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_SHADE:
|
|
||||||
client->frame->shade_press = (e->type == ButtonPress);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* nothing changes with clicks for any other contexts */
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -926,45 +958,20 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
client->frame->shade_hover || client->frame->iconify_hover ||
|
client->frame->shade_hover || client->frame->iconify_hover ||
|
||||||
client->frame->close_hover)
|
client->frame->close_hover)
|
||||||
{
|
{
|
||||||
client->frame->max_hover = FALSE;
|
client->frame->max_hover =
|
||||||
client->frame->desk_hover = FALSE;
|
client->frame->desk_hover =
|
||||||
client->frame->shade_hover = FALSE;
|
client->frame->shade_hover =
|
||||||
client->frame->iconify_hover = FALSE;
|
client->frame->iconify_hover =
|
||||||
client->frame->close_hover = FALSE;
|
client->frame->close_hover = FALSE;
|
||||||
frame_adjust_state(client->frame);
|
frame_adjust_state(client->frame);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OB_FRAME_CONTEXT_MAXIMIZE:
|
|
||||||
if (!client->frame->max_hover && !pb) {
|
|
||||||
client->frame->max_hover = TRUE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ALLDESKTOPS:
|
|
||||||
if (!client->frame->desk_hover && !pb) {
|
|
||||||
client->frame->desk_hover = TRUE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_SHADE:
|
|
||||||
if (!client->frame->shade_hover && !pb) {
|
|
||||||
client->frame->shade_hover = TRUE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ICONIFY:
|
|
||||||
if (!client->frame->iconify_hover && !pb) {
|
|
||||||
client->frame->iconify_hover = TRUE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_CLOSE:
|
|
||||||
if (!client->frame->close_hover && !pb) {
|
|
||||||
client->frame->close_hover = TRUE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
|
but = context_to_button(client->frame, con, FALSE);
|
||||||
|
if (but && !*but && !pb) {
|
||||||
|
*but = TRUE;
|
||||||
|
frame_adjust_state(client->frame);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -976,49 +983,18 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
case OB_FRAME_CONTEXT_TLCORNER:
|
case OB_FRAME_CONTEXT_TLCORNER:
|
||||||
case OB_FRAME_CONTEXT_TRCORNER:
|
case OB_FRAME_CONTEXT_TRCORNER:
|
||||||
/* we've left the button area inside the titlebar */
|
/* we've left the button area inside the titlebar */
|
||||||
client->frame->max_hover = FALSE;
|
client->frame->max_hover =
|
||||||
client->frame->desk_hover = FALSE;
|
client->frame->desk_hover =
|
||||||
client->frame->shade_hover = FALSE;
|
client->frame->shade_hover =
|
||||||
client->frame->iconify_hover = FALSE;
|
client->frame->iconify_hover =
|
||||||
client->frame->close_hover = FALSE;
|
client->frame->close_hover = FALSE;
|
||||||
if (e->xcrossing.mode == NotifyGrab) {
|
if (e->xcrossing.mode == NotifyGrab) {
|
||||||
client->frame->max_press = FALSE;
|
client->frame->max_press =
|
||||||
client->frame->desk_press = FALSE;
|
client->frame->desk_press =
|
||||||
client->frame->shade_press = FALSE;
|
client->frame->shade_press =
|
||||||
client->frame->iconify_press = FALSE;
|
client->frame->iconify_press =
|
||||||
client->frame->close_press = FALSE;
|
client->frame->close_press = FALSE;
|
||||||
}
|
}
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_MAXIMIZE:
|
|
||||||
client->frame->max_hover = FALSE;
|
|
||||||
if (e->xcrossing.mode == NotifyGrab)
|
|
||||||
client->frame->max_press = FALSE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ALLDESKTOPS:
|
|
||||||
client->frame->desk_hover = FALSE;
|
|
||||||
if (e->xcrossing.mode == NotifyGrab)
|
|
||||||
client->frame->desk_press = FALSE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_SHADE:
|
|
||||||
client->frame->shade_hover = FALSE;
|
|
||||||
if (e->xcrossing.mode == NotifyGrab)
|
|
||||||
client->frame->shade_press = FALSE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ICONIFY:
|
|
||||||
client->frame->iconify_hover = FALSE;
|
|
||||||
if (e->xcrossing.mode == NotifyGrab)
|
|
||||||
client->frame->iconify_press = FALSE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_CLOSE:
|
|
||||||
client->frame->close_hover = FALSE;
|
|
||||||
if (e->xcrossing.mode == NotifyGrab)
|
|
||||||
client->frame->close_press = FALSE;
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
break;
|
||||||
case OB_FRAME_CONTEXT_FRAME:
|
case OB_FRAME_CONTEXT_FRAME:
|
||||||
/* When the mouse leaves an animating window, don't use the
|
/* When the mouse leaves an animating window, don't use the
|
||||||
|
@ -1046,6 +1022,15 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
but = context_to_button(client->frame, con, FALSE);
|
||||||
|
if (but) {
|
||||||
|
*but = FALSE;
|
||||||
|
if (e->xcrossing.mode == NotifyGrab) {
|
||||||
|
but = context_to_button(client->frame, con, TRUE);
|
||||||
|
*but = FALSE;
|
||||||
|
}
|
||||||
|
frame_adjust_state(client->frame);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1054,36 +1039,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
con = frame_context(client, e->xcrossing.window,
|
con = frame_context(client, e->xcrossing.window,
|
||||||
e->xcrossing.x, e->xcrossing.y);
|
e->xcrossing.x, e->xcrossing.y);
|
||||||
switch (con) {
|
switch (con) {
|
||||||
case OB_FRAME_CONTEXT_MAXIMIZE:
|
|
||||||
client->frame->max_hover = TRUE;
|
|
||||||
if (e->xcrossing.mode == NotifyUngrab)
|
|
||||||
client->frame->max_press = (con == pcon);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ALLDESKTOPS:
|
|
||||||
client->frame->desk_hover = TRUE;
|
|
||||||
if (e->xcrossing.mode == NotifyUngrab)
|
|
||||||
client->frame->desk_press = (con == pcon);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_SHADE:
|
|
||||||
client->frame->shade_hover = TRUE;
|
|
||||||
if (e->xcrossing.mode == NotifyUngrab)
|
|
||||||
client->frame->shade_press = (con == pcon);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_ICONIFY:
|
|
||||||
client->frame->iconify_hover = TRUE;
|
|
||||||
if (e->xcrossing.mode == NotifyUngrab)
|
|
||||||
client->frame->iconify_press = (con == pcon);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_CLOSE:
|
|
||||||
client->frame->close_hover = TRUE;
|
|
||||||
if (e->xcrossing.mode == NotifyUngrab)
|
|
||||||
client->frame->close_press = (con == pcon);
|
|
||||||
frame_adjust_state(client->frame);
|
|
||||||
break;
|
|
||||||
case OB_FRAME_CONTEXT_FRAME:
|
case OB_FRAME_CONTEXT_FRAME:
|
||||||
if (grab_on_keyboard())
|
if (grab_on_keyboard())
|
||||||
break;
|
break;
|
||||||
|
@ -1115,6 +1070,15 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
but = context_to_button(client->frame, con, FALSE);
|
||||||
|
if (but) {
|
||||||
|
*but = TRUE;
|
||||||
|
if (e->xcrossing.mode == NotifyUngrab) {
|
||||||
|
but = context_to_button(client->frame, con, TRUE);
|
||||||
|
*but = (con == pcon);
|
||||||
|
}
|
||||||
|
frame_adjust_state(client->frame);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1135,7 +1099,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
RECT_TO_DIMS(client->area, x, y, w, h);
|
RECT_TO_DIMS(client->area, x, y, w, h);
|
||||||
|
|
||||||
ob_debug("ConfigureRequest for \"%s\" desktop %d wmstate %d "
|
ob_debug("ConfigureRequest for \"%s\" desktop %d wmstate %d "
|
||||||
"visibile %d",
|
"visible %d",
|
||||||
client->title,
|
client->title,
|
||||||
screen_desktop, client->wmstate, client->frame->visible);
|
screen_desktop, client->wmstate, client->frame->visible);
|
||||||
ob_debug(" x %d y %d w %d h %d b %d",
|
ob_debug(" x %d y %d w %d h %d b %d",
|
||||||
|
@ -1148,7 +1112,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
/* if the border width is changing then that is the same
|
/* if the border width is changing then that is the same
|
||||||
as requesting a resize, but we don't actually change
|
as requesting a resize, but we don't actually change
|
||||||
the client's border, so it will change their root
|
the client's border, so it will change their root
|
||||||
coordiantes (since they include the border width) and
|
coordinates (since they include the border width) and
|
||||||
we need to a notify then */
|
we need to a notify then */
|
||||||
move = TRUE;
|
move = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1192,16 +1156,14 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
(e->xconfigurerequest.value_mask & CWWidth) ||
|
(e->xconfigurerequest.value_mask & CWWidth) ||
|
||||||
(e->xconfigurerequest.value_mask & CWHeight))
|
(e->xconfigurerequest.value_mask & CWHeight))
|
||||||
{
|
{
|
||||||
if (e->xconfigurerequest.value_mask & CWX) {
|
|
||||||
/* don't allow clients to move shaded windows (fvwm does this)
|
/* don't allow clients to move shaded windows (fvwm does this)
|
||||||
*/
|
*/
|
||||||
|
if (e->xconfigurerequest.value_mask & CWX) {
|
||||||
if (!client->shaded)
|
if (!client->shaded)
|
||||||
x = e->xconfigurerequest.x;
|
x = e->xconfigurerequest.x;
|
||||||
move = TRUE;
|
move = TRUE;
|
||||||
}
|
}
|
||||||
if (e->xconfigurerequest.value_mask & CWY) {
|
if (e->xconfigurerequest.value_mask & CWY) {
|
||||||
/* don't allow clients to move shaded windows (fvwm does this)
|
|
||||||
*/
|
|
||||||
if (!client->shaded)
|
if (!client->shaded)
|
||||||
y = e->xconfigurerequest.y;
|
y = e->xconfigurerequest.y;
|
||||||
move = TRUE;
|
move = TRUE;
|
||||||
|
@ -1255,7 +1217,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
gint lw,lh;
|
gint lw, lh;
|
||||||
|
|
||||||
client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
|
client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
|
||||||
|
|
||||||
|
@ -1264,8 +1226,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
if ((e->xconfigurerequest.value_mask & CWWidth &&
|
if ((e->xconfigurerequest.value_mask & CWWidth &&
|
||||||
!(e->xconfigurerequest.value_mask & CWX)))
|
!(e->xconfigurerequest.value_mask & CWX)))
|
||||||
client_gravity_resize_w(client, &x, client->area.width, w);
|
client_gravity_resize_w(client, &x, client->area.width, w);
|
||||||
/* if y was not given, then use gravity to figure out the new
|
/* same for y */
|
||||||
y. the reference point should not be moved */
|
|
||||||
if ((e->xconfigurerequest.value_mask & CWHeight &&
|
if ((e->xconfigurerequest.value_mask & CWHeight &&
|
||||||
!(e->xconfigurerequest.value_mask & CWY)))
|
!(e->xconfigurerequest.value_mask & CWY)))
|
||||||
client_gravity_resize_h(client, &y, client->area.height,h);
|
client_gravity_resize_h(client, &y, client->area.height,h);
|
||||||
|
@ -1328,32 +1289,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
|
|
||||||
msgtype = e->xclient.message_type;
|
msgtype = e->xclient.message_type;
|
||||||
if (msgtype == OBT_PROP_ATOM(WM_CHANGE_STATE)) {
|
if (msgtype == OBT_PROP_ATOM(WM_CHANGE_STATE)) {
|
||||||
/* compress changes into a single change */
|
compress_client_message_event(e, &ce, client->window, msgtype);
|
||||||
while (XCheckTypedWindowEvent(obt_display, client->window,
|
|
||||||
e->type, &ce)) {
|
|
||||||
/* XXX: it would be nice to compress ALL messages of a
|
|
||||||
type, not just messages in a row without other
|
|
||||||
message types between. */
|
|
||||||
if (ce.xclient.message_type != msgtype) {
|
|
||||||
XPutBackEvent(obt_display, &ce);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
e->xclient = ce.xclient;
|
|
||||||
}
|
|
||||||
client_set_wm_state(client, e->xclient.data.l[0]);
|
client_set_wm_state(client, e->xclient.data.l[0]);
|
||||||
} else if (msgtype == OBT_PROP_ATOM(NET_WM_DESKTOP)) {
|
} else if (msgtype == OBT_PROP_ATOM(NET_WM_DESKTOP)) {
|
||||||
/* compress changes into a single change */
|
compress_client_message_event(e, &ce, client->window, msgtype);
|
||||||
while (XCheckTypedWindowEvent(obt_display, client->window,
|
|
||||||
e->type, &ce)) {
|
|
||||||
/* XXX: it would be nice to compress ALL messages of a
|
|
||||||
type, not just messages in a row without other
|
|
||||||
message types between. */
|
|
||||||
if (ce.xclient.message_type != msgtype) {
|
|
||||||
XPutBackEvent(obt_display, &ce);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
e->xclient = ce.xclient;
|
|
||||||
}
|
|
||||||
if ((unsigned)e->xclient.data.l[0] < screen_num_desktops ||
|
if ((unsigned)e->xclient.data.l[0] < screen_num_desktops ||
|
||||||
(unsigned)e->xclient.data.l[0] == DESKTOP_ALL)
|
(unsigned)e->xclient.data.l[0] == DESKTOP_ALL)
|
||||||
client_set_desktop(client, (unsigned)e->xclient.data.l[0],
|
client_set_desktop(client, (unsigned)e->xclient.data.l[0],
|
||||||
|
@ -1468,8 +1407,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
if (e->xclient.data.l[0] & 1 << 11) {
|
if (e->xclient.data.l[0] & 1 << 11) {
|
||||||
h = e->xclient.data.l[4];
|
h = e->xclient.data.l[4];
|
||||||
|
|
||||||
/* if y was not given, then use gravity to figure out the new
|
/* same for y */
|
||||||
y. the reference point should not be moved */
|
|
||||||
if (!(e->xclient.data.l[0] & 1 << 9))
|
if (!(e->xclient.data.l[0] & 1 << 9))
|
||||||
client_gravity_resize_h(client, &y, client->area.height,h);
|
client_gravity_resize_h(client, &y, client->area.height,h);
|
||||||
}
|
}
|
||||||
|
@ -1598,10 +1536,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
client_update_protocols(client);
|
client_update_protocols(client);
|
||||||
client_setup_decor_and_functions(client, TRUE);
|
client_setup_decor_and_functions(client, TRUE);
|
||||||
}
|
}
|
||||||
else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT)) {
|
else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT) ||
|
||||||
client_update_strut(client);
|
msgtype == OBT_PROP_ATOM(NET_WM_STRUT_PARTIAL)) {
|
||||||
}
|
|
||||||
else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT_PARTIAL)) {
|
|
||||||
client_update_strut(client);
|
client_update_strut(client);
|
||||||
}
|
}
|
||||||
else if (msgtype == OBT_PROP_ATOM(NET_WM_ICON)) {
|
else if (msgtype == OBT_PROP_ATOM(NET_WM_ICON)) {
|
||||||
|
@ -1677,8 +1613,6 @@ static void event_handle_dockapp(ObDockApp *app, XEvent *e)
|
||||||
dock_unmanage(app, TRUE);
|
dock_unmanage(app, TRUE);
|
||||||
break;
|
break;
|
||||||
case DestroyNotify:
|
case DestroyNotify:
|
||||||
dock_unmanage(app, FALSE);
|
|
||||||
break;
|
|
||||||
case ReparentNotify:
|
case ReparentNotify:
|
||||||
dock_unmanage(app, FALSE);
|
dock_unmanage(app, FALSE);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -45,7 +45,13 @@ void event_enter_client(struct _ObClient *client);
|
||||||
gulong event_start_ignore_all_enters(void);
|
gulong event_start_ignore_all_enters(void);
|
||||||
void event_end_ignore_all_enters(gulong start);
|
void event_end_ignore_all_enters(gulong start);
|
||||||
|
|
||||||
/*! End *all* active and passive grabs on the keyboard */
|
/*! End *all* active and passive grabs on the keyboard
|
||||||
|
This is called in situations where if there is a grab going on, then
|
||||||
|
we need to cancel it. If we move focus during the grab, applications
|
||||||
|
will get NotifyWhileGrabbed events and ignore them!
|
||||||
|
|
||||||
|
Actions should not rely on being able to move focus during an
|
||||||
|
interactive grab. */
|
||||||
void event_cancel_all_key_grabs(void);
|
void event_cancel_all_key_grabs(void);
|
||||||
|
|
||||||
/* Halts any focus delay in progress, use this when the user is selecting a
|
/* Halts any focus delay in progress, use this when the user is selecting a
|
||||||
|
|
|
@ -196,13 +196,6 @@ void focus_nothing(void)
|
||||||
/* nothing is focused, update the colormap and _the root property_ */
|
/* nothing is focused, update the colormap and _the root property_ */
|
||||||
focus_set_client(NULL);
|
focus_set_client(NULL);
|
||||||
|
|
||||||
/* if there is a grab going on, then we need to cancel it. if we move
|
|
||||||
focus during the grab, applications will get NotifyWhileGrabbed events
|
|
||||||
and ignore them !
|
|
||||||
|
|
||||||
actions should not rely on being able to move focus during an
|
|
||||||
interactive grab.
|
|
||||||
*/
|
|
||||||
event_cancel_all_key_grabs();
|
event_cancel_all_key_grabs();
|
||||||
|
|
||||||
/* when nothing will be focused, send focus to the backup target */
|
/* when nothing will be focused, send focus to the backup target */
|
||||||
|
|
|
@ -74,7 +74,7 @@ typedef enum {
|
||||||
/*! Display a button to toggle the window's placement on
|
/*! Display a button to toggle the window's placement on
|
||||||
all desktops */
|
all desktops */
|
||||||
OB_FRAME_DECOR_ALLDESKTOPS = 1 << 7,
|
OB_FRAME_DECOR_ALLDESKTOPS = 1 << 7,
|
||||||
OB_FRAME_DECOR_SHADE = 1 << 8, /*!< Displays a shade button */
|
OB_FRAME_DECOR_SHADE = 1 << 8, /*!< Display a shade button */
|
||||||
OB_FRAME_DECOR_CLOSE = 1 << 9 /*!< Display a close button */
|
OB_FRAME_DECOR_CLOSE = 1 << 9 /*!< Display a close button */
|
||||||
} ObFrameDecorations;
|
} ObFrameDecorations;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue