]> Dogcows Code - chaz/openbox/blobdiff - engines/openbox/openbox.c
focus on middle click on client
[chaz/openbox] / engines / openbox / openbox.c
index 013deec617d4e24eccc3f94d2660f04869adafdf..7981e8014ab4158e3019396aee899f2b29497827 100644 (file)
@@ -19,7 +19,6 @@
                         f->cbwidth)
 #define BUTTON_SIZE     (LABEL_HEIGHT - 2)
 #define GRIP_WIDTH      (BUTTON_SIZE * 2)
-#define HANDLE_WIDTH(f) (f->width - (GRIP_WIDTH + f->bwidth) * 2)
 
 #define PLATE_EVENTMASK (SubstructureRedirectMask | ButtonPressMask)
 #define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask)
@@ -122,12 +121,12 @@ typedef struct ObFrame {
 
 static void layout_title(ObFrame *self);
 static void render(ObFrame *self);
-static void render_label(ObFrame *self);
-static void render_max(ObFrame *self);
-static void render_icon(ObFrame *self);
-static void render_iconify(ObFrame *self);
-static void render_desk(ObFrame *self);
-static void render_close(ObFrame *self);
+static void render_label(ObFrame *self, Appearance *a);
+static void render_max(ObFrame *self, Appearance *a);
+static void render_icon(ObFrame *self, Appearance *a);
+static void render_iconify(ObFrame *self, Appearance *a);
+static void render_desk(ObFrame *self, Appearance *a);
+static void render_close(ObFrame *self, Appearance *a);
 
 static void frame_mouse_press(const ObEvent *e, ObFrame *self);
 static void frame_mouse_release(const ObEvent *e, ObFrame *self);
@@ -176,7 +175,7 @@ gboolean startup()
     a_unfocused_title = appearance_new(Surface_Planar, 0);
     a_focused_label = appearance_new(Surface_Planar, 1);
     a_unfocused_label = appearance_new(Surface_Planar, 1);
-    a_icon = appearance_new(Surface_Planar, 0);/*1);*/
+    a_icon = appearance_new(Surface_Planar, 1);
     a_focused_handle = appearance_new(Surface_Planar, 0);
     a_unfocused_handle = appearance_new(Surface_Planar, 0);
 
@@ -471,23 +470,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
             XUnmapWindow(ob_display, self->handle);
     }
 
-    if (moved) {
-        /* find the new coordinates */
-        self->frame.area.x = self->frame.client->area.x;
-        self->frame.area.y = self->frame.client->area.y;
-        frame_client_gravity((Frame*)self,
-                             &self->frame.area.x, &self->frame.area.y);
-    }
-
-    /* move and resize the top level frame.
-       shading can change without being moved or resized */
-    XMoveResizeWindow(ob_display, self->frame.window,
-                      self->frame.area.x, self->frame.area.y,
-                      self->width,
-                      (self->frame.client->shaded ? TITLE_HEIGHT :
-                       self->innersize.top + self->innersize.bottom +
-                       self->frame.client->area.height));
-
     if (resized) {
         /* move and resize the plate */
         XMoveResizeWindow(ob_display, self->frame.plate,
@@ -515,6 +497,21 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
                    self->frame.client->area.height +
                    self->frame.size.top + self->frame.size.bottom));
 
