int create_filters(const char *pProgram, int eExecute, int uUp, int dDown, pid_t *pProcess1, pid_t *pProcess2) { if (!pProcess1 || !pProcess2) { fprintf(stderr, "%s: internal error\n", pProgram); return -1; } int far_incoming = -1; int far_outgoing = -1; int client_incoming = -1; int client_outgoing = -1; int filter_type = check_type(eExecute); if (filter_type == FILTER_ERROR) { fprintf(stderr, "%s: filter must be associated with an active server or forwarder\n", pProgram); return -1; } else if (filter_type == FILTER_NORMAL) { if (normal_setup(pProgram, uUp, dDown, &client_incoming, &client_outgoing, &far_incoming, &far_outgoing ) < 0) return -1; return fork_normal(pProgram, uUp, dDown, pProcess1, pProcess2, client_incoming, client_outgoing, far_incoming, far_outgoing); } else if (filter_type == FILTER_REMOTE) { if (remote_setup(pProgram, eExecute, &client_incoming, &client_outgoing, &far_incoming, &far_outgoing) < 0) return -1; return fork_remote(pProgram, eExecute, uUp, dDown, pProcess1, pProcess2, client_incoming, client_outgoing, far_incoming, far_outgoing); } else { fprintf(stderr, "%s: internal error\n", pProgram); return -1; } }
void display_cow(bool debug, const char *text, bool run_main, cowmode_t mode) { GdkScreen *screen = gdk_screen_get_default(); gint n_monitors = gdk_screen_get_n_monitors(screen); gint pick = get_int_option("monitor"); if (pick < 0 || pick >= n_monitors) pick = random() % n_monitors; GdkRectangle geom; gdk_screen_get_monitor_geometry(screen, pick, &geom); xcowsay.screen_width = geom.width; xcowsay.screen_height = geom.height; g_assert(xcowsay.cow_pixbuf); xcowsay.cow = make_shape_from_pixbuf(xcowsay.cow_pixbuf); switch (mode) { case COWMODE_NORMAL: case COWMODE_THINK: normal_setup(text, debug, mode); break; case COWMODE_DREAM: dream_setup(text, debug); break; default: fprintf(stderr, "Error: Unsupported cow mode %d\n", mode); exit(1); } xcowsay.bubble = make_shape_from_pixbuf(xcowsay.bubble_pixbuf); int total_width = shape_width(xcowsay.cow) + get_int_option("bubble_x") + xcowsay.bubble_width; int total_height = max(shape_height(xcowsay.cow), xcowsay.bubble_height); int bubble_off = max((xcowsay.bubble_height - shape_height(xcowsay.cow))/2, 0); int area_w = xcowsay.screen_width - total_width; int area_h = xcowsay.screen_height - total_height; // Fit the cow on the screen as best as we can // The area can't be be zero or we'd get an FPE if (area_w < 1) area_w = 1; if (area_h < 1) area_h = 1; int cow_x = get_int_option("at_x"); if (cow_x < 0) cow_x = random() % area_w; else if (cow_x >= area_w) cow_x = area_w - 1; int cow_y = get_int_option("at_y"); if (cow_y < 0) cow_y = random() % area_h; else if (cow_y >= area_h) cow_y = area_h - 1; if (get_bool_option("left")) { move_shape(xcowsay.cow, geom.x + cow_x + xcowsay.bubble_width, geom.y + bubble_off + cow_y); show_shape(xcowsay.cow); int bx = shape_x(xcowsay.cow) - xcowsay.bubble_width + get_int_option("bubble_x"); int by = shape_y(xcowsay.cow) + (shape_height(xcowsay.cow) - shape_height(xcowsay.bubble))/2 + get_int_option("bubble_y"); move_shape(xcowsay.bubble, bx, by); } else { move_shape(xcowsay.cow, geom.x + cow_x, geom.y + bubble_off + cow_y); show_shape(xcowsay.cow); int bx = shape_x(xcowsay.cow) + shape_width(xcowsay.cow) + get_int_option("bubble_x"); int by = shape_y(xcowsay.cow) + (shape_height(xcowsay.cow) - shape_height(xcowsay.bubble))/2 + get_int_option("bubble_y"); move_shape(xcowsay.bubble, bx, by); } xcowsay.state = csLeadIn; xcowsay.transition_timeout = get_int_option("lead_in_time"); g_timeout_add(TICK_TIMEOUT, tick, NULL); close_when_clicked(xcowsay.cow); if (run_main) gtk_main(); g_object_unref(xcowsay.bubble_pixbuf); xcowsay.bubble_pixbuf = NULL; }