SDL_bool SDL_IBus_Init(void) { SDL_bool result = SDL_FALSE; SDL_DBusContext *dbus = SDL_DBus_GetContext(); if(dbus){ char *addr_file = IBus_GetDBusAddressFilename(); if(!addr_file){ return SDL_FALSE; } ibus_addr_file = SDL_strdup(addr_file); char *addr = IBus_ReadAddressFromFile(addr_file); inotify_fd = inotify_init(); fcntl(inotify_fd, F_SETFL, O_NONBLOCK); char *addr_file_dir = SDL_strrchr(addr_file, '/'); if(addr_file_dir){ *addr_file_dir = 0; } inotify_add_watch(inotify_fd, addr_file, IN_CREATE | IN_MODIFY); SDL_free(addr_file); result = IBus_SetupConnection(dbus, addr); SDL_free(addr); } return result; }
SDL_bool SDL_IBus_Init(void) { SDL_bool result = SDL_FALSE; SDL_DBusContext *dbus = SDL_DBus_GetContext(); if (dbus) { char *addr_file = IBus_GetDBusAddressFilename(); char *addr; char *addr_file_dir; if (!addr_file) { return SDL_FALSE; } /* !!! FIXME: if ibus_addr_file != NULL, this will overwrite it and leak (twice!) */ ibus_addr_file = SDL_strdup(addr_file); addr = IBus_ReadAddressFromFile(addr_file); if (!addr) { SDL_free(addr_file); return SDL_FALSE; } if (inotify_fd < 0) { inotify_fd = inotify_init(); fcntl(inotify_fd, F_SETFL, O_NONBLOCK); } addr_file_dir = SDL_strrchr(addr_file, '/'); if (addr_file_dir) { *addr_file_dir = 0; } inotify_wd = inotify_add_watch(inotify_fd, addr_file, IN_CREATE | IN_MODIFY); SDL_free(addr_file); if (addr) { result = IBus_SetupConnection(dbus, addr); SDL_free(addr); } } return result; }
static SDL_bool IBus_CheckConnection(SDL_DBusContext *dbus) { if (!dbus) return SDL_FALSE; if (ibus_conn && dbus->connection_get_is_connected(ibus_conn)) { return SDL_TRUE; } if (inotify_fd > 0 && inotify_wd > 0) { char buf[1024]; ssize_t readsize = read(inotify_fd, buf, sizeof(buf)); if (readsize > 0) { char *p; SDL_bool file_updated = SDL_FALSE; for (p = buf; p < buf + readsize; /**/) { struct inotify_event *event = (struct inotify_event*) p; if (event->len > 0) { char *addr_file_no_path = SDL_strrchr(ibus_addr_file, '/'); if (!addr_file_no_path) return SDL_FALSE; if (SDL_strcmp(addr_file_no_path + 1, event->name) == 0) { file_updated = SDL_TRUE; break; } } p += sizeof(struct inotify_event) + event->len; } if (file_updated) { char *addr = IBus_ReadAddressFromFile(ibus_addr_file); if (addr) { SDL_bool result = IBus_SetupConnection(dbus, addr); SDL_free(addr); return result; } } } } return SDL_FALSE; }