+    if (moved) {
+        /* find the new coordinates, done after setting the frame.size, for
+           frame_client_gravity. */
+        self->frame.area.x = self->frame.client->area.x;
+        self->frame.area.y = self->frame.client->area.y;
+        frame_client_gravity((Frame*)self,
+                             &self->frame.area.x, &self->frame.area.y);
+    }
+
+    /* move and resize the top level frame.
+       shading can change without being moved or resized */
+    XMoveResizeWindow(ob_display, self->frame.window,
+                      self->frame.area.x, self->frame.area.y,
+                      self->width, self->frame.area.height - self->bwidth * 2);
+
     if (resized) {
         render(self);
 
@@ -524,8 +521,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
 
 void frame_adjust_state(ObFrame *self)
 {
-    render_max(self);
-    render_desk(self);
+    render(self);
 }
 
 void frame_adjust_focus(ObFrame *self)
@@ -535,12 +531,12 @@ void frame_adjust_focus(ObFrame *self)
 
 void frame_adjust_title(ObFrame *self)
 {
-    render_label(self);
+    render(self);
 }
 
 void frame_adjust_icon(ObFrame *self)
 {
-    render_icon(self);
+    render(self);
 }
 
 void frame_grab_client(ObFrame *self, Client *client)
@@ -741,43 +737,105 @@ static void render(ObFrame *self)
     }
 
     if (self->frame.client->decorations & Decor_Titlebar) {
-        paint(self->title, (client_focused(self->frame.client) ?
-                            self->a_focused_title :
-                            self->a_unfocused_title),
-              0, 0, self->width, TITLE_HEIGHT);
-        render_label(self);
-        render_max(self);
-        render_icon(self);
-        render_iconify(self);
-        render_desk(self);
-        render_close(self);
+        Appearance *t, *l, *m, *n, *i, *d, *c;
+
+        t = (client_focused(self->frame.client) ?
+             self->a_focused_title : self->a_unfocused_title);
+        l = (client_focused(self->frame.client) ?
+             self->a_focused_label : self->a_unfocused_label);
+        m = (client_focused(self->frame.client) ?
+             ((self->max_press ||
+              self->frame.client->max_vert || self->frame.client->max_horz) ?
+              a_focused_pressed_max : a_focused_unpressed_max) :
+             ((self->max_press ||
+              self->frame.client->max_vert || self->frame.client->max_horz) ?
+              a_unfocused_pressed_max : a_unfocused_unpressed_max));
+        n = self->a_icon;
+        i = (client_focused(self->frame.client) ?
+             (self->iconify_press ?
+              a_focused_pressed_iconify : a_focused_unpressed_iconify) :
+             (self->iconify_press ?
+              a_unfocused_pressed_iconify : a_unfocused_unpressed_iconify));
+        d = (client_focused(self->frame.client) ?
+             (self->desk_press || self->frame.client->desktop == DESKTOP_ALL ?
+              a_focused_pressed_desk : a_focused_unpressed_desk) :
+             (self->desk_press || self->frame.client->desktop == DESKTOP_ALL ?
+              a_unfocused_pressed_desk : a_unfocused_unpressed_desk));
+        c = (client_focused(self->frame.client) ?
+             (self->close_press ?
+              a_focused_pressed_close : a_focused_unpressed_close) :
+             (self->close_press ?
+              a_unfocused_pressed_close : a_unfocused_unpressed_close));
+
+        paint(self->title, t, 0, 0, self->width, TITLE_HEIGHT);
+
+        /* set parents for any parent relative guys */
+        l->surface.data.planar.parent = t;
+        l->surface.data.planar.parentx = self->label_x;
+        l->surface.data.planar.parenty = s_bevel;
+
+        m->surface.data.planar.parent = t;
+        m->surface.data.planar.parentx = self->max_x;
+        m->surface.data.planar.parenty = s_bevel + 1;
+
+        n->surface.data.planar.parent = t;
+        n->surface.data.planar.parentx = self->icon_x;
+        n->surface.data.planar.parenty = s_bevel + 1;
+
+        i->surface.data.planar.parent = t;
+        i->surface.data.planar.parentx = self->iconify_x;
+        i->surface.data.planar.parenty = s_bevel + 1;
+
+        d->surface.data.planar.parent = t;
+        d->surface.data.planar.parentx = self->desk_x;
+        d->surface.data.planar.parenty = s_bevel + 1;
+
+        c->surface.data.planar.parent = t;
+        c->surface.data.planar.parentx = self->close_x;
+        c->surface.data.planar.parenty = s_bevel + 1;
+
+        render_label(self, l);
+        render_max(self, m);
+        render_icon(self, n);
+        render_iconify(self, i);
+        render_desk(self, d);
+        render_close(self, c);
     }
 
     if (self->frame.client->decorations & Decor_Handle) {
-        paint(self->handle, (client_focused(self->frame.client) ?
-                             self->a_focused_handle :
-                             self->a_unfocused_handle),
-              GRIP_WIDTH + self->bwidth, 0,
-              HANDLE_WIDTH(self), s_handle_height);
-        paint(self->lgrip, (client_focused(self->frame.client) ?
-                            a_focused_grip :
-                            a_unfocused_grip),
-              0, 0, GRIP_WIDTH, s_handle_height);
-        paint(self->rgrip, (client_focused(self->frame.client) ?
-                            a_focused_grip :
-                            a_unfocused_grip),
-              0, 0, GRIP_WIDTH, s_handle_height);
+        Appearance *h, *g;
+
+        h = (client_focused(self->frame.client) ?
+             self->a_focused_handle : self->a_unfocused_handle);
+        g = (client_focused(self->frame.client) ?
+             a_focused_grip : a_unfocused_grip);
+
+        if (g->surface.data.planar.grad == Background_ParentRelative) {
+            g->surface.data.planar.parent = h;
+            paint(self->handle, h, 0, 0, self->width, s_handle_height);
+        } else {
+            paint(self->handle, h,
+                  GRIP_WIDTH + self->bwidth, 0,
+                  self->width - (GRIP_WIDTH + self->bwidth) * 2,
+                  s_handle_height);
+        }
+
+        g->surface.data.planar.parentx = 0;
+        g->surface.data.planar.parenty = 0;
+
+        paint(self->lgrip, g, 0, 0, GRIP_WIDTH, s_handle_height);
+
+        g->surface.data.planar.parentx = self->width - GRIP_WIDTH;
+        g->surface.data.planar.parenty = 0;
+
+        paint(self->rgrip, g, 0, 0, GRIP_WIDTH, s_handle_height);
     }
 }
 
