X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=34d263b6364b04f7720ab991415bbf099c89e37d;hb=06fb4c7382a9c2a25e74adefbbc267417af5aadd;hp=f1dc11aa03a62f802df400ba164e77ac0a776f44;hpb=fdfaa0c8dd830209e44efc23271eec0e32b86f7d;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index f1dc11aa..34d263b6 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -5,6 +5,7 @@ #include "startup.h" #include "screen.h" #include "moveresize.h" +#include "place.h" #include "prop.h" #include "extensions.h" #include "frame.h" @@ -13,11 +14,10 @@ #include "grab.h" #include "focus.h" #include "stacking.h" -#include "dispatch.h" #include "openbox.h" #include "group.h" #include "config.h" -#include "menu.h" +#include "menuframe.h" #include "keyboard.h" #include "mouse.h" #include "render/render.h" @@ -32,7 +32,8 @@ #define CLIENT_NOPROPAGATEMASK (ButtonPressMask | ButtonReleaseMask | \ ButtonMotionMask) -GList *client_list = NULL; +GList *client_list = NULL; +GSList *client_destructors = NULL; static void client_get_all(ObClient *self); static void client_toggle_border(ObClient *self, gboolean show); @@ -48,6 +49,7 @@ static void client_change_state(ObClient *self); static void client_apply_startup_state(ObClient *self); static void client_restore_session_state(ObClient *self); static void client_restore_session_stacking(ObClient *self); +static void client_urgent_notify(ObClient *self); void client_startup() { @@ -58,6 +60,16 @@ void client_shutdown() { } +void client_add_destructor(ObClientDestructorFunc func) +{ + client_destructors = g_slist_prepend(client_destructors, (gpointer)func); +} + +void client_remove_destructor(ObClientDestructorFunc func) +{ + client_destructors = g_slist_remove(client_destructors, (gpointer)func); +} + void client_set_list() { Window *windows, *win_it; @@ -254,10 +266,10 @@ void client_manage(Window window) frame_grab_client(self->frame, self); - client_apply_startup_state(self); - grab_server(FALSE); + client_apply_startup_state(self); + /* update the focus lists */ focus_order_add_new(self); @@ -306,11 +318,21 @@ void client_manage(Window window) #endif } - dispatch_client(Event_Client_New, self, 0, 0); + if (ob_state() == OB_STATE_RUNNING) { + int x = self->area.x, ox = x; + int y = self->area.y, oy = y; + + place_client(self, &x, &y); + + /* make sure the window is visible */ + client_find_onscreen(self, &x, &y, + self->frame->area.width, + self->frame->area.height, + client_normal(self)); - /* make sure the window is visible */ - if (ob_state() == OB_STATE_RUNNING) - client_move_onscreen(self, TRUE); + if (x != ox || y != oy) + client_move(self, x, y); + } client_showhide(self); @@ -339,8 +361,6 @@ void client_manage(Window window) keyboard_grab_for_client(self, TRUE); mouse_grab_for_client(self, TRUE); - dispatch_client(Event_Client_Mapped, self, 0, 0); - ob_debug("Managed window 0x%lx (%s)\n", window, self->class); } @@ -350,13 +370,6 @@ void client_unmanage_all() client_unmanage(client_list->data); } -/* called by client_unmanage() to close any menus referencing this client */ -void client_close_menus(gpointer key, gpointer value, gpointer self) -{ - if (((ObMenu *)value)->client == (ObClient *)self) - menu_hide((ObMenu *)value); -} - void client_unmanage(ObClient *self) { guint j; @@ -364,7 +377,6 @@ void client_unmanage(ObClient *self) ob_debug("Unmanaging window: %lx (%s)\n", self->window, self->class); - dispatch_client(Event_Client_Destroy, self, 0, 0); g_assert(self != NULL); keyboard_grab_for_client(self, FALSE); @@ -410,13 +422,11 @@ void client_unmanage(ObClient *self) } } - if (moveresize_client == self) - moveresize_end(TRUE); - - /* close any windows that are attached to this window */ - g_hash_table_foreach(menu_hash, client_close_menus, self); - - + for (it = client_destructors; it; it = g_slist_next(it)) { + ObClientDestructorFunc func = (ObClientDestructorFunc) it->data; + func(self); + } + if (focus_client == self) { XEvent e; @@ -432,10 +442,6 @@ void client_unmanage(ObClient *self) self->group = NULL; } - /* dispatch the unmapped event */ - dispatch_client(Event_Client_Unmapped, self, 0, 0); - g_assert(self != NULL); - /* give the client its border back */ client_toggle_border(self, TRUE); @@ -476,6 +482,14 @@ void client_unmanage(ObClient *self) client_set_list(); } +static void client_urgent_notify(ObClient *self) +{ + if (self->urgent) + frame_flash_start(self->frame); + else + frame_flash_stop(self->frame); +} + static void client_restore_session_state(ObClient *self) { GList *it; @@ -536,9 +550,7 @@ void client_move_onscreen(ObClient *self, gboolean rude) if (client_find_onscreen(self, &x, &y, self->frame->area.width, self->frame->area.height, rude)) { - client_configure(self, OB_CORNER_TOPLEFT, x, y, - self->area.width, self->area.height, - TRUE, TRUE); + client_move(self, x, y); } } @@ -1024,20 +1036,22 @@ void client_update_normal_hints(ObClient *self) void client_setup_decor_and_functions(ObClient *self) { /* start with everything (cept fullscreen) */ - self->decorations = (OB_FRAME_DECOR_TITLEBAR | - OB_FRAME_DECOR_HANDLE | - OB_FRAME_DECOR_GRIPS | - OB_FRAME_DECOR_BORDER | - OB_FRAME_DECOR_ICON | - OB_FRAME_DECOR_ALLDESKTOPS | - OB_FRAME_DECOR_ICONIFY | - OB_FRAME_DECOR_MAXIMIZE | - OB_FRAME_DECOR_SHADE); - self->functions = (OB_CLIENT_FUNC_RESIZE | - OB_CLIENT_FUNC_MOVE | - OB_CLIENT_FUNC_ICONIFY | - OB_CLIENT_FUNC_MAXIMIZE | - OB_CLIENT_FUNC_SHADE); + self->decorations = + (OB_FRAME_DECOR_TITLEBAR | + (ob_rr_theme->show_handle ? OB_FRAME_DECOR_HANDLE : 0) | + OB_FRAME_DECOR_GRIPS | + OB_FRAME_DECOR_BORDER | + OB_FRAME_DECOR_ICON | + OB_FRAME_DECOR_ALLDESKTOPS | + OB_FRAME_DECOR_ICONIFY | + OB_FRAME_DECOR_MAXIMIZE | + OB_FRAME_DECOR_SHADE); + self->functions = + (OB_CLIENT_FUNC_RESIZE | + OB_CLIENT_FUNC_MOVE | + OB_CLIENT_FUNC_ICONIFY | + OB_CLIENT_FUNC_MAXIMIZE | + OB_CLIENT_FUNC_SHADE); if (self->delete_window) { self->functions |= OB_CLIENT_FUNC_CLOSE; self->decorations |= OB_FRAME_DECOR_CLOSE; @@ -1288,7 +1302,7 @@ void client_update_wmhints(ObClient *self) /* fire the urgent callback if we're mapped, otherwise, wait until after we're mapped */ if (self->frame) - dispatch_client(Event_Client_Urgent, self, self->urgent, 0); + client_urgent_notify(self); } } @@ -1712,7 +1726,7 @@ static void client_apply_startup_state(ObClient *self) client_shade(self, TRUE); } if (self->urgent) - dispatch_client(Event_Client_Urgent, self, self->urgent, 0); + client_urgent_notify(self); if (self->max_vert && self->max_horz) { self->max_vert = self->max_horz = FALSE; @@ -1819,7 +1833,6 @@ void client_configure_full(ObClient *self, ObCorner anchor, if (!(w == self->area.width && h == self->area.height)) { int basew, baseh, minw, minh; - int mw, mh, aw, ah; /* base size is substituted with min size if not specified */ if (self->base_size.width || self->base_size.height) { @@ -1838,23 +1851,6 @@ void client_configure_full(ObClient *self, ObCorner anchor, minh = self->base_size.height; } - /* for interactive resizing. have to move half an increment in each - direction. */ - - /* how far we are towards the next size inc */ - mw = (w - basew) % self->size_inc.width; - mh = (h - baseh) % self->size_inc.height; - /* amount to add */ - aw = self->size_inc.width / 2; - ah = self->size_inc.height / 2; - /* don't let us move into a new size increment */ - if (mw + aw >= self->size_inc.width) - aw = self->size_inc.width - mw - 1; - if (mh + ah >= self->size_inc.height) - ah = self->size_inc.height - mh - 1; - w += aw; - h += ah; - /* if this is a user-requested resize, then check against min/max sizes */ @@ -2011,7 +2007,7 @@ void client_fullscreen(ObClient *self, gboolean fs, gboolean savearea) client_setup_decor_and_functions(self); - client_configure(self, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE); + client_move_resize(self, x, y, w, h); /* try focus us when we go into fullscreen mode */ client_focus(self); @@ -2069,9 +2065,6 @@ static void client_iconify_recursive(ObClient *self, client_change_state(self); client_showhide(self); screen_update_areas(); - - dispatch_client(iconic ? Event_Client_Unmapped : Event_Client_Mapped, - self, 0, 0); } /* iconify all transients */ @@ -2190,7 +2183,7 @@ void client_maximize(ObClient *self, gboolean max, int dir, gboolean savearea) /* figure out where the client should be going */ frame_frame_gravity(self->frame, &x, &y); - client_configure(self, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE); + client_move_resize(self, x, y, w, h); } void client_shade(ObClient *self, gboolean shade) @@ -2273,8 +2266,6 @@ void client_set_desktop_recursive(ObClient *self, focus_order_to_top(self); else focus_order_to_bottom(self); - - dispatch_client(Event_Client_Desktop, self, target, old); } /* move all transients */