refactor file operations

This commit is contained in:
Vadim Lopatin 2014-12-17 09:56:15 +03:00
parent a682fd63bc
commit f7409f6c07
8 changed files with 1145 additions and 1197 deletions

View File

@ -294,6 +294,7 @@
<Folder name="core">
<File path="src\dlangui\core\collections.d" />
<File path="src\dlangui\core\events.d" />
<File path="src\dlangui\core\files.d" />
<File path="src\dlangui\core\i18n.d" />
<File path="src\dlangui\core\linestream.d" />
<File path="src\dlangui\core\logger.d" />

View File

@ -63,3 +63,4 @@ public import dlangui.widgets.tree;
public import dlangui.widgets.combobox;
public import dlangui.graphics.fonts;
public import dlangui.core.i18n;
public import dlangui.core.files;

View File

@ -58,6 +58,7 @@ module dlangui.core.i18n;
import dlangui.core.types;
import dlangui.core.logger;
import dlangui.core.files;
private import dlangui.core.linestream;
private import std.utf;
private import std.algorithm;

View File

@ -390,82 +390,3 @@ dchar dcharToUpper(dchar ch) {
return ch;
}
version (Windows) {
/// path delimiter (\ for windows, / for others)
immutable char PATH_DELIMITER = '\\';
} else {
/// path delimiter (\ for windows, / for others)
immutable char PATH_DELIMITER = '/';
}
/** returns true if char ch is / or \ slash */
bool isPathDelimiter(char ch) {
return ch == '/' || ch == '\\';
}
/** returns current executable path only, including last path delimiter */
@property string exePath() {
import std.file;
string path = thisExePath();
int lastSlash = 0;
for (int i = 0; i < path.length; i++)
if (path[i] == PATH_DELIMITER)
lastSlash = i;
return path[0 .. lastSlash + 1];
}
/// converts path delimiters to standard for platform inplace in buffer(e.g. / to \ on windows, \ to / on posix), returns buf
char[] convertPathDelimiters(char[] buf) {
foreach(ref ch; buf) {
version (Windows) {
if (ch == '/')
ch = '\\';
} else {
if (ch == '\\')
ch = '/';
}
}
return buf;
}
/** converts path delimiters to standard for platform (e.g. / to \ on windows, \ to / on posix) */
string convertPathDelimiters(string src) {
char[] buf = src.dup;
return cast(string)convertPathDelimiters(buf);
}
/** appends file path parts with proper delimiters e.g. appendPath("/home/user", ".myapp", "config") => "/home/user/.myapp/config" */
string appendPath(string[] pathItems ...) {
char[] buf;
foreach (s; pathItems) {
if (buf.length && !isPathDelimiter(buf[$-1]))
buf ~= PATH_DELIMITER;
buf ~= s;
}
return convertPathDelimiters(buf).dup;
}
/** appends file path parts with proper delimiters (as well converts delimiters inside path to system) to buffer e.g. appendPath("/home/user", ".myapp", "config") => "/home/user/.myapp/config" */
char[] appendPath(char[] buf, string[] pathItems ...) {
foreach (s; pathItems) {
if (buf.length && !isPathDelimiter(buf[$-1]))
buf ~= PATH_DELIMITER;
buf ~= s;
}
return convertPathDelimiters(buf);
}
/** split path into elements, e.g. /home/user/dir1 -> ["home", "user", "dir1"], "c:\dir1\dir2" -> ["c:", "dir1", "dir2"] */
string[] splitPath(string path) {
string[] res;
int start = 0;
for (int i = 0; i <= path.length; i++) {
char ch = i < path.length ? path[i] : 0;
if (ch == '\\' || ch == '/' || ch == 0) {
if (start < i)
res ~= path[start .. i].dup;
start = i + 1;
}
}
return res;
}

View File

@ -26,6 +26,7 @@ module dlangui.dialogs.filedlg;
import dlangui.core.events;
import dlangui.core.i18n;
import dlangui.core.stdaction;
import dlangui.core.files;
import dlangui.widgets.controls;
import dlangui.widgets.lists;
import dlangui.widgets.popup;

View File

@ -28,6 +28,7 @@ import std.file;
import dlangui.core.logger;
import dlangui.core.events;
import dlangui.core.files;
import dlangui.graphics.drawbuf;
import dlangui.graphics.fonts;
import dlangui.graphics.ftfonts;

View File