-static void render_label(ObFrame *self)
+static void render_label(ObFrame *self, Appearance *a)
 {
-    Appearance *a;
-
     if (self->label_x < 0) return;
 
-    a = (client_focused(self->frame.client) ?
-         self->a_focused_label : self->a_unfocused_label);
 
     /* set the texture's text! */
     a->texture[0].data.text.string = self->frame.client->title;
@@ -786,73 +844,52 @@ static void render_label(ObFrame *self)
     paint(self->label, a, 0, 0, self->label_width, LABEL_HEIGHT);
 }
 
-static void render_icon(ObFrame *self)
+static void render_icon(ObFrame *self, Appearance *a)
 {
     if (self->icon_x < 0) return;
 
-    /* XXX set the texture's icon picture! */
-    RECT_SET(self->a_icon->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
-    paint(self->icon, self->a_icon, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
+    if (self->frame.client->nicons) {
+        Icon *icon = client_icon(self->frame.client, BUTTON_SIZE, BUTTON_SIZE);
+        a->texture[0].type = RGBA;
+        a->texture[0].data.rgba.width = icon->width;
+        a->texture[0].data.rgba.height = icon->height;
+        a->texture[0].data.rgba.data = icon->data;
+        RECT_SET(self->a_icon->texture[0].position, 0, 0,
+                 BUTTON_SIZE,BUTTON_SIZE);
+    } else
+        a->texture[0].type = NoTexture;
+
+    paint(self->icon, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
 }
 
-static void render_max(ObFrame *self)
+static void render_max(ObFrame *self, Appearance *a)
 {
-    Appearance *a;
-
-    gboolean press = self->max_press ||
-       self->frame.client->max_vert || self->frame.client->max_horz;
-    
     if (self->max_x < 0) return;
 
-    a = (client_focused(self->frame.client) ?
-         (press ? a_focused_pressed_max : a_focused_unpressed_max) :
-         (press ? a_unfocused_pressed_max : a_unfocused_unpressed_max));
     RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
     paint(self->max, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
 }
 
-static void render_iconify(ObFrame *self)
+static void render_iconify(ObFrame *self, Appearance *a)
 {
-    Appearance *a;
-
     if (self->iconify_x < 0) return;
 
-    a = (client_focused(self->frame.client) ?
-         (self->iconify_press ?
-          a_focused_pressed_iconify : a_focused_unpressed_iconify) :
-         (self->iconify_press ?
-          a_unfocused_pressed_iconify : a_unfocused_unpressed_iconify));
     RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
     paint(self->iconify, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
 }
 
-static void render_desk(ObFrame *self)
+static void render_desk(ObFrame *self, Appearance *a)
 {
-    Appearance *a;
-
-    gboolean press = self->desk_press ||
-       self->frame.client->desktop == DESKTOP_ALL;
-    
     if (self->desk_x < 0) return;
 
-    a = (client_focused(self->frame.client) ?
-         (press ? a_focused_pressed_desk : a_focused_unpressed_desk) :
-         (press ? a_unfocused_pressed_desk : a_unfocused_unpressed_desk));
     RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
     paint(self->desk, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
 }
 
-static void render_close(ObFrame *self)
+static void render_close(ObFrame *self, Appearance *a)
 {
-    Appearance *a;
-
     if (self->close_x < 0) return;
 
-    a = (client_focused(self->frame.client) ?
-         (self->close_press ?
-          a_focused_pressed_close : a_focused_unpressed_close) :
-         (self->close_press ?
-          a_unfocused_pressed_close : a_unfocused_unpressed_close));
     RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
     paint(self->close, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
 }
@@ -887,16 +924,16 @@ static void frame_mouse_press(const ObEvent *e, ObFrame *self)
     Window win = e->data.x.e->xbutton.window;
     if (win == self->max) {
         self->max_press = TRUE;
-        render_max(self);
+        render(self);
     } else if (win == self->close) {
         self->close_press = TRUE;
-        render_close(self);
+        render(self);
     } else if (win == self->iconify) {
         self->iconify_press = TRUE;
-        render_iconify(self);
+        render(self);
     } else if (win == self->desk) { 
         self->desk_press = TRUE;
-        render_desk(self);
+        render(self);
     }
 }
 
@@ -905,15 +942,15 @@ static void frame_mouse_release(const ObEvent *e, ObFrame *self)
     Window win = e->data.x.e->xbutton.window;
     if (win == self->max) {
         self->max_press = FALSE;
-        render_max(self);
+        render(self);
     } else if (win == self->close) {
         self->close_press = FALSE; 
-        render_close(self);
+        render(self);
     } else if (win == self->iconify) {
         self->iconify_press = FALSE;
-        render_iconify(self);
+        render(self);
     } else if (win == self->desk) {
         self->desk_press = FALSE;
-        render_desk(self);
+        render(self);
     }
 }
This page took 0.028455 seconds and 4 git commands to generate.