]> git.pld-linux.org Git - packages/dmenu.git/blob - dmenu-xmms.patch
up to 5.3
[packages/dmenu.git] / dmenu-xmms.patch
1 This patch is based on
2 http://tools.suckless.org/dmenu/patches/xmms-like_pattern_matching
3
4 diff -up dmenu-4.1.1/config.def.h dmenu-4.1.1_xmms/config.def.h
5 --- dmenu-4.1.1/config.def.h    2009-04-18 13:50:04.000000000 +0200
6 +++ dmenu-4.1.1_xmms/config.def.h       2009-11-19 21:31:17.000000000 +0100
7 @@ -7,3 +7,4 @@ static const char *normfgcolor = "#00000
8  static const char *selbgcolor  = "#0066ff";
9  static const char *selfgcolor  = "#ffffff";
10  static unsigned int spaceitem  = 30; /* px between menu items */
11 +static unsigned int maxtokens  = 16; /* max. tokens for pattern matching */
12 diff -up dmenu-4.1.1/dmenu.1 dmenu-4.1.1_xmms/dmenu.1
13 --- dmenu-4.1.1/dmenu.1 2009-04-18 13:50:04.000000000 +0200
14 +++ dmenu-4.1.1_xmms/dmenu.1    2009-11-19 21:14:24.000000000 +0100
15 @@ -11,6 +11,7 @@ dmenu \- dynamic menu
16  .RB [ \-p " <prompt>"]
17  .RB [ \-sb " <color>"]
18  .RB [ \-sf " <color>"]
19 +.RB [ \-xs ]
20  .RB [ \-v ]
21  .SH DESCRIPTION
22  .SS Overview
23 @@ -44,6 +45,9 @@ defines the selected background color (#
24  .B \-sf <color>
25  defines the selected foreground color (#RGB, #RRGGBB, and color names are supported).
26  .TP
27 +.B \-xs
28 +xmms-like pattern matching.
29 +.TP
30  .B \-v
31  prints version information to standard output, then exits.
32  .SH USAGE
33 diff -u dmenu-4.1.1/dmenu.c.orig dmenu-4.1.1/dmenu.c
34 --- dmenu-4.1.1/dmenu.c.orig    2010-05-29 13:56:51.000000000 +0200
35 +++ dmenu-4.1.1/dmenu.c 2010-07-05 22:23:30.000000000 +0200
36 @@ -75,6 +75,7 @@
37  /* variables */
38  static char *maxname = NULL;
39  static char *prompt = NULL;
40 +static char **tokens = NULL;
41  static char text[4096];
42  static int cmdw = 0;
43  static int promptw = 0;
44 @@ -84,6 +85,7 @@
45  static unsigned int mw, mh;
46  static unsigned int numlockmask = 0;
47  static Bool running = True;
48 +static Bool xmms = False;
49  static Display *dpy;
50  static DC dc;
51  static Item *allitems = NULL;  /* first of all items */
52 @@ -578,22 +580,55 @@
53         drawmenu();
54  }
55  
56 +unsigned int tokenize(char *pat, char **tok)
57 +{
58 +       unsigned int i = 0;
59 +       char tmp[4096] = {0};
60 +
61 +       strncpy(tmp, pat, strlen(pat));
62 +       tok[0] = strtok(tmp, " ");
63 +
64 +       while(tok[i] && i < maxtokens)
65 +               tok[++i] = strtok(NULL, " ");
66 +       return i;
67 +}
68 +
69  void
70  match(char *pattern) {
71 -       unsigned int plen;
72 +       unsigned int plen, tokencnt = 0;
73 +       char append = 0;
74         Item *i, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
75  
76         if(!pattern)
77                 return;
78 -       plen = strlen(pattern);
79 +
80 +       if(!xmms)
81 +               tokens[(tokencnt = 1)-1] = pattern;
82 +       else
83 +               if(!(tokencnt = tokenize(pattern, tokens)))
84 +                       tokens[(tokencnt = 1)-1] = "";
85         item = lexact = lprefix = lsubstr = itemend = exactend = prefixend = substrend = NULL;
86 -       for(i = allitems; i; i = i->next)
87 -               if(!fstrncmp(pattern, i->text, plen + 1))
88 +       for(i = allitems; i; i = i->next) {
89 +               for(int j = 0; j < tokencnt; ++j) {
90 +                       plen = strlen(tokens[j]);
91 +                       if(!fstrncmp(tokens[j], i->text, plen + 1))
92 +                               append = !append || append > 1 ? 1 : append;
93 +                       else if(!fstrncmp(tokens[j], i->text, plen ))
94 +                               append = !append || append > 2 ? 2 : append;
95 +                       else if(fstrstr(i->text, tokens[j]))
96 +                               append = append > 0 && append < 3 ? append : 3;
97 +                       else {
98 +                               append = 0;
99 +                               break;
100 +                       }
101 +               }
102 +               if(append == 1)
103                         appenditem(i, &lexact, &exactend);
104 -               else if(!fstrncmp(pattern, i->text, plen))
105 +               else if(append == 2)
106                         appenditem(i, &lprefix, &prefixend);
107 -               else if(fstrstr(i->text, pattern))
108 +               else if(append == 3)
109                         appenditem(i, &lsubstr, &substrend);
110 +       }
111         if(lexact) {
112                 item = lexact;
113                 itemend = exactend;
114 @@ -748,6 +783,7 @@
115         if(prompt)
116                 promptw = MIN(textw(prompt), mw / 5);
117         text[0] = '\0';
118 +       tokens = malloc((xmms?maxtokens:1)*sizeof(char*));
119         match(text);
120         XMapRaised(dpy, win);
121  }
122 @@ -806,11 +842,13 @@
123                 else if(!strcmp(argv[i], "-sf")) {
124                         if(++i < argc) selfgcolor = argv[i];
125                 }
126 +               else if(!strcmp(argv[i], "-xs"))
127 +                       xmms = True;
128                 else if(!strcmp(argv[i], "-v"))
129                         eprint("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n");
130                 else
131                         eprint("usage: dmenu [-i] [-b] [-e <xid>] [-l <lines>] [-fn <font>] [-nb <color>]\n"
132 -                              "             [-nf <color>] [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");
133 +                              "             [-nf <color>] [-p <prompt>] [-sb <color>] [-sf <color>] [-xs] [-v]\n");
134         if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
135                 fprintf(stderr, "warning: no locale support\n");
136         if(!(dpy = XOpenDisplay(NULL)))
This page took 0.102387 seconds and 3 git commands to generate.