📄 gdk.c
字号:
voidgdk_key_repeat_restore (void){ if (autorepeat) XAutoRepeatOn (gdk_display); else XAutoRepeatOff (gdk_display);}voidgdk_beep (void){ XBell(gdk_display, 100);}/* *-------------------------------------------------------------- * gdk_exit_func * * This is the "atexit" function that makes sure the * library gets a chance to cleanup. * * Arguments: * * Results: * * Side effects: * The library is un-initialized and the program exits. * *-------------------------------------------------------------- */static voidgdk_exit_func (void){ static gboolean in_gdk_exit_func = FALSE; /* This is to avoid an infinite loop if a program segfaults in an atexit() handler (and yes, it does happen, especially if a program has trounced over memory too badly for even g_message to work) */ if (in_gdk_exit_func == TRUE) return; in_gdk_exit_func = TRUE; if (gdk_initialized) {#ifdef USE_XIM /* cleanup IC */ gdk_ic_cleanup (); /* close IM */ gdk_im_close ();#endif gdk_image_exit (); gdk_input_exit (); gdk_key_repeat_restore (); XCloseDisplay (gdk_display); gdk_initialized = 0; }}/* *-------------------------------------------------------------- * gdk_x_error * * The X error handling routine. * * Arguments: * "display" is the X display the error orignated from. * "error" is the XErrorEvent that we are handling. * * Results: * Either we were expecting some sort of error to occur, * in which case we set the "gdk_error_code" flag, or this * error was unexpected, in which case we will print an * error message and exit. (Since trying to continue will * most likely simply lead to more errors). * * Side effects: * *-------------------------------------------------------------- */static intgdk_x_error (Display *display, XErrorEvent *error){ if (error->error_code) { if (gdk_error_warnings) { char buf[64]; XGetErrorText (display, error->error_code, buf, 63);#ifdef G_ENABLE_DEBUG g_error ("%s\n serial %ld error_code %d request_code %d minor_code %d\n", buf, error->serial, error->error_code, error->request_code, error->minor_code);#else /* !G_ENABLE_DEBUG */ fprintf (stderr, "Gdk-ERROR **: %s\n serial %ld error_code %d request_code %d minor_code %d\n", buf, error->serial, error->error_code, error->request_code, error->minor_code); exit(1);#endif /* G_ENABLE_DEBUG */ } gdk_error_code = error->error_code; } return 0;}/* *-------------------------------------------------------------- * gdk_x_io_error * * The X I/O error handling routine. * * Arguments: * "display" is the X display the error orignated from. * * Results: * An X I/O error basically means we lost our connection * to the X server. There is not much we can do to * continue, so simply print an error message and exit. * * Side effects: * *-------------------------------------------------------------- */static intgdk_x_io_error (Display *display){ /* This is basically modelled after the code in XLib. We need * an explicit error handler here, so we can disable our atexit() * which would otherwise cause a nice segfault. * We fprintf(stderr, instead of g_warning() because g_warning() * could possibly be redirected to a dialog */ if (errno == EPIPE) { fprintf (stderr, "Gdk-ERROR **: X connection to %s broken (explicit kill or server shutdown).\n", gdk_display ? DisplayString (gdk_display) : gdk_get_display()); } else { fprintf (stderr, "Gdk-ERROR **: Fatal IO error %d (%s) on X server %s.\n", errno, g_strerror (errno), gdk_display ? DisplayString (gdk_display) : gdk_get_display()); } /* Disable the atexit shutdown for GDK */ gdk_initialized = 0; exit(1);}gchar *gdk_get_display (void){ return (gchar *)XDisplayName (gdk_display_name);}/************************************************************* * gdk_error_trap_push: * Push an error trap. X errors will be trapped until * the corresponding gdk_error_pop(), which will return * the error code, if any. * arguments: * * results: *************************************************************/voidgdk_error_trap_push (void){ GSList *node; GdkErrorTrap *trap; if (gdk_error_trap_free_list) { node = gdk_error_trap_free_list; gdk_error_trap_free_list = gdk_error_trap_free_list->next; } else { node = g_slist_alloc (); node->data = g_new (GdkErrorTrap, 1); } node->next = gdk_error_traps; gdk_error_traps = node; trap = node->data; trap->error_code = gdk_error_code; trap->error_warnings = gdk_error_warnings; gdk_error_code = 0; gdk_error_warnings = 0;}/************************************************************* * gdk_error_trap_pop: * Pop an error trap added with gdk_error_push() * arguments: * * results: * 0, if no error occured, otherwise the error code. *************************************************************/gintgdk_error_trap_pop (void){ GSList *node; GdkErrorTrap *trap; gint result; g_return_val_if_fail (gdk_error_traps != NULL, 0); node = gdk_error_traps; gdk_error_traps = gdk_error_traps->next; node->next = gdk_error_trap_free_list; gdk_error_trap_free_list = node; result = gdk_error_code; trap = node->data; gdk_error_code = trap->error_code; gdk_error_warnings = trap->error_warnings; return result;}gint gdk_send_xevent (Window window, gboolean propagate, glong event_mask, XEvent *event_send){ Status result; gint old_warnings = gdk_error_warnings; gdk_error_code = 0; gdk_error_warnings = 0; result = XSendEvent (gdk_display, window, propagate, event_mask, event_send); XSync (gdk_display, False); gdk_error_warnings = old_warnings; return result && !gdk_error_code;}#ifndef HAVE_XCONVERTCASE/* compatibility function from X11R6.3, since XConvertCase is not * supplied by X11R5. */static voidgdkx_XConvertCase (KeySym symbol, KeySym *lower, KeySym *upper){ register KeySym sym = symbol; g_return_if_fail (lower != NULL); g_return_if_fail (upper != NULL); *lower = sym; *upper = sym; switch (sym >> 8) {#if defined (GDK_A) && defined (GDK_Ooblique) case 0: /* Latin 1 */ if ((sym >= GDK_A) && (sym <= GDK_Z)) *lower += (GDK_a - GDK_A); else if ((sym >= GDK_a) && (sym <= GDK_z)) *upper -= (GDK_a - GDK_A); else if ((sym >= GDK_Agrave) && (sym <= GDK_Odiaeresis)) *lower += (GDK_agrave - GDK_Agrave); else if ((sym >= GDK_agrave) && (sym <= GDK_odiaeresis)) *upper -= (GDK_agrave - GDK_Agrave); else if ((sym >= GDK_Ooblique) && (sym <= GDK_Thorn)) *lower += (GDK_oslash - GDK_Ooblique); else if ((sym >= GDK_oslash) && (sym <= GDK_thorn)) *upper -= (GDK_oslash - GDK_Ooblique); break;#endif /* LATIN1 */ #if defined (GDK_Aogonek) && defined (GDK_tcedilla) case 1: /* Latin 2 */ /* Assume the KeySym is a legal value (ignore discontinuities) */ if (sym == GDK_Aogonek) *lower = GDK_aogonek; else if (sym >= GDK_Lstroke && sym <= GDK_Sacute) *lower += (GDK_lstroke - GDK_Lstroke); else if (sym >= GDK_Scaron && sym <= GDK_Zacute) *lower += (GDK_scaron - GDK_Scaron); else if (sym >= GDK_Zcaron && sym <= GDK_Zabovedot) *lower += (GDK_zcaron - GDK_Zcaron); else if (sym == GDK_aogonek) *upper = GDK_Aogonek; else if (sym >= GDK_lstroke && sym <= GDK_sacute) *upper -= (GDK_lstroke - GDK_Lstroke); else if (sym >= GDK_scaron && sym <= GDK_zacute) *upper -= (GDK_scaron - GDK_Scaron); else if (sym >= GDK_zcaron && sym <= GDK_zabovedot) *upper -= (GDK_zcaron - GDK_Zcaron); else if (sym >= GDK_Racute && sym <= GDK_Tcedilla) *lower += (GDK_racute - GDK_Racute); else if (sym >= GDK_racute && sym <= GDK_tcedilla) *upper -= (GDK_racute - GDK_Racute); break;#endif /* LATIN2 */ #if defined (GDK_Hstroke) && defined (GDK_Cabovedot) case 2: /* Latin 3 */ /* Assume the KeySym is a legal value (ignore discontinuities) */ if (sym >= GDK_Hstroke && sym <= GDK_Hcircumflex) *lower += (GDK_hstroke - GDK_Hstroke); else if (sym >= GDK_Gbreve && sym <= GDK_Jcircumflex) *lower += (GDK_gbreve - GDK_Gbreve); else if (sym >= GDK_hstroke && sym <= GDK_hcircumflex) *upper -= (GDK_hstroke - GDK_Hstroke); else if (sym >= GDK_gbreve && sym <= GDK_jcircumflex) *upper -= (GDK_gbreve - GDK_Gbreve); else if (sym >= GDK_Cabovedot && sym <= GDK_Scircumflex) *lower += (GDK_cabovedot - GDK_Cabovedot); else if (sym >= GDK_cabovedot && sym <= GDK_scircumflex) *upper -= (GDK_cabovedot - GDK_Cabovedot); break;#endif /* LATIN3 */ #if defined (GDK_Rcedilla) && defined (GDK_Amacron) case 3: /* Latin 4 */ /* Assume the KeySym is a legal value (ignore discontinuities) */ if (sym >= GDK_Rcedilla && sym <= GDK_Tslash) *lower += (GDK_rcedilla - GDK_Rcedilla); else if (sym >= GDK_rcedilla && sym <= GDK_tslash) *upper -= (GDK_rcedilla - GDK_Rcedilla); else if (sym == GDK_ENG) *lower = GDK_eng; else if (sym == GDK_eng) *upper = GDK_ENG; else if (sym >= GDK_Amacron && sym <= GDK_Umacron) *lower += (GDK_amacron - GDK_Amacron); else if (sym >= GDK_amacron && sym <= GDK_umacron) *upper -= (GDK_amacron - GDK_Amacron); break;#endif /* LATIN4 */ #if defined (GDK_Serbian_DJE) && defined (GDK_Cyrillic_yu) case 6: /* Cyrillic */ /* Assume the KeySym is a legal value (ignore discontinuities) */ if (sym >= GDK_Serbian_DJE && sym <= GDK_Serbian_DZE) *lower -= (GDK_Serbian_DJE - GDK_Serbian_dje); else if (sym >= GDK_Serbian_dje && sym <= GDK_Serbian_dze) *upper += (GDK_Serbian_DJE - GDK_Serbian_dje); else if (sym >= GDK_Cyrillic_YU && sym <= GDK_Cyrillic_HARDSIGN) *lower -= (GDK_Cyrillic_YU - GDK_Cyrillic_yu); else if (sym >= GDK_Cyrillic_yu && sym <= GDK_Cyrillic_hardsign) *upper += (GDK_Cyrillic_YU - GDK_Cyrillic_yu); break;#endif /* CYRILLIC */ #if defined (GDK_Greek_ALPHAaccent) && defined (GDK_Greek_finalsmallsigma) case 7: /* Greek */ /* Assume the KeySym is a legal value (ignore discontinuities) */ if (sym >= GDK_Greek_ALPHAaccent && sym <= GDK_Greek_OMEGAaccent) *lower += (GDK_Greek_alphaaccent - GDK_Greek_ALPHAaccent); else if (sym >= GDK_Greek_alphaaccent && sym <= GDK_Greek_omegaaccent && sym != GDK_Greek_iotaaccentdieresis && sym != GDK_Greek_upsilonaccentdieresis) *upper -= (GDK_Greek_alphaaccent - GDK_Greek_ALPHAaccent); else if (sym >= GDK_Greek_ALPHA && sym <= GDK_Greek_OMEGA) *lower += (GDK_Greek_alpha - GDK_Greek_ALPHA); else if (sym >= GDK_Greek_alpha && sym <= GDK_Greek_omega && sym != GDK_Greek_finalsmallsigma) *upper -= (GDK_Greek_alpha - GDK_Greek_ALPHA); break;#endif /* GREEK */ }}#endifgchar*gdk_keyval_name (guint keyval){ return XKeysymToString (keyval);}guintgdk_keyval_from_name (const gchar *keyval_name){ g_return_val_if_fail (keyval_name != NULL, 0); return XStringToKeysym (keyval_name);}guintgdk_keyval_to_upper (guint keyval){ if (keyval) { KeySym lower_val = 0; KeySym upper_val = 0; XConvertCase (keyval, &lower_val, &upper_val); return upper_val; } return 0;}guintgdk_keyval_to_lower (guint keyval){ if (keyval) { KeySym lower_val = 0; KeySym upper_val = 0; XConvertCase (keyval, &lower_val, &upper_val); return lower_val; } return 0;}gbooleangdk_keyval_is_upper (guint keyval){ if (keyval) { KeySym lower_val = 0; KeySym upper_val = 0; XConvertCase (keyval, &lower_val, &upper_val); return upper_val == keyval; } return TRUE;}gbooleangdk_keyval_is_lower (guint keyval){ if (keyval) { KeySym lower_val = 0; KeySym upper_val = 0; XConvertCase (keyval, &lower_val, &upper_val); return lower_val == keyval; } return TRUE;}voidgdk_threads_enter (){ GDK_THREADS_ENTER ();}voidgdk_threads_leave (){ GDK_THREADS_LEAVE ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -