X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=f17e9724fc228afa338b83c6604d875c4f339acb;hb=615cbd96075905d75533f9b615c4ee6a75f4f9a4;hp=961c6bbf3c696c2bad8498984a88857cb15ceb10;hpb=0964b804a135243968de22695b953f19f9e8b9d1;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 961c6bbf..f17e9724 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -17,7 +17,7 @@ #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" @@ -233,7 +233,7 @@ void client_manage(Window window) /* create the ObClient struct, and populate it from the hints on the window */ - self = g_new(ObClient, 1); + self = g_new0(ObClient, 1); self->obwin.type = Window_Client; self->window = window; @@ -272,6 +272,8 @@ void client_manage(Window window) (self->type == OB_CLIENT_TYPE_NORMAL || self->type == OB_CLIENT_TYPE_DIALOG)) { + activate = TRUE; +#if 0 if (self->desktop != screen_desktop) { /* activate the window */ activate = TRUE; @@ -301,15 +303,14 @@ void client_manage(Window window) activate = TRUE; } } +#endif } dispatch_client(Event_Client_New, self, 0, 0); /* make sure the window is visible */ if (ob_state() == OB_STATE_RUNNING) - client_move_onscreen(self, TRUE); - - screen_update_areas(); + client_move_onscreen(self, client_normal(self)); client_showhide(self); @@ -329,6 +330,9 @@ void client_manage(Window window) client_list = g_list_append(client_list, self); g_hash_table_insert(window_map, &self->window, self); + /* this has to happen after we're in the client_list */ + screen_update_areas(); + /* update the list hints */ client_set_list(); @@ -346,13 +350,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; @@ -409,9 +406,9 @@ 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); - + /* menus can be associated with a client, so close any that are since + we are disappearing now */ + menu_frame_hide_all_client(self); if (focus_client == self) { XEvent e; @@ -651,26 +648,11 @@ static void client_toggle_border(ObClient *self, gboolean show) static void client_get_all(ObClient *self) { - /* update EVERYTHING!! */ - - self->ignore_unmaps = 0; - - /* defaults */ - self->frame = NULL; - self->session = NULL; - self->title = self->icon_title = NULL; + /* non-zero defaults */ self->title_count = 1; - self->name = self->class = self->role = NULL; self->wmstate = NormalState; - self->transient = FALSE; - self->transients = NULL; - self->transient_for = NULL; self->layer = -1; - self->urgent = FALSE; - self->positioned = FALSE; self->decorate = TRUE; - self->group = NULL; - self->nicons = 0; client_get_area(self); client_update_transient_for(self); @@ -1131,6 +1113,10 @@ void client_setup_decor_and_functions(ObClient *self) self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE; } + /* kill the handle on fully maxed windows */ + if (self->max_vert && self->max_horz) + self->decorations &= ~OB_FRAME_DECOR_HANDLE; + /* finally, the user can have requested no decorations, which overrides everything */ if (!self->decorate) @@ -1408,12 +1394,13 @@ void client_update_strut(ObClient *self) guint num; guint32 *data; gboolean got = FALSE; + StrutPartial strut; if (PROP_GETA32(self->window, net_wm_strut_partial, cardinal, &data, &num)) { if (num == 12) { got = TRUE; - STRUT_PARTIAL_SET(self->strut, + STRUT_PARTIAL_SET(strut, data[0], data[2], data[1], data[3], data[4], data[5], data[8], data[9], data[6], data[7], data[10], data[11]); @@ -1425,7 +1412,7 @@ void client_update_strut(ObClient *self) PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) { if (num == 4) { got = TRUE; - STRUT_PARTIAL_SET(self->strut, + STRUT_PARTIAL_SET(strut, data[0], data[2], data[1], data[3], 0, 0, 0, 0, 0, 0, 0, 0); } @@ -1433,13 +1420,17 @@ void client_update_strut(ObClient *self) } if (!got) - STRUT_PARTIAL_SET(self->strut, 0, 0, 0, 0, + STRUT_PARTIAL_SET(strut, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - /* updating here is pointless while we're being mapped cuz we're not in - the client list yet */ - if (self->frame) - screen_update_areas(); + if (!STRUT_EQUAL(strut, self->strut)) { + self->strut = strut; + + /* updating here is pointless while we're being mapped cuz we're not in + the client list yet */ + if (self->frame) + screen_update_areas(); + } } void client_update_icons(ObClient *self) @@ -1743,6 +1734,7 @@ void client_configure_full(ObClient *self, ObCorner anchor, { gboolean moved = FALSE, resized = FALSE; guint fdecor = self->frame->decorations; + gboolean fhorz = self->frame->max_horz; /* make the frame recalculate its dimentions n shit without changing anything visible for real, this way the constraints below can work with @@ -1820,6 +1812,7 @@ 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,33 +1831,31 @@ void client_configure_full(ObClient *self, ObCorner anchor, minh = self->base_size.height; } - if (user) { - /* for interactive resizing. have to move half an increment in each - direction. */ - - /* how far we are towards the next size inc */ - int mw = (w - basew) % self->size_inc.width; - int mh = (h - baseh) % self->size_inc.height; - /* amount to add */ - int aw = self->size_inc.width / 2; - int 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; + /* 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 */ - - /* smaller than min size or bigger than max size? */ - if (w > self->max_size.width) w = self->max_size.width; - if (w < minw) w = minw; - if (h > self->max_size.height) h = self->max_size.height; - if (h < minh) h = minh; - } + /* if this is a user-requested resize, then check against min/max + sizes */ + + /* smaller than min size or bigger than max size? */ + if (w > self->max_size.width) w = self->max_size.width; + if (w < minw) w = minw; + if (h > self->max_size.height) h = self->max_size.height; + if (h < minh) h = minh; w -= basew; h -= baseh; @@ -1888,20 +1879,18 @@ void client_configure_full(ObClient *self, ObCorner anchor, w += basew; h += baseh; - if (user) { - /* adjust the height to match the width for the aspect ratios. - for this, min size is not substituted for base size ever. */ - w -= self->base_size.width; - h -= self->base_size.height; + /* adjust the height to match the width for the aspect ratios. + for this, min size is not substituted for base size ever. */ + w -= self->base_size.width; + h -= self->base_size.height; - if (self->min_ratio) - if (h * self->min_ratio > w) h = (int)(w / self->min_ratio); - if (self->max_ratio) - if (h * self->max_ratio < w) h = (int)(w / self->max_ratio); + if (self->min_ratio) + if (h * self->min_ratio > w) h = (int)(w / self->min_ratio); + if (self->max_ratio) + if (h * self->max_ratio < w) h = (int)(w / self->max_ratio); - w += self->base_size.width; - h += self->base_size.height; - } + w += self->base_size.width; + h += self->base_size.height; } switch (anchor) { @@ -1933,7 +1922,7 @@ void client_configure_full(ObClient *self, ObCorner anchor, /* move/resize the frame to match the request */ if (self->frame) { - if (self->decorations != fdecor) + if (self->decorations != fdecor || self->max_horz != fhorz) moved = resized = TRUE; if (moved || resized) @@ -2190,6 +2179,8 @@ void client_maximize(ObClient *self, gboolean max, int dir, gboolean savearea) client_change_state(self); /* change the state hints on the client */ + client_setup_decor_and_functions(self); + /* 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);