Initial import
This commit is contained in:
17
CMakeLists.txt
Normal file
17
CMakeLists.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(yellownotes LANGUAGES CXX C)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
add_executable(yellownotes main.cpp
|
||||
gtk-imports.h
|
||||
gtkloader.h gtkloader.cpp
|
||||
gtk-imports.c)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
install(TARGETS yellownotes
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
15
gtk-imports.c
Normal file
15
gtk-imports.c
Normal file
@@ -0,0 +1,15 @@
|
||||
#include <malloc.h>
|
||||
|
||||
#define GTK_DECLARE_FUNCS
|
||||
#include "gtk-imports.h"
|
||||
|
||||
void loadGtkFunctions(void (*loader)(const char *funcname, void **func, void *user_data), void *user_data)
|
||||
{
|
||||
#undef GTK_IMPORTS_H
|
||||
#undef GTK_DECLARE_FUNCS
|
||||
#undef DECL
|
||||
#define GTK_LOAD_FUNCS
|
||||
#include "gtk-imports.h"
|
||||
}
|
||||
|
||||
|
||||
98
gtk-imports.h
Normal file
98
gtk-imports.h
Normal file
@@ -0,0 +1,98 @@
|
||||
#ifndef GTK_IMPORTS_H
|
||||
#define GTK_IMPORTS_H
|
||||
|
||||
/*************************************************************************************
|
||||
* boiler plate code to initialize Gtk functions etc.
|
||||
*************************************************************************************/
|
||||
|
||||
void loadGtkFunctions(void (*loader)(const char *, void **, void *), void *user_data);
|
||||
|
||||
/*************************************************************************************
|
||||
* Gtk Functions to load from shared library
|
||||
*************************************************************************************/
|
||||
|
||||
#ifdef GTK_DECLARE_FUNCS
|
||||
#define EXTERN
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
#define DECL(ret, f, arg1) EXTERN ret (*f) arg1 = NULL;
|
||||
#else
|
||||
#ifdef GTK_LOAD_FUNCS
|
||||
#define DECL(ret, f, arg1) loader(#f, (void **) &f, user_data);
|
||||
#else
|
||||
#define EXTERN extern
|
||||
#define DECL(ret, f, arg1) EXTERN ret (*f) arg1;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef GTK_IMPORTS_TYPES
|
||||
#define GTK_IMPORTS_TYPES
|
||||
|
||||
typedef void GtkWidget;
|
||||
typedef void GtkWindow;
|
||||
typedef void GtkApplication;
|
||||
typedef void GApplication;
|
||||
typedef void GObject;
|
||||
typedef void *GCallback;
|
||||
typedef void *gpointer;
|
||||
typedef int gboolean;
|
||||
typedef int gint;
|
||||
typedef char gchar;
|
||||
typedef void GClosure;
|
||||
typedef void (*GClosureNotify) (gpointer data, GClosure *closure);
|
||||
|
||||
typedef enum {
|
||||
GTK_WINDOW_TOPLEVEL = 0
|
||||
} GtkWindowType;
|
||||
|
||||
typedef enum {
|
||||
G_APPLICATION_FLAGS_NONE = 0,
|
||||
G_APPLICATION_DEFAULT_FLAGS = 0,
|
||||
G_APPLICATION_IS_SERVICE = 1,
|
||||
G_APPLICATION_IS_LAUNCHER = 2,
|
||||
G_APPLICATION_HANDLES_OPEN = 4,
|
||||
G_APPLICATION_HANDLES_COMMAND_LINE = 8,
|
||||
G_APPLICATION_SEND_ENVIRONMENT = 16,
|
||||
G_APPLICATION_NON_UNIQUE = 32,
|
||||
G_APPLICATION_CAN_OVERRIDE_APP_ID = 64,
|
||||
G_APPLICATION_ALLOW_REPLACEMENT = 128,
|
||||
G_APPLICATION_REPLACE = 256
|
||||
} GApplicationFlags;
|
||||
|
||||
typedef enum {
|
||||
G_CONNECT_DEFAULT = 0,
|
||||
G_CONNECT_AFTER = 1,
|
||||
G_CONNECT_SWAPPED = 2
|
||||
} GConnectFlags;
|
||||
|
||||
#endif
|
||||
|
||||
DECL(GtkApplication *, gtk_application_new, (const char *name, GApplicationFlags flags))
|
||||
DECL(int, g_application_run, (GApplication* application, int argc, char** argv))
|
||||
|
||||
DECL(GtkWidget*, gtk_application_window_new, ( GtkApplication* application ))
|
||||
DECL(GtkWidget *, gtk_window_new, (GtkWindowType))
|
||||
DECL(void, gtk_window_close, (GtkWindow *))
|
||||
DECL(void, gtk_widget_show_all, (GtkWindow *window))
|
||||
DECL(void, gtk_window_get_size, (GtkWindow *win, int *width, int *height))
|
||||
DECL(void, gtk_window_resize, (GtkWindow* window, gint width, gint height))
|
||||
DECL(void, gtk_window_set_default_size, (GtkWindow *window, gint width, gint height))
|
||||
DECL(void, gtk_window_get_position, (GtkWindow* window, gint* root_x, gint* root_y))
|
||||
DECL(void, gtk_window_move, (GtkWindow* window, gint x, gint y))
|
||||
|
||||
DECL(gboolean, gtk_window_get_decorated, (GtkWindow* window))
|
||||
|
||||
DECL(void, gtk_window_set_title, (GtkWindow* window, const gchar* title))
|
||||
DECL(const gchar*, gtk_window_get_title, (GtkWindow* window))
|
||||
|
||||
DECL(void, gtk_main, (void))
|
||||
DECL(void, gtk_main_quit, (void))
|
||||
|
||||
DECL(unsigned long, g_signal_connect_data, (GObject *obj, const char *signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags))
|
||||
DECL(void, g_object_unref, (GObject* object))
|
||||
|
||||
#define g_signal_connect(instance, signal, c_handler, data) \
|
||||
g_signal_connect_data(instance, signal, reinterpret_cast<void *>(c_handler), data, NULL, G_CONNECT_DEFAULT)
|
||||
|
||||
#endif // GTK_IMPORTS_H
|
||||
111
gtkloader.cpp
Normal file
111
gtkloader.cpp
Normal file
@@ -0,0 +1,111 @@
|
||||
#include "gtkloader.h"
|
||||
|
||||
extern "C" {
|
||||
#include "gtk-imports.h"
|
||||
}
|
||||
|
||||
#include <string>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <direct.h>
|
||||
#endif
|
||||
|
||||
void GtkLoader::loadLibraryWin64(const char *lib, void **handle)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
#define DIR "C:\\devel\\yellownotes\\gtk3\\bin"
|
||||
HMODULE dll = nullptr;
|
||||
std::string dir = DIR;
|
||||
|
||||
*handle = nullptr;
|
||||
|
||||
auto mklibname = [](const char *libname) {
|
||||
std::string dll;
|
||||
dll = std::string(DIR) + "\\" + libname + ".dll";
|
||||
return dll;
|
||||
};
|
||||
|
||||
std::string library;
|
||||
library = mklibname(lib);
|
||||
|
||||
char *cwd = _getcwd(NULL, 0);
|
||||
if (cwd == nullptr) {
|
||||
throw std::string("Cannot get current working directory");
|
||||
}
|
||||
|
||||
_chdir(dir.c_str());
|
||||
dll = LoadLibraryA(library.c_str());
|
||||
_chdir(cwd);
|
||||
free(cwd);
|
||||
if (dll == nullptr) {
|
||||
throw std::string("Cannot load library '") + lib + "'";
|
||||
}
|
||||
|
||||
*handle = reinterpret_cast<void *>(dll);
|
||||
#endif
|
||||
}
|
||||
|
||||
void GtkLoader::loadFunctionWin64(const char *func, void **func_ptr)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
|
||||
FARPROC fp = nullptr;
|
||||
std::list<void *>::const_iterator it = library_handles.begin();
|
||||
while (fp == nullptr && it != library_handles.end()) {
|
||||
HMODULE handle = reinterpret_cast<HMODULE>(*it);
|
||||
fp = GetProcAddress(handle, func);
|
||||
it++;
|
||||
}
|
||||
|
||||
*func_ptr = reinterpret_cast<void *>(fp);
|
||||
if (fp == nullptr) {
|
||||
throw std::string("Cannot load function '") + func;
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void GtkLoader::dlopen()
|
||||
{
|
||||
if (library_handles.size() == 0) {
|
||||
#ifdef _WIN32
|
||||
const char *libs[] = {
|
||||
"gobject-2.0-0",
|
||||
"gtk-3-vs17",
|
||||
"glib-2.0-0",
|
||||
"gio-2.0-0",
|
||||
NULL
|
||||
};
|
||||
int i;
|
||||
for(i = 0; libs[i] != NULL; i++) {
|
||||
void *lib;
|
||||
loadLibraryWin64(libs[i], &lib);
|
||||
if (lib) { library_handles.push_back(lib); }
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void GtkLoader::loadFunction(const char *func, void **func_ptr)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
loadFunctionWin64(func, func_ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void loader(const char *func, void **func_ptr, void *user_data)
|
||||
{
|
||||
GtkLoader *l = reinterpret_cast<GtkLoader *>(user_data);
|
||||
l->loadFunction(func, func_ptr);
|
||||
}
|
||||
|
||||
void GtkLoader::loadGtk()
|
||||
{
|
||||
dlopen();
|
||||
loadGtkFunctions(loader, this);
|
||||
}
|
||||
|
||||
GtkLoader::GtkLoader()
|
||||
{
|
||||
}
|
||||
26
gtkloader.h
Normal file
26
gtkloader.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef GTKLOADER_H
|
||||
#define GTKLOADER_H
|
||||
|
||||
#include <list>
|
||||
|
||||
class GtkLoader
|
||||
{
|
||||
private:
|
||||
std::list<void *> library_handles;
|
||||
|
||||
private:
|
||||
void loadLibraryWin64(const char *lib, void **handle);
|
||||
void loadFunctionWin64(const char *func, void **func_ptr);
|
||||
|
||||
public:
|
||||
void dlopen();
|
||||
void loadFunction(const char *func, void **func_ptr);
|
||||
|
||||
public:
|
||||
void loadGtk();
|
||||
|
||||
public:
|
||||
GtkLoader();
|
||||
};
|
||||
|
||||
#endif // GTKLOADER_H
|
||||
38
main.cpp
Normal file
38
main.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
#include <iostream>
|
||||
#include "gtkloader.h"
|
||||
|
||||
extern "C" {
|
||||
#include "gtk-imports.h"
|
||||
}
|
||||
|
||||
static void activate (GtkApplication* app, gpointer user_data)
|
||||
{
|
||||
GtkWidget *window;
|
||||
|
||||
window = gtk_application_window_new (app);
|
||||
gtk_window_set_title (window, "Window");
|
||||
gtk_window_set_default_size (window, 200, 200);
|
||||
gtk_widget_show_all (window);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GtkLoader l;
|
||||
|
||||
try {
|
||||
l.loadGtk();
|
||||
} catch(std::string msg) {
|
||||
std::cerr << msg << std::endl;
|
||||
}
|
||||
|
||||
GtkApplication *app;
|
||||
int status;
|
||||
|
||||
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
|
||||
g_signal_connect (app, "activate", activate, NULL);
|
||||
status = g_application_run (app, argc, argv);
|
||||
g_object_unref (app);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user