]> git.mdlowis.com Git - proto/anvil.git/commitdiff
added font loading and titles in title bars
authorMichael D. Lowis <mike.lowis@gentex.com>
Fri, 13 Mar 2020 17:30:48 +0000 (13:30 -0400)
committerMichael D. Lowis <mike.lowis@gentex.com>
Fri, 13 Mar 2020 17:30:48 +0000 (13:30 -0400)
anvil.c
anvil.h
client.c
error.c
keys.c

diff --git a/anvil.c b/anvil.c
index bf0647daa3861a33e2e6547b3291f47e56be6579..a0384781addd6dc1274688e8af2e00dfe894cba2 100644 (file)
--- a/anvil.c
+++ b/anvil.c
@@ -185,10 +185,6 @@ int main(void)
     X.white = WhitePixel(X.disp, X.screen);
     XAllocNamedColor(X.disp, DefaultColormap(X.disp, X.screen), "DimGray", &color, &exact);
     X.gray = color.pixel;
-    check_for_wm();
-    mons_init();
-    client_initall();
-    keys_init();
 
     /* configure mouse cursors */
     Colormap cmap = DefaultColormap(X.disp, X.screen);
@@ -199,6 +195,35 @@ int main(void)
     XRecolorCursor(X.disp, X.csr_point, &red, &white);
     XDefineCursor(X.disp, X.root, X.csr_root);
 
+    /* load the font */
+    char **miss, *def;
+    int nmiss;
+    X.font = XCreateFontSet(X.disp, FONT_NAME, &miss, &nmiss, &def);
+    if (!X.font)
+    {
+        X.font = XCreateFontSet(X.disp, "fixed", &miss, &nmiss, &def);
+    }
+    check(X.font != NULL, "unable to create font set for title font");
+    X.font_ext = XExtentsOfFontSet(X.font);
+
+    XGCValues gv;
+    /* Set up root (frame) GC's. */
+    gv.foreground = X.black ^ X.white;
+    gv.background = X.white;
+    gv.function = GXxor;
+    gv.line_width = 1;
+    gv.subwindow_mode = IncludeInferiors;
+    gv.line_width = 2;
+    X.graphics = XCreateGC(X.disp, X.root,
+        GCForeground | GCBackground | GCFunction |
+        GCLineWidth | GCSubwindowMode, &gv);
+
+
+    check_for_wm();
+    mons_init();
+    client_initall();
+    keys_init();
+
     /* setup event handlers */
     X.eventfns[ButtonPress] = xbtnpress;
     X.eventfns[ButtonRelease] = xbtnrelease;
diff --git a/anvil.h b/anvil.h
index 7b454a0ce6ec09c832fc455c6cf1083d917a1160..5158cfcac5775d83f304ff114353c1c5b4a036f2 100644 (file)
--- a/anvil.h
+++ b/anvil.h
@@ -2,11 +2,13 @@
 #include <X11/Xlib.h>
 #include <X11/keysym.h>
 #include <X11/XKBlib.h>
+#include <X11/Xatom.h>
 #include <X11/cursorfont.h>
 #include <X11/extensions/Xinerama.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <stdio.h>
+#include <string.h>
 #include <assert.h>
 
 #define min(a,b) (a < b ? a : b)
@@ -29,6 +31,9 @@ typedef struct {
     int start_x, start_y;
     int reshaping;
     Cursor csr_root, csr_point;
+    XFontSet font;
+    XFontSetExtents *font_ext;
+    GC graphics;
     void (*eventfns[LASTEvent])(XEvent*);
 } XConf;
 
@@ -69,7 +74,8 @@ typedef struct {
 } Key;
 
 #define BORDER_WIDTH 5
-#define TITLE_HEIGHT 10
+#define TITLE_HEIGHT (X.font_ext->max_logical_extent.height)
+#define FONT_NAME    "-*-lucida-bold-r-normal-sans-14-*-*-*-p-*-iso10646-1"
 
 /* anvil.c */
 extern XConf X;
index 99a4c1440ae7e79f7ae17fe9e24d4c56867d9ecf..26d1faba5c6b018dd50804254d7c06406ae5fa8f 100644 (file)
--- a/client.c
+++ b/client.c
@@ -31,6 +31,12 @@ Client* client_add(Window win, XWindowAttributes* attr)
     mons_addclient(c);
 
     /* get window name */
+    Atom actual_type;
+    int format;
+    unsigned long n, extra;
+    XGetWindowProperty(
+        X.disp, c->win, XA_WM_NAME, 0L, 100L, False, AnyPropertyType, &actual_type, &format, &n, &extra, (unsigned char **)&c->name);
+
     /* get normal hints ? */
     /* get registered protocols */
     /* get transient_for property ? */
@@ -75,15 +81,13 @@ void client_draw(Client* c)
         XSetWindowBackground(X.disp, c->frame, (Focused == c) ? X.black : X.gray);
         XClearWindow(X.disp, c->frame);
         XDefineCursor(X.disp, c->frame, X.csr_point);
-
-    //    int quarter = (border + titleHeight()) / 4;
-    //    /* Draw window title. */
-    //    if (c->name != 0) {
-    //        Xutf8DrawString(dpy, c->parent, font_set,
-    //            gc, border + 2 + (3 * quarter),
-    //            2 + ascent(font_set_ext),
-    //            c->name, c->namelen);
-    //    }
+        if (c->name) {
+            int ascent = abs(X.font_ext->max_logical_extent.y);
+            Xutf8DrawString(X.disp, c->frame, X.font,
+                X.graphics, BORDER_WIDTH,
+                2 + ascent,
+                c->name, strlen(c->name));
+        }
     }
 }
 
diff --git a/error.c b/error.c
index 70cfabe9ff71df704f7a48328e08bf5503152f0d..98be4d57c5cad5a2fe595b762e1882a14c2c3ba1 100644 (file)
--- a/error.c
+++ b/error.c
@@ -2,12 +2,6 @@
 
 int (*error_default)(Display* disp, XErrorEvent* ev) = NULL;
 
-int error_ignore(Display* disp, XErrorEvent* ev)
-{
-    (void)disp, (void)ev;
-    return 0;
-}
-
 int error_init(Display* disp, XErrorEvent* ev)
 {
     (void)disp, (void)ev;
@@ -17,6 +11,10 @@ int error_init(Display* disp, XErrorEvent* ev)
 
 int error_panic(Display* disp, XErrorEvent* ev)
 {
+    if (ev->error_code == BadWindow)
+    {
+        return 0;
+    }
     fprintf(stderr, "anvil: fatal error: request code=%d, error code=%d\n", ev->request_code, ev->error_code);
     return error_default(disp, ev);
 }
diff --git a/keys.c b/keys.c
index 4a1c5f03315bb146de369ad67dcdb575c52afe44..a43080e7ce67aab59b9feb21540c88e9d42c072f 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -53,13 +53,6 @@ void keys_run(XKeyEvent* ev)
     KeySym keysym = XkbKeycodeToKeysym(X.disp, ev->keycode, 0, 0);
     for (unsigned int i = 0; i < sizeof(keys)/sizeof(keys[0]); i++)
     {
-        printf("%d: (%d == %d) && (%d == %d)\n",
-            (int)i,
-            (int)keysym,
-            (int)keys[i].keysym,
-            (int)keys[i].mod,
-            (int)ev->state
-        );
         if (keysym == keys[i].keysym && keys[i].mod == ev->state && keys[i].func)
         {
             keys[i].func(&(keys[i].arg));