ソースを参照

fixed offsets, updated eprint, cleaned up

master
Connor Lane Smith 14年前
コミット
6c1d0e4d60
4個のファイルの変更42行の追加33行の削除
  1. +3
    -2
      dinput.c
  2. +30
    -26
      dmenu.c
  3. +8
    -4
      draw.c
  4. +1
    -1
      draw.h

+ 3
- 2
dinput.c ファイルの表示

@@ -164,7 +164,7 @@ kpress(XKeyEvent * e) {
FILE *fp; FILE *fp;
char *s; char *s;
if(!(fp = popen("sselp", "r"))) if(!(fp = popen("sselp", "r")))
eprint("dinput: cannot popen sselp\n");
eprint("cannot popen sselp\n");
s = fgets(buf, sizeof buf, fp); s = fgets(buf, sizeof buf, fp);
pclose(fp); pclose(fp);
if(s == NULL) if(s == NULL)
@@ -322,6 +322,7 @@ main(int argc, char *argv[]) {
Bool topbar = True; Bool topbar = True;


/* command line args */ /* command line args */
progname = argv[0];
for(i = 1; i < argc; i++) for(i = 1; i < argc; i++)
if(!strcmp(argv[i], "-b")) if(!strcmp(argv[i], "-b"))
topbar = False; topbar = False;
@@ -356,7 +357,7 @@ main(int argc, char *argv[]) {
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
fprintf(stderr, "dinput: warning: no locale support\n"); fprintf(stderr, "dinput: warning: no locale support\n");
if(!(dpy = XOpenDisplay(NULL))) if(!(dpy = XOpenDisplay(NULL)))
eprint("dinput: cannot open display\n");
eprint("cannot open display\n");
screen = DefaultScreen(dpy); screen = DefaultScreen(dpy);
if(!parent) if(!parent)
parent = RootWindow(dpy, screen); parent = RootWindow(dpy, screen);


+ 30
- 26
dmenu.c ファイルの表示

@@ -34,6 +34,7 @@ static void calcoffsetsh(void);
static void calcoffsetsv(void); static void calcoffsetsv(void);
static char *cistrstr(const char *s, const char *sub); static char *cistrstr(const char *s, const char *sub);
static void cleanup(void); static void cleanup(void);
static void dinput(void);
static void drawmenu(void); static void drawmenu(void);
static void drawmenuh(void); static void drawmenuh(void);
static void drawmenuv(void); static void drawmenuv(void);
@@ -89,28 +90,25 @@ void
calcoffsetsh(void) { calcoffsetsh(void) {
unsigned int w; unsigned int w;


if(!curr)
return;
w = promptw + cmdw + 2 * spaceitem;
for(next = curr; next && w < mw; next=next->right)
w += MIN(textw(next->text), mw / 3);
w = promptw + cmdw + 2 * spaceitem;
for(prev = curr; prev && prev->left && w < mw; prev=prev->left)
w += MIN(textw(prev->left->text), mw / 3);
w = promptw + cmdw + (2 * spaceitem);
for(next = curr; next; next = next->right)
if((w += MIN(textw(next->text), mw / 3)) > mw)
break;
w = promptw + cmdw + (2 * spaceitem);
for(prev = curr; prev && prev->left; prev = prev->left)
if((w += MIN(textw(prev->left->text), mw / 3)) > mw)
break;
} }


void void
calcoffsetsv(void) { calcoffsetsv(void) {
unsigned int h;
unsigned int i;


if(!curr)
return;
h = (dc.font.height + 2) * lines;
for(next = curr; next && h > 0; next = next->right)
h -= dc.font.height + 2;
h = (dc.font.height + 2) * lines;
for(prev = curr; prev && prev->left && h > 0; prev = prev->left)
h -= dc.font.height + 2;
next = prev = curr;
for(i = 0; i < lines && next; i++)
next = next->right;
for(i = 0; i < lines && prev && prev->left; i++)
prev = prev->left;
} }


char * char *
@@ -150,6 +148,13 @@ cleanup(void) {
XUngrabKeyboard(dpy, CurrentTime); XUngrabKeyboard(dpy, CurrentTime);
} }


void
dinput(void) {
cleanup();
execlp("dinput", "dinput", text, NULL); /* todo: argv */
eprint("cannot exec dinput\n");
}

void void
drawmenu(void) { drawmenu(void) {
dc.x = 0; dc.x = 0;
@@ -290,8 +295,7 @@ kpress(XKeyEvent * e) {
match(text); match(text);
break; break;
case XK_x: case XK_x:
execlp("dinput", "dinput", text, NULL); /* todo: argv */
eprint("dmenu: cannot exec dinput:");
dinput();
break; break;
} }
} }
@@ -369,10 +373,9 @@ kpress(XKeyEvent * e) {
} }
break; break;
case XK_Tab: case XK_Tab:
if(!sel)
return;
strncpy(text, sel->text, sizeof text);
match(text);
if(sel)
strncpy(text, sel->text, sizeof text);
dinput();
break; break;
} }
drawmenu(); drawmenu();
@@ -431,11 +434,11 @@ readstdin(void) {
if(buf[len-1] == '\n') if(buf[len-1] == '\n')
buf[--len] = '\0'; buf[--len] = '\0';
if(!(p = strdup(buf))) if(!(p = strdup(buf)))
eprint("dmenu: cannot strdup %u bytes\n", len);
eprint("cannot strdup %u bytes\n", len);
if((max = MAX(max, len)) == len) if((max = MAX(max, len)) == len)
maxname = p; maxname = p;
if(!(new = malloc(sizeof *new))) if(!(new = malloc(sizeof *new)))
eprint("dmenu: cannot malloc %u bytes\n", sizeof *new);
eprint("cannot malloc %u bytes\n", sizeof *new);
new->next = new->left = new->right = NULL; new->next = new->left = new->right = NULL;
new->text = p; new->text = p;
if(!i) if(!i)
@@ -544,6 +547,7 @@ main(int argc, char *argv[]) {
Bool topbar = True; Bool topbar = True;


/* command line args */ /* command line args */
progname = argv[0];
for(i = 1; i < argc; i++) for(i = 1; i < argc; i++)
if(!strcmp(argv[i], "-i")) { if(!strcmp(argv[i], "-i")) {
fstrncmp = strncasecmp; fstrncmp = strncasecmp;
@@ -585,7 +589,7 @@ main(int argc, char *argv[]) {
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
fprintf(stderr, "dmenu: warning: no locale support\n"); fprintf(stderr, "dmenu: warning: no locale support\n");
if(!(dpy = XOpenDisplay(NULL))) if(!(dpy = XOpenDisplay(NULL)))
eprint("dmenu: cannot open display\n");
eprint("cannot open display\n");
screen = DefaultScreen(dpy); screen = DefaultScreen(dpy);
if(!parent) if(!parent)
parent = RootWindow(dpy, screen); parent = RootWindow(dpy, screen);


+ 8
- 4
draw.c ファイルの表示

@@ -13,6 +13,9 @@
#define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b))


/* variables */
char *progname;

void void
drawcleanup(void) { drawcleanup(void) {
if(dc.font.set) if(dc.font.set)
@@ -71,6 +74,7 @@ void
eprint(const char *errstr, ...) { eprint(const char *errstr, ...) {
va_list ap; va_list ap;


fprintf(stderr, "%s: ", progname);
va_start(ap, errstr); va_start(ap, errstr);
vfprintf(stderr, errstr, ap); vfprintf(stderr, errstr, ap);
va_end(ap); va_end(ap);
@@ -83,7 +87,7 @@ getcolor(const char *colstr) {
XColor color; XColor color;


if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
eprint("drawtext: cannot allocate color '%s'\n", colstr);
eprint("cannot allocate color '%s'\n", colstr);
return color.pixel; return color.pixel;
} }


@@ -92,8 +96,8 @@ initfont(const char *fontstr) {
char *def, **missing = NULL; char *def, **missing = NULL;
int i, n; int i, n;


if(!fontstr || fontstr[0] == '\0')
eprint("drawtext: cannot load font: '%s'\n", fontstr);
if(!fontstr || !*fontstr)
eprint("cannot load null font\n");
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
if(missing) if(missing)
XFreeStringList(missing); XFreeStringList(missing);
@@ -111,7 +115,7 @@ initfont(const char *fontstr) {
else { else {
if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
eprint("drawtext: cannot load font: '%s'\n", fontstr);
eprint("cannot load font '%s'\n", fontstr);
dc.font.ascent = dc.font.xfont->ascent; dc.font.ascent = dc.font.xfont->ascent;
dc.font.descent = dc.font.xfont->descent; dc.font.descent = dc.font.xfont->descent;
} }


+ 1
- 1
draw.h ファイルの表示

@@ -30,13 +30,13 @@ int textnw(const char *text, unsigned int len);
int textw(const char *text); int textw(const char *text);


/* variables */ /* variables */
extern char *progname;
extern Display *dpy; extern Display *dpy;
extern DC dc; extern DC dc;
extern int screen; extern int screen;
extern unsigned int mw, mh; extern unsigned int mw, mh;
extern Window parent; extern Window parent;


/* style */
extern const char *font; extern const char *font;
extern const char *normbgcolor; extern const char *normbgcolor;
extern const char *normfgcolor; extern const char *normfgcolor;


読み込み中…
キャンセル
保存