/* handles the mouse button being released inside the drawing area calls the apropriate tool function, or none */ static gint button_release_event(GtkWidget *widget, GdkEventButton *event ) { double x, y; if (deleting_placename) { do_delete_placename(current_place); return TRUE; } if (adding_placename) { x = pix_x_to_map(event->x)*map->config.resolution; y = pix_y_to_map(event->y)*map->config.resolution; start_add_placename(x, y); return TRUE; } if (adding_door) { x = pix_x_to_map(event->x)*map->config.resolution; y = pix_y_to_map(event->y)*map->config.resolution; if (adding_door == 2) start_add_door(x, y); else finish_add_door(x, y); return TRUE; } if (event->button == 1 && tmp_pixmap != NULL) switch(utensil) { case CARMEN_MAP_RECTANGLE: creating_rectangle(widget, 2, event->x, event->y); break; case CARMEN_MAP_CROP: cropping(widget, 2, event->x, event->y); break; case CARMEN_MAP_LINE: creating_line(2, event->x, event->y); break; case CARMEN_MAP_MOVER: move(2, event->x, event->y); default: break; } redraw(); return 1; }
/* handles the mouse moving in the drawing area only calls the appropriate tool function if the mouse button is down. always sets the cursor to the appropriate symbol */ static gint motion_notify_event( GtkWidget *widget, GdkEventMotion *event ) { int x, y; GdkModifierType state; static char label_buffer[255]; static carmen_map_point_t map_point; static carmen_world_point_t world_point; gtk_propagate_event(GTK_WIDGET(vrule), (GdkEvent *)event); gtk_propagate_event(GTK_WIDGET(hrule), (GdkEvent *)event); map_to_tmp(); if (event->is_hint) gdk_window_get_pointer (event->window, &x, &y, &state); else { x = event->x; y = event->y; state = event->state; } map_point.x = pix_x_to_map(x); map_point.y = pix_y_to_map(y); map_point.map = map; carmen_map_to_world(&map_point, &world_point); sprintf(label_buffer, "X: %6.2f Y: %6.2f", world_point.pose.x, world_point.pose.y); gtk_label_set_text(GTK_LABEL(coords_label), label_buffer); if (tmp_pixmap == NULL) return TRUE; if (deleting_placename) { handle_deleting_placename_move(map_point.x, map_point.y); } else if ((state & GDK_BUTTON1_MASK)) { switch(utensil) { case CARMEN_MAP_BRUSH: draw_brush (widget, x, y); x = x/mult - brush_size + .5; y = y/mult - brush_size + .5; break; case CARMEN_MAP_RECTANGLE: creating_rectangle(widget, 1, x, y); break; case CARMEN_MAP_CROP: cropping(widget, 1, x, y); break; case CARMEN_MAP_LINE: creating_line(1, x, y); break; case CARMEN_MAP_EYEDROPPER: sample(x, y); break; case CARMEN_MAP_MOVER: move(1, x, y); default: break; } } redraw(); return TRUE; }
/* handles a button press event in the drawing area. calls the apropriate tool depending upon utensil's setting also creates a backup for undo and incrememnts modified if necessary */ static gint button_press_event( GtkWidget *widget, GdkEventButton *event ) { if(tmp_pixmap == NULL) return -1; if (deleting_placename) return TRUE; if (adding_placename) return TRUE; if (adding_door) return TRUE; if (event->button == 1) { switch(utensil) { case CARMEN_MAP_BRUSH: memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size * map->config.y_size); modified ++; draw_brush(widget, event->x, event->y); break; case CARMEN_MAP_RECTANGLE: memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size * map->config.y_size); modified ++; creating_rectangle(widget, 0, event->x, event->y); break; case CARMEN_MAP_CROP: memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size * map->config.y_size); modified ++; cropping(widget, 0, event->x, event->y); break; case CARMEN_MAP_LINE: memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size * map->config.y_size); modified ++; creating_line(0, event->x, event->y); break; case CARMEN_MAP_FILL: memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size * map->config.y_size); modified ++; create_fill(event->x, event->y); break; case CARMEN_MAP_FUZZY_FILL: memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size * map->config.y_size); modified ++; create_fuzzy_fill(event->x, event->y); break; case CARMEN_MAP_EYEDROPPER: sample(event->x, event->y); break; case CARMEN_MAP_ZOOM: zoom_in(event->x, event->y); break; case CARMEN_MAP_MOVER: move(0, event->x, event->y); default: break; } } else if (event->button == 3 && utensil == CARMEN_MAP_ZOOM) zoom_out(event->x, event->y); redraw(); return TRUE; }
int machinery(void) { int key, button = 1, status = 0, h, v; machineplates(); do{ key = checkinput(); h = rat.horiz; v = rat.verti; if((rat.buttons == LBUTTON && key == PRESS) && (platehit(0,h,v))) { clearplates(); status = farmpower(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(1,h,v))) { clearplates(); status = cropping(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(2,h,v))) { clearplates(); status = haying(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(3,h,v))) { clearplates(); status = specialcrops(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(4,h,v))) { clearplates(); status = dairy(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(5,h,v))) { clearplates(); status = swine(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(6,h,v))) { clearplates(); status = poultry(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(7,h,v))) { clearplates(); status = genlvstock(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(8,h,v))) { clearplates(); status = misc(); machineplates(); } if((rat.buttons == LBUTTON && key == PRESS) && (platehit(9,h,v))) { clearplates(); status = landlords(); machineplates(); } if((rat.buttons == RBUTTON && key == HELD) && (checkhit(1,h,v))) { if(buton) { buttonoff(1); buton = 0; } else { buttonon(1); buton = 1; } } if((rat.buttons == CBUTTON && key == RELEASE) && (checkhit(1,h,v))) { if(buton) { buttonoff(1); buton = 0; } else { buttonon(1); buton = 1; } } if((rat.buttons == LBUTTON && key == PRESS) && (checkhit(2,h,v))) { status = 1; } if((rat.buttons == LBUTTON && key == PRESS) && (checkhit(0,h,v))) { status = 2; } if (status == 2 || status == 1) key = ESC; }while(!(((rat.buttons == LBUTTON && key == RELEASE) || (key == ENTER)) && checkhit(3,h,v) || (key == ESC)); clearplates(); return(status); }