📄 callbacks.c
字号:
#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <gtk/gtk.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#include <stdio.h>#include "callbacks.h"#include "interface.h"#include "support.h"#define UNKNOWN 0#define NOL 1#define NGG 2#define FA_NONE 0#define FA_SAVE 1#define FA_OPEN 2#define ASK_NONE 0#define ASK_QUITSAVE 1#define ASK_NEWSAVE 2#define ASK_OPENSAVE 3#define ASK_REPLACE 4int AskAction = ASK_NONE;char tempf[256];char filename[256];static GdkPixmap *pixmap = NULL;static GdkPixmap *pixmapSmall = NULL;GtkWidget *owindow;GtkWidget *filewindow;GtkWidget *askwindow;int FileAction = FA_NONE;int filetype = UNKNOWN;int fhfilled = 0;char fileheader[20];char image[72][14];char buf[256];int imgchanged = 0;void refreshAll() { GdkRectangle update_rect; update_rect.x = 0; update_rect.y = 0; update_rect.width = drawtable->allocation.width; update_rect.height = drawtable->allocation.height; gtk_widget_draw (drawtable, &update_rect); update_rect.x = 0; update_rect.y = 0; update_rect.width = drawtableSmall->allocation.width; update_rect.height = drawtableSmall->allocation.height; gtk_widget_draw (drawtableSmall, &update_rect);};void showinfo(char* s) { GtkWidget* w; sprintf(buf, " %s ", s); w = create_informationwindow(buf); gtk_widget_show(w);};void ask(char* q, int a) { AskAction = a; sprintf(buf, " %s ", q); askwindow = create_askwindow(buf); gtk_widget_show(askwindow);};static void draw_brush( GtkWidget *widget, gdouble x, gdouble y, int color) { GdkRectangle update_rect; GdkRectangle update_rectSmall; int nx, ny; if ((x < 0)||(y < 0)||(x > widget->allocation.width) ||(y > widget->allocation.height)) return; nx = (int) x/6; ny = (int) y/6; image[nx][ny] = color ? '1' : '0'; update_rectSmall.x = nx; update_rectSmall.y = ny; update_rectSmall.width = 1; update_rectSmall.height = 1; nx *= 6; ny *= 6; update_rect.x = nx; update_rect.y = ny; update_rect.width = 5; update_rect.height = 5; gdk_draw_rectangle (pixmap, color ? widget->style->black_gc : widget->style->white_gc, TRUE, update_rect.x, update_rect.y, update_rect.width, update_rect.height); gdk_draw_rectangle (pixmapSmall, color ? drawtableSmall->style->black_gc : drawtableSmall->style->white_gc, TRUE, update_rectSmall.x, update_rectSmall.y, update_rectSmall.width, update_rectSmall.height); gtk_widget_draw (widget, &update_rect); gtk_widget_draw (drawtableSmall, &update_rectSmall); imgchanged = 1;}voidon_mainwindow_destroy (GtkObject *object, gpointer user_data){ gtk_main_quit();}void clear(int n) { int i, j; int c = 0; if ((n)&&(imgchanged)) { ask("Image changed, would you like to save it?", ASK_NEWSAVE); return; }; for (i = 1; i <= 14; i++ ) for (j = 1; j <= 72; j++ ) { gdk_draw_rectangle (pixmap, drawtable->style->white_gc, TRUE, (j - 1) * 6, (i - 1) * 6, 5, 5); gdk_draw_rectangle (pixmapSmall, drawtableSmall->style->white_gc, TRUE, (j - 1), (i - 1), 1, 1); c = c || (image[j-1][i-1] == '1'); image[j-1][i-1] = '0'; }; if (c) imgchanged = 1; if (n) { fhfilled = 0; filetype = UNKNOWN; filename[0] = 0; gtk_window_set_title (GTK_WINDOW (MainWindow), "Nokia Logo Editor"); imgchanged = 0; }; refreshAll();};voidon_nowy1_activate (GtkMenuItem *menuitem, gpointer user_data){ clear(1);}void openfile(int force) { if ((!force)&&(imgchanged)) { ask("Image changed, would you like to save it?", ASK_OPENSAVE); return; }; FileAction = FA_OPEN; filewindow = create_fileselection1("Open..."); if (strlen(filename) > 0) gtk_file_selection_set_filename (GTK_FILE_SELECTION(filewindow), filename); gtk_widget_show (filewindow);};voidon_otw_rz1_activate (GtkMenuItem *menuitem, gpointer user_data){ openfile(0);}void zapiszjako() { FileAction = FA_SAVE; filewindow = create_fileselection1("Save as..."); if (strlen(filename) > 0) gtk_file_selection_set_filename (GTK_FILE_SELECTION(filewindow), filename); gtk_widget_show (filewindow);};int zapisz(char* filen) { int fd; int i, j; if (strlen(filen) == 0) { zapiszjako(); return 0; }; if (filetype == UNKNOWN) filetype = NOL; fd = open(filen, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if (fd == -1) return 1; switch (filetype) { case NOL: write(fd,"NOL",3); if (!fhfilled) { fileheader[0] = 0; fileheader[1] = 1; fileheader[2] = 0; fileheader[3] = 4; //Plus GSM :-) fileheader[4] = 1; fileheader[5] = 1; fileheader[6] = 0; fileheader[7] = 72; fileheader[8] = 0; fileheader[9] = 14; fileheader[10] = 0; fileheader[11] = 1; fileheader[12] = 0; fileheader[13] = 1; fileheader[14] = 0; fileheader[15] = 0x53; fileheader[16] = 0; fhfilled = 1; }; write(fd, fileheader, 17); break; case NGG: write(fd,"NGG",3); if (!fhfilled) { fileheader[0] = 0; fileheader[1] = 1; fileheader[2] = 0; fileheader[3] = 72; fileheader[4] = 0; fileheader[5] = 14; fileheader[6] = 0; fileheader[7] = 1; fileheader[8] = 0; fileheader[9] = 1; fileheader[10] = 0; fileheader[11] = 0x4a; fileheader[12] = 0; }; write(fd, fileheader, 13); break; default: showinfo("Unknown file format."); return 1; }; for (i = 1; i <= 14; i++ ) for (j = 1; j <= 72; j++) { write(fd, &image[j-1][i-1], 1); }; close(fd); imgchanged = 0; if (AskAction == ASK_QUITSAVE) { AskAction = ASK_NONE; gtk_widget_destroy(MainWindow); return 1; }; if (AskAction == ASK_NEWSAVE) { AskAction = ASK_NONE; clear(1); }; if (AskAction == ASK_OPENSAVE) { AskAction = ASK_NONE; openfile(0); }; if (AskAction == ASK_REPLACE) { AskAction = ASK_NONE; FileAction = FA_NONE; gtk_widget_destroy(filewindow); strcpy(filename, filen); sprintf(buf, "Nokia Logo Editor - %s", rindex(filename, '/')+1); gtk_window_set_title (GTK_WINDOW (MainWindow), buf); }; return 0;};voidon_zapisz1_activate (GtkMenuItem *menuitem, gpointer user_data){ zapisz(filename);}voidon_zapisz_jako1_activate (GtkMenuItem *menuitem, gpointer user_data){ zapiszjako();}voidon_zako_cz1_activate (GtkMenuItem *menuitem, gpointer user_data){ if (imgchanged) { ask("Image changed, would you like to save it?", ASK_QUITSAVE); return; }; gtk_main_quit();}voidon_informacje_o1_activate (GtkMenuItem *menuitem, gpointer user_data){ owindow = create_aboutwindow(); gtk_widget_show (owindow);}voidon_newbutton_clicked (GtkButton *button, gpointer user_data){ clear(1);}voidon_openbutton_clicked (GtkButton *button, gpointer user_data){ openfile(0);}voidon_savebutton_clicked (GtkButton *button, gpointer user_data){ zapisz(filename);}gbooleanon_drawingarea2_configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data){ if (pixmapSmall) gdk_pixmap_unref(pixmapSmall); pixmapSmall = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); gdk_draw_rectangle (pixmapSmall, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); return TRUE;}gbooleanon_drawingarea2_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data){ gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmapSmall, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE;}gbooleanon_drawingarea1_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data){ gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE;}gbooleanon_drawingarea1_configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data){ int i, j; if (pixmap) gdk_pixmap_unref(pixmap); pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); gdk_draw_rectangle (pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); for (i = 0; i < 72; i++) for (j = 0; j < 14; j++) image[i][j] = '0'; return TRUE;}gbooleanon_drawingarea1_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data){ if (event->button == 1 && pixmap != NULL) draw_brush (widget, event->x, event->y, 1); if (event->button == 3 && pixmap != NULL) draw_brush (widget, event->x, event->y, 0); return TRUE;}gbooleanon_drawingarea1_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data){ int x, y; GdkModifierType state; if (event->is_hint) gdk_window_get_pointer (event->window, &x, &y, &state); else { x = event->x; y = event->y; state = event->state; } if (state & GDK_BUTTON1_MASK && pixmap != NULL) draw_brush (widget, x, y, 1); if (state & GDK_BUTTON3_MASK && pixmap != NULL) draw_brush (widget, x, y, 0); return TRUE;}voidon_ok_button1_clicked (GtkButton *button, gpointer user_data){ int fd; int i, j; int hlen = 0; int eof_warn = 1; strcpy(tempf, gtk_file_selection_get_filename (GTK_FILE_SELECTION (filewindow))); if (FileAction == FA_OPEN) { gtk_widget_destroy(filewindow); FileAction = FA_NONE; fd = open(tempf, O_RDONLY); if (fd == -1) { showinfo("Error while opening the file."); return; }; if (read(fd, buf, 3) == -1) { showinfo("Error while reading the file."); return; }; buf[3] = 0; if (!strncmp(buf, "NOL", 3)) { filetype = NOL; hlen = 20 - 3; }; if (!strncmp(buf, "NGG", 3)) { filetype = NGG; hlen = 16 - 3; }; if (filetype == UNKNOWN) { showinfo("Unknown file format."); return; }; read(fd, fileheader, hlen); fhfilled = 1; for (i = 1; i <= 14; i++ ) for (j = 1; j <= 72; j++ ) { if (read(fd, buf, 1) <= 0) { if (eof_warn) { showinfo("Unexpected end of file.");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -