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
|
||||
|
||||
# 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 &
|
||||
elif which gnome-settings-daemon >/dev/null; then
|
||||
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
|
||||
|
||||
# Preload stuff for KDE apps
|
||||
|
|
|
@ -67,7 +67,7 @@ typedef struct
|
|||
gpointer data;
|
||||
} ClientCallback;
|
||||
|
||||
GList *client_list = NULL;
|
||||
GList *client_list = NULL;
|
||||
|
||||
static GSList *client_destroy_notifies = NULL;
|
||||
static RrImage *client_default_icon = NULL;
|
||||
|
@ -460,7 +460,7 @@ void client_manage(Window window, ObPrompt *prompt)
|
|||
"Not focusing the window because the user is "
|
||||
"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)) {
|
||||
activate = FALSE;
|
||||
ob_debug_type(OB_DEBUG_FOCUS,
|
||||
|
@ -501,7 +501,7 @@ void client_manage(Window window, ObPrompt *prompt)
|
|||
if (!activate) {
|
||||
ob_debug_type(OB_DEBUG_FOCUS,
|
||||
"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);
|
||||
/* if the client isn't focused, then hilite it so the user
|
||||
knows it is there */
|
||||
|
@ -598,7 +598,7 @@ ObClient *client_fake_manage(Window window)
|
|||
|
||||
void client_unmanage_all(void)
|
||||
{
|
||||
while (client_list != NULL)
|
||||
while (client_list)
|
||||
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
|
||||
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
|
||||
titlebar on you. (The user can still do this if they want too, it's
|
||||
only limiting the application.
|
||||
|
@ -1214,7 +1214,7 @@ static void client_get_state(ObClient *self)
|
|||
static void client_get_shaped(ObClient *self)
|
||||
{
|
||||
self->shaped = FALSE;
|
||||
#ifdef SHAPE
|
||||
#ifdef SHAPE
|
||||
if (obt_display_extension_shape) {
|
||||
gint foo;
|
||||
guint ufoo;
|
||||
|
@ -1225,7 +1225,7 @@ static void client_get_shaped(ObClient *self)
|
|||
XShapeQueryExtents(obt_display, self->window, &s, &foo,
|
||||
&foo, &ufoo, &ufoo, &foo, &foo, &foo, &ufoo,
|
||||
&ufoo);
|
||||
self->shaped = (s != 0);
|
||||
self->shaped = !!s;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1237,9 +1237,9 @@ void client_update_transient_for(ObClient *self)
|
|||
gboolean trangroup = FALSE;
|
||||
|
||||
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);
|
||||
/* 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));
|
||||
if (tw && WINDOW_IS_CLIENT(tw)) {
|
||||
/* 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
|
||||
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.
|
||||
*/
|
||||
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
|
||||
effect group transient-ness, which affects how they relate to other
|
||||
effective group transient-ness, which affects how they relate to other
|
||||
group windows **/
|
||||
|
||||
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)) {
|
||||
screen_install_colormap(self, FALSE); /* uninstall old one */
|
||||
self->colormap = colormap;
|
||||
screen_install_colormap(self, FALSE); /* install new one */
|
||||
screen_install_colormap(self, TRUE); /* install new one */
|
||||
} else
|
||||
self->colormap = colormap;
|
||||
}
|
||||
|
@ -1810,7 +1810,7 @@ void client_update_wmhints(ObClient *self)
|
|||
{
|
||||
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;
|
||||
|
||||
if ((hints = XGetWMHints(obt_display, self->window)) != NULL) {
|
||||
|
@ -1842,7 +1842,7 @@ void client_update_wmhints(ObClient *self)
|
|||
ObGroup *oldgroup = self->group;
|
||||
|
||||
/* remove from the old group if there was one */
|
||||
if (self->group != NULL) {
|
||||
if (self->group) {
|
||||
group_remove(self->group, self);
|
||||
self->group = NULL;
|
||||
}
|
||||
|
@ -1913,7 +1913,7 @@ void client_update_title(ObClient *self)
|
|||
*/
|
||||
data = g_strdup("");
|
||||
} else
|
||||
data = g_strdup("Unnamed Window");
|
||||
data = g_strdup(_("Unnamed Window"));
|
||||
}
|
||||
}
|
||||
self->original_title = g_strdup(data);
|
||||
|
@ -2529,13 +2529,6 @@ gboolean client_hide(ObClient *self)
|
|||
|
||||
if (!client_should_show(self)) {
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -2748,7 +2741,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
|
|||
Rect desired = {*x, *y, *w, *h};
|
||||
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
|
||||
the updated frame dimensions. */
|
||||
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 */
|
||||
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)) {
|
||||
gint basew, baseh, minw, minh;
|
||||
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;
|
||||
}
|
||||
|
||||
/* This comment is no longer true */
|
||||
/* if this is a user-requested resize, then check against min/max
|
||||
sizes */
|
||||
|
||||
|
@ -3068,7 +3062,7 @@ void client_fullscreen(ObClient *self, gboolean fs)
|
|||
if (fs) {
|
||||
self->pre_fullscreen_area = self->area;
|
||||
/* 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) {
|
||||
self->pre_fullscreen_area.x = self->pre_max_area.x;
|
||||
self->pre_fullscreen_area.width = self->pre_max_area.width;
|
||||
|
@ -3119,7 +3113,6 @@ static void client_iconify_recursive(ObClient *self,
|
|||
GSList *it;
|
||||
gboolean changed = FALSE;
|
||||
|
||||
|
||||
if (self->iconic != iconic) {
|
||||
ob_debug("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"),
|
||||
self->window);
|
||||
|
@ -3335,10 +3328,11 @@ static void client_prompt_kill(ObClient *self)
|
|||
/* check if we're already prompting */
|
||||
if (!self->kill_prompt) {
|
||||
ObPromptAnswer answers[] = {
|
||||
{ _("Cancel"), OB_KILL_RESULT_NO },
|
||||
{ _("Force Exit"), OB_KILL_RESULT_YES }
|
||||
{ 0, OB_KILL_RESULT_NO },
|
||||
{ 0, OB_KILL_RESULT_YES }
|
||||
};
|
||||
gchar *m;
|
||||
const gchar *y;
|
||||
|
||||
if (client_on_localhost(self)) {
|
||||
const gchar *sig;
|
||||
|
@ -3349,12 +3343,19 @@ static void client_prompt_kill(ObClient *self)
|
|||
sig = "kill";
|
||||
|
||||
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
|
||||
(_("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,
|
||||
sizeof(answers)/sizeof(answers[0]),
|
||||
|
@ -3735,13 +3736,6 @@ gboolean client_focus(ObClient *self)
|
|||
go moving on us */
|
||||
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();
|
||||
|
||||
obt_display_ignore_errors(TRUE);
|
||||
|
@ -3801,6 +3795,8 @@ static void client_present(ObClient *self, gboolean here, gboolean raise,
|
|||
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,
|
||||
gboolean unshade, gboolean user)
|
||||
{
|
||||
|
@ -3846,8 +3842,6 @@ gboolean client_focused(ObClient *self)
|
|||
return self == focus_client;
|
||||
}
|
||||
|
||||
|
||||
|
||||
RrImage* client_icon(ObClient *self)
|
||||
{
|
||||
RrImage *ret = NULL;
|
||||
|
|
274
openbox/event.c
274
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)
|
||||
{
|
||||
XEvent ce;
|
||||
Atom msgtype;
|
||||
ObFrameContext con;
|
||||
gboolean *but;
|
||||
static gint px = -1, py = -1;
|
||||
static guint pb = 0;
|
||||
static ObFrameContext pcon = OB_FRAME_CONTEXT_NONE;
|
||||
|
@ -883,30 +935,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
e->xbutton.button == pb)
|
||||
pb = 0, px = py = -1, pcon = OB_FRAME_CONTEXT_NONE;
|
||||
|
||||
switch (con) {
|
||||
case OB_FRAME_CONTEXT_MAXIMIZE:
|
||||
client->frame->max_press = (e->type == ButtonPress);
|
||||
but = context_to_button(client->frame, con, TRUE);
|
||||
if (but) {
|
||||
*but = (e->type == ButtonPress);
|
||||
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;
|
||||
|
@ -926,45 +958,20 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
client->frame->shade_hover || client->frame->iconify_hover ||
|
||||
client->frame->close_hover)
|
||||
{
|
||||
client->frame->max_hover = FALSE;
|
||||
client->frame->desk_hover = FALSE;
|
||||
client->frame->shade_hover = FALSE;
|
||||
client->frame->iconify_hover = FALSE;
|
||||
client->frame->close_hover = FALSE;
|
||||
frame_adjust_state(client->frame);
|
||||
}
|
||||
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;
|
||||
client->frame->max_hover =
|
||||
client->frame->desk_hover =
|
||||
client->frame->shade_hover =
|
||||
client->frame->iconify_hover =
|
||||
client->frame->close_hover = FALSE;
|
||||
frame_adjust_state(client->frame);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
but = context_to_button(client->frame, con, FALSE);
|
||||
if (but && !*but && !pb) {
|
||||
*but = TRUE;
|
||||
frame_adjust_state(client->frame);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -976,49 +983,18 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
case OB_FRAME_CONTEXT_TLCORNER:
|
||||
case OB_FRAME_CONTEXT_TRCORNER:
|
||||
/* we've left the button area inside the titlebar */
|
||||
client->frame->max_hover = FALSE;
|
||||
client->frame->desk_hover = FALSE;
|
||||
client->frame->shade_hover = FALSE;
|
||||
client->frame->iconify_hover = FALSE;
|
||||
client->frame->close_hover = FALSE;
|
||||
client->frame->max_hover =
|
||||
client->frame->desk_hover =
|
||||
client->frame->shade_hover =
|
||||
client->frame->iconify_hover =
|
||||
client->frame->close_hover = FALSE;
|
||||
if (e->xcrossing.mode == NotifyGrab) {
|
||||
client->frame->max_press = FALSE;
|
||||
client->frame->desk_press = FALSE;
|
||||
client->frame->shade_press = FALSE;
|
||||
client->frame->iconify_press = FALSE;
|
||||
client->frame->close_press = FALSE;
|
||||
client->frame->max_press =
|
||||
client->frame->desk_press =
|
||||
client->frame->shade_press =
|
||||
client->frame->iconify_press =
|
||||
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;
|
||||
case OB_FRAME_CONTEXT_FRAME:
|
||||
/* 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;
|
||||
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;
|
||||
|
@ -1054,36 +1039,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
con = frame_context(client, e->xcrossing.window,
|
||||
e->xcrossing.x, e->xcrossing.y);
|
||||
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:
|
||||
if (grab_on_keyboard())
|
||||
break;
|
||||
|
@ -1115,6 +1070,15 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
}
|
||||
break;
|
||||
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;
|
||||
|
@ -1135,7 +1099,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
RECT_TO_DIMS(client->area, x, y, w, h);
|
||||
|
||||
ob_debug("ConfigureRequest for \"%s\" desktop %d wmstate %d "
|
||||
"visibile %d",
|
||||
"visible %d",
|
||||
client->title,
|
||||
screen_desktop, client->wmstate, client->frame->visible);
|
||||
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
|
||||
as requesting a resize, but we don't actually change
|
||||
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 */
|
||||
move = TRUE;
|
||||
}
|
||||
|
@ -1192,16 +1156,14 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
(e->xconfigurerequest.value_mask & CWWidth) ||
|
||||
(e->xconfigurerequest.value_mask & CWHeight))
|
||||
{
|
||||
/* don't allow clients to move shaded windows (fvwm does this)
|
||||
*/
|
||||
if (e->xconfigurerequest.value_mask & CWX) {
|
||||
/* don't allow clients to move shaded windows (fvwm does this)
|
||||
*/
|
||||
if (!client->shaded)
|
||||
x = e->xconfigurerequest.x;
|
||||
move = TRUE;
|
||||
}
|
||||
if (e->xconfigurerequest.value_mask & CWY) {
|
||||
/* don't allow clients to move shaded windows (fvwm does this)
|
||||
*/
|
||||
if (!client->shaded)
|
||||
y = e->xconfigurerequest.y;
|
||||
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);
|
||||
|
||||
|
@ -1264,8 +1226,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
if ((e->xconfigurerequest.value_mask & CWWidth &&
|
||||
!(e->xconfigurerequest.value_mask & CWX)))
|
||||
client_gravity_resize_w(client, &x, client->area.width, w);
|
||||
/* if y was not given, then use gravity to figure out the new
|
||||
y. the reference point should not be moved */
|
||||
/* same for y */
|
||||
if ((e->xconfigurerequest.value_mask & CWHeight &&
|
||||
!(e->xconfigurerequest.value_mask & CWY)))
|
||||
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;
|
||||
if (msgtype == OBT_PROP_ATOM(WM_CHANGE_STATE)) {
|
||||
/* compress changes into a single change */
|
||||
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;
|
||||
}
|
||||
compress_client_message_event(e, &ce, client->window, msgtype);
|
||||
client_set_wm_state(client, e->xclient.data.l[0]);
|
||||
} else if (msgtype == OBT_PROP_ATOM(NET_WM_DESKTOP)) {
|
||||
/* compress changes into a single change */
|
||||
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;
|
||||
}
|
||||
compress_client_message_event(e, &ce, client->window, msgtype);
|
||||
if ((unsigned)e->xclient.data.l[0] < screen_num_desktops ||
|
||||
(unsigned)e->xclient.data.l[0] == DESKTOP_ALL)
|
||||
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) {
|
||||
h = e->xclient.data.l[4];
|
||||
|
||||
/* if y was not given, then use gravity to figure out the new
|
||||
y. the reference point should not be moved */
|
||||
/* same for y */
|
||||
if (!(e->xclient.data.l[0] & 1 << 9))
|
||||
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_setup_decor_and_functions(client, TRUE);
|
||||
}
|
||||
else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT)) {
|
||||
client_update_strut(client);
|
||||
}
|
||||
else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT_PARTIAL)) {
|
||||
else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT) ||
|
||||
msgtype == OBT_PROP_ATOM(NET_WM_STRUT_PARTIAL)) {
|
||||
client_update_strut(client);
|
||||
}
|
||||
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);
|
||||
break;
|
||||
case DestroyNotify:
|
||||
dock_unmanage(app, FALSE);
|
||||
break;
|
||||
case ReparentNotify:
|
||||
dock_unmanage(app, FALSE);
|
||||
break;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
struct _ObClient;
|
||||
|
||||
/*! The amount of time before a window appears that is checked for user input
|
||||
to determine if the user is working in another window */
|
||||
to determine if the user is working in another window */
|
||||
#define OB_EVENT_USER_TIME_DELAY (500) /* 0.5 seconds */
|
||||
|
||||
/*! Time at which the last event with a timestamp occured. */
|
||||
|
@ -37,15 +37,21 @@ void event_startup(gboolean reconfig);
|
|||
void event_shutdown(gboolean reconfig);
|
||||
|
||||
/*! Make as if the mouse just entered the client, use only when using focus
|
||||
follows mouse */
|
||||
follows mouse */
|
||||
void event_enter_client(struct _ObClient *client);
|
||||
|
||||
/*! Make mouse focus not move at all from the stuff that happens between these
|
||||
two function calls. */
|
||||
two function calls. */
|
||||
gulong event_start_ignore_all_enters(void);
|
||||
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);
|
||||
|
||||
/* Halts any focus delay in progress, use this when the user is selecting a
|
||||
|
@ -53,7 +59,7 @@ void event_cancel_all_key_grabs(void);
|
|||
void event_halt_focus_delay(void);
|
||||
|
||||
/*! Compare t1 and t2, taking into account wraparound. True if t1
|
||||
comes at the same time or later than t2. */
|
||||
comes at the same time or later than t2. */
|
||||
gboolean event_time_after(Time t1, Time t2);
|
||||
|
||||
Time event_get_server_time(void);
|
||||
|
|
|
@ -196,13 +196,6 @@ void focus_nothing(void)
|
|||
/* nothing is focused, update the colormap and _the root property_ */
|
||||
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();
|
||||
|
||||
/* 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
|
||||
all desktops */
|
||||
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 */
|
||||
} ObFrameDecorations;
|
||||
|
||||
|
|
Loading…
Reference in a new issue