📄 hexviewdlg.c
字号:
/* * * Copyright (C) 2003 Xiangbin Lee <honeycombs@sina.com> <honeycombs@263.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation. */#include "common.h"#include "hexviewdlg.h"void GtkHexView_Draw(GtkHexView *lpview, gushort from, gushort len){ gchar msgtxt[20]; gushort curcline=0,curpos=0; GdkColor color; if(lpview==NULL||len<=0) return ; /* Realizing a widget creates a window for it, * ready for us to insert some text */ gtk_text_backward_delete(GTK_TEXT (lpview->areaid),gtk_text_get_length(GTK_TEXT (lpview->areaid))); gtk_text_backward_delete(GTK_TEXT (lpview->areahex),gtk_text_get_length(GTK_TEXT (lpview->areahex))); gtk_text_backward_delete(GTK_TEXT (lpview->areatext),gtk_text_get_length(GTK_TEXT (lpview->areatext))); gtk_text_thaw (GTK_TEXT (lpview->areaid)); gtk_text_thaw (GTK_TEXT (lpview->areahex)); gtk_text_thaw (GTK_TEXT (lpview->areatext)); /* show here */ if(from>lpview->hexdatalen-1) return ; if(from+len>lpview->hexdatalen) len = lpview->hexdatalen-from; /* show normal here( hFontWide, hFontHeight ) */ for(curpos=from;curpos<len;curpos++) { msgtxt[0]=0; curcline=curpos/lpview->chnperline; // header if(curpos%lpview->chnperline==0) { gushort selfromline, seltoline; sprintf(msgtxt, " %06X",(guint)(curcline*lpview->chnperline)); selfromline=lpview->sho_frombufpos/lpview->chnperline; seltoline=(lpview->sho_frombufpos+(lpview->sho_length-1))/lpview->chnperline; if(lpview->sho_length<=0 || curcline<selfromline || curcline >seltoline) { color.red=lpview->m_idFontColor.red; color.green=lpview->m_idFontColor.green; color.blue=lpview->m_idFontColor.blue; } else if(curcline>selfromline&&curcline<seltoline) { color.red=lpview->m_idSelColor.red; color.green=lpview->m_idSelColor.green; color.blue=lpview->m_idSelColor.blue; } else if(curcline==selfromline||curcline==seltoline) { color.red=(lpview->m_idFontColor.red+lpview->m_idSelColor.red)/2; color.green=(lpview->m_idFontColor.green+lpview->m_idSelColor.green)/2; color.blue=(lpview->m_idFontColor.blue+lpview->m_idSelColor.blue)/2; } if(curcline) { gtk_text_insert (GTK_TEXT(lpview->areaid), NULL, &color, NULL,"\n", -1); gtk_text_insert (GTK_TEXT(lpview->areahex), NULL, &color, NULL,"\n", -1); gtk_text_insert (GTK_TEXT(lpview->areatext), NULL, &color, NULL,"\n", -1); } gtk_text_insert (GTK_TEXT(lpview->areaid), NULL, &color, NULL,msgtxt, -1); } // hex if(lpview->sho_length<=0) { color.red=lpview->m_hexFontColor.red; color.green=lpview->m_hexFontColor.green; color.blue=lpview->m_hexFontColor.blue; } else if(curpos>=lpview->sho_frombufpos&&curpos<lpview->sho_frombufpos+lpview->sho_length) { color.red=lpview->m_hexSelColor.red; color.green=lpview->m_hexSelColor.green; color.blue=lpview->m_hexSelColor.blue; } else { color.red=lpview->m_hexFontColor.red; color.green=lpview->m_hexFontColor.green; color.blue=lpview->m_hexFontColor.blue; } sprintf(msgtxt," %02X",lpview->hexbuffer[curpos]); gtk_text_insert (GTK_TEXT(lpview->areahex), NULL, &color, NULL,msgtxt, -1); // text if(lpview->sho_length<=0) { color.red=lpview->m_txtFontColor.red; color.green=lpview->m_txtFontColor.green; color.blue=lpview->m_txtFontColor.blue; } else if(curpos>=lpview->sho_frombufpos&&curpos<lpview->sho_frombufpos+lpview->sho_length) { color.red=lpview->m_txtSelColor.red; color.green=lpview->m_txtSelColor.green; color.blue=lpview->m_txtSelColor.blue; } else { color.red=lpview->m_txtFontColor.red; color.green=lpview->m_txtFontColor.green; color.blue=lpview->m_txtFontColor.blue; } msgtxt[0]=msgtxt[1]=0; if(lpview->hexbuffer[curpos]>31&&lpview->hexbuffer[curpos]<127) msgtxt[0]=lpview->hexbuffer[curpos]; else msgtxt[0]='.'; gtk_text_insert (GTK_TEXT(lpview->areatext), NULL, &color, NULL,msgtxt, -1); } gtk_text_insert (GTK_TEXT(lpview->areaid), NULL, &color, NULL,"\n", -1); gtk_text_insert (GTK_TEXT(lpview->areahex), NULL, &color, NULL,"\n", -1); gtk_text_insert (GTK_TEXT(lpview->areatext), NULL, &color, NULL,"\n", -1);}GtkWidget *GtkHexView_Create(GtkHexView *lpview, GtkWidget * window){ GtkWidget *hbox; if(lpview==NULL) return NULL; else if(lpview->regsignal==GTK_WIDGET_REG) return (lpview->scrolled_window); else lpview->regsignal=GTK_WIDGET_REG; /* here create view with text area */ lpview->hexdatalen=0; lpview->chnperline=0; lpview->sho_frombufpos=0; lpview->sho_length=0; lpview->old_frombufpos=0; lpview->old_length=0; lpview->view =gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (lpview->view), GTK_SHADOW_ETCHED_OUT); hbox=gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(lpview->view),hbox); lpview->areaid=gtk_text_new (NULL, NULL); gtk_text_set_editable (GTK_TEXT(lpview->areaid), FALSE); lpview->areahex=gtk_text_new (NULL, NULL); gtk_text_set_editable (GTK_TEXT (lpview->areahex), FALSE); lpview->areatext=gtk_text_new (NULL, NULL); gtk_text_set_editable (GTK_TEXT (lpview->areatext), FALSE); gtk_box_pack_start(GTK_BOX(hbox),lpview->areaid, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox),lpview->areahex, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox),lpview->areatext, FALSE, FALSE, 0); /* end create view */ lpview->scrolled_window = gtk_append_scrollviewport(lpview->view); if(window!=NULL) gtk_container_add (GTK_CONTAINER (window), lpview->scrolled_window); gtk_widget_show_all (lpview->scrolled_window); return lpview->scrolled_window;}void GtkHexView_SetFontColor(GtkHexView *lpview, GdkColor idcolor,GdkColor idselcolor, GdkColor hexcolor,GdkColor hexselcolor, GdkColor txtcolor,GdkColor txtselcolor ){ if(lpview!=NULL&&lpview->regsignal==GTK_WIDGET_REG) { lpview->m_idFontColor.red=idcolor.red; lpview->m_idFontColor.green=idcolor.green; lpview->m_idFontColor.blue=idcolor.blue; lpview->m_idSelColor.red=idselcolor.red; lpview->m_idSelColor.green=idselcolor.green; lpview->m_idSelColor.blue=idselcolor.blue; lpview->m_hexFontColor.red=hexcolor.red; lpview->m_hexFontColor.green=hexcolor.green; lpview->m_hexFontColor.blue=hexcolor.blue; lpview->m_hexSelColor.red=hexselcolor.red; lpview->m_hexSelColor.green=hexselcolor.green; lpview->m_hexSelColor.blue=hexselcolor.blue; lpview->m_txtFontColor.red=txtcolor.red; lpview->m_txtFontColor.green=txtcolor.green; lpview->m_txtFontColor.blue=txtcolor.blue; lpview->m_txtSelColor.red=txtselcolor.red; lpview->m_txtSelColor.green=txtselcolor.green; lpview->m_txtSelColor.blue=txtselcolor.blue; }}/* set buffer to show */void GtkHexView_SetLineCharNum(GtkHexView *lpview, gushort num, gint ifredraw){ if((lpview!=NULL)&&(lpview->regsignal==GTK_WIDGET_REG)&&(num>8)) { gushort colum=0; lpview->chnperline = num; colum=HEXMAX_CHARS/lpview->chnperline; if((HEXMAX_CHARS%lpview->chnperline)!=0)colum++; gtk_widget_set_size_request (GTK_WIDGET (lpview->view), lpview->chnperline*32+140, colum*18+80); gtk_widget_set_size_request (GTK_WIDGET (lpview->areaid), 60, colum*18+40); gtk_widget_set_size_request (GTK_WIDGET (lpview->areahex), lpview->chnperline*24+40,colum*18+40); gtk_widget_set_size_request (GTK_WIDGET (lpview->areatext),lpview->chnperline*8+40,colum*18+40); if(ifredraw) GtkHexView_Draw(lpview,0,lpview->hexdatalen); }}void GtkHexView_SetSelOption(GtkHexView *lpview, gushort _bufpos, gushort _slen, gint ifredraw){ if(lpview!=NULL&&lpview->regsignal==GTK_WIDGET_REG) { lpview->sho_frombufpos = _bufpos; lpview->sho_length = _slen; if(ifredraw) GtkHexView_Draw(lpview,0,lpview->hexdatalen); }}void GtkHexView_SetBufferData(GtkHexView *lpview, guchar *buf, gushort len, gint ifredraw){ if(lpview!=NULL&&lpview->regsignal==GTK_WIDGET_REG) { lpview->hexdatalen=0; if(len>0) { if(len>=HEXMAX_CHARS) len=HEXMAX_CHARS-1; memcpy(lpview->hexbuffer,buf,sizeof(guchar)*len); lpview->hexdatalen = len; } if(ifredraw) GtkHexView_Draw(lpview,0,lpview->hexdatalen); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -