I'm working on a web application using WebKitGtk2 and I need to use the “window-object-cleared” signal with WebKitWebFrame. When I compile it I got an error:
main.cc:11:1: error: ‘WebKitFrame’ does not name a type
Compiled with:
c++ main.cc -w `pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0` -o m
I checked on this and tried to use WebKitFrame instead but same thing happening.
This is my code
GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(main_window), 800, 600);
WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
gtk_container_add(GTK_CONTAINER(main_window), GTK_WIDGET(webView));
g_signal_connect(main_window, "destroy", G_CALLBACK(destroyWindowCb), NULL);
g_signal_connect(webView, "window-object-cleared", G_CALLBACK(woCleared), main_window);
The callback function
void
woCleared (WebKitWebView *web_view,
WebKitWebFrame *frame, /* this line error*/
gpointer context,
gpointer window_object,
gpointer user_data){
// my code
}
Im new with the webkitgtk.
Related
Is there a GTK3 function that detects if a window has focus? I am currently using the following code:
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
GtkWidget *LinuxWindow;
static void buttonMessage(GtkWidget *widget, gpointer data)
{
g_print("Yay, you clicked me!\n");
}
int main() {
GtkWidget *Box, *Button;
int argC = 0;
char **argV;
// Setup the window and fixed grid
gtk_init(&argC, &argV);
LinuxWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Box = gtk_fixed_new();
// Set the title
gtk_window_set_title(GTK_WINDOW(LinuxWindow), "Title");
// Setup the window events
gtk_widget_show_all(LinuxWindow);
g_signal_connect(G_OBJECT(LinuxWindow), "destroy", G_CALLBACK(gtk_main_quit),
NULL);
// Add controls
Button = gtk_button_new_with_label("Click Me!");
g_signal_connect(Button, "clicked", G_CALLBACK(buttonMessage), NULL);
gtk_fixed_put(GTK_FIXED(Box), Button, 20, 20);
gtk_fixed_move(GTK_FIXED(Box), Button, 20, 20);
gtk_widget_set_size_request(Button, 30, 100);
gtk_container_add(GTK_CONTAINER(LinuxWindow), Box);
gtk_widget_show_all(LinuxWindow);
// Create a dialog
GtkWidget *dialog;
dialog = gtk_message_dialog_new(
GTK_WINDOW(LinuxWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Hello and welcome to my GTK GUI...", NULL);
gint ret = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(GTK_WIDGET(dialog));
printf("%i", ret);
// Add the fixed grid and go the to the main window loop
gtk_main();
return 0;
}
I am compiling it using
g++ -std=c++17 -m64 -o gtkTest myGtkApp.cpp -lX11 `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0`
I want to detect if the window is focused and print it to the console.
There is a function: gtk_widget_is_focus ().
You need to assure parents have the "has-focus" property set.
Doc. excerpt:
gtk_widget_is_focus (GtkWidget *widget);
Determines if the widget is the focus widget within its toplevel. (This does not mean that the “has-focus” property is necessarily set; “has-focus” will only be set if the toplevel widget additionally has the global input focus.)
If you want to receive an event when the window is focused then register a callback for the enter-notify-event (signal)
In the linked doc. there is a section just three points after enter-notify-event that is what you want:
The “focus” signal
Sorry, I should have to mention this event the first time.
I am trying to make an application using Gtk 3 and OpenGl but when I try to compile the file, the Gl commands are not recognized. Any suggestions? Code and Errors provided below. I am just trying to setup and render a empty gl area.
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
static gboolean
render (GtkGLArea *area, GdkGLContext *context)
{
glClearColor(0, 0, 0, 0);
return TRUE;
}
static void activate (GtkApplication *app, gpointer user_data){
GtkWidget *window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Calculator");
gtk_window_resize(GTK_WINDOW(window), 290, 300);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
GtkWidget *gl = gtk_gl_area_new();
g_signal_connect (gl, "render", G_CALLBACK(render), NULL);
gtk_widget_show_all(window);
gtk_main();
}
int main(int argc, char **argv){
GtkApplication *app;
int status;
app = gtk_application_new("com.calculate", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref(app);
return status;
}
Compiled with:
gcc OpenGl.c `pkg-config --cflags gtk+-3.0` -o gl `pkg-config --libs gtk+-3.0`
Error Message:
/usr/bin/ld: /tmp/ccmKOqOJ.o: in function `render':
OpenGl.c:(.text+0x21): undefined reference to `glClearColor'
/usr/bin/ld: OpenGl.c:(.text+0x2b): undefined reference to `glClear'
collect2: error: ld returned 1 exit status
You need to link OpenGL with your program, just like you have linked GTK+. -lOpenGL in your compiler invocation may be all you need.
I am beginning with GTK development, and I have struggled.
This first application took me 4 hours, I would like to know now if I am already doing too many obvious mistakes?
Mainly I want to ask how do I transition this code to GTK3? It gives me error:
‘GTK_OBJECT’ was not declared in this scope
If I try to compile against GTK3 instead of GTK2, i.e.:
pkg-config --cflags --libs gtk+-3.0
#include <gtk/gtk.h>
static int click_counter = 0;
void greet ( GtkWidget * widget, gpointer data )
{
g_print ( "My first GTK app!\n" );
g_print ( "%s clicked %d times\n", (char*) data, ++click_counter );
}
void destroy ( GtkWidget * widget, gpointer data )
{
gtk_main_quit ();
}
int main ( int argc, char * argv[] )
{
GtkWidget * main_window;
GtkWidget * counter_button;
gtk_init( & argc, & argv);
main_window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
g_signal_connect (main_window, "destroy", G_CALLBACK (destroy), NULL);
gtk_container_set_border_width ( GTK_CONTAINER ( main_window ), 30 );
counter_button = gtk_button_new_with_label ("Click me!");
g_signal_connect ( GTK_OBJECT(counter_button), "clicked", G_CALLBACK (greet), NULL ); // last param counter_button ?
gtk_container_add ( GTK_CONTAINER (main_window), counter_button );
gtk_widget_show_all ( main_window );
gtk_main ();
return 0;
}
I compile using a Makefile, the main part:
CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Wc++11-compat # -Werror -Wpedantic -pedantic-errors
LDLIBS := $$( pkg-config --cflags --libs gtk+-2.0 )
PROJECT := firstGTK
BINARY := $(PROJECT)
SOURCE := $(PROJECT).cpp
$(BINARY): $(SOURCE)
$(CXX) $(CXXFLAGS) $(SOURCE) -o $(BINARY) $(LDLIBS)
If you are porting GTK 2 code to GTK 3, then you should read the GTK 2 to 3 migration guide. It is to be expected that some changes to the code will be necessary when you switch.
There is a section that talks specifically about how to replace GtkObject. The answer is, in most cases, to use GObject or GtkWidget.
I'm rather new to programming and especially when it comes to how to including libraries and alike activities. I've been programming a bit using Python in the past and I've been using GTK to create windows, something I've intended to do when programming with c++ as well. To get things started, here's my code:
#include <stdlib.h>
#include <gtk/gtk.h>
static void helloWorld (GtkWidget *wid, GtkWidget *win)
{
GtkWidget *dialog = NULL;
dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Hello World!");
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
int main (int argc, char *argv[])
{
GtkWidget *button = NULL;
GtkWidget *win = NULL;
GtkWidget *vbox = NULL;
/* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
/* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW (win), 400, 300);
gtk_container_set_border_width (GTK_CONTAINER (win), 8);
gtk_window_set_title (GTK_WINDOW (win), "test");
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
gtk_widget_realize (win);
g_signal_connect (win, "destroy", gtk_main_quit, NULL);
/* Create a vertical box with buttons */
vbox = gtk_vbox_new (TRUE, 6);
gtk_container_add (GTK_CONTAINER (win), vbox);
button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
g_signal_connect (button, "clicked", gtk_main_quit, NULL);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
/* Enter the main loop */
gtk_widget_show_all (win);
gtk_main ();
return 0;
}
The code was taken from a "Hello world" example I found on the internet a while back.
I'm aware that this issue have already gotten an answer, but my situation is much more complex (from my perspective at least). First off, I've installed all packages required. I run Ubuntu 14.04 by the way.
When I compile the code using g++ main.cpp I get the following error:
main.cpp:2:21: fatal error: gtk/gtk.h: No such file or directory
#include <gtk/gtk.h>
^
compilation terminated.
There is a fix for this particular error, which is to extend the compile command like this: g++ main.cpp -I/usr/include/gtk-2.0. This however will provide another, similar error:
In file included from /usr/include/gtk-2.0/gdk/gdk.h:32:0,
from /usr/include/gtk-2.0/gtk/gtk.h:32,
from main.cpp:2:
/usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30:21: fatal error: gio/gio.h: No such file or directory
#include <gio/gio.h>
^
compilation terminated.
You can fix this as well by extending the command like this (all commands are fund on the internet and I don't quite understand it all): g++ -g -Wall -c -o program.o main.cpp -I/usr/include/gtk-2.0 $(pkg-config --libs --cflags glib-2.0). There will now be an error with cairo.h.
As you can see there are similar errors. I have no idea what's wrong but I must believe there is a relatively easy fix.
Also, I tried a fresh install of Ubuntu (just installed packages necessary) and the same errors occur.
The pkgconfig command gives you all of the necessary -I (include) and -l (linker) statements for the compiler, when including a certain package.
Take a look what is given by running:
pkgconfig --cflags --libs gtk+-2.0
I've tried compiling your code on my Ubuntu 14.04.1 and it went fine, when I used:
g++ main.cpp `pkg-config --cflags --libs gtk+-2.0`
Probably pkg-config --libs --cflags glib-2.0 wasn't enough to provide all of the necessary include paths and shared libraries.
It's works (Ubuntu):
export CPATH=$CPATH:/usr/include/gtk-2.0
export CPATH=$CPATH:/usr/include/glib-2.0/
export CPATH=$CPATH:/usr/lib/glib-2.0/include/
export CPATH=$CPATH:/usr/include/pango-1.0/
export CPATH=$CPATH:/usr/lib/gtk-2.0/include/
export CPATH=$CPATH:/usr/include/atk-1.0/
With Fedora >=25:
export CPATH=$CPATH:/usr/include/gtk-3.0
export CPATH=$CPATH:/usr/include/glib-2.0/
export CPATH=$CPATH:/lib64/glib-2.0/include/
export CPATH=$CPATH:/usr/include/pango-1.0/
export CPATH=$CPATH:/usr/lib64/gtk-3.0/3.0.0/
export CPATH=$CPATH:/usr/include/atk-1.0/
export CPATH=$CPATH:/usr/include/cairo/
into ~/.bashrc
or
into ~/.zshrc
Remember to run: source ~/.bashrc
When you don't have a file installed on Ubuntu, the place to go is http://packages.ubuntu.com and use the second search form to look for the filename.
In this case, the answer is (for trusty):
File Package
-----------------------------------------------------------------
/usr/include/gtk-2.0/gtk/gtk.h libgtk2.0-dev
/usr/include/gtk-3.0/gtk/gtk.h libgtk-3-dev
/usr/lib/R/site-library/RGtk2/include/RGtk2/gtk.h r-cran-rgtk2
You need to select which one of those is most suitable, and install it.
I'm guessing this one: libgtk2.0-dev
You can then repeat the process for the gio/gio.h header file.
I also immigranted to C++ from Python and I am just not used with how the C++ include way of working. Here's what I do to make life easier in C++. I make a Makefile with the following contents:
all:
g++-5 main.cpp -o main `pkg-config --libs --cflags gtkmm-3.0`
Instead of main.cpp, include all your *.cpp files and headers. (Also, please notice I use gtkmm-3.0) And in gtkmm-3.0, your Application with one window, one button and the button being linked to a function [which says: Hello World! of course] would look like this
#include <iostream>
#include <gtkmm/application.h>
#include <gtkmm/window.h>
#include <gtkmm/button.h>
class HelloWorld : public Gtk::Window{
public:
HelloWorld();
virtual ~HelloWorld();
protected:
//Signal handlers:
void on_button_clicked();
//Member widgets:
Gtk::Button m_button;
};
// implementing the class HelloWorld
HelloWorld::HelloWorld(): m_button("Click me, Xweque"){
set_border_width(20); // Sets the border width of the window.
// Connecting the button's clicked signal to an arbitrary function
m_button.signal_clicked().connect(sigc::mem_fun(*this, &HelloWorld::on_button_clicked));
add(m_button);
m_button.show();
}
HelloWorld::~HelloWorld()
{
}
void HelloWorld::on_button_clicked(){
std::cout << "Hello World" << std::endl;
}
int main(int argc, char** argv){
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
HelloWorld mywindow;
app->run(mywindow);
return 0;
}
I really need help on getting a simple GTK program in c++ running using MinGW. Here's my program:
# Makefile for Hello World Program (lab0).
all: lab0
lab0: lab0.o
g++ -Wall lab0.o -o lab0 -L C:/Users/Vic/Desktop/MinGW/lib -lgtk
lab0.o: lab0.c
g++ -Wall -I C:/Users/Vic/Desktop/MinGW/include/gtk-2.0/gtk -c lab0.c -o lab0.o
Program:
#include <gtk/gtk.h>
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *label;
gtk_init (&argc, &argv);
/* create the main, top level, window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* give it the title */
gtk_window_set_title (GTK_WINDOW (window), "Hello World");
/* Connect the destroy signal of the window to gtk_main_quit
* When the window is about to be destroyed we get a notification and
* stop the main GTK+ loop
*/
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
/* Create the "Hello, World" label */
label = gtk_label_new ("Hello, World");
/* and insert it into the main window */
gtk_container_add (GTK_CONTAINER (window), label);
/* make sure that everything, window and label, are visible */
gtk_widget_show_all (window);
/* start the main loop, and let it rest there until the application is closed */
gtk_main ();
return 0;
}
when i compile this using minGW i get this error:
g++ -Wall lab0.o -o lab0 -LC:/users/vic/desktop/mingw/lib -lgtk
/bin/Id: cannot find -lgtk
collect2: Id returned 1 exit status
make: *** [lab0] Error 1
I need to fix this problem and I need to figure out how to run gtk from my makefile.
Ideally, you would use pkg-config to help you find the header and library paths:
g++ -Wall lab0.o -o lab0 `pkg-config --cflags --libs gtk+-win32-2.0`
Or just the library path:
g++ -Wall lab0.o -o lab0 -LC:/users/vic/desktop/mingw/lib -lgtk `pkg-config --libs gtk+-win32-2.0`