aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-08-01 19:15:37 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2007-08-01 19:15:37 +0000
commit3b1918496ea4b20ec61287ffbb9e1573e950fdcc (patch)
treebe72121879ccae348690932106b378e5b2f92868 /main.c
parente5a5085f0b16b00e367b3c0428add2829dd7f7b9 (diff)
downloaddzen-3b1918496ea4b20ec61287ffbb9e1573e950fdcc.tar.gz
dzen-3b1918496ea4b20ec61287ffbb9e1573e950fdcc.zip
release 0.7.5
fixed memory leak added in-text commands: ^tw() ^c() ^p() added gadgets: kittscanner gdbar gcpubar git-svn-id: http://dzen.googlecode.com/svn/trunk@149 f2baff5b-bf2c-0410-a398-912abdc3d8b2
Diffstat (limited to 'main.c')
-rw-r--r--main.c100
1 files changed, 58 insertions, 42 deletions
diff --git a/main.c b/main.c
index 0db79fc..4b51313 100644
--- a/main.c
+++ b/main.c
@@ -126,10 +126,8 @@ void
free_buffer(void) {
int i;
for(i=0; i<dzen.slave_win.tsize; i++) {
- free(dzen.slave_win.tbuf[i].text);
- dzen.slave_win.tbuf[i].text = NULL;
- dzen.slave_win.tbuf[i].fg = dzen.norm[ColFG];
- dzen.slave_win.tbuf[i].fg = dzen.norm[ColBG];
+ free(dzen.slave_win.tbuf[i]);
+ dzen.slave_win.tbuf[i] = NULL;
}
dzen.slave_win.tcnt =
dzen.slave_win.last_line_vis =
@@ -171,14 +169,14 @@ read_stdin(void) {
static void
x_hilight_line(int line) {
- drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis].text, 1, line, dzen.slave_win.alignment);
+ drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 1, line, dzen.slave_win.alignment);
XCopyArea(dzen.dpy, dzen.slave_win.drawable[line], dzen.slave_win.line[line], dzen.gc,
0, 0, dzen.slave_win.width, dzen.line_height, 0, 0);
}
static void
x_unhilight_line(int line) {
- drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis].text, 0, line, dzen.slave_win.alignment);
+ drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 0, line, dzen.slave_win.alignment);
XCopyArea(dzen.dpy, dzen.slave_win.drawable[line], dzen.slave_win.line[line], dzen.rgc,
0, 0, dzen.slave_win.width, dzen.line_height, 0, 0);
}
@@ -204,9 +202,8 @@ x_draw_body(void) {
for(i=0; i < dzen.slave_win.max_lines; i++) {
if(i < dzen.slave_win.last_line_vis)
- drawtext(dzen.slave_win.tbuf[i + dzen.slave_win.first_line_vis].text, 0, i, dzen.slave_win.alignment);
- else if(i < dzen.slave_win.max_lines)
- drawtext("", 0, i, dzen.slave_win.alignment);
+ drawtext(dzen.slave_win.tbuf[i + dzen.slave_win.first_line_vis],
+ 0, i, dzen.slave_win.alignment);
}
for(i=0; i < dzen.slave_win.max_lines; i++)
XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc,
@@ -310,6 +307,20 @@ set_net_wm_strut_partial_for(Display *dpy, Window w) {
}
static void
+x_create_gcs(void) {
+ /* normal GC */
+ dzen.gc = XCreateGC(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), 0, 0);
+ XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColFG]);
+ XSetBackground(dzen.dpy, dzen.gc, dzen.norm[ColBG]);
+ /* reverse color GC */
+ dzen.rgc = XCreateGC(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), 0, 0);
+ XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]);
+ XSetBackground(dzen.dpy, dzen.rgc, dzen.norm[ColFG]);
+ /* temporary GC */
+ dzen.tgc = XCreateGC(dzen.dpy, RootWindow(dzen.dpy, dzen.screen), 0, 0);
+}
+
+static void
x_create_windows(void) {
XSetWindowAttributes wa;
Window root;
@@ -330,6 +341,8 @@ x_create_windows(void) {
eprint("dzen: error, cannot allocate color '%s'\n", dzen.fg);
setfont(dzen.fnt);
+ x_create_gcs();
+
/* window attributes */
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
@@ -348,9 +361,11 @@ x_create_windows(void) {
DefaultDepth(dzen.dpy, dzen.screen), CopyFromParent,
DefaultVisual(dzen.dpy, dzen.screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
+ XStoreName(dzen.dpy, dzen.title_win.win, "dzen title");
+
dzen.title_win.drawable = XCreatePixmap(dzen.dpy, root, dzen.title_win.width,
dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen));
- XStoreName(dzen.dpy, dzen.title_win.win, "dzen title");
+ XFillRectangle(dzen.dpy, dzen.title_win.drawable, dzen.rgc, 0, 0, dzen.title_win.width, dzen.line_height);
/* set some hints for windowmanagers*/
set_net_wm_strut_partial_for(dzen.dpy, dzen.title_win.win);
@@ -382,9 +397,12 @@ x_create_windows(void) {
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XStoreName(dzen.dpy, dzen.slave_win.win, "dzen slave");
- for(i=0; i < dzen.slave_win.max_lines; i++)
+ for(i=0; i < dzen.slave_win.max_lines; i++) {
dzen.slave_win.drawable[i] = XCreatePixmap(dzen.dpy, root, ew+r,
dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen));
+ XFillRectangle(dzen.dpy, dzen.slave_win.drawable[i], dzen.rgc, 0, 0,
+ ew+r, dzen.line_height);
+ }
/* windows holding the lines */
for(i=0; i < dzen.slave_win.max_lines; i++)
@@ -416,9 +434,12 @@ x_create_windows(void) {
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XStoreName(dzen.dpy, dzen.slave_win.win, "dzen slave");
- for(i=0; i < dzen.slave_win.max_lines; i++)
+ for(i=0; i < dzen.slave_win.max_lines; i++) {
dzen.slave_win.drawable[i] = XCreatePixmap(dzen.dpy, root, dzen.slave_win.width,
dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen));
+ XFillRectangle(dzen.dpy, dzen.slave_win.drawable[i], dzen.rgc, 0, 0,
+ dzen.slave_win.width, dzen.line_height);
+ }
/* windows holding the lines */
for(i=0; i < dzen.slave_win.max_lines; i++)
@@ -429,15 +450,6 @@ x_create_windows(void) {
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
}
}
- /* normal GC */
- dzen.gc = XCreateGC(dzen.dpy, root, 0, 0);
- XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColFG]);
- XSetBackground(dzen.dpy, dzen.gc, dzen.norm[ColBG]);
- /* temporary GC */
- dzen.rgc = XCreateGC(dzen.dpy, root, 0, 0);
- XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]);
- XSetBackground(dzen.dpy, dzen.rgc, dzen.norm[ColFG]);
- dzen.tgc = XCreateGC(dzen.dpy, root, 0, 0);
}
@@ -448,6 +460,27 @@ x_map_window(Window win) {
}
static void
+x_redraw(XEvent e) {
+ int i;
+
+ if(!dzen.slave_win.ishmenu
+ && e.xexpose.window == dzen.title_win.win)
+ drawheader(NULL);
+ if(!dzen.tsupdate && e.xexpose.window == dzen.slave_win.win) {
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc,
+ 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0);
+ }
+ else {
+ for(i=0; i < dzen.slave_win.max_lines; i++)
+ if(e.xcrossing.window == dzen.slave_win.line[i]) {
+ XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc,
+ 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0);
+ }
+ }
+}
+
+static void
handle_xev(void) {
XEvent ev;
int i;
@@ -457,23 +490,8 @@ handle_xev(void) {
XNextEvent(dzen.dpy, &ev);
switch(ev.type) {
case Expose:
- if(ev.xexpose.count == 0) {
- if(!dzen.slave_win.ishmenu
- && ev.xexpose.window == dzen.title_win.win)
- drawheader(NULL);
- if(!dzen.tsupdate && ev.xexpose.window == dzen.slave_win.win) {
- for(i=0; i < dzen.slave_win.max_lines; i++)
- XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc,
- 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0);
- }
- else {
- for(i=0; i < dzen.slave_win.max_lines; i++)
- if(ev.xcrossing.window == dzen.slave_win.line[i]) {
- XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc,
- 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0);
- }
- }
- }
+ if(ev.xexpose.count == 0)
+ x_redraw(ev);
break;
case EnterNotify:
if(dzen.slave_win.ismenu) {
@@ -579,9 +597,6 @@ event_loop(void) {
int xfd, ret, dr=0;
fd_set rmask;
- /* fill background until data is available */
- drawheader("");
-
xfd = ConnectionNumber(dzen.dpy);
while(dzen.running) {
FD_ZERO(&rmask);
@@ -654,7 +669,7 @@ init_input_buffer(void) {
else
dzen.slave_win.tsize = MIN_BUF_SIZE;
- dzen.slave_win.tbuf = emalloc(dzen.slave_win.tsize * sizeof(Sline));
+ dzen.slave_win.tbuf = emalloc(dzen.slave_win.tsize * sizeof(char *));
}
int
@@ -830,3 +845,4 @@ main(int argc, char *argv[]) {
return EXIT_SUCCESS;
}
+