static int genmon2_constructor(plugin_instance *p) { genmon2_priv *gm; ENTER; gm = (genmon2_priv *) p; gm->command = "date +%R"; gm->time = 1; gm->max_text_len = 99; XCG(p->xc, "Command", &gm->command, str); XCG(p->xc, "TextSize", &gm->textsize, str); XCG(p->xc, "TextColor", &gm->textcolor, str); XCG(p->xc, "PollingTime", &gm->time, int); XCG(p->xc, "MaxTextLength", &gm->max_text_len, int); gm->main = gtk_label_new(NULL); gtk_label_set_max_width_chars(GTK_LABEL(gm->main), gm->max_text_len); text_update(gm); gtk_container_set_border_width (GTK_CONTAINER (p->pwid), 1); gtk_container_add(GTK_CONTAINER(p->pwid), gm->main); gtk_widget_show_all(p->pwid); gm->timer = g_timeout_add((guint) gm->time * 1000, (GSourceFunc) text_update, (gpointer) gm); RET(1); }
static void fetch_gravatar_done(GPid pid, gint status, gpointer data) { user_priv *c G_GNUC_UNUSED = data; plugin_instance *p G_GNUC_UNUSED = data; gchar *image = NULL, *icon = NULL; ENTER; DBG("status %d\n", status); g_spawn_close_pid(c->pid); c->pid = 0; c->sid = 0; if (status) RET(); DBG("rebuild menu\n"); XCG(p->xc, "icon", &icon, strdup); XCG(p->xc, "image", &image, strdup); XCS(p->xc, "image", image, value); xconf_del(xconf_find(p->xc, "icon", 0), FALSE); PLUGIN_CLASS(k)->destructor(p); PLUGIN_CLASS(k)->constructor(p); if (image) { XCS(p->xc, "image", image, value); g_free(image); } if (icon) { XCS(p->xc, "icon", icon, value); g_free(icon); } RET(); }
static int net_constructor(plugin_instance *p) { net_priv *c; if (!(k = class_get("chart"))) RET(0); if (!PLUGIN_CLASS(k)->constructor(p)) RET(0); c = (net_priv *) p; c->iface = "eth0"; c->max_rx = 120; c->max_tx = 12; c->colors[0] = "violet"; c->colors[1] = "blue"; XCG(p->xc, "interface", &c->iface, str); XCG(p->xc, "RxLimit", &c->max_rx, int); XCG(p->xc, "TxLimit", &c->max_tx, int); XCG(p->xc, "TxColor", &c->colors[0], str); XCG(p->xc, "RxColor", &c->colors[1], str); init_net_stats(c); c->max = c->max_rx + c->max_tx; k->set_rows(&c->chart, 2, c->colors); gtk_widget_set_tooltip_markup(((plugin_instance *)c)->pwid, "<b>Net</b>"); net_get_load(c); c->timer = g_timeout_add(CHECK_PERIOD * 1000, (GSourceFunc) net_get_load, (gpointer) c); RET(1); }
static int read_application(icons_priv *ics, xconf *xc) { GdkPixbuf *gp = NULL; gchar *fname, *iname, *appname, *classname; wmpix_t *wp = NULL; gulong *data; int size; ENTER; iname = fname = appname = classname = NULL; XCG(xc, "image", &fname, str); XCG(xc, "icon", &iname, str); XCG(xc, "appname", &appname, str); XCG(xc, "classname", &classname, str); fname = expand_tilda(fname); DBG("appname=%s classname=%s\n", appname, classname); if (!(fname || iname)) goto error; gp = fb_pixbuf_new(iname, fname, 48, 48, FALSE); if (gp) { if ((data = pixbuf2argb(gp, &size))) { wp = g_new0 (wmpix_t, 1); wp->next = ics->wmpix; wp->data = data; wp->size = size; wp->ch.res_name = g_strdup(appname); wp->ch.res_class = g_strdup(classname); DBG("read name=[%s] class=[%s]\n", wp->ch.res_name, wp->ch.res_class); ics->wmpix = wp; } g_object_unref(gp); } g_free(fname); RET(1); error: g_free(fname); RET(0); }
static int user_constructor(plugin_instance *p) { user_priv *c G_GNUC_UNUSED = (user_priv *) p; gchar *image = NULL; gchar *icon = NULL; gchar *gravatar = NULL; ENTER; if (!(k = class_get("menu"))) RET(0); XCG(p->xc, "image", &image, str); XCG(p->xc, "icon", &icon, str); if (!(image || icon)) XCS(p->xc, "icon", "avatar-default", value); if (!PLUGIN_CLASS(k)->constructor(p)) RET(0); XCG(p->xc, "gravataremail", &gravatar, str); DBG("gravatar email '%s'\n", gravatar); if (gravatar) g_timeout_add(300, fetch_gravatar, p); gtk_widget_set_tooltip_markup(p->pwid, "<b>User</b>"); RET(1); }
static void make_button(plugin_instance *p, xconf *xc) { int w, h; menu_priv *m; gchar *fname, *iname; ENTER; m = (menu_priv *) p; /* XXX: this code is duplicated in every plugin. * Lets run it once in a panel */ if (p->panel->orientation == GTK_ORIENTATION_HORIZONTAL) { w = -1; h = p->panel->max_elem_height; } else { w = p->panel->max_elem_height; h = -1; } fname = iname = NULL; XCG(xc, "image", &fname, str); fname = expand_tilda(fname); XCG(xc, "icon", &iname, str); if (fname || iname) { m->bg = fb_button_new(iname, fname, w, h, 0x702020, NULL); gtk_container_add(GTK_CONTAINER(p->pwid), m->bg); if (p->panel->transparent) gtk_bgbox_set_background(m->bg, BG_INHERIT, 0, 0); g_signal_connect (G_OBJECT (m->bg), "button-press-event", G_CALLBACK (my_button_pressed), p); } g_free(fname); }
static int ics_parse_config(icons_priv *ics) { gchar *def_icon; plugin_instance *p = (plugin_instance *) ics; int i; xconf *pxc; ENTER; def_icon = NULL; XCG(p->xc, "defaulticon", &def_icon, str); if (def_icon && !read_dicon(ics, def_icon)) goto error; for (i = 0; (pxc = xconf_find(p->xc, "application", i)); i++) if (!read_application(ics, pxc)) goto error; RET(1); error: RET(0); }
static gboolean fetch_gravatar(gpointer data) { user_priv *c G_GNUC_UNUSED = data; plugin_instance *p G_GNUC_UNUSED = data; GChecksum *cs; gchar *gravatar = NULL; gchar buf[GRAVATAR_LEN]; // FIXME: select more secure path gchar *image = "/tmp/gravatar"; gchar *argv[] = { "wget", "-q", "-O", image, buf, NULL }; ENTER; cs = g_checksum_new(G_CHECKSUM_MD5); XCG(p->xc, "gravataremail", &gravatar, str); g_checksum_update(cs, (guchar *) gravatar, -1); snprintf(buf, sizeof(buf), "http://www.gravatar.com/avatar/%s", g_checksum_get_string(cs)); g_checksum_free(cs); DBG("gravatar '%s'\n", buf); c->pid = run_app_argv(argv); c->sid = g_child_watch_add(c->pid, fetch_gravatar_done, data); RET(FALSE); }
static int panel_parse_global(xconf *xc) { ENTER; /* Set default values */ p->allign = ALLIGN_CENTER; p->edge = EDGE_BOTTOM; p->widthtype = WIDTH_PERCENT; p->width = 100; p->heighttype = HEIGHT_PIXEL; p->height = PANEL_HEIGHT_DEFAULT; p->max_elem_height = PANEL_HEIGHT_MAX; p->setdocktype = 1; p->setstrut = 1; p->round_corners = 1; p->round_corners_radius = 7; p->autohide = 0; p->height_when_hidden = 2; p->transparent = 0; p->alpha = 127; p->tintcolor_name = "white"; p->spacing = 0; p->setlayer = FALSE; p->layer = LAYER_ABOVE; /* Read config */ /* geometry */ XCG(xc, "edge", &p->edge, enum, edge_enum); XCG(xc, "allign", &p->allign, enum, allign_enum); XCG(xc, "widthtype", &p->widthtype, enum, widthtype_enum); XCG(xc, "heighttype", &p->heighttype, enum, heighttype_enum); XCG(xc, "width", &p->width, int); XCG(xc, "height", &p->height, int); XCG(xc, "margin", &p->margin, int); /* properties */ XCG(xc, "setdocktype", &p->setdocktype, enum, bool_enum); XCG(xc, "setpartialstrut", &p->setstrut, enum, bool_enum); XCG(xc, "autohide", &p->autohide, enum, bool_enum); XCG(xc, "heightwhenhidden", &p->height_when_hidden, int); XCG(xc, "setlayer", &p->setlayer, enum, bool_enum); XCG(xc, "layer", &p->layer, enum, layer_enum); /* effects */ XCG(xc, "roundcorners", &p->round_corners, enum, bool_enum); XCG(xc, "roundcornersradius", &p->round_corners_radius, int); XCG(xc, "transparent", &p->transparent, enum, bool_enum); XCG(xc, "alpha", &p->alpha, int); XCG(xc, "tintcolor", &p->tintcolor_name, str); XCG(xc, "maxelemheight", &p->max_elem_height, int); /* Sanity checks */ if (!gdk_color_parse(p->tintcolor_name, &p->gtintcolor)) gdk_color_parse("white", &p->gtintcolor); p->tintcolor = gcolor2rgb24(&p->gtintcolor); DBG("tintcolor=%x\n", p->tintcolor); if (p->alpha > 255) p->alpha = 255; p->orientation = (p->edge == EDGE_TOP || p->edge == EDGE_BOTTOM) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL; if (p->orientation == GTK_ORIENTATION_HORIZONTAL) { p->my_box_new = gtk_hbox_new; p->my_separator_new = gtk_vseparator_new; } else { p->my_box_new = gtk_vbox_new; p->my_separator_new = gtk_hseparator_new; } if (p->width < 0) p->width = 100; if (p->widthtype == WIDTH_PERCENT && p->width > 100) p->width = 100; p->heighttype = HEIGHT_PIXEL; if (p->heighttype == HEIGHT_PIXEL) { if (p->height < PANEL_HEIGHT_MIN) p->height = PANEL_HEIGHT_MIN; else if (p->height > PANEL_HEIGHT_MAX) p->height = PANEL_HEIGHT_MAX; } if (p->max_elem_height > p->height || p->max_elem_height < PANEL_HEIGHT_MIN) p->max_elem_height = p->height; p->curdesk = get_net_current_desktop(); p->desknum = get_net_number_of_desktops(); //p->workarea = get_xaproperty (GDK_ROOT_WINDOW(), a_NET_WORKAREA, // XA_CARDINAL, &p->wa_len); //print_wmdata(p); panel_start_gui(p); RET(1); }
/* Creates menu item. Text and image are read from xconf. Action * depends on @menu. If @menu is NULL, action is to execute external * command. Otherwise it is to pop up @menu menu */ static GtkWidget * menu_create_item(xconf *xc, GtkWidget *menu, menu_priv *m) { gchar *name, *fname, *iname, *action, *cmd; GtkWidget *mi; cmd = name = fname = action = iname = NULL; XCG(xc, "name", &name, str); mi = gtk_image_menu_item_new_with_label(name ? name : ""); gtk_container_set_border_width(GTK_CONTAINER(mi), 0); XCG(xc, "image", &fname, str); fname = expand_tilda(fname); XCG(xc, "icon", &iname, str); if (fname || iname) { GdkPixbuf *pb; if ((pb = fb_pixbuf_new(iname, fname, m->icon_size, m->icon_size, FALSE))) { gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), gtk_image_new_from_pixbuf(pb)); g_object_unref(G_OBJECT(pb)); } } g_free(fname); if (menu) { gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), menu); goto done; } XCG(xc, "action", &action, str); if (action) { action = expand_tilda(action); g_signal_connect_swapped(G_OBJECT(mi), "activate", (GCallback)run_app, action); g_object_set_data_full(G_OBJECT(mi), "activate", action, g_free); goto done; } XCG(xc, "command", &cmd, str); if (cmd) { /* XXX: implement command API */ #if 0 command *tmp; for (tmp = commands; tmp->name; tmp++) if (!g_ascii_strcasecmp(cmd, tmp->name)) { g_signal_connect(G_OBJECT(mi), "activate", (GCallback)run_command, tmp->cmd); goto done; } #endif } done: return mi; }