📄 test15.c
字号:
/* $Id: test15.c,v 1.7 2001/05/30 08:15:14 amai Exp $ *//** --------------------------------------------------------------- **/#include <stdlib.h>#include <stdio.h>#include <ctype.h>#include <Xm/TextP.h>#include <Xm/TextStrSoP.h>#include <Xm/Text.h>#include <Xm/Form.h>#include <Xm/MainW.h>#include <Xm/PushB.h>#include <Xm/CascadeB.h>#include <Xm/RowColumn.h>#include <Xm/ScrolledW.h>XtAppContext app_context;XmTextWidget text = 0;int argInitialString = False ;int argLongString = False ;int argStringValues = False ;int argShowDrawCursor = False ;int argShowReadProc = False ;#ifndef Out_Rows#define Out_XDraw(OUTPUT) ( OUTPUT -> insertx )#define Out_YDraw(OUTPUT) ( OUTPUT -> inserty )#define Out_XOffset(OUTPUT) ( OUTPUT -> hoffset )#define Out_DrawGC(OUTPUT) ( OUTPUT -> gc )#define Out_DrawGCInverted(OUTPUT) ( OUTPUT -> have_inverted_image_gc )#define Out_Rows(OUTPUT) ( OUTPUT -> rows )#define Text_OutputData( WID ) ( ((XmTextWidget)WID) -> text.output -> data )#define Text_InputData( WID ) ( ((XmTextWidget)WID) -> text.input -> data )#define Text_Line( WID ) ( ((XmTextWidget)WID) -> text.line )#define Text_LineTable( WID ) ( ((XmTextWidget)WID) -> text.line_table )#define Text_LastPos( WID ) ( ((XmTextWidget)WID) -> text.last_position )#define Text_Source( WID ) ( ((XmTextWidget)WID) -> text.source )#define Text_TopLine( WID ) ( ((XmTextWidget)WID) -> text.top_line )#define Text_TotalLines( WID ) ( ((XmTextWidget)WID) -> text.total_lines )#define Text_Highlight( WID ) ( ((XmTextWidget)WID) -> text.highlight )#define Text_OldHighlight( WID ) ( ((XmTextWidget)WID) -> text.old_highlight )#define Text_CurPos( WID ) ( ((XmTextWidget)WID) -> text.cursor_position )#define Out_Font( OUTPUT ) ( OUTPUT -> font )#define Out_TabWidth( OUTPUT ) ( OUTPUT -> tabwidth )#define Out_FontHeight( OUTPUT ) ( OUTPUT -> font -> ascent + OUTPUT -> font -> descent )#define Text_LastTopChar(w) (((XmTextWidget)(w))->text.last_top_char)#if XmVersion == 2000extern LineNum _XmTextPosToLine(XmTextWidget widget, XmTextPosition position);#endif#endif#ifndef Text#define Text( WID ) ( ((XmTextWidget)WID) -> text )#define Source_CurPos(SOURCE) ( SOURCE -> data -> widgets[0] -> text.cursor_position )#endifstatic int indent = 0;void ShowRangeData ( XmTextWidget, int, Boolean );void ShowLine ( XmTextWidget, LineNum, int );void ShowLineTable ( XmTextWidget, LineNum, int );void ShowSecondarySelectionData ( XmTextWidget );void ShowHighlightData ( XmTextWidget );void ShowSelectionData ( XmTextWidget );/* Pointers to hooks which I "catch" */static DrawProc DefaultDraw = 0;ReplaceProc DefaultReplace;static DrawInsertionPointProc DefaultDrawInsertionPoint;static MakePositionVisibleProc DefaultMakePositionVisible;ReadProc DefaultRead;static GetSelectionProc DefaultGetSelectionProc = 0;static MeasureLineProc DefaultMeasureLineProc = 0;static MoveLinesProc DefaultMoveLines;static SetSelectionProc DefaultSetSelectionProc = 0;static InputInvalidateProc DefaultInputInvalidateProc = 0;static InvalidateProc DefaultOutputInvalidateProc = 0;static CountLinesProc DefaultCountLines = 0;static InputGetSecResProc DefaultInputGetSecResDataProc = 0;static ScanProc DefaultScanProc = 0;XtProc DefaultClassInitialize ;XtWidgetClassProc DefaultClassPartInitialize ;OutputCreateProc DefaultOutputCreate;InputCreateProc DefaultInputCreate;XtRealizeProc DefaultRealize ;XtWidgetProc DefaultResize;XtExposeProc DefaultExpose ;XYToPosProc DefaultXYToPos ;PosToXYProc DefaultPosToXY ;GetPreferredSizeProc DefaultGetPreferredSize ;SetValuesProc DefaultOutputSetValues ;GetValuesProc DefaultOutputGetValues ;XmRealizeOutProc DefaultOutputRealize ;XmResizeFlagProc DefaultOutputResize;XtExposeProc DefaultOutputExpose ;XtInitProc DefaultInitialize ;XmTextStatus MyReplaceProc( XmTextWidget, XEvent *, XmTextPosition *, XmTextPosition *, XmTextBlock , Boolean);XmTextPosition MyReadProc( XmTextSource, XmTextPosition, XmTextPosition, XmTextBlock );XmTextPosition MyXYToPos( XmTextWidget, Position, Position );XmTextPosition MyScanProc( XmTextSource, XmTextPosition, XmTextScanType, XmTextScanDirection, int, Boolean);Boolean MyGetSelectionProc ( XmTextSource , XmTextPosition* , XmTextPosition* );Boolean MyMeasureLineProc ( XmTextWidget, LineNum, XmTextPosition, XmTextPosition *, LineTableExtraRec **);Boolean MyMoveLinesProc( XmTextWidget, LineNum, LineNum, LineNum );Boolean MyPosToXY( XmTextWidget, XmTextPosition, Position *, Position *);Boolean MyOutputSetValues( Widget, Widget, Widget, ArgList, Cardinal*);int MyCountLines ( XmTextSource, XmTextPosition, unsigned long);void MyDraw ( XmTextWidget, LineNum, XmTextPosition, XmTextPosition, XmHighlightMode);void MyDrawInsertionPointProc ( XmTextWidget, XmTextPosition, OnOrOff );void MyMakePositionVisibleProc ( XmTextWidget, XmTextPosition );void MyInvalidateProc ( XmTextWidget, XmTextPosition, XmTextPosition, long );void MySetSelectionProc ( XmTextSource, XmTextPosition, XmTextPosition, Time );void MyInputInvalidateProc ( XmTextWidget, XmTextPosition, XmTextPosition, long );void MyClassInitialize();void MyClassPartInitialize ( WidgetClass wclass);void MyOutputCreate( Widget, ArgList, Cardinal);void MyInputCreate( Widget, ArgList, Cardinal);void MyRealize( Widget, XtValueMask*, XSetWindowAttributes*);void MyResize ( Widget );void MyExpose ( Widget, XEvent*, Region );void MyGetPreferredSize( Widget, Dimension *, Dimension *);void MyOutputGetValues( Widget, ArgList, Cardinal);void MyOutputRealize( Widget, Mask *, XSetWindowAttributes *);void MyOutputResize( Widget, Boolean);void MyOutputExpose( Widget, XEvent*, Region );void MyInitialize ( Widget, Widget, ArgList, Cardinal* );XmTextPart copyOfTextInternals;XmSourceDataRec copyOfTextSourceInternals;InputDataRec copyOfTextInputInternals;OutputDataRec copyOfTextOutputInternals;RangeRec copyOfRangeAtIndex0;LineRec copyOfLineRec [ 100 ]; /* 100 seems to be a reasonably enough huge number */Boolean widgetInitialized = False;XmTextLineTableRec copyOfLineTable[101];static int printedBanner =0;void InitTextInternals ( ){ memset ( ©OfTextInternals, 170, sizeof ( XmTextPart ) ); memset ( ©OfTextSourceInternals, 170, sizeof ( XmSourceDataRec ) ); copyOfTextSourceInternals.ptr = copyOfTextSourceInternals.value = copyOfTextSourceInternals.gap_start = copyOfTextSourceInternals.gap_end = copyOfTextSourceInternals.PSWC_NWLN = 0; memset ( ©OfTextInputInternals, 170, sizeof ( InputDataRec ) ); memset ( ©OfTextOutputInternals, 170, sizeof ( OutputDataRec ) ); memset ( ©OfRangeAtIndex0, 170, sizeof ( RangeRec ) ); memset ( copyOfLineRec, 170, sizeof ( LineRec ) * 100 ) ; /* memset ( ©OfLineTable, 170, sizeof ( LineTable ) * 100 ) ; *//*CP: due to a change in type from Motif 1.2 to 2.0 */ copyOfTextInternals.cursor_position_x = 0;}void CopyTextInternals ( XmTextWidget toBeCopied ){ memcpy ( ©OfTextInternals, &(toBeCopied -> text), sizeof ( XmTextPart ) ); if ( ! widgetInitialized ) return; memcpy ( ©OfTextSourceInternals, toBeCopied -> text.source->data, sizeof ( XmSourceDataRec ) ); memcpy ( ©OfTextInputInternals, toBeCopied -> text.input->data, sizeof ( InputDataRec ) ); memcpy ( ©OfTextOutputInternals, toBeCopied -> text.output->data, sizeof ( OutputDataRec ) ); memcpy ( ©OfRangeAtIndex0, &toBeCopied -> text.repaint.range[0], sizeof ( RangeRec ) ); memcpy ( copyOfLineRec, toBeCopied -> text.line, sizeof ( LineRec ) * ( toBeCopied -> text.maximum_lines < 100 ? toBeCopied -> text.maximum_lines : 100 ) ); if ( toBeCopied -> text.line_table ) memcpy ( copyOfLineTable, toBeCopied -> text.line_table, sizeof ( XmTextLineTableRec ) * ( toBeCopied -> text.total_lines < 100 ? toBeCopied -> text.total_lines : 100 ) );}void PrintTime ( Widget w, Time timeToCheck ){ Time lastTime = XtLastTimestampProcessed ( XtDisplay ( w ) ) ; if ( timeToCheck == lastTime ) printf ( " is last processed timestamp\n" ); else if ( timeToCheck == 0 ) printf ( " 0\n" ); else printf ( " %u ( is the difference between last time and set time ) \n", (unsigned int)(lastTime - timeToCheck) );}void PrintDiffDesc ( char* part, char* start ){ printf ( "\t\t%s %s", part, start );}#define PRINT_BANNER \ if ( ! printedBanner ) \ { \ printf ( "\tDiffing text with previous saved version:\n" ); \ printedBanner = 1; \ } \void PrintInts ( char* part, char* nameToBeChecked, long int copy, long int original ){ if ( copy != original ) { PRINT_BANNER PrintDiffDesc ( part, nameToBeChecked ); if ( copy == PASTENDPOS ) printf ( " ( old = PASTENDPOS new = %li )\n", original ); else if ( original == PASTENDPOS ) printf ( " ( old = %li new = PASTENDPOS )\n", copy ); else printf ( " ( old = %li new = %li )\n", copy, original ); }}#define CHECK_X_SMALL_VALUE(nameToBeChecked,format,cast) \ if ( COPY.nameToBeChecked != COMPARE.nameToBeChecked ) \ { \ PRINT_BANNER \ PrintDiffDesc ( PART, #nameToBeChecked ); \ printf ( format, COPY.nameToBeChecked, COMPARE.nameToBeChecked ); \ }void PrintDiffs ( XmTextWidget toBeCompared ){ int i; XmTextPart textPart = toBeCompared->text; printedBanner = 0; if ( text != 0 && text != toBeCompared ) /* for when I create another text I do not want to see them cross pollution each other */ return;#define CHECK_X_CHANGED(nameToBeChecked,cast) \ if ( COPY.nameToBeChecked != COMPARE.nameToBeChecked ) \ { \ PRINT_BANNER \ PrintDiffDesc ( PART, #nameToBeChecked ); \ if ( ! COMPARE.nameToBeChecked ) \ printf ( " is zero now\n" ); \ else if ( ! COPY.nameToBeChecked ) \ printf ( " is non-zero now\n" ); \ else \ printf ( " has changed values\n" ); \ }#define CHECK_X_VALUE(nameToBeChecked,format,cast) \ PrintInts ( PART, #nameToBeChecked, (long int)COPY.nameToBeChecked, (long int)COMPARE.nameToBeChecked );#define CHECK_TIME(nameToBeChecked) \ if ( COPY.nameToBeChecked != COMPARE.nameToBeChecked ) \ { \ PRINT_BANNER \ PrintDiffDesc ( PART, #nameToBeChecked ); \ PrintTime((Widget)toBeCompared, COMPARE.nameToBeChecked ); \ }#define CHECK_PTR_CHANGED(nameToBeChecked) \ CHECK_X_CHANGED(nameToBeChecked, void* )#define CHECK_PTR_VALUE(nameToBeChecked) \ CHECK_X_VALUE(nameToBeChecked, " ( old = %p new = %p )\n", void* )#define CHECK_INT_VALUE(nameToBeChecked) \ CHECK_X_VALUE(nameToBeChecked, " ( old = %i new = %i )\n", int )#define CHECK_LONG_VALUE(nameToBeChecked) \ CHECK_X_VALUE(nameToBeChecked, " ( old = %li new = %li )\n", long )#define CHECK_CHAR_VALUE(nameToBeChecked) \ CHECK_X_SMALL_VALUE(nameToBeChecked, " ( old = %i new = %i )\n", char )#define CHECK_STRING_VALUE(nameToBeChecked) \ if ( COPY.nameToBeChecked != COMPARE.nameToBeChecked ) \ { \ PRINT_BANNER \ PrintDiffDesc ( PART, #nameToBeChecked ); \ printf ( " ( old = <%s> new = <%s> )\n", \ ((char*)COPY.nameToBeChecked)? (char*)COPY.nameToBeChecked : "", \ ((char*)COMPARE.nameToBeChecked)? (char*)COMPARE.nameToBeChecked : ""); \ }#define CHECK_SHORT_VALUE(nameToBeChecked) \ CHECK_X_VALUE(nameToBeChecked, " ( old = %i new = %i )\n", short )#define COPY copyOfTextInternals#define COMPARE textPart#define PART " " CHECK_PTR_CHANGED ( activate_callback ) CHECK_PTR_CHANGED ( focus_callback ) CHECK_PTR_CHANGED ( losing_focus_callback ) CHECK_PTR_CHANGED ( value_changed_callback ) CHECK_PTR_CHANGED ( modify_verify_callback ) CHECK_PTR_CHANGED ( wcs_modify_verify_callback ) CHECK_PTR_CHANGED ( motion_verify_callback ) CHECK_PTR_CHANGED ( gain_primary_callback ) CHECK_PTR_CHANGED ( lose_primary_callback ) CHECK_PTR_CHANGED ( value ) CHECK_PTR_CHANGED ( wc_value ) CHECK_INT_VALUE ( margin_height ) CHECK_INT_VALUE ( margin_width )#define NITTY_GRITTY_POS#ifdef NITTY_GRITTY_POS CHECK_INT_VALUE ( cursor_position_x )#endif CHECK_PTR_CHANGED ( output_create ) CHECK_PTR_CHANGED ( input_create ) CHECK_INT_VALUE ( top_character ) CHECK_INT_VALUE ( bottom_position ) CHECK_INT_VALUE ( cursor_position ) CHECK_INT_VALUE ( max_length ) CHECK_INT_VALUE ( edit_mode ) CHECK_CHAR_VALUE ( auto_show_cursor_position ) CHECK_CHAR_VALUE ( editable ) CHECK_CHAR_VALUE ( verify_bell ) CHECK_CHAR_VALUE ( add_mode ) CHECK_CHAR_VALUE ( traversed ) CHECK_CHAR_VALUE ( in_redisplay ) CHECK_CHAR_VALUE ( needs_redisplay ) CHECK_CHAR_VALUE ( in_refigure_lines ) CHECK_CHAR_VALUE ( needs_refigure_lines ) CHECK_CHAR_VALUE ( in_setvalues ) CHECK_CHAR_VALUE ( in_resize ) CHECK_CHAR_VALUE ( in_expose ) CHECK_CHAR_VALUE ( highlight_changed ) if ( widgetInitialized && Text( toBeCompared ) . highlight_changed && ! copyOfTextInternals . highlight_changed ) ShowHighlightData ( toBeCompared ); CHECK_CHAR_VALUE ( pendingoff ) CHECK_CHAR_VALUE ( char_size ) CHECK_CHAR_VALUE ( on_or_off ) CHECK_INT_VALUE ( first_position ) CHECK_INT_VALUE ( last_position ) CHECK_INT_VALUE ( forget_past ) CHECK_INT_VALUE ( force_display ) CHECK_INT_VALUE ( new_top ) CHECK_INT_VALUE ( last_top_char ) CHECK_INT_VALUE ( dest_position ) CHECK_INT_VALUE ( disable_depth ) CHECK_INT_VALUE ( pending_scroll ) CHECK_INT_VALUE ( total_lines ) if ( widgetInitialized && textPart.line_table && textPart.total_lines > copyOfTextInternals.total_lines ) for ( i = 0; i <= textPart.total_lines; i++ ) { ShowLineTable ( toBeCompared, i, True ); } else if ( widgetInitialized && textPart.line_table ) { for ( i = 0; i < textPart.total_lines && i < 100; i++ ) if ( copyOfLineTable[i].start_pos != textPart.line_table[i].start_pos ) { ShowLineTable ( toBeCompared, i, True ); } } CHECK_INT_VALUE ( top_line ) CHECK_INT_VALUE ( vsbar_scrolling ) CHECK_INT_VALUE ( number_lines )/* if ( textPart.number_lines > copyOfTextInternals.number_lines ) ShowLine ( toBeCompared, textPart.number_lines - 1, True );*/ CHECK_INT_VALUE ( maximum_lines ) CHECK_PTR_CHANGED ( line ) if ( widgetInitialized && textPart.line != copyOfTextInternals.line ) { int i = (copyOfTextInternals.maximum_lines>0 ? copyOfTextInternals.maximum_lines : 0); for ( ; i < textPart.maximum_lines ; i ++ ) { Line lineData = &textPart.line [ i ]; if ( lineData -> changed_position != 0 ) { static int isInitialized = 0; if ( isInitialized ) { printf ("Motif does not intialize these properly so I am doing it so that it is easier to may comparisions later\n"); isInitialized = 1; } lineData -> changed_position = 0; } } } if ( widgetInitialized ) for ( i = 0; i < textPart.maximum_lines ; i ++ ) if ( copyOfLineRec[i].start != textPart.line[i].start || copyOfLineRec[i].changed != textPart.line[i].changed || copyOfLineRec[i].extra != textPart.line[i].extra || copyOfLineRec[i].past_end != textPart.line[i].past_end || copyOfLineRec[i].changed_position != textPart.line[i].changed_position ) { PRINT_BANNER if ( copyOfLineRec[i].start >= 0 ) /*CP: This means that the correct values have not yet been initialized here */ { if ( copyOfLineRec[i].start != textPart.line[i].start ) printf ( " \t\t\t\tstart was %i\n", (int) copyOfLineRec[i].start); if ( copyOfLineRec[i].changed != textPart.line[i].changed ) printf ( " \t\t\t\tchanged was %s\n", (copyOfLineRec[i].changed?"true":"false" ) ); if ( copyOfLineRec[i].changed_position != textPart.line[i].changed_position ) printf ( " \t\t\t\tchanged_position was %i\n", (int)copyOfLineRec[i].changed_position ); if ( copyOfLineRec[i].past_end != textPart.line[i].past_end ) printf ( " \t\t\t\tpast_end was %s\n", (copyOfLineRec[i].past_end?"true":"false" ) ); if ( copyOfLineRec[i].extra != textPart.line[i].extra ) { printf ( " \t\t\t\textra ptr changed " ); if ( i > 0 && textPart.line[i].extra == copyOfLineRec[i-1].extra ) printf ( "( copy of prev line's extra !)" ); if ( i > 0 && textPart.line[i].extra == copyOfLineRec[i+1].extra ) printf ( "( copy of next line's extra !)" ); printf ( "\n" ); } } ShowLine ( toBeCompared, i, True ); } CHECK_PTR_CHANGED ( repaint.range ) CHECK_PTR_CHANGED ( highlight.list ) CHECK_PTR_CHANGED ( old_highlight.list )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -