/** @copydoc widgetdata::event_func */ static int widget_event(widgetdata *widget, SDL_Event *event) { network_graph_widget_t *network_graph = widget->subwidget; network_graph_data_t *data = &network_graph->data[network_graph->type]; if (event->type == SDL_MOUSEMOTION) { int x = event->motion.x - widget->x; if (x < 0 || x >= widget->w) { return 0; } char buf[HUGE_BUF]; snprintf(VS(buf), "Maximum: %" PRIu64 " Bytes/s (%" PRIu64 " kB/s)", (uint64_t) data->max, (uint64_t) data->max / 1000); for (int i = 0; i < NETWORK_GRAPH_TRAFFIC_MAX; i++) { size_t bytes = data->data[x * NETWORK_GRAPH_TRAFFIC_MAX + i]; snprintfcat(VS(buf), "\n%s: %" PRIu64 " Bytes/s (%" PRIu64 " kB/s)", network_graph_filters[i], (uint64_t) bytes, (uint64_t) bytes / 1000); } tooltip_create(event->motion.x, event->motion.y, FONT_ARIAL11, buf); tooltip_multiline(200); tooltip_enable_delay(100); } return 0; }
/** @copydoc popup_struct::event_func */ static int popup_event_func(popup_struct *popup, SDL_Event *event) { if (scrollbar_event(&scrollbar, event)) { return 1; } if (book_help_history_enabled && BUTTON_CHECK_TOOLTIP(&popup->button_left.button)) { tooltip_create(event->motion.x, event->motion.y, FONT_ARIAL11, "Go back"); tooltip_enable_delay(300); } /* Mouse event and the mouse is inside the book. */ if (event->type == SDL_MOUSEBUTTONDOWN && event->motion.x >= popup->x && event->motion.x < popup->x + popup->surface->w && event->motion.y >= popup->y && event->motion.y < popup->y + popup->surface->h) { /* Scroll the book. */ if (event->button.button == SDL_BUTTON_WHEELDOWN) { scrollbar_scroll_adjust(&scrollbar, 1); return 1; } else if (event->button.button == SDL_BUTTON_WHEELUP) { scrollbar_scroll_adjust(&scrollbar, -1); return 1; } } else if (event->type == SDL_KEYDOWN) { /* Scrolling. */ if (event->key.keysym.sym == SDLK_DOWN) { scrollbar_scroll_adjust(&scrollbar, 1); return 1; } else if (event->key.keysym.sym == SDLK_UP) { scrollbar_scroll_adjust(&scrollbar, -1); return 1; } else if (event->key.keysym.sym == SDLK_PAGEDOWN) { scrollbar_scroll_adjust(&scrollbar, book_scroll_lines); return 1; } else if (event->key.keysym.sym == SDLK_PAGEUP) { scrollbar_scroll_adjust(&scrollbar, -book_scroll_lines); return 1; } } return -1; }
MainWin * mainwin_create(Display *dpy, dlist *config) { const char *tmp; XColor screen_color, exact_color; XSetWindowAttributes wattr; XWindowAttributes rootattr; unsigned long valuemask = CWEventMask; #ifdef XINERAMA int event_base, error_base; #endif /* XINERAMA */ MainWin *mw = (MainWin *)malloc(sizeof(MainWin)); mw->screen = DefaultScreen(dpy); mw->visual = imlib_get_best_visual(dpy, mw->screen, &mw->depth); mw->colormap = DefaultColormap(dpy, mw->screen); mw->root = RootWindow(dpy, mw->screen); mw->background = 0; mw->bg_pixmap = None; #ifdef XINERAMA mw->xin_info = mw->xin_active = 0; mw->xin_screens = 0; #endif /* XINERAMA */ mw->x = mw->y = 0; mw->no_free_color = 0; mw->pressed = mw->focus = 0; mw->tooltip = 0; mw->cod = 0; mw->cm_normal = mw->cm_highlight = 0; mw->key_up = XKeysymToKeycode(dpy, XK_Up); mw->key_down = XKeysymToKeycode(dpy, XK_Down); mw->key_left = XKeysymToKeycode(dpy, XK_Left); mw->key_right = XKeysymToKeycode(dpy, XK_Right); mw->key_enter = XKeysymToKeycode(dpy, XK_Return); mw->key_space = XKeysymToKeycode(dpy, XK_space); mw->key_escape = XKeysymToKeycode(dpy, XK_Escape); mw->key_q = XKeysymToKeycode(dpy, XK_q); XGetWindowAttributes(dpy, mw->root, &rootattr); mw->width = rootattr.width; mw->height = rootattr.height; mw->dpy = dpy; valuemask |= CWBackPixel; wattr.background_pixel = BlackPixel(dpy, mw->screen); wattr.event_mask = VisibilityChangeMask | ButtonReleaseMask; mw->window = XCreateWindow(dpy, mw->root, 0, 0, mw->width, mw->height, 0, CopyFromParent, InputOutput, CopyFromParent, valuemask, &wattr); if(mw->window == None) { free(mw); return 0; } #ifdef XINERAMA # ifdef DEBUG fprintf(stderr, "--> checking for Xinerama extension... "); # endif /* DEBUG */ if(XineramaQueryExtension(dpy, &event_base, &error_base)) { # ifdef DEBUG fprintf(stderr, "yes\n--> checking if Xinerama is enabled... "); # endif /* DEBUG */ if(XineramaIsActive(dpy)) { # ifdef DEBUG fprintf(stderr, "yes\n--> fetching Xinerama info... "); # endif /* DEBUG */ mw->xin_info = XineramaQueryScreens(mw->dpy, &mw->xin_screens); # ifdef DEBUG fprintf(stderr, "done (%i screens)\n", mw->xin_screens); # endif /* DEBUG */ } # ifdef DEBUG else fprintf(stderr, "no\n"); # endif /* DEBUG */ } # ifdef DEBUG else fprintf(stderr, "no\n"); # endif /* DEBUG */ #endif /* XINERAMA */ tmp = config_get(config, "normal", "border", "black"); if(! XAllocNamedColor(mw->dpy, mw->colormap, tmp, &screen_color, &exact_color)) { fprintf(stderr, "WARNING: Invalid color '%s', reverting to black.\n", tmp); BORDER_COLOR(mw) = BlackPixel(mw->dpy, mw->screen); mw->no_free_color = 1; } else BORDER_COLOR(mw) = screen_color.pixel; tmp = config_get(config, "highlight", "border", "#d0d0ff"); if(! XAllocNamedColor(mw->dpy, mw->colormap, tmp, &screen_color, &exact_color)) { fprintf(stderr, "WARNING: Invalid color '%s', reverting to white.\n", tmp); HIGHLIGHT_COLOR(mw) = WhitePixel(mw->dpy, mw->screen); mw->no_free_color |= 2; } else HIGHLIGHT_COLOR(mw) = screen_color.pixel; tmp = config_get(config, "general", "distance", "50"); DISTANCE(mw) = MAX(1, strtol(tmp, 0, 10)); if(! strcasecmp(config_get(config, "tooltip", "show", "true"), "true")) mw->tooltip = tooltip_create(mw, config); mw->cm_normal = create_modifier(mw, config, "normal", "0.0", "white", "200"); mw->cm_highlight = create_modifier(mw, config, "highlight", "0.05", "#d0d0ff", "255"); return mw; }