⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callbacks.c

📁 可以修改Nokia手机的logo图标的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -