/* * Carla UI bridge code * Copyright (C) 2011-2012 Filipe Coelho * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the COPYING file */ #include "carla_bridge_client.h" #ifdef BRIDGE_LV2_X11 #error X11 UI uses Qt4 #endif #include #include CARLA_BRIDGE_START_NAMESPACE // ------------------------------------------------------------------------- class CarlaBridgeToolkitGtk2: public CarlaBridgeToolkit { public: CarlaBridgeToolkitGtk2(const char* const title) : CarlaBridgeToolkit(title), settings("Cadence", "Carla-Gtk2UIs") { qDebug("CarlaBridgeToolkitGtk2::CarlaBridgeToolkitGtk2(%s)", title); window = nullptr; last_x = last_y = 0; last_width = last_height = 0; } ~CarlaBridgeToolkitGtk2() { qDebug("CarlaBridgeToolkitGtk2::~CarlaBridgeToolkitGtk2()"); } void init() { qDebug("CarlaBridgeToolkitGtk2::init()"); static int argc = 0; static char** argv = { nullptr }; gtk_init(&argc, &argv); } void exec(CarlaBridgeClient* const client) { qDebug("CarlaBridgeToolkitGtk2::exec(%p)", client); assert(client); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_add(GTK_CONTAINER(window), (GtkWidget*)client->getWidget()); gtk_window_set_resizable(GTK_WINDOW(window), client->isResizable()); gtk_window_set_title(GTK_WINDOW(window), m_title); gtk_window_get_position(GTK_WINDOW(window), &last_x, &last_y); gtk_window_get_size(GTK_WINDOW(window), &last_width, &last_height); if (settings.contains(QString("%1/pos_x").arg(m_title))) { last_x = settings.value(QString("%1/pos_x").arg(m_title), last_x).toInt(); last_y = settings.value(QString("%1/pos_y").arg(m_title), last_y).toInt(); gtk_window_move(GTK_WINDOW(window), last_x, last_y); if (client->isResizable()) { last_width = settings.value(QString("%1/width").arg(m_title), last_width).toInt(); last_height = settings.value(QString("%1/height").arg(m_title), last_height).toInt(); gtk_window_resize(GTK_WINDOW(window), last_width, last_height); } } g_timeout_add(50, gtk_ui_timeout, this); g_signal_connect(window, "destroy", G_CALLBACK(gtk_ui_destroy), this); m_client = client; client->oscSendUpdate(); // Main loop gtk_main(); } void quit() { qDebug("CarlaBridgeToolkitGtk2::quit()"); if (window) { gtk_widget_destroy(window); gtk_main_quit(); window = nullptr; } m_client = nullptr; } void show() { qDebug("CarlaBridgeToolkitGtk2::show()"); assert(window); if (window) gtk_widget_show_all(window); } void hide() { qDebug("CarlaBridgeToolkitGtk2::hide()"); assert(window); if (window) gtk_widget_hide_all(window); } void resize(int width, int height) { qDebug("CarlaBridgeToolkitGtk2::resize(%i, %i)", width, height); assert(window); if (window) gtk_window_resize(GTK_WINDOW(window), width, height); } private: GtkWidget* window; QSettings settings; gint last_x, last_y, last_width, last_height; static void gtk_ui_destroy(GtkWidget*, gpointer data) { CarlaBridgeToolkitGtk2* const _this_ = (CarlaBridgeToolkitGtk2*)data; _this_->handleDestroy(); gtk_main_quit(); } static gboolean gtk_ui_timeout(gpointer data) { CarlaBridgeToolkitGtk2* const _this_ = (CarlaBridgeToolkitGtk2*)data; return _this_->handleTimeout(); } // --------------------------------------------------------------------- void handleDestroy() { window = nullptr; m_client = nullptr; settings.setValue(QString("%1/pos_x").arg(m_title), last_x); settings.setValue(QString("%1/pos_y").arg(m_title), last_y); settings.setValue(QString("%1/width").arg(m_title), last_width); settings.setValue(QString("%1/height").arg(m_title), last_height); settings.sync(); } gboolean handleTimeout() { if (window) { gtk_window_get_position(GTK_WINDOW(window), &last_x, &last_y); gtk_window_get_size(GTK_WINDOW(window), &last_width, &last_height); } return m_client ? m_client->runMessages() : false; } }; // ------------------------------------------------------------------------- CarlaBridgeToolkit* CarlaBridgeToolkit::createNew(const char* const title) { return new CarlaBridgeToolkitGtk2(title); } CARLA_BRIDGE_END_NAMESPACE