]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
Update traditional chinese messages
[chaz/openbox] / openbox / client.c
index f38a0c01d11a9460642884789b55f44849fd1158..712df3a579768f8a0664fc727717e7097094cbe7 100644 (file)
@@ -1,5 +1,5 @@
 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-   
+
    client.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
    Copyright (c) 2003-2007   Dana Jansens
@@ -64,8 +64,6 @@ typedef struct
 
 GList            *client_list          = NULL;
 
-extern ObDock *dock;
-
 static GSList *client_destroy_notifies = NULL;
 
 static void client_get_all(ObClient *self, gboolean real);
@@ -239,7 +237,7 @@ void client_manage(Window window)
         grab_server(FALSE);
         return; /* don't manage it */
     }
-  
+
     /* is the window a docking app */
     if ((wmhint = XGetWMHints(ob_display, window))) {
         if ((wmhint->flags & StateHint) &&
@@ -384,7 +382,8 @@ void client_manage(Window window)
                              */
                              ob_state() == OB_STATE_RUNNING &&
                              (transient ||
-                              (!(self->positioned & USPosition) &&
+                              (!((self->positioned & USPosition) ||
+                                 (settings && settings->pos_given)) &&
                                client_normal(self) &&
                                !self->session)));
     }
@@ -444,6 +443,7 @@ void client_manage(Window window)
     client_apply_startup_state(self, placex, placey, placew, placeh);
 
     if (activate) {
+        gboolean raise = FALSE;
         guint32 last_time = focus_client ?
             focus_client->user_time : CurrentTime;
 
@@ -453,13 +453,24 @@ void client_manage(Window window)
                       "(last time %u)\n",
                       self->window, self->user_time, last_time);
 
+        if (menu_frame_visible || moveresize_in_progress) {
+            activate = FALSE;
+            raise = TRUE;
+            ob_debug_type(OB_DEBUG_FOCUS,
+                          "Not focusing the window because the user is inside "
+                          "an Openbox menu or is move/resizing a window and "
+                          "we don't want to interrupt them\n");
+        }
+
         /* if it's on another desktop */
-        if (!(self->desktop == screen_desktop || self->desktop == DESKTOP_ALL)
-            && /* the timestamp is from before you changed desktops */
+        else if (!(self->desktop == screen_desktop ||
+              self->desktop == DESKTOP_ALL) &&
+            /* the timestamp is from before you changed desktops */
             self->user_time && screen_desktop_user_time &&
             !event_time_after(self->user_time, screen_desktop_user_time))
         {
             activate = FALSE;
+            raise = TRUE;
             ob_debug_type(OB_DEBUG_FOCUS,
                           "Not focusing the window because its on another "
                           "desktop\n");
@@ -504,6 +515,7 @@ void client_manage(Window window)
                anyway */
             else if (client_focus_target(self) != self) {
                 activate = FALSE;
+                raise = TRUE;
                 ob_debug_type(OB_DEBUG_FOCUS,
                               "Not focusing the window because another window "
                               "would get the focus anyway\n");
@@ -518,6 +530,9 @@ void client_manage(Window window)
             /* if the client isn't focused, then hilite it so the user
                knows it is there */
             client_hilite(self, TRUE);
+            /* we may want to raise it even tho we're not activating it */
+            if (raise && !client_restore_session_stacking(self))
+                stacking_raise(CLIENT_AS_WINDOW(self));
         }
     }
     else {
@@ -598,7 +613,7 @@ ObClient *client_fake_manage(Window window)
     frame_adjust_area(self->frame, FALSE, TRUE, TRUE);
 
     ob_debug("gave extents left %d right %d top %d bottom %d\n",
-             self->frame->size.left, self->frame->size.right, 
+             self->frame->size.left, self->frame->size.right,
              self->frame->size.top, self->frame->size.bottom);
 
     /* free the ObAppSettings shallow copy */
@@ -985,10 +1000,15 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
     for (i = 0; i < screen_num_monitors; ++i) {
         Rect *a;
 
-        if (!screen_physical_area_monitor_contains(i, &desired))
-            continue;
+        if (!screen_physical_area_monitor_contains(i, &desired)) {
+            if (i < screen_num_monitors - 1)
+                continue;
 
-        a = screen_area(self->desktop, SCREEN_AREA_ONE_MONITOR, &desired);
+            /* the window is not inside any monitor! so just use the first
+               one */
+            a = screen_area(self->desktop, 0, NULL);
+        } else
+            a = screen_area(self->desktop, SCREEN_AREA_ONE_MONITOR, &desired);
 
         /* This makes sure windows aren't entirely outside of the screen so you
            can't see them at all.
@@ -1005,7 +1025,7 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
             if (!self->strut.left && *x + fw*9/10 - 1 < a->x)
                 *x = a->x - fw*9/10;
             if (!self->strut.top && *y + fh*9/10 - 1 < a->y)
-                *y = a->y - fw*9/10;
+                *y = a->y - fh*9/10;
         }
 
         /* This here doesn't let windows even a pixel outside the
@@ -1074,7 +1094,7 @@ static void client_get_all(ObClient *self, gboolean real)
         if (self->type == OB_CLIENT_TYPE_DESKTOP)
             self->desktop = DESKTOP_ALL;
     }
-  
+
 #ifdef SYNC
     client_update_sync_request_counter(self);
 #endif
@@ -1100,7 +1120,7 @@ static void client_get_area(ObClient *self)
 {
     XWindowAttributes wattrib;
     Status ret;
-  
+
     ret = XGetWindowAttributes(ob_display, self->window, &wattrib);
     g_assert(ret != BadWindow);
 
@@ -1121,7 +1141,7 @@ static void client_get_desktop(ObClient *self)
             self->desktop = screen_num_desktops - 1;
         else
             self->desktop = d;
-        ob_debug("client requested desktop 0x%x\n", self->desktop); 
+        ob_debug("client requested desktop 0x%x\n", self->desktop);
     } else {
         GSList *it;
         gboolean first = TRUE;
@@ -1168,7 +1188,7 @@ static void client_get_state(ObClient *self)
 {
     guint32 *state;
     guint num;
-  
+
     if (PROP_GETA32(self->window, net_wm_state, atom, &state, &num)) {
         gulong i;
         for (i = 0; i < num; ++i) {
@@ -1251,7 +1271,7 @@ void client_update_transient_for(ObClient *self)
                                  self->transient_for_group, trangroup,
                                  client_direct_parent(self), target);
     self->transient_for_group = trangroup;
-                          
+
 }
 
 static void client_update_transient_tree(ObClient *self,
@@ -1397,7 +1417,7 @@ void client_get_type_and_transientness(ObClient *self)
 
     self->type = -1;
     self->transient = FALSE;
-  
+
     if (PROP_GETA32(self->window, net_wm_window_type, atom, &val, &num)) {
         /* use the first value that we know about in the array */
         for (i = 0; i < num; ++i) {
@@ -1433,7 +1453,7 @@ void client_get_type_and_transientness(ObClient *self)
 
     if (XGetTransientForHint(ob_display, self->window, &t))
         self->transient = TRUE;
-            
+
     if (self->type == (ObClientType) -1) {
         /*the window type hint was not set, which means we either classify
           ourself as a normal window or a dialog, depending on if we are a
@@ -1472,7 +1492,7 @@ void client_update_protocols(ObClient *self)
                    notified whenever we want it to receive focus */
                 self->focus_notify = TRUE;
 #ifdef SYNC
-            else if (proto[i] == prop_atoms.net_wm_sync_request) 
+            else if (proto[i] == prop_atoms.net_wm_sync_request)
                 /* if this protocol is requested, then resizing the
                    window will be synchronized between the frame and the
                    client */
@@ -1552,13 +1572,13 @@ void client_update_normal_hints(ObClient *self)
 
         if (size.flags & PMinSize)
             SIZE_SET(self->min_size, size.min_width, size.min_height);
-    
+
         if (size.flags & PMaxSize)
             SIZE_SET(self->max_size, size.max_width, size.max_height);
-    
+
         if (size.flags & PBaseSize)
             SIZE_SET(self->base_size, size.base_width, size.base_height);
-    
+
         if (size.flags & PResizeInc && size.width_inc && size.height_inc)
             SIZE_SET(self->size_inc, size.width_inc, size.height_inc);
 
@@ -1792,7 +1812,7 @@ void client_update_wmhints(ObClient *self)
 
     /* assume a window takes input if it doesnt specify */
     self->can_focus = TRUE;
-  
+
     if ((hints = XGetWMHints(ob_display, self->window)) != NULL) {
         gboolean ur;
 
@@ -1879,17 +1899,17 @@ void client_update_title(ObClient *self)
     gchar *visible = NULL;
 
     g_free(self->title);
-     
+
     /* try netwm */
     if (!PROP_GETS(self->window, net_wm_name, utf8, &data)) {
         /* try old x stuff */
         if (!(PROP_GETS(self->window, wm_name, locale, &data)
               || PROP_GETS(self->window, wm_name, utf8, &data))) {
             if (self->transient) {
-                /*
-                  GNOME alert windows are not given titles:
-                  http://developer.gnome.org/projects/gup/hig/draft_hig_new/windows-alert.html
-                */
+    /*
+    GNOME alert windows are not given titles:
+    http://developer.gnome.org/projects/gup/hig/draft_hig_new/windows-alert.html
+    */
                 data = g_strdup("");
             } else
                 data = g_strdup("Unnamed Window");
@@ -2007,7 +2027,7 @@ void client_update_icons(ObClient *self)
         }
 
         self->icons = g_new(ObClientIcon, self->nicons);
-    
+
         /* store the icons */
         i = 0;
         for (j = 0; j < self->nicons; ++j) {
@@ -2064,7 +2084,7 @@ void client_update_icons(ObClient *self)
        or removes it entirely, it's not very likely it is going to set one
        right away afterwards
 
-       if it has parents, then one of them will have an icon already 
+       if it has parents, then one of them will have an icon already
     */
     if (self->nicons == 0 && !self->parents) {
         RrPixel32 *icon = ob_rr_theme->def_win_icon;
@@ -2438,7 +2458,7 @@ gboolean client_should_show(ObClient *self)
         return FALSE;
     if (self->desktop == screen_desktop || self->desktop == DESKTOP_ALL)
         return TRUE;
-    
+
     return FALSE;
 }
 
@@ -2582,7 +2602,7 @@ static void client_apply_startup_state(ObClient *self,
         client_shade(self, TRUE);
     if (demands_attention)
         client_hilite(self, TRUE);
-  
+
     if (max_vert && max_horz)
         client_maximize(self, TRUE, 0);
     else if (max_vert)
@@ -2784,7 +2804,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
         /* you cannot resize to nothing */
         if (basew + *w < 1) *w = 1 - basew;
         if (baseh + *h < 1) *h = 1 - baseh;
-  
+
         /* save the logical size */
         *logicalw = incw > 1 ? *w : *w + basew;
         *logicalh = inch > 1 ? *h : *h + baseh;
@@ -3099,7 +3119,7 @@ void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk,
 void client_maximize(ObClient *self, gboolean max, gint dir)
 {
     gint x, y, w, h;
-     
+
     g_assert(dir == 0 || dir == 1 || dir == 2);
     if (!(self->functions & OB_CLIENT_FUNC_MAXIMIZE)) return; /* can't */
 
@@ -3187,7 +3207,7 @@ void client_close(ObClient *self)
        close, we just kill it */
     if (!self->delete_window)
         client_kill(self);
-    
+
     /*
       XXX: itd be cool to do timeouts and shit here for killing the client's
       process off
@@ -3289,7 +3309,7 @@ ObClient *client_search_modal_child(ObClient *self)
 {
     GSList *it;
     ObClient *ret;
-  
+
     for (it = self->transients; it; it = g_slist_next(it)) {
         ObClient *c = it->data;
         if ((ret = client_search_modal_child(c))) return ret;
@@ -3300,7 +3320,7 @@ ObClient *client_search_modal_child(ObClient *self)
 
 gboolean client_validate(ObClient *self)
 {
-    XEvent e; 
+    XEvent e;
 
     XSync(ob_display, FALSE); /* get all events on the server */
 
@@ -3316,7 +3336,7 @@ gboolean client_validate(ObClient *self)
 void client_set_wm_state(ObClient *self, glong state)
 {
     if (state == self->wmstate) return; /* no change */
-  
+
     switch (state) {
     case IconicState:
         client_iconify(self, TRUE, TRUE, FALSE);
@@ -3345,11 +3365,11 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
           action == prop_atoms.net_wm_state_remove ||
           action == prop_atoms.net_wm_state_toggle))
         /* an invalid action was passed to the client message, ignore it */
-        return; 
+        return;
 
     for (i = 0; i < 2; ++i) {
         Atom state = i == 0 ? data1 : data2;
-    
+
         if (!state) continue;
 
         /* if toggling, then pick whether we're adding or removing */
@@ -3396,7 +3416,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
                 action = undecorated ? prop_atoms.net_wm_state_remove :
                     prop_atoms.net_wm_state_add;
         }
-    
+
         if (action == prop_atoms.net_wm_state_add) {
             if (state == prop_atoms.net_wm_state_modal) {
                 modal = TRUE;
@@ -3705,7 +3725,7 @@ static ObClientIcon* client_icon_recursive(ObClient *self, gint w, gint h)
             if ((parent = client_icon_recursive(c, w, h)))
                 break;
         }
-        
+
         return parent;
     }
 
@@ -3759,7 +3779,7 @@ void client_set_layer(ObClient *self, gint layer)
 void client_set_undecorated(ObClient *self, gboolean undecorated)
 {
     if (self->undecorated != undecorated &&
-        /* don't let it undecorate if the function is missing, but let 
+        /* don't let it undecorate if the function is missing, but let
            it redecorate */
         (self->functions & OB_CLIENT_FUNC_UNDECORATE || !undecorated))
     {
@@ -3779,7 +3799,7 @@ ObClient *client_direct_parent(ObClient *self)
     if (!self->parents) return NULL;
     if (self->transient_for_group) return NULL;
     return self->parents->data;
-}                        
+}
 
 ObClient *client_search_top_direct_parent(ObClient *self)
 {
@@ -3794,7 +3814,7 @@ static GSList *client_search_all_top_parents_internal(ObClient *self,
 {
     GSList *ret;
     ObClient *p;
-    
+
     /* move up the direct transient chain as far as possible */
     while ((p = client_direct_parent(self)) &&
            (!bylayer || p->layer == layer))
@@ -3948,6 +3968,7 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
 {
     GList *it;
     Rect *a, *mon;
+    Rect dock_area;
     gint edge;
 
     a = screen_area(self->desktop, SCREEN_AREA_ALL_MONITORS,
@@ -3957,25 +3978,25 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
 
     switch(dir) {
     case OB_DIRECTION_NORTH:
-        if (my_head >= RECT_TOP(*mon))
+        if (my_head >= RECT_TOP(*mon) + 1)
             edge = RECT_TOP(*mon) - 1;
         else
             edge = RECT_TOP(*a) - 1;
         break;
     case OB_DIRECTION_SOUTH:
-        if (my_head <= RECT_BOTTOM(*mon))
+        if (my_head <= RECT_BOTTOM(*mon) - 1)
             edge = RECT_BOTTOM(*mon) + 1;
         else
             edge = RECT_BOTTOM(*a) + 1;
         break;
     case OB_DIRECTION_EAST:
-        if (my_head <= RECT_RIGHT(*mon))
+        if (my_head <= RECT_RIGHT(*mon) - 1)
             edge = RECT_RIGHT(*mon) + 1;
         else
             edge = RECT_RIGHT(*a) + 1;
         break;
     case OB_DIRECTION_WEST:
-        if (my_head >= RECT_LEFT(*mon))
+        if (my_head >= RECT_LEFT(*mon) + 1)
             edge = RECT_LEFT(*mon) - 1;
         else
             edge = RECT_LEFT(*a) - 1;
@@ -4004,7 +4025,8 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
         detect_edge(cur->frame->area, dir, my_head, my_size, my_edge_start,
                     my_edge_size, dest, near_edge);
     }
-    detect_edge(dock->area, dir, my_head, my_size, my_edge_start,
+    dock_get_area(&dock_area);
+    detect_edge(dock_area, dir, my_head, my_size, my_edge_start,
                 my_edge_size, dest, near_edge);
 }
 
This page took 0.032849 seconds and 4 git commands to generate.