static gpointer pangoxft_view_create (const PangoViewer *klass) { XViewer *instance; instance = x_view_create (klass); XftInit (NULL); pango_xft_set_default_substitute (instance->display, instance->screen, default_substitute, NULL, NULL); return instance; }
bool x11_init(XRESOURCES* res, CFG* config){ Window root; XSetWindowAttributes window_attributes; unsigned width, height; Atom wm_state_fullscreen; int xdbe_major, xdbe_minor; XTextProperty window_name; pid_t pid = getpid(); //allocate some structures XSizeHints* size_hints = XAllocSizeHints(); XWMHints* wm_hints = XAllocWMHints(); XClassHint* class_hints = XAllocClassHint(); if(!size_hints || !wm_hints || !class_hints){ fprintf(stderr, "Failed to allocate X data structures\n"); return false; } //x data initialization res->display = XOpenDisplay(NULL); if(!(res->display)){ fprintf(stderr, "Failed to open display\n"); XFree(size_hints); XFree(wm_hints); XFree(class_hints); return false; } if(config->double_buffer){ config->double_buffer = (XdbeQueryExtension(res->display, &xdbe_major, &xdbe_minor) != 0); } else{ config->double_buffer = false; } errlog(config, LOG_INFO, "Double buffering %s\n", config->double_buffer ? "enabled":"disabled"); res->screen = DefaultScreen(res->display); root = RootWindow(res->display, res->screen); //start xft if(!XftInit(NULL)){ fprintf(stderr, "Failed to initialize Xft\n"); XFree(size_hints); XFree(wm_hints); XFree(class_hints); return false; } //set up colors res->text_color = colorspec_parse(config->text_color, res->display, res->screen); res->bg_color = colorspec_parse(config->bg_color, res->display, res->screen); res->debug_color = colorspec_parse(config->debug_color, res->display, res->screen); //set up window params window_attributes.background_pixel = res->bg_color.pixel; window_attributes.cursor = None; window_attributes.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask; width = DisplayWidth(res->display, res->screen); height = DisplayHeight(res->display, res->screen); //create window res->main = XCreateWindow(res->display, root, 0, 0, width, height, 0, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel | CWCursor | CWEventMask, &window_attributes); //set window properties if(XStringListToTextProperty(&(config->window_name), 1, &window_name) == 0){ fprintf(stderr, "Failed to create string list, aborting\n"); return false; } wm_hints->flags = 0; class_hints->res_name = "xecho"; class_hints->res_class = "xecho"; XSetWMProperties(res->display, res->main, &window_name, NULL, NULL, 0, NULL, wm_hints, class_hints); XFree(window_name.value); XFree(size_hints); XFree(wm_hints); XFree(class_hints); //set fullscreen mode if(!config->windowed){ wm_state_fullscreen = XInternAtom(res->display, "_NET_WM_STATE_FULLSCREEN", False); XChangeProperty(res->display, res->main, XInternAtom(res->display, "_NET_WM_STATE", False), XA_ATOM, 32, PropModeReplace, (unsigned char*) &wm_state_fullscreen, 1); } XChangeProperty(res->display, res->main, XInternAtom(res->display, "_NET_WM_PID", False), XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&pid, 1); //allocate back drawing buffer if(config->double_buffer){ res->back_buffer = XdbeAllocateBackBufferName(res->display, res->main, XdbeBackground); } //make xft drawable from window res->drawable = XftDrawCreate(res->display, (config->double_buffer?res->back_buffer:res->main), DefaultVisual(res->display, res->screen), DefaultColormap(res->display, res->screen)); if(!res->drawable){ fprintf(stderr, "Failed to allocate drawable\n"); return false; } //register for WM_DELETE_WINDOW messages res->wm_delete = XInternAtom(res->display, "WM_DELETE_WINDOW", False); XSetWMProtocols(res->display, res->main, &(res->wm_delete), 1); //map window XMapRaised(res->display, res->main); //get x socket fds if(!xfd_add(&(res->xfds), XConnectionNumber(res->display))){ fprintf(stderr, "Failed to allocate xfd memory\n"); return false; } if(XAddConnectionWatch(res->display, xconn_watch, (void*)(&(res->xfds))) == 0){ fprintf(stderr, "Failed to register connection watch procedure\n"); return false; } return true; }
static void nr_type_xft_init (void) { XftFontSet *fs; const char *debugenv; int debug, ret; int i, pos, fpos; debugenv = getenv ("INKSCAPE_DEBUG_XFT"); debug = (debugenv && *debugenv && (*debugenv != '0')); ret = XftInit (NULL); if (debug) { fprintf (stderr, "XftInit result %d\n", ret); fprintf (stderr, "Reading Xft font database...\n"); } /* Get family list */ fs = XftListFonts (GDK_DISPLAY (), 0, XFT_SCALABLE, XftTypeBool, 1, XFT_OUTLINE, XftTypeBool, 1, 0, XFT_FAMILY, 0); NRXftFamilies.length = fs->nfont; NRXftFamilies.names = nr_new (gchar *, NRXftFamilies.length); NRXftFamilies.destructor = NULL; XftFontSetDestroy (fs); if (debug) { fprintf (stderr, "Read %lu families\n", NRXftFamilies.length); } /* Get typeface list */ NRXftPatterns = XftListFonts (GDK_DISPLAY (), 0, XFT_SCALABLE, XftTypeBool, 1, XFT_OUTLINE, XftTypeBool, 1, 0, XFT_FAMILY, XFT_WEIGHT, XFT_SLANT, XFT_FILE, XFT_INDEX, 0); NRXftTypefaces.length = NRXftPatterns->nfont; NRXftTypefaces.names = nr_new (gchar *, NRXftTypefaces.length); NRXftTypefaces.destructor = NULL; NRXftNamedict = g_hash_table_new (g_str_hash, g_str_equal); NRXftFamilydict = g_hash_table_new (g_str_hash, g_str_equal); if (debug) { fprintf (stderr, "Read %lu fonts\n", NRXftTypefaces.length); } pos = 0; fpos = 0; for (i = 0; i < NRXftPatterns->nfont; i++) { char *name, *file; XftPatternGetString (NRXftPatterns->fonts[i], XFT_FAMILY, 0, &name); if (debug) { fprintf (stderr, "Typeface %s\n", name); } XftPatternGetString (NRXftPatterns->fonts[i], XFT_FILE, 0, &file); if (file) { int len; if (debug) { fprintf (stderr, "Got filename %s\n", file); } len = strlen (file); /* fixme: This is silly and evil */ /* But Freetype just does not load pfa reliably (Lauris) */ /* Changed to exclude pfa, better for OSX */ if ((len > 4) && /* (!strcmp (file + len - 4, ".ttf") || !strcmp (file + len - 4, ".TTF") || !strcmp (file + len - 4, ".ttc") || !strcmp (file + len - 4, ".TTC") || !strcmp (file + len - 4, ".otf") || !strcmp (file + len - 4, ".OTF") || !strcmp (file + len - 4, ".pfb") || !strcmp (file + len - 4, ".PFB"))) { */ strcmp (file + len - 4, ".pfa") && strcmp (file + len - 4, ".PFA")) { char *fn, *wn, *sn, *name; int weight; int slant; if (debug) { fprintf (stderr, "Seems valid\n"); } XftPatternGetString (NRXftPatterns->fonts[i], XFT_FAMILY, 0, &fn); XftPatternGetInteger (NRXftPatterns->fonts[i], XFT_WEIGHT, 0, &weight); XftPatternGetInteger (NRXftPatterns->fonts[i], XFT_SLANT, 0, &slant); switch (weight) { case XFT_WEIGHT_LIGHT: wn = "Light"; break; case XFT_WEIGHT_MEDIUM: wn = "Book"; break; case XFT_WEIGHT_DEMIBOLD: wn = "Demibold"; break; case XFT_WEIGHT_BOLD: wn = "Bold"; break; case XFT_WEIGHT_BLACK: wn = "Black"; break; default: wn = "Normal"; break; } switch (slant) { case XFT_SLANT_ROMAN: sn = "Roman"; break; case XFT_SLANT_ITALIC: sn = "Italic"; break; case XFT_SLANT_OBLIQUE: sn = "Oblique"; break; default: sn = "Normal"; break; } name = g_strdup_printf ("%s %s %s", fn, wn, sn); if (!g_hash_table_lookup (NRXftNamedict, name)) { if (!g_hash_table_lookup (NRXftFamilydict, fn)) { NRXftFamilies.names[fpos] = g_strdup (fn); g_hash_table_insert (NRXftFamilydict, NRXftFamilies.names[fpos++], (void *) TRUE); } NRXftTypefaces.names[pos++] = name; g_hash_table_insert (NRXftNamedict, name, NRXftPatterns->fonts[i]); } else { g_free (name); } } } } NRXftTypefaces.length = pos; NRXftFamilies.length = fpos; nrxfti = TRUE; }