guint32 *state;
guint num;
- self->modal = self->shaded = self->max_horz = self->max_vert =
- self->fullscreen = self->above = self->below = self->iconic =
- self->skip_taskbar = self->skip_pager = FALSE;
-
if (PROP_GETA32(self->window, net_wm_state, atom, &state, &num)) {
gulong i;
for (i = 0; i < num; ++i) {
GList *it;
guint32 nums;
guint i;
- char *data = NULL;
+ gchar *data = NULL;
gboolean read_title;
+ gchar *old_title;
- g_free(self->title);
+ old_title = self->title;
/* try netwm */
if (!PROP_GETS(self->window, net_wm_name, utf8, &data))
if (!PROP_GETS(self->window, wm_name, locale, &data))
data = g_strdup("Unnamed Window");
+ /* did the title change? then reset the title_count */
+ if (old_title && 0 != strncmp(old_title, data, strlen(data)))
+ self->title_count = 1;
+
/* look for duplicates and append a number */
nums = 0;
for (it = client_list; it; it = it->next)
}
/* dont display the number for the first window */
if (self->title_count > 1) {
- char *vdata, *ndata;
- ndata = g_strdup_printf(" - [%u]", self->title_count);
- vdata = g_strconcat(data, ndata, NULL);
- g_free(ndata);
+ char *ndata;
+ ndata = g_strdup_printf("%s - [%u]", data, self->title_count);
g_free(data);
- data = vdata;
+ data = ndata;
}
PROP_SETS(self->window, net_wm_visible_name, data);
if (self->frame)
frame_adjust_title(self->frame);
+ g_free(old_title);
+
/* update the icon title */
data = NULL;
g_free(self->icon_title);
gboolean user, gboolean final,
gboolean force_reply)
{
+ gint oldw, oldh;
+ gboolean send_resize_client;
gboolean moved = FALSE, resized = FALSE;
guint fdecor = self->frame->decorations;
gboolean fhorz = self->frame->max_horz;
moved = x != self->area.x || y != self->area.y;
resized = w != self->area.width || h != self->area.height;
+ oldw = self->area.width;
+ oldh = self->area.height;
RECT_SET(self->area, x, y, w, h);
/* for app-requested resizes, always resize if 'resized' is true.
for user-requested ones, only resize if final is true, or when
resizing in redraw mode */
- if ((!user && resized) ||
- (user && (final || (resized && config_redraw_resize))))
- XResizeWindow(ob_display, self->window, w, h);
+ send_resize_client = ((!user && resized) ||
+ (user && (final ||
+ (resized && config_redraw_resize))));
+
+ /* if the client is enlarging, the resize the client before the frame */
+ if (send_resize_client && (w > oldw || h > oldh))
+ XResizeWindow(ob_display, self->window, MAX(w, oldw), MAX(h, oldh));
/* move/resize the frame to match the request */
if (self->frame) {
FALSE, StructureNotifyMask, &event);
}
}
+
+ /* if the client is shrinking, then resize the frame before the client */
+ if (send_resize_client && (w <= oldw || h <= oldh))
+ XResizeWindow(ob_display, self->window, w, h);
+
+ XFlush(ob_display);
}
void client_fullscreen(ObClient *self, gboolean fs, gboolean savearea)
return FALSE;
}
- if (self->can_focus)
+ if (self->can_focus) {
/* RevertToPointerRoot causes much more headache than RevertToNone, so
I choose to use it always, hopefully to find errors quicker, if any
- are left. (I hate X. I hate focus events.) */
- XSetInputFocus(ob_display, self->window, RevertToPointerRoot,
+ are left. (I hate X. I hate focus events.)
+
+ Update: Changing this to RevertToNone fixed a bug with mozilla (bug
+ #799. So now it is RevertToNone again.
+ */
+ XSetInputFocus(ob_display, self->window, RevertToNone,
event_lasttime);
+ }
if (self->focus_notify) {
XEvent ce;