@ -39,6 +39,7 @@ import dlangui.graphics.drawbuf;
import dlangui.graphics.images;
import dlangui.graphics.fonts;
import dlangui.core.logger;
import dlangui.core.files;
version (USE_OPENGL) {
import dlangui.graphics.glsupport;

View File

@ -1,32 +1,55 @@
// Written in the D programming language.
/**
This module contains implementation of Win32 platform support
Provides XCB platform and window classes.
Usually you don't need to use this module directly.
NOTE: Current implementation of XCB backend does not work well. Consider using of SDL2 backend instead.
Synopsis:
----
import dlangui.platforms.x11.x11app;
----
Copyright: Vadim Lopatin, 2014
License: Boost License 1.0
Authors: Vadim Lopatin, coolreader.org@gmail.com
*/
module src.dlangui.platforms.x11.x11app;
version(USE_XCB) {
version(USE_XCB):
import std.string;
import std.c.linux.X11.xcb.xcb;
import std.c.linux.X11.xcb.shm;
import std.c.linux.X11.xcb.xproto;
import std.c.linux.X11.xcb.image;
import std.c.linux.X11.keysymdef;
import std.c.linux.linux;
import std.c.stdlib;
import std.conv;
import std.string;
import std.c.linux.X11.xcb.xcb;
import std.c.linux.X11.xcb.shm;
import std.c.linux.X11.xcb.xproto;
import std.c.linux.X11.xcb.image;
import std.c.linux.X11.keysymdef;
import std.c.linux.linux;
import std.c.stdlib;
import std.conv;
import dlangui.core.logger;
import dlangui.core.events;
import dlangui.graphics.drawbuf;
import dlangui.graphics.fonts;
import dlangui.graphics.ftfonts;
import dlangui.graphics.resources;
import dlangui.widgets.styles;
import dlangui.platforms.common.platform;
import dlangui.core.logger;
import dlangui.core.events;
import dlangui.core.files;
import dlangui.graphics.drawbuf;
import dlangui.graphics.fonts;
import dlangui.graphics.ftfonts;
import dlangui.graphics.resources;
import dlangui.widgets.styles;
import dlangui.platforms.common.platform;
version (USE_OPENGL) {
version (USE_OPENGL) {
import dlangui.graphics.glsupport;
}
}
import derelict.opengl3.gl3;
import derelict.opengl3.glx;
import derelict.opengl3.gl3;
import derelict.opengl3.glx;
// pragma(lib, "xcb");
// pragma(lib, "xcb-shm");
@ -35,37 +58,37 @@ version(USE_XCB) {
// pragma(lib, "X11");
// pragma(lib, "dl");
extern (System)
xcb_connection_t *XGetXCBConnection(std.c.linux.X11.Xlib.Display *dpy);
enum XEventQueueOwner { XlibOwnsEventQueue = 0, XCBOwnsEventQueue };
extern (System)
void XSetEventQueueOwner(std.c.linux.X11.Xlib.Display *dpy, XEventQueueOwner owner);
extern (System)
xcb_connection_t *XGetXCBConnection(std.c.linux.X11.Xlib.Display *dpy);
enum XEventQueueOwner { XlibOwnsEventQueue = 0, XCBOwnsEventQueue };
extern (System)
void XSetEventQueueOwner(std.c.linux.X11.Xlib.Display *dpy, XEventQueueOwner owner);
struct xcb_key_symbols_t {};
/* enumeration for col parameter? */
enum xcb_lookup_t {
struct xcb_key_symbols_t {};
/* enumeration for col parameter? */
enum xcb_lookup_t {
xcb_lookup_none_t = 1,
xcb_lookup_chars_t = 2,
xcb_lookup_key_sym_t = 3,
xcb_lookup_both_t = 4
};
};
extern(C) xcb_key_symbols_t *xcb_key_symbols_alloc (xcb_connection_t *c);
extern(C) xcb_key_symbols_t *xcb_key_symbols_alloc (xcb_connection_t *c);
extern(C) void xcb_key_symbols_free (xcb_key_symbols_t *syms);
extern(C) void xcb_key_symbols_free (xcb_key_symbols_t *syms);
extern(C) xcb_keysym_t xcb_key_symbols_get_keysym (xcb_key_symbols_t *syms,
extern(C) xcb_keysym_t xcb_key_symbols_get_keysym (xcb_key_symbols_t *syms,
xcb_keycode_t keycode,
int col);
extern(C) xcb_keysym_t xcb_key_press_lookup_keysym (xcb_key_symbols_t *syms,
extern(C) xcb_keysym_t xcb_key_press_lookup_keysym (xcb_key_symbols_t *syms,
xcb_key_press_event_t *event,
int col);
extern(C) xcb_keysym_t xcb_key_release_lookup_keysym (xcb_key_symbols_t *syms,
extern(C) xcb_keysym_t xcb_key_release_lookup_keysym (xcb_key_symbols_t *syms,
xcb_key_release_event_t *event,
int col);
class XCBWindow : Window {
class XCBWindow : Window {
xcb_window_t _w;
xcb_gcontext_t _g;
xcb_image_t * _image;
@ -791,15 +814,15 @@ version(USE_XCB) {
}
return res;
}
}
}
private __gshared xcb_connection_t * _xcbconnection;
private __gshared xcb_screen_t * _xcbscreen;
private __gshared ubyte _xcbscreendepth;
private __gshared bool _enableOpengl;
private __gshared std.c.linux.X11.Xlib.Display * _display;
private __gshared xcb_connection_t * _xcbconnection;
private __gshared xcb_screen_t * _xcbscreen;
private __gshared ubyte _xcbscreendepth;
private __gshared bool _enableOpengl;
private __gshared std.c.linux.X11.Xlib.Display * _display;
class XCBPlatform : Platform {
class XCBPlatform : Platform {
this() {
}
@ -1122,13 +1145,13 @@ version(USE_XCB) {
}
protected XCBWindow[xcb_window_t] _windowMap;
}
}
// entry point
extern(C) int UIAppMain(string[] args);
// entry point
extern(C) int UIAppMain(string[] args);
int main(string[] args)
{
int main(string[] args)
{
setStderrLogger();
Log.setLogLevel(LogLevel.Trace);
@ -1168,6 +1191,4 @@ version(USE_XCB) {
Log.d("Exiting main");
return res;
}
}