aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clocks.c87
-rw-r--r--display.c17
-rw-r--r--display.h1
3 files changed, 64 insertions, 41 deletions
diff --git a/clocks.c b/clocks.c
index 59db8a7..2ae2f5a 100644
--- a/clocks.c
+++ b/clocks.c
@@ -159,28 +159,6 @@ static int dump_all_parents(char *clkarg)
return tree_for_each_parent(tree, dump_clock_cb, NULL);
}
-void find_parents_for_clock(char *clkname, int complete)
-{
- char name[256];
-
- name[0] = '\0';
- if (!complete) {
- char str[256];
-
- strcat(name, clkname);
- sprintf(str, "Enter Clock Name : %s\n", name);
- display_reset_cursor(CLOCK);
- display_print_line(CLOCK, 0, str, 1, NULL);
- display_refresh_pad(CLOCK);
- return;
- }
- sprintf(name, "Parents for \"%s\" Clock : \n", clkname);
- display_reset_cursor(CLOCK);
- display_print_line(CLOCK, 0, name, 1, NULL);
- display_refresh_pad(CLOCK);
- dump_all_parents(clkname);
-}
-
static inline int read_clock_cb(struct tree *t, void *data)
{
struct clock_info *clk = t->private;
@@ -192,9 +170,9 @@ static inline int read_clock_cb(struct tree *t, void *data)
return 0;
}
-static int read_clock_info(void)
+static int read_clock_info(struct tree *tree)
{
- return tree_for_each(clock_tree, read_clock_cb, NULL);
+ return tree_for_each(tree, read_clock_cb, NULL);
}
static int fill_clock_cb(struct tree *t, void *data)
@@ -259,20 +237,12 @@ free_clkname:
return clkline;
}
-static int clock_print_info_cb(struct tree *t, void *data)
+static int _clock_print_info_cb(struct tree *t, void *data)
{
struct clock_info *clock = t->private;
int *line = data;
char *buffer;
- /* we skip the root node of the tree */
- if (!t->parent)
- return 0;
-
- /* show the clock when *all* its parent is expanded */
- if (tree_for_each_parent(t->parent, is_collapsed, NULL))
- return 0;
-
buffer = clock_line(t);
if (!buffer)
return -1;
@@ -286,6 +256,19 @@ static int clock_print_info_cb(struct tree *t, void *data)
return 0;
}
+static int clock_print_info_cb(struct tree *t, void *data)
+{
+ /* we skip the root node of the tree */
+ if (!t->parent)
+ return 0;
+
+ /* show the clock when *all* its parent is expanded */
+ if (tree_for_each_parent(t->parent, is_collapsed, NULL))
+ return 0;
+
+ return _clock_print_info_cb(t, data);
+}
+
static int clock_print_header(void)
{
char *buf;
@@ -302,7 +285,7 @@ static int clock_print_header(void)
return ret;
}
-static int clock_print_info(void)
+static int clock_print_info(struct tree *tree)
{
int ret, line = 0;
@@ -310,7 +293,7 @@ static int clock_print_info(void)
clock_print_header();
- ret = tree_for_each(clock_tree, clock_print_info_cb, &line);
+ ret = tree_for_each(tree, clock_print_info_cb, &line);
display_refresh_pad(CLOCK);
@@ -334,10 +317,37 @@ static int clock_toggle_expanded(void)
*/
static int clock_display(void)
{
- if (read_clock_info())
+ if (read_clock_info(clock_tree))
return -1;
- return clock_print_info();
+ return clock_print_info(clock_tree);
+}
+
+int clock_find(const char *name)
+{
+ struct tree **ptree = NULL;
+ int i, nr, line = 0, ret = 0;
+
+ nr = tree_finds(clock_tree, name, &ptree);
+
+ display_reset_cursor(CLOCK);
+
+ for (i = 0; i < nr; i++) {
+
+ ret = read_clock_info(ptree[i]);
+ if (ret)
+ break;
+
+ ret = _clock_print_info_cb(ptree[i], &line);
+ if (ret)
+ break;
+ }
+
+ display_refresh_pad(CLOCK);
+
+ free(ptree);
+
+ return ret;
}
/*
@@ -350,7 +360,7 @@ int clock_dump(char *clk)
{
int ret;
- if (read_clock_info())
+ if (read_clock_info(clock_tree))
return -1;
if (clk) {
@@ -370,6 +380,7 @@ int clock_dump(char *clk)
static struct display_ops clock_ops = {
.display = clock_display,
.select = clock_toggle_expanded,
+ .find = clock_find,
};
/*
diff --git a/display.c b/display.c
index 12eb052..1dc11dd 100644
--- a/display.c
+++ b/display.c
@@ -16,6 +16,7 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <ctype.h>
#include <ncurses.h>
#include <sys/types.h>
#include <regex.h>
@@ -424,7 +425,6 @@ static int display_find_keystroke(int fd, void *data)
regex_t *reg = findd->reg;
char *string = findd->string;
int keystroke = getch();
-
char match[2] = { [0] = (char)keystroke, [1] = '\0' };
regmatch_t m[1];
@@ -434,6 +434,14 @@ static int display_find_keystroke(int fd, void *data)
display_find_form_fini(findd);
return display_switch_to_main(fd);
+ case KEY_DOWN:
+ display_next_line();
+ break;
+
+ case KEY_UP:
+ display_prev_line();
+ break;
+
case KEY_BACKSPACE:
if (strlen(string))
string[strlen(string) - 1] = '\0';
@@ -455,10 +463,13 @@ static int display_find_keystroke(int fd, void *data)
break;
}
- if (display_show_header(current_win))
+ if (!windata[current_win].ops || !windata[current_win].ops->find)
+ return 0;
+
+ if (windata[current_win].ops->find(string))
return -1;
- if (display_refresh(current_win))
+ if (display_show_header(current_win))
return -1;
if (display_show_footer(current_win, strlen(string) ? string :
diff --git a/display.h b/display.h
index f9a762c..fe084cb 100644
--- a/display.h
+++ b/display.h
@@ -18,6 +18,7 @@ enum { CLOCK, REGULATOR, SENSOR };
struct display_ops {
int (*display)(void);
int (*select)(void);
+ int (*find)(const char *);
};
extern int display_print_line(int window, int line, char *str,