/* Init function. Here we setup all the gtk stuff */ static GtkWidget *init_fftscope_window() { GtkWidget *fftscope_win; GtkStyle *style; GdkColor color; guint32 colors[129]; int i; pthread_mutex_init(&fftscope_mutex, NULL); style = gtk_style_new(); fftscope_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(fftscope_win), "FFTscope"); gtk_widget_set_usize(fftscope_win, 256, SCOPE_HEIGHT); gtk_window_set_wmclass(GTK_WINDOW(fftscope_win), "FFTscope", "AlsaPlayer"); gtk_window_set_policy(GTK_WINDOW(fftscope_win), FALSE, FALSE, FALSE); style = gtk_style_copy(gtk_widget_get_style(GTK_WIDGET(fftscope_win))); color.red = SCOPE_BG_RED << 8; color.blue = SCOPE_BG_BLUE << 8; color.green = SCOPE_BG_GREEN << 8; gdk_color_alloc(gdk_colormap_get_system(), &color); gtk_widget_set_style(GTK_WIDGET(fftscope_win), style); for (i = 0; i < 32; i++) { colors[i * 2] = colors[i * 2 + 1] = ((i * 8) << 16) + (255 << 8); colors[i * 2 + 64] = colors[i * 2 + 65] = (255 << 16) + (((31 - i) * 8) << 8); } colors[128] = 0; color_map = gdk_rgb_cmap_new(colors, 129); area = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(fftscope_win), area); gtk_widget_realize(area); gdk_window_set_background(area->window, &color); gtk_widget_show(area); gtk_widget_show(fftscope_win); /* Signals */ gtk_signal_connect(GTK_OBJECT(fftscope_win), "delete_event", GTK_SIGNAL_FUNC(close_fftscope_window), fftscope_win); /* Clear and show the window */ gdk_window_clear(fftscope_win->window); gdk_flush(); ready_state = 1; return fftscope_win; }
static GtkWidget *init_fftscope_window(void) { GtkWidget *fftscope_win; GdkColor color; guint32 colors[129]; int i; pthread_mutex_init(&fftscope_mutex, NULL); fftscope_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(fftscope_win), "logFFTscope"); gtk_widget_set_usize(fftscope_win, 256,128); gtk_window_set_wmclass (GTK_WINDOW(fftscope_win), "logFFTscope", "AlsaPlayer"); gtk_window_set_policy (GTK_WINDOW (fftscope_win), FALSE, FALSE, FALSE); gtk_widget_realize(fftscope_win); color.red = SCOPE_BG_RED << 8; color.blue = SCOPE_BG_BLUE << 8; color.green = SCOPE_BG_GREEN << 8; gdk_color_alloc(gdk_colormap_get_system(), &color); colors[0] = 0; for (i = 1; i < 64; i++) { colors[i] = ((i*4) << 16) + (255 << 8); colors[i + 63] = (255 << 16) + (((63 - i) * 4) << 8); } color_map = gdk_rgb_cmap_new(colors, 128); area = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(fftscope_win), area); gtk_widget_realize(area); gdk_window_set_background(area->window, &color); gtk_widget_show(area); gtk_widget_show(fftscope_win); gtk_signal_connect(GTK_OBJECT(fftscope_win), "delete_event", GTK_SIGNAL_FUNC(close_fftscope_window), fftscope_win); ready_state = 1; return fftscope_win; }
/* draw a part of a pixmap info to the window */ void draw_pinfo(GdkWindow *w, GdkGC *gc,struct pixmap_info *p_info, int srcx,int srcy, int destx, int desty, int width, int height) { guchar *bitbuf=p_info->row_pointers[srcy]+srcx*p_info->bit_depth/8; if (p_info->num_palette) { GdkRgbCmap* cmap=gdk_rgb_cmap_new(p_info->gdk_palette, p_info->num_palette); /* printf("drawing %x:(%d,%d) to (%d,%d) w:%d h=%d\n",(int)p_info, srcx,srcy,destx,desty,width,height); */ gdk_draw_indexed_image(w,gc,destx,desty,width,height, GDK_RGB_DITHER_NONE, bitbuf,p_info->row_len, cmap); gdk_rgb_cmap_free(cmap); } else { gdk_draw_rgb_image(w,gc,destx,desty,width,height, GDK_RGB_DITHER_NONE,bitbuf, p_info->row_len); } }
int main(int argc, char **argv){ GtkBuilder *builder = NULL; GError *error = NULL; GtkWidget *main_window = NULL; GtkWidget *main_screen = NULL; GtkWidget *button_list[MAX_BUTTON]; GtkWidget *led_list[MAX_LEDS]; #ifndef TRUE_COLOR guint32 virtual_color[256]; #endif // init_sighandler(); //init gtk context gtk_init(&argc, &argv); gdk_rgb_init(); //init color palette #ifndef TRUE_COLOR virtual_palette_set((unsigned int *)virtual_color); V_CPU.cmap = gdk_rgb_cmap_new(virtual_color, 256); #endif builder = gtk_builder_new(); //load UI from file. If error occurs, report it and quit application. if(!gtk_builder_add_from_file(builder, UI_FILE, &error)) { g_warning("%s", error->message); g_free(error); return -1; } // gtk_builder_connect_signals(builder,NULL); //create main_window and configure it main_screen an buttonq main_window = GTK_WIDGET(gtk_builder_get_object(builder,"main_window")); gtk_signal_connect(GTK_OBJECT (main_window), "delete_event", GTK_SIGNAL_FUNC(destroy),NULL); //create main screen and configure it main_screen = GTK_WIDGET(gtk_builder_get_object(builder,"main_screen")); //gtk_drawing_area_size(GTK_DRAWING_AREA(main_screen), SCREEN_XRES, SCREEN_YRES); gtk_signal_connect(GTK_OBJECT (main_screen), "expose_event", GTK_SIGNAL_FUNC(on_darea_expose),NULL); //refresh screen rate 75 ms gtk_timeout_add(75, Repaint,(gpointer)main_screen); //read kb layout provide by user interface virtual_kb_create_button(builder,button_list,MAX_BUTTON,kb_layout,read_kb); //create radio button provide by user interface virtual_leds_create_radio_button(builder,led_list,MAX_LEDS); //add stdin in watch descriptor V_CPU.gui_event = gio_watch; V_CPU.gui_event[0].watch = (void*)g_io_channel_unix_new(0); g_io_add_watch((GIOChannel *)V_CPU.gui_event[0].watch,G_IO_IN, (GIOFunc)gio_watch[0].func,0); gtk_widget_add_events(main_screen, GDK_POINTER_MOTION_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK); gtk_widget_show(main_window); //destroy builder, since we don't need it anymore g_object_unref(G_OBJECT(builder)); //init hardware init_hardware((void *)&V_CPU); //wait for pipe ready if(load_pipe()<0) { return -1; } //main gtk loop gtk_main(); return 0; }
/* EDITOR: MAIN FUNCTION * ===================== * This is the first function called when calling the editor. * Here we get functions to Create, Load and Save LUMPS, as well as * play with palettes and generate colormaps. * * TODO: Import/Export of PCX files */ void VID_LaunchEditor(void) { GtkWidget *vbox; GtkWidget *fileMenu; GtkWidget *extraMenu; unsigned int ed_colors[256]; ed_palfile = malloc(256+8); ed_palette = malloc(16*16*3); memcpy(&ed_palette, &host_basepal, sizeof(16*16*3)); int i; for (i = 0; i < 256; i++) { unsigned char r, g, b; r = *ed_palette++; g = *ed_palette++; b = *ed_palette++; ed_colors[i] = r << 16 | g << 8 | b; ed_palfile->data[i] = i; } ed_cmap = gdk_rgb_cmap_new(ed_colors, 256); ed_palfile = Image_Resize(ed_palfile->data, 16, 16, 64, 64); VID_EditorDrawTile(); ed_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(ed_window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(ed_window), 300, 200); gtk_window_set_title(GTK_WINDOW(ed_window), "NGUNIXEd - 2D Lump Editor"); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(ed_window), vbox); ed_menubar = gtk_menu_bar_new(); fileMenu = gtk_menu_new(); extraMenu = gtk_menu_new(); GtkWidget *fileMi = gtk_menu_item_new_with_label("File"); GtkWidget *newMi = gtk_menu_item_new_with_label("New"); GtkWidget *loadMi = gtk_menu_item_new_with_label("Load..."); GtkWidget *saveMi = gtk_menu_item_new_with_label("Save..."); GtkWidget *importMi = gtk_menu_item_new_with_label("Import..."); GtkWidget *exportMi = gtk_menu_item_new_with_label("Export..."); GtkWidget *extrMi = gtk_menu_item_new_with_label("Extra"); GtkWidget *swipalMi = gtk_menu_item_new_with_label("Switch Palette..."); GtkWidget *viewcolmapMi = gtk_menu_item_new_with_label("View Colormap..."); GtkWidget *gencolmapMi = gtk_menu_item_new_with_label("Generate Colormap..."); gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), newMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), loadMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), saveMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), importMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), exportMi); gtk_menu_shell_append(GTK_MENU_SHELL(ed_menubar), fileMi); gtk_menu_item_set_submenu(GTK_MENU_ITEM(extrMi), extraMenu); gtk_menu_shell_append(GTK_MENU_SHELL(extraMenu), swipalMi); gtk_menu_shell_append(GTK_MENU_SHELL(extraMenu), viewcolmapMi); gtk_menu_shell_append(GTK_MENU_SHELL(extraMenu), gencolmapMi); gtk_menu_shell_append(GTK_MENU_SHELL(ed_menubar), extrMi); gtk_box_pack_start(GTK_BOX(vbox), ed_menubar, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(ed_window), "destroy", G_CALLBACK(VID_EditorQuit), NULL); g_signal_connect(G_OBJECT(newMi), "activate", G_CALLBACK(VID_EditorNewFile), NULL); g_signal_connect(G_OBJECT(loadMi), "activate", G_CALLBACK(VID_EditorLoadFile), NULL); g_signal_connect(G_OBJECT(saveMi), "activate", G_CALLBACK(VID_EditorSaveFile), NULL); g_signal_connect(G_OBJECT(importMi), "activate", G_CALLBACK(VID_EditorImportFile), NULL); g_signal_connect(G_OBJECT(exportMi), "activate", G_CALLBACK(VID_EditorExportFile), NULL); g_signal_connect(G_OBJECT(swipalMi), "activate", G_CALLBACK(VID_EditorLoadPalette), NULL); g_signal_connect(G_OBJECT(viewcolmapMi), "activate", G_CALLBACK(VID_EditorViewColormap), NULL); g_signal_connect(G_OBJECT(gencolmapMi), "activate", G_CALLBACK(VID_EditorGenerateColormap), NULL); gtk_timeout_add(100, VID_EditorUpdate, NULL); gtk_widget_realize(ed_window); gtk_widget_realize(ed_menubar); ed_pic = gdk_gc_new(gtk_widget_get_window(ed_window)); gtk_widget_show_all(ed_window); Con_Printf("[EDITOR] Initialized\n"); vid_ineditor = true; gtk_main(); }
/* EDITOR: PALETTE SWITCHER * ======================== * TODO: This somehow affects the main engine despite us using our own GdkColmap... */ gint VID_EditorLoadPalette(gpointer data) { int i; GtkWidget *dialog; GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; gint res; loadedfile_t *palfile; unsigned int colors[256]; dialog = gtk_file_chooser_dialog_new ("NGUNIXEd - Open Palette (.lmp) File", NULL, action, ("_Cancel"), GTK_RESPONSE_CANCEL, ("_Open"), GTK_RESPONSE_ACCEPT, NULL); // Set the dialog and the default path (current directory) GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); char path[MAX_OSPATH]; sprintf(path, "file://%s", get_current_dir_name()); gtk_file_chooser_set_current_folder_uri(chooser, path); // Add the filter for .lmp files GtkFileFilter *filter = gtk_file_filter_new (); gtk_file_filter_add_pattern (filter, "*.lmp"); gtk_file_chooser_set_filter (chooser, filter); res = gtk_dialog_run (GTK_DIALOG (dialog)); if (res == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (chooser); palfile = COM_LoadFile (filename, 2); if(palfile) { Con_Printf("[EDITOR] Switching palette to %s\n", filename); for(i=0; i < 16*16*3; i++) ed_palette[i] = palfile->data[i]; if (ed_cmap) gdk_rgb_cmap_free(ed_cmap); for (i = 0; i < 256; i++) { unsigned char r, g, b; r = *ed_palette++; g = *ed_palette++; b = *ed_palette++; colors[i] = r << 16 | g << 8 | b; } ed_cmap = gdk_rgb_cmap_new(colors, 256); } g_free (filename); } gtk_widget_destroy (dialog); return 0; }